/ Hex Artifact Content
Login

Artifact 47994ce8caf7e02e93db6a531cb6b592293e206f:


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 53   SQLITE_ENABLE_S
0290: 51 4c 52 52 0a 23 20 69 6e 63 6c 75 64 65 20 22  QLRR.# include "
02a0: 73 71 6c 72 72 2e 68 22 0a 23 65 6e 64 69 66 20  sqlrr.h".#endif 
02b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
02c0: 4e 41 42 4c 45 5f 46 54 53 33 0a 23 20 69 6e 63  NABLE_FTS3.# inc
02d0: 6c 75 64 65 20 22 66 74 73 33 2e 68 22 0a 23 65  lude "fts3.h".#e
02e0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
02f0: 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a  TE_ENABLE_RTREE.
0300: 23 20 69 6e 63 6c 75 64 65 20 22 72 74 72 65 65  # include "rtree
0310: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0320: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0330: 49 43 55 0a 23 20 69 6e 63 6c 75 64 65 20 22 73  ICU.# include "s
0340: 71 6c 69 74 65 69 63 75 2e 68 22 0a 23 65 6e 64  qliteicu.h".#end
0350: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
0360: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a  TE_AMALGAMATION.
0370: 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  /* IMPLEMENTATIO
0380: 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36 2d 34 35  N-OF: R-46656-45
0390: 31 35 36 20 54 68 65 20 73 71 6c 69 74 65 33 5f  156 The sqlite3_
03a0: 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67  version[] string
03b0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 63 6f 6e   constant.** con
03c0: 74 61 69 6e 73 20 74 68 65 20 74 65 78 74 20 6f  tains the text o
03d0: 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  f SQLITE_VERSION
03e0: 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73   macro. .*/.cons
03f0: 74 20 63 68 61 72 20 73 71 6c 69 74 65 33 5f 76  t char sqlite3_v
0400: 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c 49 54  ersion[] = SQLIT
0410: 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e 64 69  E_VERSION;.#endi
0420: 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  f../* IMPLEMENTA
0430: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33 35 33 36  TION-OF: R-53536
0440: 2d 34 32 35 37 35 20 54 68 65 20 73 71 6c 69 74  -42575 The sqlit
0450: 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 20  e3_libversion() 
0460: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
0470: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
0480: 20 74 68 65 20 74 6f 20 74 68 65 20 73 71 6c 69   the to the sqli
0490: 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74  te3_version[] st
04a0: 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e 20 0a  ring constant. .
04b0: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
04c0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
04d0: 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  n(void){ return 
04e0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 3b  sqlite3_version;
04f0: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0500: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 36 33 31 32  ATION-OF: R-6312
0510: 34 2d 33 39 33 30 30 20 54 68 65 20 73 71 6c 69  4-39300 The sqli
0520: 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 20 66  te3_sourceid() f
0530: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
0540: 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
0550: 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e  a string constan
0560: 74 20 77 68 6f 73 65 20 76 61 6c 75 65 20 69 73  t whose value is
0570: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
0580: 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f 55 52 43  .** SQLITE_SOURC
0590: 45 5f 49 44 20 43 20 70 72 65 70 72 6f 63 65 73  E_ID C preproces
05a0: 73 6f 72 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63  sor macro. .*/.c
05b0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
05c0: 65 33 5f 73 6f 75 72 63 65 69 64 28 76 6f 69 64  e3_sourceid(void
05d0: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
05e0: 5f 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a 0a 2f  _SOURCE_ID; }../
05f0: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0600: 2d 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36 33 35  -OF: R-35210-635
0610: 30 38 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c  08 The sqlite3_l
0620: 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72  ibversion_number
0630: 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72  () function.** r
0640: 65 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65  eturns an intege
0650: 72 20 65 71 75 61 6c 20 74 6f 20 53 51 4c 49 54  r equal to SQLIT
0660: 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
0670: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0680: 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
0690: 65 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e  er(void){ return
06a0: 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
06b0: 4e 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 20 49 4d  NUMBER; }../* IM
06c0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
06d0: 20 52 2d 32 30 37 39 30 2d 31 34 30 32 35 20 54   R-20790-14025 T
06e0: 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  he sqlite3_threa
06f0: 64 73 61 66 65 28 29 20 66 75 6e 63 74 69 6f 6e  dsafe() function
0700: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f   returns.** zero
0710: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
0720: 53 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69  SQLite was compi
0730: 6c 65 64 20 77 69 74 68 20 6d 75 74 65 78 69 6e  led with mutexin
0740: 67 20 63 6f 64 65 20 6f 6d 69 74 74 65 64 20 64  g code omitted d
0750: 75 65 20 74 6f 0a 2a 2a 20 74 68 65 20 53 51 4c  ue to.** the SQL
0760: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 63  ITE_THREADSAFE c
0770: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
0780: 6f 6e 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20  on being set to 
0790: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
07a0: 33 5f 74 68 72 65 61 64 73 61 66 65 28 76 6f 69  3_threadsafe(voi
07b0: 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d){ return SQLIT
07c0: 45 5f 54 48 52 45 41 44 53 41 46 45 3b 20 7d 0a  E_THREADSAFE; }.
07d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
07e0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
07f0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
0800: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
0810: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E)./*.** If the 
0820: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
0830: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  on pointer is no
0840: 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a 2a  t NULL and if.**
0850: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
0860: 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62 6c 65  OTRACE is enable
0870: 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67 65 73  d, then messages
0880: 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 49   describing.** I
0890: 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20 77 72  /O active are wr
08a0: 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68 69 73  itten using this
08b0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73   function.  Thes
08c0: 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61 72  e messages.** ar
08d0: 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 64  e intended for d
08e0: 65 62 75 67 67 69 6e 67 20 61 63 74 69 76 69 74  ebugging activit
08f0: 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a 20 6e 6f  y only..*/./* no
0900: 74 2d 70 72 69 76 61 74 65 20 2a 2f 20 76 6f 69  t-private */ voi
0910: 64 20 28 2a 73 71 6c 69 74 65 33 49 6f 54 72 61  d (*sqlite3IoTra
0920: 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ce)(const char*,
0930: 20 2e 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e 64 69   ...) = 0;.#endi
0940: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
0950: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
0960: 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73   variable points
0970: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69   to a string whi
0980: 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d  ch is the.** nam
0990: 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79  e of a directory
09a0: 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69 72 65  , then that dire
09b0: 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73  ctory will be us
09c0: 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74  ed to store.** t
09d0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a  emporary files..
09e0: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  **.** See also t
09f0: 68 65 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f  he "PRAGMA temp_
0a00: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22  store_directory"
0a10: 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   SQL command..*/
0a20: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 74  .char *sqlite3_t
0a30: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
0a40: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  0;../*.** If the
0a50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
0a60: 6c 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74  l variable point
0a70: 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68  s to a string wh
0a80: 69 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61  ich is the.** na
0a90: 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72  me of a director
0aa0: 79 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69 72  y, then that dir
0ab0: 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75  ectory will be u
0ac0: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  sed to store.** 
0ad0: 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  all database fil
0ae0: 65 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74  es specified wit
0af0: 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  h a relative pat
0b00: 68 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  hname..**.** See
0b10: 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d   also the "PRAGM
0b20: 41 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72  A data_store_dir
0b30: 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d  ectory" SQL comm
0b40: 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  and..*/.char *sq
0b50: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
0b60: 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  tory = 0;../*.**
0b70: 20 49 6e 69 74 69 61 6c 69 7a 65 20 53 51 4c 69   Initialize SQLi
0b80: 74 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  te.  .**.** This
0b90: 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
0ba0: 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 69 74 69   called to initi
0bb0: 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
0bc0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 0a 2a 2a 20   allocation,.** 
0bd0: 56 46 53 2c 20 61 6e 64 20 6d 75 74 65 78 20 73  VFS, and mutex s
0be0: 75 62 73 79 73 74 65 6d 73 20 70 72 69 6f 72 20  ubsystems prior 
0bf0: 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 73 65 72  to doing any ser
0c00: 69 6f 75 73 20 77 6f 72 6b 20 77 69 74 68 0a 2a  ious work with.*
0c10: 2a 20 53 51 4c 69 74 65 2e 20 20 42 75 74 20 61  * SQLite.  But a
0c20: 73 20 6c 6f 6e 67 20 61 73 20 79 6f 75 20 64 6f  s long as you do
0c30: 20 6e 6f 74 20 63 6f 6d 70 69 6c 65 20 77 69 74   not compile wit
0c40: 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  h SQLITE_OMIT_AU
0c50: 54 4f 49 4e 49 54 0a 2a 2a 20 74 68 69 73 20 72  TOINIT.** this r
0c60: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
0c70: 61 6c 6c 65 64 20 61 75 74 6f 6d 61 74 69 63 61  alled automatica
0c80: 6c 6c 79 20 62 79 20 6b 65 79 20 72 6f 75 74 69  lly by key routi
0c90: 6e 65 73 20 73 75 63 68 20 61 73 0a 2a 2a 20 73  nes such as.** s
0ca0: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 20 20  qlite3_open().  
0cb0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
0cc0: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 65  ine is a no-op e
0cd0: 78 63 65 70 74 20 6f 6e 20 69 74 73 20 76 65 72  xcept on its ver
0ce0: 79 20 66 69 72 73 74 20 63 61 6c 6c 20 66 6f 72  y first call for
0cf0: 20 74 68 65 20 70 72 6f 63 65 73 73 2c 0a 2a 2a   the process,.**
0d00: 20 6f 72 20 66 6f 72 20 74 68 65 20 66 69 72 73   or for the firs
0d10: 74 20 63 61 6c 6c 20 61 66 74 65 72 20 61 20 63  t call after a c
0d20: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73  all to sqlite3_s
0d30: 68 75 74 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54  hutdown..**.** T
0d40: 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20  he first thread 
0d50: 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  to call this rou
0d60: 74 69 6e 65 20 72 75 6e 73 20 74 68 65 20 69 6e  tine runs the in
0d70: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 6f 0a  itialization to.
0d80: 2a 2a 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20  ** completion.  
0d90: 49 66 20 73 75 62 73 65 71 75 65 6e 74 20 74 68  If subsequent th
0da0: 72 65 61 64 73 20 63 61 6c 6c 20 74 68 69 73 20  reads call this 
0db0: 72 6f 75 74 69 6e 65 20 62 65 66 6f 72 65 20 74  routine before t
0dc0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 68 72 65  he first.** thre
0dd0: 61 64 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ad has finished 
0de0: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
0df0: 6f 6e 20 70 72 6f 63 65 73 73 2c 20 74 68 65 6e  on process, then
0e00: 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 0a   the subsequent.
0e10: 2a 2a 20 74 68 72 65 61 64 73 20 6d 75 73 74 20  ** threads must 
0e20: 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20  block until the 
0e30: 66 69 72 73 74 20 74 68 72 65 61 64 20 66 69 6e  first thread fin
0e40: 69 73 68 65 73 20 77 69 74 68 20 74 68 65 20 69  ishes with the i
0e50: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 2a  nitialization..*
0e60: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
0e70: 68 72 65 61 64 20 6d 69 67 68 74 20 63 61 6c 6c  hread might call
0e80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
0e90: 63 75 72 73 69 76 65 6c 79 2e 20 20 52 65 63 75  cursively.  Recu
0ea0: 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 73 20 74  rsive.** calls t
0eb0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  o this routine s
0ec0: 68 6f 75 6c 64 20 6e 6f 74 20 62 6c 6f 63 6b 2c  hould not block,
0ed0: 20 6f 66 20 63 6f 75 72 73 65 2e 20 20 4f 74 68   of course.  Oth
0ee0: 65 72 77 69 73 65 20 74 68 65 0a 2a 2a 20 69 6e  erwise the.** in
0ef0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
0f00: 63 65 73 73 20 77 6f 75 6c 64 20 6e 65 76 65 72  cess would never
0f10: 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a   complete..**.**
0f20: 20 4c 65 74 20 58 20 62 65 20 74 68 65 20 66 69   Let X be the fi
0f30: 72 73 74 20 74 68 72 65 61 64 20 74 6f 20 65 6e  rst thread to en
0f40: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
0f50: 2e 20 20 4c 65 74 20 59 20 62 65 20 73 6f 6d 65  .  Let Y be some
0f60: 20 6f 74 68 65 72 0a 2a 2a 20 74 68 72 65 61 64   other.** thread
0f70: 2e 20 20 54 68 65 6e 20 77 68 69 6c 65 20 74 68  .  Then while th
0f80: 65 20 69 6e 69 74 69 61 6c 20 69 6e 76 6f 63 61  e initial invoca
0f90: 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 72 6f 75  tion of this rou
0fa0: 74 69 6e 65 20 62 79 20 58 20 69 73 0a 2a 2a 20  tine by X is.** 
0fb0: 69 6e 63 6f 6d 70 6c 65 74 65 2c 20 69 74 20 69  incomplete, it i
0fc0: 73 20 72 65 71 75 69 72 65 64 20 74 68 61 74 3a  s required that:
0fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 61 6c  .**.**    *  Cal
0fe0: 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ls to this routi
0ff0: 6e 65 20 66 72 6f 6d 20 59 20 6d 75 73 74 20 62  ne from Y must b
1000: 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 6f  lock until the o
1010: 75 74 65 72 2d 6d 6f 73 74 0a 2a 2a 20 20 20 20  uter-most.**    
1020: 20 20 20 63 61 6c 6c 20 62 79 20 58 20 63 6f 6d     call by X com
1030: 70 6c 65 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  pletes..**.**   
1040: 20 2a 20 20 52 65 63 75 72 73 69 76 65 20 63 61   *  Recursive ca
1050: 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  lls to this rout
1060: 69 6e 65 20 66 72 6f 6d 20 74 68 72 65 61 64 20  ine from thread 
1070: 58 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  X return immedia
1080: 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 77 69  tely.**       wi
1090: 74 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a  thout blocking..
10a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  */.int sqlite3_i
10b0: 6e 69 74 69 61 6c 69 7a 65 28 76 6f 69 64 29 7b  nitialize(void){
10c0: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
10d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
10e0: 4d 61 73 74 65 72 3b 20 29 20 20 20 20 20 20 20  Master; )       
10f0: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74  /* The main stat
1100: 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 69 6e  ic mutex */.  in
1110: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1140: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 23 69 66  sult code */.#if
1150: 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41  def SQLITE_EXTRA
1160: 5f 49 4e 49 54 0a 20 20 69 6e 74 20 62 52 75 6e  _INIT.  int bRun
1170: 45 78 74 72 61 49 6e 69 74 20 3d 20 30 3b 20 20  ExtraInit = 0;  
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1190: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e       /* Extra in
11a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6e 65 65  itialization nee
11b0: 64 65 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23  ded */.#endif..#
11c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
11d0: 54 5f 57 53 44 0a 20 20 72 63 20 3d 20 73 71 6c  T_WSD.  rc = sql
11e0: 69 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34 30  ite3_wsd_init(40
11f0: 39 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20 72  96, 24);.  if( r
1200: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1210: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1220: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1230: 49 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72  If SQLite is alr
1240: 65 61 64 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20  eady completely 
1250: 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65  initialized, the
1260: 6e 20 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a  n this call.  **
1270: 20 74 6f 20 73 71 6c 69 74 65 33 5f 69 6e 69 74   to sqlite3_init
1280: 69 61 6c 69 7a 65 28 29 20 73 68 6f 75 6c 64 20  ialize() should 
1290: 62 65 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74  be a no-op.  But
12a0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
12b0: 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65  ion.  ** must be
12c0: 20 63 6f 6d 70 6c 65 74 65 2e 20 20 53 6f 20 69   complete.  So i
12d0: 73 49 6e 69 74 20 6d 75 73 74 20 6e 6f 74 20 62  sInit must not b
12e0: 65 20 73 65 74 20 75 6e 74 69 6c 20 74 68 65 20  e set until the 
12f0: 76 65 72 79 20 65 6e 64 0a 20 20 2a 2a 20 6f 66  very end.  ** of
1300: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20   this routine.. 
1310: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
1320: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1330: 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51  Init ) return SQ
1340: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d  LITE_OK;..  /* M
1350: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6d 75 74  ake sure the mut
1360: 65 78 20 73 75 62 73 79 73 74 65 6d 20 69 73 20  ex subsystem is 
1370: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 49 66  initialized.  If
1380: 20 75 6e 61 62 6c 65 20 74 6f 20 0a 20 20 2a 2a   unable to .  **
1390: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
13a0: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 2c  mutex subsystem,
13b0: 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20 77 69   return early wi
13c0: 74 68 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  th the error..  
13d0: 2a 2a 20 49 66 20 74 68 65 20 73 79 73 74 65 6d  ** If the system
13e0: 20 69 73 20 73 6f 20 73 69 63 6b 20 74 68 61 74   is so sick that
13f0: 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
1400: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 75 74  o allocate a mut
1410: 65 78 2c 0a 20 20 2a 2a 20 74 68 65 72 65 20 69  ex,.  ** there i
1420: 73 20 6e 6f 74 20 6d 75 63 68 20 53 51 4c 69 74  s not much SQLit
1430: 65 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 62 65  e is going to be
1440: 20 61 62 6c 65 20 74 6f 20 64 6f 2e 0a 20 20 2a   able to do..  *
1450: 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 75 74 65 78  *.  ** The mutex
1460: 20 73 75 62 73 79 73 74 65 6d 20 6d 75 73 74 20   subsystem must 
1470: 74 61 6b 65 20 63 61 72 65 20 6f 66 20 73 65 72  take care of ser
1480: 69 61 6c 69 7a 69 6e 67 20 69 74 73 20 6f 77 6e  ializing its own
1490: 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61  .  ** initializa
14a0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
14b0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 49 6e  = sqlite3MutexIn
14c0: 69 74 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  it();.  if( rc )
14d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
14e0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
14f0: 20 6d 61 6c 6c 6f 63 28 29 20 73 79 73 74 65 6d   malloc() system
1500: 20 61 6e 64 20 74 68 65 20 72 65 63 75 72 73 69   and the recursi
1510: 76 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75  ve pInitMutex mu
1520: 74 65 78 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  tex..  ** This o
1530: 70 65 72 61 74 69 6f 6e 20 69 73 20 70 72 6f 74  peration is prot
1540: 65 63 74 65 64 20 62 79 20 74 68 65 20 53 54 41  ected by the STA
1550: 54 49 43 5f 4d 41 53 54 45 52 20 6d 75 74 65 78  TIC_MASTER mutex
1560: 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a  .  Note that.  *
1570: 2a 20 4d 75 74 65 78 41 6c 6c 6f 63 28 29 20 69  * MutexAlloc() i
1580: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 73  s called for a s
1590: 74 61 74 69 63 20 6d 75 74 65 78 20 70 72 69 6f  tatic mutex prio
15a0: 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 69 6e  r to initializin
15b0: 67 20 74 68 65 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  g the.  ** mallo
15c0: 63 20 73 75 62 73 79 73 74 65 6d 20 2d 20 74 68  c subsystem - th
15d0: 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  is implies that 
15e0: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f  the allocation o
15f0: 66 20 61 20 73 74 61 74 69 63 0a 20 20 2a 2a 20  f a static.  ** 
1600: 6d 75 74 65 78 20 6d 75 73 74 20 6e 6f 74 20 72  mutex must not r
1610: 65 71 75 69 72 65 20 73 75 70 70 6f 72 74 20 66  equire support f
1620: 72 6f 6d 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73  rom the malloc s
1630: 75 62 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20  ubsystem..  */. 
1640: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d   MUTEX_LOGIC( pM
1650: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
1660: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
1670: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
1680: 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74  STER); ).  sqlit
1690: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
16a0: 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Master);.  sqlit
16b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
16c0: 73 4d 75 74 65 78 49 6e 69 74 20 3d 20 31 3b 0a  sMutexInit = 1;.
16d0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c    if( !sqlite3Gl
16e0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c  obalConfig.isMal
16f0: 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20 72  locInit ){.    r
1700: 63 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  c = sqlite3Mallo
1710: 63 49 6e 69 74 28 29 3b 0a 20 20 7d 0a 20 20 69  cInit();.  }.  i
1720: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1730: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47   ){.    sqlite3G
1740: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61  lobalConfig.isMa
1750: 6c 6c 6f 63 49 6e 69 74 20 3d 20 31 3b 0a 20 20  llocInit = 1;.  
1760: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c    if( !sqlite3Gl
1770: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1780: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 73  Mutex ){.      s
1790: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
17a0: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 0a  ig.pInitMutex =.
17b0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17c0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
17d0: 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53  ITE_MUTEX_RECURS
17e0: 49 56 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  IVE);.      if( 
17f0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1800: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 26  fig.bCoreMutex &
1810: 26 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  & !sqlite3Global
1820: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1830: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  x ){.        rc 
1840: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1850: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1860: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1870: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
1880: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1890: 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b  .nRefInitMutex++
18a0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
18b0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
18c0: 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72  ter);..  /* If r
18d0: 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  c is not SQLITE_
18e0: 4f 4b 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  OK at this point
18f0: 2c 20 74 68 65 6e 20 65 69 74 68 65 72 20 74 68  , then either th
1900: 65 20 6d 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75  e malloc.  ** su
1910: 62 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f  bsystem could no
1920: 74 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  t be initialized
1930: 20 6f 72 20 74 68 65 20 73 79 73 74 65 6d 20 66   or the system f
1940: 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74  ailed to allocat
1950: 65 0a 20 20 2a 2a 20 74 68 65 20 70 49 6e 69 74  e.  ** the pInit
1960: 4d 75 74 65 78 20 6d 75 74 65 78 2e 20 52 65 74  Mutex mutex. Ret
1970: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  urn an error in 
1980: 65 69 74 68 65 72 20 63 61 73 65 2e 20 20 2a 2f  either case.  */
1990: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
19b0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
19c0: 20 44 6f 20 74 68 65 20 72 65 73 74 20 6f 66 20   Do the rest of 
19d0: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
19e0: 6f 6e 20 75 6e 64 65 72 20 74 68 65 20 72 65 63  on under the rec
19f0: 75 72 73 69 76 65 20 6d 75 74 65 78 20 73 6f 0a  ursive mutex so.
1a00: 20 20 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c    ** that we wil
1a10: 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 68 61 6e  l be able to han
1a20: 64 6c 65 20 72 65 63 75 72 73 69 76 65 20 63 61  dle recursive ca
1a30: 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71  lls into.  ** sq
1a40: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1a50: 28 29 2e 20 20 54 68 65 20 72 65 63 75 72 73 69  ().  The recursi
1a60: 76 65 20 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c  ve calls normall
1a70: 79 20 63 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20  y come through. 
1a80: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69   ** sqlite3_os_i
1a90: 6e 69 74 28 29 20 77 68 65 6e 20 69 74 20 69 6e  nit() when it in
1aa0: 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 76 66  vokes sqlite3_vf
1ab0: 73 5f 72 65 67 69 73 74 65 72 28 29 2c 20 62 75  s_register(), bu
1ac0: 74 20 6f 74 68 65 72 0a 20 20 2a 2a 20 72 65 63  t other.  ** rec
1ad0: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6d 69 67  ursive calls mig
1ae0: 68 74 20 61 6c 73 6f 20 62 65 20 70 6f 73 73 69  ht also be possi
1af0: 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
1b00: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
1b10: 3a 20 52 2d 30 30 31 34 30 2d 33 37 34 34 35 20  : R-00140-37445 
1b20: 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69 63  SQLite automatic
1b30: 61 6c 6c 79 20 73 65 72 69 61 6c 69 7a 65 73 20  ally serializes 
1b40: 63 61 6c 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68  calls.  ** to th
1b50: 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20  e xInit method, 
1b60: 73 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65 74  so the xInit met
1b70: 68 6f 64 20 6e 65 65 64 20 6e 6f 74 20 62 65 20  hod need not be 
1b80: 74 68 72 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a  threadsafe..  **
1b90: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
1ba0: 69 6e 67 20 6d 75 74 65 78 20 69 73 20 77 68 61  ing mutex is wha
1bb0: 74 20 73 65 72 69 61 6c 69 7a 65 73 20 61 63 63  t serializes acc
1bc0: 65 73 73 20 74 6f 20 74 68 65 20 61 70 70 64 65  ess to the appde
1bd0: 66 20 70 63 61 63 68 65 20 78 49 6e 69 74 0a 20  f pcache xInit. 
1be0: 20 2a 2a 20 6d 65 74 68 6f 64 73 2e 20 20 54 68   ** methods.  Th
1bf0: 65 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  e sqlite3_pcache
1c00: 5f 6d 65 74 68 6f 64 73 2e 78 49 6e 69 74 28 29  _methods.xInit()
1c10: 20 61 6c 6c 20 69 73 20 65 6d 62 65 64 64 65 64   all is embedded
1c20: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c   in the.  ** cal
1c30: 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63  l to sqlite3Pcac
1c40: 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a  heInitialize()..
1c50: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
1c60: 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
1c70: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1c80: 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 69 66  InitMutex);.  if
1c90: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1ca0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20  onfig.isInit==0 
1cb0: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
1cc0: 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73  Config.inProgres
1cd0: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 46 75 6e 63  s==0 ){.    Func
1ce0: 44 65 66 48 61 73 68 20 2a 70 48 61 73 68 20 3d  DefHash *pHash =
1cf0: 20 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66   &GLOBAL(FuncDef
1d00: 48 61 73 68 2c 20 73 71 6c 69 74 65 33 47 6c 6f  Hash, sqlite3Glo
1d10: 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20  balFunctions);. 
1d20: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1d30: 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73  Config.inProgres
1d40: 73 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65  s = 1;.    memse
1d50: 74 28 70 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  t(pHash, 0, size
1d60: 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  of(sqlite3Global
1d70: 46 75 6e 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20  Functions));.   
1d80: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
1d90: 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 28  GlobalFunctions(
1da0: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
1db0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1dc0: 73 50 43 61 63 68 65 49 6e 69 74 3d 3d 30 20 29  sPCacheInit==0 )
1dd0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1de0: 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61  ite3PcacheInitia
1df0: 6c 69 7a 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20  lize();.    }.  
1e00: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1e20: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1e30: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
1e40: 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  1;.      rc = sq
1e50: 6c 69 74 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20  lite3OsInit();. 
1e60: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1e70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e80: 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63 68      sqlite3PCach
1e90: 65 42 75 66 66 65 72 53 65 74 75 70 28 20 73 71  eBufferSetup( sq
1ea0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1eb0: 67 2e 70 50 61 67 65 2c 20 0a 20 20 20 20 20 20  g.pPage, .      
1ec0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1ed0: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20  lConfig.szPage, 
1ee0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1ef0: 66 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20  fig.nPage);.    
1f00: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1f10: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 31  onfig.isInit = 1
1f20: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1f30: 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 20 20 20  EXTRA_INIT.     
1f40: 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20 3d   bRunExtraInit =
1f50: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d   1;.#endif.    }
1f60: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
1f70: 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72  alConfig.inProgr
1f80: 65 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  ess = 0;.  }.  s
1f90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1fa0: 76 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ve(sqlite3Global
1fb0: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1fc0: 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63  x);..  /* Go bac
1fd0: 6b 20 75 6e 64 65 72 20 74 68 65 20 73 74 61 74  k under the stat
1fe0: 69 63 20 6d 75 74 65 78 20 61 6e 64 20 63 6c 65  ic mutex and cle
1ff0: 61 6e 20 75 70 20 74 68 65 20 72 65 63 75 72 73  an up the recurs
2000: 69 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74  ive.  ** mutex t
2010: 6f 20 70 72 65 76 65 6e 74 20 61 20 72 65 73 6f  o prevent a reso
2020: 75 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a  urce leak..  */.
2030: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2040: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
2050: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2060: 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75  onfig.nRefInitMu
2070: 74 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c  tex--;.  if( sql
2080: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2090: 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d  .nRefInitMutex<=
20a0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
20b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
20c0: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
20d0: 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ex==0 );.    sql
20e0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
20f0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2100: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
2110: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2120: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
2130: 74 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  tex = 0;.  }.  s
2140: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2150: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20  ve(pMaster);..  
2160: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2170: 20 69 73 20 6a 75 73 74 20 61 20 73 61 6e 69 74   is just a sanit
2180: 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  y check to make 
2190: 73 75 72 65 20 53 51 4c 69 74 65 20 68 61 73 0a  sure SQLite has.
21a0: 20 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c    ** been compil
21b0: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49  ed correctly.  I
21c0: 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
21d0: 6f 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 2c  o run this code,
21e0: 20 62 75 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e   but.  ** we don
21f0: 27 74 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 69  't want to run i
2200: 74 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20  t too often and 
2210: 73 6f 61 6b 20 75 70 20 43 50 55 20 63 79 63 6c  soak up CPU cycl
2220: 65 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72  es for no.  ** r
2230: 65 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75  eason.  So we ru
2240: 6e 20 69 74 20 6f 6e 63 65 20 64 75 72 69 6e 67  n it once during
2250: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e   initialization.
2260: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  .  */.#ifndef ND
2270: 45 42 55 47 0a 23 69 66 6e 64 65 66 20 53 51 4c  EBUG.#ifndef SQL
2280: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
2290: 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69  G_POINT.  /* Thi
22a0: 73 20 73 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64  s section of cod
22b0: 65 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74  e's only "output
22c0: 22 20 69 73 20 76 69 61 20 61 73 73 65 72 74 28  " is via assert(
22d0: 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f  ) statements. */
22e0: 0a 20 20 69 66 20 28 20 72 63 3d 3d 53 51 4c 49  .  if ( rc==SQLI
22f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34  TE_OK ){.    u64
2300: 20 78 20 3d 20 28 28 28 75 36 34 29 31 29 3c 3c   x = (((u64)1)<<
2310: 36 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c  63)-1;.    doubl
2320: 65 20 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e y;.    assert(
2330: 73 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20  sizeof(x)==8);. 
2340: 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66     assert(sizeof
2350: 28 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b  (x)==sizeof(y));
2360: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 79 2c 20  .    memcpy(&y, 
2370: 26 78 2c 20 38 29 3b 0a 20 20 20 20 61 73 73 65  &x, 8);.    asse
2380: 72 74 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  rt( sqlite3IsNaN
2390: 28 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  (y) );.  }.#endi
23a0: 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  f.#endif..  /* D
23b0: 6f 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69  o extra initiali
23c0: 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 72 65 71  zation steps req
23d0: 75 65 73 74 65 64 20 62 79 20 74 68 65 20 53 51  uested by the SQ
23e0: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
23f0: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d    ** compile-tim
2400: 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  e option..  */.#
2410: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54  ifdef SQLITE_EXT
2420: 52 41 5f 49 4e 49 54 0a 20 20 69 66 28 20 62 52  RA_INIT.  if( bR
2430: 75 6e 45 78 74 72 61 49 6e 69 74 20 29 7b 0a 20  unExtraInit ){. 
2440: 20 20 20 69 6e 74 20 53 51 4c 49 54 45 5f 45 58     int SQLITE_EX
2450: 54 52 41 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63  TRA_INIT(const c
2460: 68 61 72 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  har*);.    rc = 
2470: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2480: 54 28 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  T(0);.  }.#endif
2490: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
24a0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65  ../*.** Undo the
24b0: 20 65 66 66 65 63 74 73 20 6f 66 20 73 71 6c 69   effects of sqli
24c0: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
24d0: 2e 20 20 4d 75 73 74 20 6e 6f 74 20 62 65 20 63  .  Must not be c
24e0: 61 6c 6c 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74  alled while.** t
24f0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
2500: 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f  ding database co
2510: 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d  nnections or mem
2520: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ory allocations 
2530: 6f 72 0a 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20  or.** while any 
2540: 70 61 72 74 20 6f 66 20 53 51 4c 69 74 65 20 69  part of SQLite i
2550: 73 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75  s otherwise in u
2560: 73 65 20 69 6e 20 61 6e 79 20 74 68 72 65 61 64  se in any thread
2570: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
2580: 6e 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  ne is not thread
2590: 73 61 66 65 2e 20 20 42 75 74 20 69 74 20 69 73  safe.  But it is
25a0: 20 73 61 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20   safe to invoke 
25b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
25c0: 6f 6e 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69  on when SQLite i
25d0: 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20 64  s already shut d
25e0: 6f 77 6e 2e 20 20 49 66 20 53 51 4c 69 74 65 20  own.  If SQLite 
25f0: 69 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20  is already shut 
2600: 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69  down.** when thi
2610: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
2620: 6f 6b 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  oked, then this 
2630: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
2640: 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
2650: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74  int sqlite3_shut
2660: 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 23 69 66 64  down(void){.#ifd
2670: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2680: 53 44 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  SD.  int rc = sq
2690: 6c 69 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34  lite3_wsd_init(4
26a0: 30 39 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20  096, 24);.  if( 
26b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
26d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
26e0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
26f0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a  onfig.isInit ){.
2700: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58  #ifdef SQLITE_EX
2710: 54 52 41 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20  TRA_SHUTDOWN.   
2720: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 45 58 54   void SQLITE_EXT
2730: 52 41 5f 53 48 55 54 44 4f 57 4e 28 76 6f 69 64  RA_SHUTDOWN(void
2740: 29 3b 0a 20 20 20 20 53 51 4c 49 54 45 5f 45 58  );.    SQLITE_EX
2750: 54 52 41 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a  TRA_SHUTDOWN();.
2760: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
2770: 65 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20  e3_os_end();.   
2780: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 5f 61   sqlite3_reset_a
2790: 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b  uto_extension();
27a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
27b0: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
27c0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
27d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
27e0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
27f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
2800: 61 63 68 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a  acheShutdown();.
2810: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2820: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
2830: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
2840: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2850: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
2860: 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Init ){.    sqli
2870: 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a  te3MallocEnd();.
2880: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2890: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
28a0: 49 6e 69 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  Init = 0;..#ifnd
28b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
28c0: 48 55 54 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52  HUTDOWN_DIRECTOR
28d0: 49 45 53 0a 20 20 20 20 2f 2a 20 54 68 65 20 68  IES.    /* The h
28e0: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 68 61  eap subsystem ha
28f0: 73 20 6e 6f 77 20 62 65 65 6e 20 73 68 75 74 64  s now been shutd
2900: 6f 77 6e 20 61 6e 64 20 74 68 65 73 65 20 76 61  own and these va
2910: 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65  lues are suppose
2920: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e  d.    ** to be N
2930: 55 4c 4c 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20  ULL or point to 
2940: 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20  memory that was 
2950: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2960: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a  lite3_malloc(),.
2970: 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75      ** which wou
2980: 6c 64 20 72 65 6c 79 20 6f 6e 20 74 68 61 74 20  ld rely on that 
2990: 68 65 61 70 20 73 75 62 73 79 73 74 65 6d 3b 20  heap subsystem; 
29a0: 74 68 65 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20  therefore, make 
29b0: 73 75 72 65 20 74 68 65 73 65 0a 20 20 20 20 2a  sure these.    *
29c0: 2a 20 76 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20  * values cannot 
29d0: 72 65 66 65 72 20 74 6f 20 68 65 61 70 20 6d 65  refer to heap me
29e0: 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20 6a 75  mory that was ju
29f0: 73 74 20 69 6e 76 61 6c 69 64 61 74 65 64 20 77  st invalidated w
2a00: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 68  hen the.    ** h
2a10: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 77 61  eap subsystem wa
2a20: 73 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69  s shutdown.  Thi
2a30: 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69  s is only done i
2a40: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61  f the current ca
2a50: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69  ll to.    ** thi
2a60: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c  s function resul
2a70: 74 65 64 20 69 6e 20 74 68 65 20 68 65 61 70 20  ted in the heap 
2a80: 73 75 62 73 79 73 74 65 6d 20 61 63 74 75 61 6c  subsystem actual
2a90: 6c 79 20 62 65 69 6e 67 20 73 68 75 74 64 6f 77  ly being shutdow
2aa0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  n..    */.    sq
2ab0: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
2ac0: 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 73 71  tory = 0;.    sq
2ad0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2ae0: 74 6f 72 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66  tory = 0;.#endif
2af0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2b00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2b10: 73 4d 75 74 65 78 49 6e 69 74 20 29 7b 0a 20 20  sMutexInit ){.  
2b20: 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 45 6e    sqlite3MutexEn
2b30: 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d();.    sqlite3
2b40: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
2b50: 75 74 65 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20  utexInit = 0;.  
2b60: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
2b70: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2b80: 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77 73 20  This API allows 
2b90: 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20  applications to 
2ba0: 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f 62 61  modify the globa
2bb0: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  l configuration 
2bc0: 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  of.** the SQLite
2bd0: 20 6c 69 62 72 61 72 79 20 61 74 20 72 75 6e 2d   library at run-
2be0: 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  time..**.** This
2bf0: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
2c00: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
2c10: 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
2c20: 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
2c30: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2c40: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
2c50: 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 69  llocations.  Thi
2c60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
2c70: 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65 2e 20  .** threadsafe. 
2c80: 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65 65 64   Failure to heed
2c90: 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67 73 20   these warnings 
2ca0: 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70 72  can lead to unpr
2cb0: 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68  edictable.** beh
2cc0: 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
2cd0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74  lite3_config(int
2ce0: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
2cf0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
2d00: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2d10: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e    /* sqlite3_con
2d20: 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65 74 75  fig() shall retu
2d30: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
2d40: 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f 6b 65   if it is invoke
2d50: 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65  d while.  ** the
2d60: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
2d70: 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20  is in use. */.  
2d80: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2d90: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  lConfig.isInit )
2da0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
2db0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76  ISUSE_BKPT;..  v
2dc0: 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
2dd0: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
2de0: 0a 0a 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 63  ..    /* Mutex c
2df0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
2e00: 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20 61 76  ions are only av
2e10: 61 69 6c 61 62 6c 65 20 69 6e 20 61 20 74 68 72  ailable in a thr
2e20: 65 61 64 73 61 66 65 0a 20 20 20 20 2a 2a 20 63  eadsafe.    ** c
2e30: 6f 6d 70 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23  ompile..    */.#
2e40: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2e50: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
2e60: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
2e70: 46 45 3e 30 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  FE>0  /* IMP: R-
2e80: 35 34 34 36 36 2d 34 36 37 35 36 20 2a 2f 0a 20  54466-46756 */. 
2e90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2ea0: 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45  ONFIG_SINGLETHRE
2eb0: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  AD: {.      /* D
2ec0: 69 73 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78  isable all mutex
2ed0: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ing */.      sql
2ee0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2ef0: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b  .bCoreMutex = 0;
2f00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2f10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
2f20: 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Mutex = 0;.     
2f30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
2f40: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
2f50: 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41  (SQLITE_THREADSA
2f60: 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  FE) && SQLITE_TH
2f70: 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d  READSAFE>0 /* IM
2f80: 50 3a 20 52 2d 32 30 35 32 30 2d 35 34 30 38 36  P: R-20520-54086
2f90: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
2fa0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49  ITE_CONFIG_MULTI
2fb0: 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20  THREAD: {.      
2fc0: 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78  /* Disable mutex
2fd0: 69 6e 67 20 6f 66 20 64 61 74 61 62 61 73 65 20  ing of database 
2fe0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20  connections */. 
2ff0: 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d       /* Enable m
3000: 75 74 65 78 69 6e 67 20 6f 66 20 63 6f 72 65 20  utexing of core 
3010: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
3020: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3030: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
3040: 72 65 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20  reMutex = 1;.   
3050: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3060: 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
3070: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  x = 0;.      bre
3080: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
3090: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
30a0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20  ITE_THREADSAFE) 
30b0: 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
30c0: 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52  SAFE>0 /* IMP: R
30d0: 2d 35 39 35 39 33 2d 32 31 38 31 30 20 2a 2f 0a  -59593-21810 */.
30e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
30f0: 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49 5a 45  CONFIG_SERIALIZE
3100: 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e  D: {.      /* En
3110: 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e  able all mutexin
3120: 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  g */.      sqlit
3130: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
3140: 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 0a 20  CoreMutex = 1;. 
3150: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3160: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
3170: 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  tex = 1;.      b
3180: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3190: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
31a0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
31b0: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
31c0: 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a  ADSAFE>0 /* IMP:
31d0: 20 52 2d 36 33 36 36 36 2d 34 38 37 35 35 20 2a   R-63666-48755 *
31e0: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
31f0: 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20  E_CONFIG_MUTEX: 
3200: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69  {.      /* Speci
3210: 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  fy an alternativ
3220: 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e  e mutex implemen
3230: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
3240: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3250: 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f  fig.mutex = *va_
3260: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
3270: 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b  mutex_methods*);
3280: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3290: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
32a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48  efined(SQLITE_TH
32b0: 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c  READSAFE) && SQL
32c0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
32d0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 34 34 35 30   /* IMP: R-14450
32e0: 2d 33 37 35 39 37 20 2a 2f 0a 20 20 20 20 63 61  -37597 */.    ca
32f0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3300: 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20  _GETMUTEX: {.   
3310: 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20 74     /* Retrieve t
3320: 68 65 20 63 75 72 72 65 6e 74 20 6d 75 74 65 78  he current mutex
3330: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
3340: 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67  */.      *va_arg
3350: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74  (ap, sqlite3_mut
3360: 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73  ex_methods*) = s
3370: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3380: 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20 20 20 20  ig.mutex;.      
3390: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
33a0: 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51  dif..    case SQ
33b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c  LITE_CONFIG_MALL
33c0: 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  OC: {.      /* E
33d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35  VIDENCE-OF: R-55
33e0: 35 39 34 2d 32 31 30 33 30 20 54 68 65 20 53 51  594-21030 The SQ
33f0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c  LITE_CONFIG_MALL
3400: 4f 43 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  OC option takes 
3410: 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c  a.      ** singl
3420: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
3430: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
3440: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
3450: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  the.      ** sql
3460: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
3470: 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 20   structure. The 
3480: 61 72 67 75 6d 65 6e 74 20 73 70 65 63 69 66 69  argument specifi
3490: 65 73 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 20  es alternative. 
34a0: 20 20 20 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76 65       ** low-leve
34b0: 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  l memory allocat
34c0: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 6f 20  ion routines to 
34d0: 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  be used in place
34e0: 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20   of the memory. 
34f0: 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69       ** allocati
3500: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 62 75 69 6c  on routines buil
3510: 74 20 69 6e 74 6f 20 53 51 4c 69 74 65 2e 20 2a  t into SQLite. *
3520: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3530: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20  lobalConfig.m = 
3540: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
3550: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a  te3_mem_methods*
3560: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3570: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
3580: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3590: 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
35a0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
35b0: 52 2d 35 31 32 31 33 2d 34 36 34 31 34 20 54 68  R-51213-46414 Th
35c0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
35d0: 47 45 54 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e  GETMALLOC option
35e0: 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a   takes a.      *
35f0: 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
3600: 74 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69  t which is a poi
3610: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
3620: 6e 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  nce of the.     
3630: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f   ** sqlite3_mem_
3640: 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72  methods structur
3650: 65 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d  e. The sqlite3_m
3660: 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63  em_methods struc
3670: 74 75 72 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  ture is.      **
3680: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
3690: 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
36a0: 65 64 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ed memory alloca
36b0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 2e 20 2a  tion routines. *
36c0: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
36d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
36e0: 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73  m.xMalloc==0 ) s
36f0: 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61  qlite3MemSetDefa
3700: 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 2a 76 61  ult();.      *va
3710: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3720: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d  _mem_methods*) =
3730: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3740: 6e 66 69 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72  nfig.m;.      br
3750: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
3760: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3770: 47 5f 4d 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20  G_MEMSTATUS: {. 
3780: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3790: 2d 4f 46 3a 20 52 2d 36 31 32 37 35 2d 33 35 31  -OF: R-61275-351
37a0: 35 37 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  57 The SQLITE_CO
37b0: 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 20 6f  NFIG_MEMSTATUS o
37c0: 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20  ption takes.    
37d0: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75    ** single argu
37e0: 6d 65 6e 74 20 6f 66 20 74 79 70 65 20 69 6e 74  ment of type int
37f0: 2c 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  , interpreted as
3800: 20 61 20 62 6f 6f 6c 65 61 6e 2c 20 77 68 69 63   a boolean, whic
3810: 68 20 65 6e 61 62 6c 65 73 0a 20 20 20 20 20 20  h enables.      
3820: 2a 2a 20 6f 72 20 64 69 73 61 62 6c 65 73 20 74  ** or disables t
3830: 68 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66  he collection of
3840: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
3850: 6f 6e 20 73 74 61 74 69 73 74 69 63 73 2e 20 2a  on statistics. *
3860: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3870: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d  lobalConfig.bMem
3880: 73 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61 70  stat = va_arg(ap
3890: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
38a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
38b0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
38c0: 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20 20  G_SCRATCH: {.   
38d0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
38e0: 46 3a 20 52 2d 30 38 34 30 34 2d 36 30 38 38 37  F: R-08404-60887
38f0: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
3900: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20   arguments to.  
3910: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f      ** SQLITE_CO
3920: 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 41 20  NFIG_SCRATCH: A 
3930: 70 6f 69 6e 74 65 72 20 61 6e 20 38 2d 62 79 74  pointer an 8-byt
3940: 65 20 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72 79  e aligned memory
3950: 20 62 75 66 66 65 72 20 66 72 6f 6d 0a 20 20 20   buffer from.   
3960: 20 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65 20     ** which the 
3970: 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74 69  scratch allocati
3980: 6f 6e 73 20 77 69 6c 6c 20 62 65 20 64 72 61 77  ons will be draw
3990: 6e 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20 65  n, the size of e
39a0: 61 63 68 20 73 63 72 61 74 63 68 0a 20 20 20 20  ach scratch.    
39b0: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20    ** allocation 
39c0: 28 73 7a 29 2c 20 61 6e 64 20 74 68 65 20 6d 61  (sz), and the ma
39d0: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
39e0: 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74 69  scratch allocati
39f0: 6f 6e 73 20 28 4e 29 2e 20 2a 2f 0a 20 20 20 20  ons (N). */.    
3a00: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3a10: 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68 20 3d  onfig.pScratch =
3a20: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
3a30: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
3a40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
3a50: 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67  Scratch = va_arg
3a60: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3a70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3a80: 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 20 3d 20  nfig.nScratch = 
3a90: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3aa0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3ab0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
3ac0: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43  ITE_CONFIG_PAGEC
3ad0: 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ACHE: {.      /*
3ae0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
3af0: 33 31 34 30 38 2d 34 30 35 31 30 20 54 68 65 72  31408-40510 Ther
3b00: 65 20 61 72 65 20 74 68 72 65 65 20 61 72 67 75  e are three argu
3b10: 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a  ments to.      *
3b20: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  * SQLITE_CONFIG_
3b30: 50 41 47 45 43 41 43 48 45 3a 20 41 20 70 6f 69  PAGECACHE: A poi
3b40: 6e 74 65 72 20 74 6f 20 38 2d 62 79 74 65 20 61  nter to 8-byte a
3b50: 6c 69 67 6e 65 64 20 6d 65 6d 6f 72 79 2c 20 74  ligned memory, t
3b60: 68 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a  he size.      **
3b70: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 62 75   of each page bu
3b80: 66 66 65 72 20 28 73 7a 29 2c 20 61 6e 64 20 74  ffer (sz), and t
3b90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
3ba0: 65 73 20 28 4e 29 2e 20 2a 2f 0a 20 20 20 20 20  es (N). */.     
3bb0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3bc0: 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f  nfig.pPage = va_
3bd0: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
3be0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3bf0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65  balConfig.szPage
3c00: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3c10: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
3c20: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
3c30: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
3c40: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
3c50: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3c60: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3c70: 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 3a 20 7b  _PCACHE_HDRSZ: {
3c80: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
3c90: 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30 30 2d 32  CE-OF: R-39100-2
3ca0: 37 33 31 37 20 54 68 65 20 53 51 4c 49 54 45 5f  7317 The SQLITE_
3cb0: 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f 48 44  CONFIG_PCACHE_HD
3cc0: 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  RSZ option takes
3cd0: 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67  .      ** a sing
3ce0: 6c 65 20 70 61 72 61 6d 65 74 65 72 20 77 68 69  le parameter whi
3cf0: 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ch is a pointer 
3d00: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e  to an integer an
3d10: 64 20 77 72 69 74 65 73 20 69 6e 74 6f 0a 20 20  d writes into.  
3d20: 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e 74 65      ** that inte
3d30: 67 65 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ger the number o
3d40: 66 20 65 78 74 72 61 20 62 79 74 65 73 20 70 65  f extra bytes pe
3d50: 72 20 70 61 67 65 20 72 65 71 75 69 72 65 64 20  r page required 
3d60: 66 6f 72 20 65 61 63 68 20 70 61 67 65 0a 20 20  for each page.  
3d70: 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c 49 54 45      ** in SQLITE
3d80: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
3d90: 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f  E. */.      *va_
3da0: 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 20 3d 20  arg(ap, int*) = 
3db0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
3dc0: 65 33 48 65 61 64 65 72 53 69 7a 65 42 74 72 65  e3HeaderSizeBtre
3dd0: 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20  e() +.          
3de0: 73 71 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a  sqlite3HeaderSiz
3df0: 65 50 63 61 63 68 65 28 29 20 2b 0a 20 20 20 20  ePcache() +.    
3e00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 65 61        sqlite3Hea
3e10: 64 65 72 53 69 7a 65 50 63 61 63 68 65 31 28 29  derSizePcache1()
3e20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3e30: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53     }..    case S
3e40: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41  QLITE_CONFIG_PCA
3e50: 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  CHE: {.      /* 
3e60: 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62  no-op */.      b
3e70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3e80: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3e90: 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20 7b 0a  IG_GETPCACHE: {.
3ea0: 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 6e 20        /* now an 
3eb0: 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72  error */.      r
3ec0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
3ed0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3ee0: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53     }..    case S
3ef0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41  QLITE_CONFIG_PCA
3f00: 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CHE2: {.      /*
3f10: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
3f20: 36 33 33 32 35 2d 34 38 33 37 38 20 54 68 65 20  63325-48378 The 
3f30: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43  SQLITE_CONFIG_PC
3f40: 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b  ACHE2 option tak
3f50: 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69  es a.      ** si
3f60: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  ngle argument wh
3f70: 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ich is a pointer
3f80: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70   to an sqlite3_p
3f90: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20  cache_methods2. 
3fa0: 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20       ** object. 
3fb0: 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70 65 63  This object spec
3fc0: 69 66 69 65 73 20 74 68 65 20 69 6e 74 65 72 66  ifies the interf
3fd0: 61 63 65 20 74 6f 20 61 20 63 75 73 74 6f 6d 20  ace to a custom 
3fe0: 70 61 67 65 20 63 61 63 68 65 0a 20 20 20 20 20  page cache.     
3ff0: 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   ** implementati
4000: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  on. */.      sql
4010: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4020: 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61 5f 61  .pcache2 = *va_a
4030: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70  rg(ap, sqlite3_p
4040: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29  cache_methods2*)
4050: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4060: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
4070: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50  LITE_CONFIG_GETP
4080: 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20  CACHE2: {.      
4090: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
40a0: 52 2d 32 32 30 33 35 2d 34 36 31 38 32 20 54 68  R-22035-46182 Th
40b0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
40c0: 47 45 54 50 43 41 43 48 45 32 20 6f 70 74 69 6f  GETPCACHE2 optio
40d0: 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20  n takes a.      
40e0: 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65  ** single argume
40f0: 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70 6f  nt which is a po
4100: 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
4110: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
4120: 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a  ds2.      ** obj
4130: 65 63 74 2e 20 53 51 4c 69 74 65 20 63 6f 70 69  ect. SQLite copi
4140: 65 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  es of the curren
4150: 74 20 70 61 67 65 20 63 61 63 68 65 20 69 6d 70  t page cache imp
4160: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 6f  lementation into
4170: 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f  .      ** that o
4180: 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20  bject. */.      
4190: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
41a0: 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 2e  lConfig.pcache2.
41b0: 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  xInit==0 ){.    
41c0: 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63 68      sqlite3PCach
41d0: 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20  eSetDefault();. 
41e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 76 61       }.      *va
41f0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
4200: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
4210: 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  *) = sqlite3Glob
4220: 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32  alConfig.pcache2
4230: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4240: 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44 45 4e 43     }../* EVIDENC
4250: 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36 2d 31 32  E-OF: R-06626-12
4260: 39 31 31 20 54 68 65 20 53 51 4c 49 54 45 5f 43  911 The SQLITE_C
4270: 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70 74 69 6f  ONFIG_HEAP optio
4280: 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61  n is only.** ava
4290: 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69 74 65  ilable if SQLite
42a0: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
42b0: 68 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  h either SQLITE_
42c0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6f  ENABLE_MEMSYS3 o
42d0: 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  r.** SQLITE_ENAB
42e0: 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e 64 20 72  LE_MEMSYS5 and r
42f0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 52  eturns SQLITE_ER
4300: 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65 64 20 6f  ROR if invoked o
4310: 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 23 69 66  therwise. */.#if
4320: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4330: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20  ENABLE_MEMSYS3) 
4340: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
4350: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
4360: 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
4370: 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b  E_CONFIG_HEAP: {
4380: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
4390: 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35 34 2d 34  CE-OF: R-19854-4
43a0: 32 31 32 36 20 54 68 65 72 65 20 61 72 65 20 74  2126 There are t
43b0: 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74  hree arguments t
43c0: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  o.      ** SQLIT
43d0: 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 41  E_CONFIG_HEAP: A
43e0: 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  n 8-byte aligned
43f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4400: 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20 20 20 20  memory, the.    
4410: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62    ** number of b
4420: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 65 6d 6f  ytes in the memo
4430: 72 79 20 62 75 66 66 65 72 2c 20 61 6e 64 20 74  ry buffer, and t
4440: 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 63  he minimum alloc
4450: 61 74 69 6f 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20  ation size. */. 
4460: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4470: 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d  alConfig.pHeap =
4480: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
4490: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
44a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
44b0: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
44c0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
44d0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
44e0: 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28  .mnReq = va_arg(
44f0: 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20  ap, int);..     
4500: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
4510: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c 31  alConfig.mnReq<1
4520: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4530: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4540: 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20 20 20 20  mnReq = 1;.     
4550: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
4560: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4570: 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b 0a  nReq>(1<<12) ){.
4580: 20 20 20 20 20 20 20 20 2f 2a 20 63 61 70 20 6d          /* cap m
4590: 69 6e 20 72 65 71 75 65 73 74 20 73 69 7a 65 20  in request size 
45a0: 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20 20  at 2^12 */.     
45b0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
45c0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 28  Config.mnReq = (
45d0: 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d 0a  1<<12);.      }.
45e0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
45f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
4600: 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Heap==0 ){.     
4610: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
4620: 46 3a 20 52 2d 34 39 39 32 30 2d 36 30 31 38 39  F: R-49920-60189
4630: 20 49 66 20 74 68 65 20 66 69 72 73 74 20 70 6f   If the first po
4640: 69 6e 74 65 72 20 28 74 68 65 20 6d 65 6d 6f 72  inter (the memor
4650: 79 20 70 6f 69 6e 74 65 72 29 0a 20 20 20 20 20  y pointer).     
4660: 20 20 20 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74     ** is NULL, t
4670: 68 65 6e 20 53 51 4c 69 74 65 20 72 65 76 65 72  hen SQLite rever
4680: 74 73 20 74 6f 20 75 73 69 6e 67 20 69 74 73 20  ts to using its 
4690: 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20 61  default memory a
46a0: 6c 6c 6f 63 61 74 6f 72 0a 20 20 20 20 20 20 20  llocator.       
46b0: 20 2a 2a 20 28 74 68 65 20 73 79 73 74 65 6d 20   ** (the system 
46c0: 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65  malloc() impleme
46d0: 6e 74 61 74 69 6f 6e 29 2c 20 75 6e 64 6f 69 6e  ntation), undoin
46e0: 67 20 61 6e 79 20 70 72 69 6f 72 20 69 6e 76 6f  g any prior invo
46f0: 63 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20  cation of.      
4700: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46    ** SQLITE_CONF
4710: 49 47 5f 4d 41 4c 4c 4f 43 2e 0a 20 20 20 20 20  IG_MALLOC..     
4720: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
4730: 20 53 65 74 74 69 6e 67 20 73 71 6c 69 74 65 33   Setting sqlite3
4740: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 74  GlobalConfig.m t
4750: 6f 20 61 6c 6c 20 7a 65 72 6f 73 20 77 69 6c 6c  o all zeros will
4760: 20 63 61 75 73 65 20 6d 61 6c 6c 6f 63 20 74 6f   cause malloc to
4770: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 76 65  .        ** reve
4780: 72 74 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c  rt to its defaul
4790: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
47a0: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e   when sqlite3_in
47b0: 69 74 69 61 6c 69 7a 65 28 29 20 69 73 20 72 75  itialize() is ru
47c0: 6e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  n.        */.   
47d0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c       memset(&sql
47e0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
47f0: 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71  .m, 0, sizeof(sq
4800: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4810: 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  g.m));.      }el
4820: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
4830: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31  VIDENCE-OF: R-61
4840: 30 30 36 2d 30 38 39 31 38 20 49 66 20 74 68 65  006-08918 If the
4850: 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 20   memory pointer 
4860: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
4870: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
4880: 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 65 6d 6f  alternative memo
4890: 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20  ry allocator is 
48a0: 65 6e 67 61 67 65 64 20 74 6f 20 68 61 6e 64 6c  engaged to handl
48b0: 65 20 61 6c 6c 20 6f 66 20 53 51 4c 69 74 65 73  e all of SQLites
48c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 6f  .        ** memo
48d0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6e 65  ry allocation ne
48e0: 65 64 73 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53  eds. */.#ifdef S
48f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
4900: 53 59 53 33 0a 20 20 20 20 20 20 20 20 73 71 6c  SYS3.        sql
4910: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4920: 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d  .m = *sqlite3Mem
4930: 47 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23 65  GetMemsys3();.#e
4940: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
4950: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
4960: 35 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  5.        sqlite
4970: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20  3GlobalConfig.m 
4980: 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74  = *sqlite3MemGet
4990: 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64 69  Memsys5();.#endi
49a0: 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
49b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
49c0: 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51  dif..    case SQ
49d0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b  LITE_CONFIG_LOOK
49e0: 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 73  ASIDE: {.      s
49f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4a00: 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d  ig.szLookaside =
4a10: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4a20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4a30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f  lobalConfig.nLoo
4a40: 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28  kaside = va_arg(
4a50: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
4a60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4a70: 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20   .    /* Record 
4a80: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
4a90: 20 6c 6f 67 67 65 72 20 66 75 6e 63 74 69 6f 6e   logger function
4aa0: 20 61 6e 64 20 69 74 73 20 66 69 72 73 74 20 61   and its first a
4ab0: 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a 20  rgument..    ** 
4ac0: 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 4e  The default is N
4ad0: 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69 73  ULL.  Logging is
4ae0: 20 64 69 73 61 62 6c 65 64 20 69 66 20 74 68 65   disabled if the
4af0: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
4b00: 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c  r is.    ** NULL
4b10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
4b20: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4b30: 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOG: {.      /* 
4b40: 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20 61 62  MSVC is picky ab
4b50: 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63  out pulling func
4b60: 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69   ptrs from va li
4b70: 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74  sts..      ** ht
4b80: 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63  tp://support.mic
4b90: 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37  rosoft.com/kb/47
4ba0: 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  961.      ** sql
4bb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4bc0: 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  .xLog = va_arg(a
4bd0: 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a  p, void(*)(void*
4be0: 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a  ,int,const char*
4bf0: 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ));.      */.   
4c00: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
4c10: 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64  *LOGFUNC_t)(void
4c20: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
4c30: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
4c40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
4c50: 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  og = va_arg(ap, 
4c60: 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20  LOGFUNC_t);.    
4c70: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4c80: 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d 20  onfig.pLogArg = 
4c90: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
4ca0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4cb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 56      }..    /* EV
4cc0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
4cd0: 34 38 2d 33 33 38 31 37 20 54 68 65 20 63 6f 6d  48-33817 The com
4ce0: 70 69 6c 65 2d 74 69 6d 65 20 73 65 74 74 69 6e  pile-time settin
4cf0: 67 20 66 6f 72 20 55 52 49 20 66 69 6c 65 6e 61  g for URI filena
4d00: 6d 65 73 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62  mes.    ** can b
4d10: 65 20 63 68 61 6e 67 65 64 20 61 74 20 73 74 61  e changed at sta
4d20: 72 74 2d 74 69 6d 65 20 75 73 69 6e 67 20 74 68  rt-time using th
4d30: 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
4d40: 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
4d50: 4f 4e 46 49 47 5f 55 52 49 2c 31 29 20 6f 72 0a  ONFIG_URI,1) or.
4d60: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
4d70: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
4d80: 46 49 47 5f 55 52 49 2c 30 29 20 63 6f 6e 66 69  FIG_URI,0) confi
4d90: 67 75 72 61 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a  guration calls..
4da0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4db0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
4dc0: 49 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  I: {.      /* EV
4dd0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 34  IDENCE-OF: R-254
4de0: 35 31 2d 36 31 31 32 35 20 54 68 65 20 53 51 4c  51-61125 The SQL
4df0: 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 20 6f  ITE_CONFIG_URI o
4e00: 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69  ption takes a si
4e10: 6e 67 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 72  ngle.      ** ar
4e20: 67 75 6d 65 6e 74 20 6f 66 20 74 79 70 65 20 69  gument of type i
4e30: 6e 74 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c  nt. If non-zero,
4e40: 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64 6c 69   then URI handli
4e50: 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20  ng is globally. 
4e60: 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e       ** enabled.
4e70: 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
4e80: 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  r is zero, then 
4e90: 55 52 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20  URI handling is 
4ea0: 67 6c 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a  globally.      *
4eb0: 2a 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20  * disabled. */. 
4ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4ed0: 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72  alConfig.bOpenUr
4ee0: 69 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  i = va_arg(ap, i
4ef0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
4f00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
4f10: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4f20: 43 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f 53  COVERING_INDEX_S
4f30: 43 41 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  CAN: {.      /* 
4f40: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
4f50: 36 35 39 32 2d 30 32 37 37 32 20 54 68 65 20 53  6592-02772 The S
4f60: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f 56  QLITE_CONFIG_COV
4f70: 45 52 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41 4e  ERING_INDEX_SCAN
4f80: 0a 20 20 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e  .      ** option
4f90: 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20   takes a single 
4fa0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
4fb0: 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
4fc0: 72 65 74 65 64 20 61 73 20 61 0a 20 20 20 20 20  reted as a.     
4fd0: 20 2a 2a 20 62 6f 6f 6c 65 61 6e 20 69 6e 20 6f   ** boolean in o
4fe0: 72 64 65 72 20 74 6f 20 65 6e 61 62 6c 65 20 6f  rder to enable o
4ff0: 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 75 73  r disable the us
5000: 65 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e  e of covering in
5010: 64 69 63 65 73 20 66 6f 72 0a 20 20 20 20 20 20  dices for.      
5020: 2a 2a 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63  ** full table sc
5030: 61 6e 73 20 69 6e 20 74 68 65 20 71 75 65 72 79  ans in the query
5040: 20 6f 70 74 69 6d 69 7a 65 72 2e 20 2a 2f 0a 20   optimizer. */. 
5050: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
5060: 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73  alConfig.bUseCis
5070: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
5080: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
5090: 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
50a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
50b0: 4c 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51 4c  LOG.    case SQL
50c0: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f  ITE_CONFIG_SQLLO
50d0: 47 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64  G: {.      typed
50e0: 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47 46  ef void(*SQLLOGF
50f0: 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73 71  UNC_t)(void*, sq
5100: 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68  lite3*, const ch
5110: 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  ar*, int);.     
5120: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5130: 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20 76  nfig.xSqllog = v
5140: 61 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f 47  a_arg(ap, SQLLOG
5150: 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 73  FUNC_t);.      s
5160: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
5170: 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d 20  ig.pSqllogArg = 
5180: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 20  va_arg(ap, void 
5190: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
51a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
51b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
51c0: 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 3a  ONFIG_MMAP_SIZE:
51d0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
51e0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 36 33  ENCE-OF: R-58063
51f0: 2d 33 38 32 35 38 20 53 51 4c 49 54 45 5f 43 4f  -38258 SQLITE_CO
5200: 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 20 74  NFIG_MMAP_SIZE t
5210: 61 6b 65 73 20 74 77 6f 20 36 34 2d 62 69 74 0a  akes two 64-bit.
5220: 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
5230: 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
5240: 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65   values that are
5250: 20 74 68 65 20 64 65 66 61 75 6c 74 20 6d 6d 61   the default mma
5260: 70 20 73 69 7a 65 20 6c 69 6d 69 74 0a 20 20 20  p size limit.   
5270: 20 20 20 2a 2a 20 28 74 68 65 20 64 65 66 61 75     ** (the defau
5280: 6c 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 50  lt setting for P
5290: 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 29  RAGMA mmap_size)
52a0: 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d   and the maximum
52b0: 20 61 6c 6c 6f 77 65 64 0a 20 20 20 20 20 20 2a   allowed.      *
52c0: 2a 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d 69  * mmap size limi
52d0: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  t. */.      sqli
52e0: 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70  te3_int64 szMmap
52f0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
5300: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
5310: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
5320: 34 20 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72  4 mxMmap = va_ar
5330: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  g(ap, sqlite3_in
5340: 74 36 34 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45  t64);.      /* E
5350: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33  VIDENCE-OF: R-53
5360: 33 36 37 2d 34 33 31 39 30 20 49 66 20 65 69 74  367-43190 If eit
5370: 68 65 72 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  her argument to 
5380: 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 0a 20  this option is. 
5390: 20 20 20 20 20 2a 2a 20 6e 65 67 61 74 69 76 65       ** negative
53a0: 2c 20 74 68 65 6e 20 74 68 61 74 20 61 72 67 75  , then that argu
53b0: 6d 65 6e 74 20 69 73 20 63 68 61 6e 67 65 64 20  ment is changed 
53c0: 74 6f 20 69 74 73 20 63 6f 6d 70 69 6c 65 2d 74  to its compile-t
53d0: 69 6d 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 20  ime default..   
53e0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
53f0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34  VIDENCE-OF: R-34
5400: 39 39 33 2d 34 35 30 33 31 20 54 68 65 20 6d 61  993-45031 The ma
5410: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 6d 6d  ximum allowed mm
5420: 61 70 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 0a  ap size will be.
5430: 20 20 20 20 20 20 2a 2a 20 73 69 6c 65 6e 74 6c        ** silentl
5440: 79 20 74 72 75 6e 63 61 74 65 64 20 69 66 20 6e  y truncated if n
5450: 65 63 65 73 73 61 72 79 20 73 6f 20 74 68 61 74  ecessary so that
5460: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 63   it does not exc
5470: 65 65 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  eed the.      **
5480: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6d 61   compile-time ma
5490: 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65 20  ximum mmap size 
54a0: 73 65 74 20 62 79 20 74 68 65 20 53 51 4c 49 54  set by the SQLIT
54b0: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 0a  E_MAX_MMAP_SIZE.
54c0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
54d0: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20 20  -time option..  
54e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
54f0: 20 6d 78 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d   mxMmap<0 || mxM
5500: 6d 61 70 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  map>SQLITE_MAX_M
5510: 4d 41 50 5f 53 49 5a 45 20 29 20 6d 78 4d 6d 61  MAP_SIZE ) mxMma
5520: 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  p = SQLITE_MAX_M
5530: 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  MAP_SIZE;.      
5540: 69 66 28 20 73 7a 4d 6d 61 70 3c 30 20 29 20 73  if( szMmap<0 ) s
5550: 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44  zMmap = SQLITE_D
5560: 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45  EFAULT_MMAP_SIZE
5570: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d  ;.      if( szMm
5580: 61 70 3e 6d 78 4d 6d 61 70 29 20 73 7a 4d 6d 61  ap>mxMmap) szMma
5590: 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  p = mxMmap;.    
55a0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
55b0: 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d  onfig.mxMmap = m
55c0: 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c  xMmap;.      sql
55d0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
55e0: 2e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70  .szMmap = szMmap
55f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5600: 20 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45     }..#if SQLITE
5610: 5f 4f 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e  _OS_WIN && defin
5620: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5630: 4d 41 4c 4c 4f 43 29 20 2f 2a 20 49 4d 50 3a 20  MALLOC) /* IMP: 
5640: 52 2d 30 34 37 38 30 2d 35 35 38 31 35 20 2a 2f  R-04780-55815 */
5650: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5660: 5f 43 4f 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45  _CONFIG_WIN32_HE
5670: 41 50 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  APSIZE: {.      
5680: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
5690: 52 2d 33 34 39 32 36 2d 30 33 33 36 30 20 53 51  R-34926-03360 SQ
56a0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e 33  LITE_CONFIG_WIN3
56b0: 32 5f 48 45 41 50 53 49 5a 45 20 74 61 6b 65 73  2_HEAPSIZE takes
56c0: 20 61 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20   a 32-bit.      
56d0: 2a 2a 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  ** unsigned inte
56e0: 67 65 72 20 76 61 6c 75 65 20 74 68 61 74 20 73  ger value that s
56f0: 70 65 63 69 66 69 65 73 20 74 68 65 20 6d 61 78  pecifies the max
5700: 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65  imum size of the
5710: 20 63 72 65 61 74 65 64 0a 20 20 20 20 20 20 2a   created.      *
5720: 2a 20 68 65 61 70 2e 20 2a 2f 0a 20 20 20 20 20  * heap. */.     
5730: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5740: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
5750: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
5760: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5770: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
5780: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
5790: 50 4d 41 53 5a 3a 20 7b 0a 20 20 20 20 20 20 73  PMASZ: {.      s
57a0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
57b0: 69 67 2e 73 7a 50 6d 61 20 3d 20 76 61 5f 61 72  ig.szPma = va_ar
57c0: 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69  g(ap, unsigned i
57d0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
57e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66  ;.    }..    def
57f0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63  ault: {.      rc
5800: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
5810: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5820: 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64    }.  }.  va_end
5830: 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (ap);.  return r
5840: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
5850: 75 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  up the lookaside
5860: 20 62 75 66 66 65 72 73 20 66 6f 72 20 61 20 64   buffers for a d
5870: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5880: 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  on..** Return SQ
5890: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
58a0: 73 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b  ss.  .** If look
58b0: 61 73 69 64 65 20 69 73 20 61 6c 72 65 61 64 79  aside is already
58c0: 20 61 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20   active, return 
58d0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a  SQLITE_BUSY..**.
58e0: 2a 2a 20 54 68 65 20 73 7a 20 70 61 72 61 6d 65  ** The sz parame
58f0: 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ter is the numbe
5900: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 65 61  r of bytes in ea
5910: 63 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f  ch lookaside slo
5920: 74 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70 61  t..** The cnt pa
5930: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e  rameter is the n
5940: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20  umber of slots. 
5950: 20 49 66 20 70 53 74 61 72 74 20 69 73 20 4e 55   If pStart is NU
5960: 4c 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20  LL the.** space 
5970: 66 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64  for the lookasid
5980: 65 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74 61  e memory is obta
5990: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
59a0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49  3_malloc()..** I
59b0: 66 20 70 53 74 61 72 74 20 69 73 20 6e 6f 74 20  f pStart is not 
59c0: 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20  NULL then it is 
59d0: 73 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f 66 20  sz*cnt bytes of 
59e0: 6d 65 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f  memory to use fo
59f0: 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69  r.** the lookasi
5a00: 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  de memory..*/.st
5a10: 61 74 69 63 20 69 6e 74 20 73 65 74 75 70 4c 6f  atic int setupLo
5a20: 6f 6b 61 73 69 64 65 28 73 71 6c 69 74 65 33 20  okaside(sqlite3 
5a30: 2a 64 62 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  *db, void *pBuf,
5a40: 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74   int sz, int cnt
5a50: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 53 74 61 72  ){.  void *pStar
5a60: 74 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  t;.  if( db->loo
5a70: 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20  kaside.nOut ){. 
5a80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5a90: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  _BUSY;.  }.  /* 
5aa0: 46 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e  Free any existin
5ab0: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66  g lookaside buff
5ac0: 65 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64  er for this hand
5ad0: 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  le before.  ** a
5ae0: 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
5af0: 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20  one so we don't 
5b00: 68 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61  have to have spa
5b10: 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74  ce for .  ** bot
5b20: 68 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  h at the same ti
5b30: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  me..  */.  if( d
5b40: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
5b50: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
5b60: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
5b70: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
5b80: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
5b90: 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69  ize of a lookasi
5ba0: 64 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f  de slot after RO
5bb0: 55 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74  UNDDOWN8 needs t
5bc0: 6f 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a  o be larger.  **
5bd0: 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20   than a pointer 
5be0: 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20  to be useful..  
5bf0: 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44  */.  sz = ROUNDD
5c00: 4f 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d  OWN8(sz);  /* IM
5c10: 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32  P: R-33038-09382
5c20: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69   */.  if( sz<=(i
5c30: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
5c40: 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d  ideSlot*) ) sz =
5c50: 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20   0;.  if( cnt<0 
5c60: 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  ) cnt = 0;.  if(
5c70: 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30   sz==0 || cnt==0
5c80: 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a   ){.    sz = 0;.
5c90: 20 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a      pStart = 0;.
5ca0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66    }else if( pBuf
5cb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
5cc0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
5cd0: 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72  loc();.    pStar
5ce0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
5cf0: 63 28 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a  c( sz*cnt );  /*
5d00: 20 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35   IMP: R-61949-35
5d10: 37 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  727 */.    sqlit
5d20: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
5d30: 63 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  c();.    if( pSt
5d40: 61 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69  art ) cnt = sqli
5d50: 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53  te3MallocSize(pS
5d60: 74 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73  tart)/sz;.  }els
5d70: 65 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  e{.    pStart = 
5d80: 70 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  pBuf;.  }.  db->
5d90: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
5da0: 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d   = pStart;.  db-
5db0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65  >lookaside.pFree
5dc0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b   = 0;.  db->look
5dd0: 61 73 69 64 65 2e 73 7a 20 3d 20 28 75 31 36 29  aside.sz = (u16)
5de0: 73 7a 3b 0a 20 20 69 66 28 20 70 53 74 61 72 74  sz;.  if( pStart
5df0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
5e00: 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74     LookasideSlot
5e10: 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *p;.    assert(
5e20: 20 73 7a 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f   sz > (int)sizeo
5e30: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
5e40: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f  ) );.    p = (Lo
5e50: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70 53 74  okasideSlot*)pSt
5e60: 61 72 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63  art;.    for(i=c
5e70: 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  nt-1; i>=0; i--)
5e80: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74  {.      p->pNext
5e90: 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65   = db->lookaside
5ea0: 2e 70 46 72 65 65 3b 0a 20 20 20 20 20 20 64 62  .pFree;.      db
5eb0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
5ec0: 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 3d  e = p;.      p =
5ed0: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
5ee0: 29 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a  )&((u8*)p)[sz];.
5ef0: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f      }.    db->lo
5f00: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 70  okaside.pEnd = p
5f10: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
5f20: 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 31  ide.bEnabled = 1
5f30: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
5f40: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20  ide.bMalloced = 
5f50: 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20  pBuf==0 ?1:0;.  
5f60: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c  }else{.    db->l
5f70: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
5f80: 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = db;.    db->lo
5f90: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 64  okaside.pEnd = d
5fa0: 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  b;.    db->looka
5fb0: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
5fc0: 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  0;.    db->looka
5fd0: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d  side.bMalloced =
5fe0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5ff0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6000: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6010: 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64  mutex associated
6020: 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
6030: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
6040: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 73  sqlite3_mutex *s
6050: 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28  qlite3_db_mutex(
6060: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
6070: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6080: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
6090: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
60a0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
60b0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
60c0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
60d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
60e0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
60f0: 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a  db->mutex;.}../*
6100: 0a 2a 2a 20 46 72 65 65 20 75 70 20 61 73 20 6d  .** Free up as m
6110: 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 77 65  uch memory as we
6120: 20 63 61 6e 20 66 72 6f 6d 20 74 68 65 20 67 69   can from the gi
6130: 76 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ven database.** 
6140: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  connection..*/.i
6150: 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
6160: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c  lease_memory(sql
6170: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
6180: 20 69 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   i;..#ifdef SQLI
6190: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
61a0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
61b0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
61c0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
61d0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
61e0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
61f0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
6200: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69  ->mutex);.  sqli
6210: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
6220: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
6230: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
6240: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
6250: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
6260: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 29  t;.    if( pBt )
6270: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
6280: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
6290: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
62a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
62b0: 65 72 53 68 72 69 6e 6b 28 70 50 61 67 65 72 29  erShrink(pPager)
62c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
62d0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
62e0: 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  ll(db);.  sqlite
62f0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
6300: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
6310: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6320: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61  ./*.** Configura
6330: 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20 66 6f  tion settings fo
6340: 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20  r an individual 
6350: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
6360: 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ion.*/.int sqlit
6370: 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c  e3_db_config(sql
6380: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70  ite3 *db, int op
6390: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
63a0: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  t ap;.  int rc;.
63b0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f    va_start(ap, o
63c0: 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p);.  switch( op
63d0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
63e0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f  ITE_DBCONFIG_LOO
63f0: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
6400: 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f  void *pBuf = va_
6410: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20  arg(ap, void*); 
6420: 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d  /* IMP: R-26835-
6430: 31 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69  10964 */.      i
6440: 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
6450: 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f  p, int);       /
6460: 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32  * IMP: R-47871-2
6470: 35 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e  5994 */.      in
6480: 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61  t cnt = va_arg(a
6490: 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a  p, int);      /*
64a0: 20 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33   IMP: R-04460-53
64b0: 33 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  386 */.      rc 
64c0: 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65  = setupLookaside
64d0: 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63  (db, pBuf, sz, c
64e0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
64f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
6500: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61  ult: {.      sta
6510: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
6520: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f   {.        int o
6530: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  p;      /* The o
6540: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20  pcode */.       
6550: 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a   u32 mask;    /*
6560: 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74   Mask of the bit
6570: 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67   in sqlite3.flag
6580: 73 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a  s to set/clear *
6590: 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f  /.      } aFlagO
65a0: 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  p[] = {.        
65b0: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
65c0: 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20  G_ENABLE_FKEY,  
65d0: 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e    SQLITE_Foreign
65e0: 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20 20 20  Keys    },.     
65f0: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
6600: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47  NFIG_ENABLE_TRIG
6610: 47 45 52 2c 20 53 51 4c 49 54 45 5f 45 6e 61 62  GER, SQLITE_Enab
6620: 6c 65 54 72 69 67 67 65 72 20 20 7d 2c 0a 20 20  leTrigger  },.  
6630: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73      };.      uns
6640: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20  igned int i;.   
6650: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
6660: 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  RROR; /* IMP: R-
6670: 34 32 37 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20  42790-23372 */. 
6680: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
6690: 41 72 72 61 79 53 69 7a 65 28 61 46 6c 61 67 4f  ArraySize(aFlagO
66a0: 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  p); i++){.      
66b0: 20 20 69 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d    if( aFlagOp[i]
66c0: 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20  .op==op ){.     
66d0: 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d       int onoff =
66e0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
66f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
6700: 2a 70 52 65 73 20 3d 20 76 61 5f 61 72 67 28 61  *pRes = va_arg(a
6710: 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
6720: 20 20 20 20 69 6e 74 20 6f 6c 64 46 6c 61 67 73      int oldFlags
6730: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
6740: 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e 6f 66          if( onof
6750: 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  f>0 ){.         
6760: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
6770: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b  aFlagOp[i].mask;
6780: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
6790: 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b   if( onoff==0 ){
67a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
67b0: 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46 6c 61 67  >flags &= ~aFlag
67c0: 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  Op[i].mask;.    
67d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
67e0: 20 20 69 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d    if( oldFlags!=
67f0: 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20  db->flags ){.   
6800: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6810: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
6820: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
6830: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6840: 20 20 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a      if( pRes ){.
6850: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
6860: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
6870: 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b   aFlagOp[i].mask
6880: 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )!=0;.          
6890: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
68a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
68b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
68c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
68d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
68e0: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
68f0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
6900: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
6910: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 62 75  n true if the bu
6920: 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63  ffer z[0..n-1] c
6930: 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70 61 63  ontains all spac
6940: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
6950: 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73  t allSpaces(cons
6960: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
6970: 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  ){.  while( n>0 
6980: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29  && z[n-1]==' ' )
6990: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72  { n--; }.  retur
69a0: 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n n==0;.}../*.**
69b0: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
69c0: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66  ault collating f
69d0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42  unction named "B
69e0: 49 4e 41 52 59 22 20 77 68 69 63 68 20 69 73 20  INARY" which is 
69f0: 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61  always.** availa
6a00: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
6a10: 65 20 70 61 64 46 6c 61 67 20 61 72 67 75 6d 65  e padFlag argume
6a20: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  nt is not NULL t
6a30: 68 65 6e 20 73 70 61 63 65 20 70 61 64 64 69 6e  hen space paddin
6a40: 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20  g at the end.** 
6a50: 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20 69 67  of strings is ig
6a60: 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 6d 70  nored.  This imp
6a70: 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54 52 49  lements the RTRI
6a80: 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  M collation..*/.
6a90: 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f  static int binCo
6aa0: 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  llFunc(.  void *
6ab0: 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e  padFlag,.  int n
6ac0: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
6ad0: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
6ae0: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
6af0: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
6b00: 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b   rc, n;.  n = nK
6b10: 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79  ey1<nKey2 ? nKey
6b20: 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 2f 2a 20  1 : nKey2;.  /* 
6b30: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
6b40: 35 30 33 33 2d 32 38 34 34 39 20 54 68 65 20 62  5033-28449 The b
6b50: 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59 20 63  uilt-in BINARY c
6b60: 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70 61 72 65  ollation compare
6b70: 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 62  s.  ** strings b
6b80: 79 74 65 20 62 79 20 62 79 74 65 20 75 73 69 6e  yte by byte usin
6b90: 67 20 74 68 65 20 6d 65 6d 63 6d 70 28 29 20 66  g the memcmp() f
6ba0: 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  unction from the
6bb0: 20 73 74 61 6e 64 61 72 64 20 43 0a 20 20 2a 2a   standard C.  **
6bc0: 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a 20 20 72   library. */.  r
6bd0: 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31  c = memcmp(pKey1
6be0: 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69  , pKey2, n);.  i
6bf0: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
6c00: 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20  if( padFlag.    
6c10: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
6c20: 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20  char*)pKey1)+n, 
6c30: 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26  nKey1-n).     &&
6c40: 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61   allSpaces(((cha
6c50: 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65  r*)pKey2)+n, nKe
6c60: 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  y2-n).    ){.   
6c70: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
6c80: 46 3a 20 52 2d 33 31 36 32 34 2d 32 34 37 33 37  F: R-31624-24737
6c90: 20 52 54 52 49 4d 20 69 73 20 6c 69 6b 65 20 42   RTRIM is like B
6ca0: 49 4e 41 52 59 20 65 78 63 65 70 74 20 74 68 61  INARY except tha
6cb0: 74 20 65 78 74 72 61 0a 20 20 20 20 20 20 2a 2a  t extra.      **
6cc0: 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20 65   spaces at the e
6cd0: 6e 64 20 6f 66 20 65 69 74 68 65 72 20 73 74 72  nd of either str
6ce0: 69 6e 67 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67  ing do not chang
6cf0: 65 20 74 68 65 20 72 65 73 75 6c 74 2e 20 49 6e  e the result. In
6d00: 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
6d10: 77 6f 72 64 73 2c 20 73 74 72 69 6e 67 73 20 77  words, strings w
6d20: 69 6c 6c 20 63 6f 6d 70 61 72 65 20 65 71 75 61  ill compare equa
6d30: 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72  l to one another
6d40: 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 79   as long as they
6d50: 0a 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72  .      ** differ
6d60: 20 6f 6e 6c 79 20 69 6e 20 74 68 65 20 6e 75 6d   only in the num
6d70: 62 65 72 20 6f 66 20 73 70 61 63 65 73 20 61 74  ber of spaces at
6d80: 20 74 68 65 20 65 6e 64 2e 0a 20 20 20 20 20 20   the end..      
6d90: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
6da0: 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d      rc = nKey1 -
6db0: 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20   nKey2;.    }.  
6dc0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6dd0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20  ../*.** Another 
6de0: 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
6df0: 6e 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43  ng sequence: NOC
6e00: 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ASE. .**.** This
6e10: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
6e20: 6e 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  nce is intended 
6e30: 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 22  to be used for "
6e40: 63 61 73 65 20 69 6e 64 65 70 65 6e 64 65 6e 74  case independent
6e50: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e  .** comparison".
6e60: 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65   SQLite's knowle
6e70: 64 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64  dge of upper and
6e80: 20 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75 69   lower case equi
6e90: 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e  valents.** exten
6ea0: 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32  ds only to the 2
6eb0: 36 20 63 68 61 72 61 63 74 65 72 73 20 75 73 65  6 characters use
6ec0: 64 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68  d in the English
6ed0: 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a   language..**.**
6ee0: 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74   At the moment t
6ef0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55  here is only a U
6f00: 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74  TF-8 implementat
6f10: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
6f20: 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69  nt nocaseCollati
6f30: 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  ngFunc(.  void *
6f40: 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e  NotUsed,.  int n
6f50: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
6f60: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
6f70: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
6f80: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
6f90: 20 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e   r = sqlite3StrN
6fa0: 49 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e  ICmp(.      (con
6fb0: 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c  st char *)pKey1,
6fc0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
6fd0: 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65  Key2, (nKey1<nKe
6fe0: 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29  y2)?nKey1:nKey2)
6ff0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
7000: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
7010: 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20   if( 0==r ){.   
7020: 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32   r = nKey1-nKey2
7030: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
7040: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7050: 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  n the ROWID of t
7060: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69  he most recent i
7070: 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f  nsert.*/.sqlite_
7080: 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61  int64 sqlite3_la
7090: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
70a0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
70b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
70c0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
70d0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
70e0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
70f0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
7100: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
7110: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7120: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7130: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d  db->lastRowid;.}
7140: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7150: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
7160: 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74  nges in the most
7170: 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
7180: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
7190: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
71a0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
71b0: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
71c0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
71d0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
71e0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
71f0: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
7200: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
7210: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
7220: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
7230: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e  return db->nChan
7240: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ge;.}../*.** Ret
7250: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
7260: 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20  f changes since 
7270: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
7280: 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  dle was opened..
7290: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
72a0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c  otal_changes(sql
72b0: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
72c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
72d0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
72e0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
72f0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
7300: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
7310: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
7320: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
7330: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  dif.  return db-
7340: 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d  >nTotalChange;.}
7350: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
7360: 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
7370: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
7380: 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65   only manipulate
7390: 73 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a  s fields of the.
73a0: 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
73b0: 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f  le object, it do
73c0: 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79  es not close any
73d0: 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74   savepoints that
73e0: 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20   may be open.** 
73f0: 61 74 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61  at the b-tree/pa
7400: 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f  ger level..*/.vo
7410: 69 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53  id sqlite3CloseS
7420: 61 76 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65  avepoints(sqlite
7430: 33 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28  3 *db){.  while(
7440: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
7450: 29 7b 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74  ){.    Savepoint
7460: 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61   *pTmp = db->pSa
7470: 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d  vepoint;.    db-
7480: 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54  >pSavepoint = pT
7490: 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  mp->pNext;.    s
74a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
74b0: 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62   pTmp);.  }.  db
74c0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
74d0: 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  ;.  db->nStateme
74e0: 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73  nt = 0;.  db->is
74f0: 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70  TransactionSavep
7500: 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  oint = 0;.}../*.
7510: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 64 65  ** Invoke the de
7520: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
7530: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  n associated wit
7540: 68 20 46 75 6e 63 44 65 66 20 70 2c 20 69 66 20  h FuncDef p, if 
7550: 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20  any. Except,.** 
7560: 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  if this is not t
7570: 68 65 20 6c 61 73 74 20 63 6f 70 79 20 6f 66 20  he last copy of 
7580: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f  the function, do
7590: 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20   not invoke it. 
75a0: 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69  Multiple.** copi
75b0: 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 66  es of a single f
75c0: 75 6e 63 74 69 6f 6e 20 61 72 65 20 63 72 65 61  unction are crea
75d0: 74 65 64 20 77 68 65 6e 20 63 72 65 61 74 65 5f  ted when create_
75e0: 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 63 61  function() is ca
75f0: 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c  lled.** with SQL
7600: 49 54 45 5f 41 4e 59 20 61 73 20 74 68 65 20 65  ITE_ANY as the e
7610: 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ncoding..*/.stat
7620: 69 63 20 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e  ic void function
7630: 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 20  Destroy(sqlite3 
7640: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 29  *db, FuncDef *p)
7650: 7b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  {.  FuncDestruct
7660: 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 20  or *pDestructor 
7670: 3d 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72  = p->pDestructor
7680: 3b 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63  ;.  if( pDestruc
7690: 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74  tor ){.    pDest
76a0: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  ructor->nRef--;.
76b0: 20 20 20 20 69 66 28 20 70 44 65 73 74 72 75 63      if( pDestruc
76c0: 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  tor->nRef==0 ){.
76d0: 20 20 20 20 20 20 70 44 65 73 74 72 75 63 74 6f        pDestructo
76e0: 72 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73  r->xDestroy(pDes
76f0: 74 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61  tructor->pUserDa
7700: 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ta);.      sqlit
7710: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65  e3DbFree(db, pDe
7720: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d  structor);.    }
7730: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  .  }.}../*.** Di
7740: 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c  sconnect all sql
7750: 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74  ite3_vtab object
7760: 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
7770: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
7780: 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73  tion.** db. This
7790: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
77a0: 64 62 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73  db is being clos
77b0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
77c0: 69 64 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c  id disconnectAll
77d0: 56 74 61 62 28 73 71 6c 69 74 65 33 20 2a 64 62  Vtab(sqlite3 *db
77e0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
77f0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
7800: 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  BLE.  int i;.  s
7810: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
7820: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
7830: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
7840: 2b 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d 61 20  ++){.    Schema 
7850: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
7860: 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  Db[i].pSchema;. 
7870: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
7880: 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ].pSchema ){.   
7890: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
78a0: 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69        for(p=sqli
78b0: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
78c0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
78d0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
78e0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 20  ext(p)){.       
78f0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28   Table *pTab = (
7900: 54 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48 61  Table *)sqliteHa
7910: 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20  shData(p);.     
7920: 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
7930: 28 70 54 61 62 29 20 29 20 73 71 6c 69 74 65 33  (pTab) ) sqlite3
7940: 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64  VtabDisconnect(d
7950: 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
7960: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
7970: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
7980: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
7990: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
79a0: 64 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  db);.#else.  UNU
79b0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
79c0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
79d0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
79e0: 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  f database conne
79f0: 63 74 69 6f 6e 20 64 62 20 68 61 73 20 75 6e 66  ction db has unf
7a00: 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65  inalized prepare
7a10: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  d.** statements 
7a20: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71  or unfinished sq
7a30: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a  lite3_backup obj
7a40: 65 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  ects.  .*/.stati
7a50: 63 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  c int connection
7a60: 49 73 42 75 73 79 28 73 71 6c 69 74 65 33 20 2a  IsBusy(sqlite3 *
7a70: 64 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  db){.  int j;.  
7a80: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7a90: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
7aa0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64  utex) );.  if( d
7ab0: 62 2d 3e 70 56 64 62 65 20 29 20 72 65 74 75 72  b->pVdbe ) retur
7ac0: 6e 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  n 1;.  for(j=0; 
7ad0: 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b  j<db->nDb; j++){
7ae0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
7af0: 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74  = db->aDb[j].pBt
7b00: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  ;.    if( pBt &&
7b10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
7b20: 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29 20 72  nBackup(pBt) ) r
7b30: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
7b40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
7b50: 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74  * Close an exist
7b60: 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62  ing SQLite datab
7b70: 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ase.*/.static in
7b80: 74 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 73  t sqlite3Close(s
7b90: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
7ba0: 66 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20  forceZombie){.  
7bb0: 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 2f  if( !db ){.    /
7bc0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
7bd0: 2d 36 33 32 35 37 2d 31 31 37 34 30 20 43 61 6c  -63257-11740 Cal
7be0: 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f  ling sqlite3_clo
7bf0: 73 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  se() or.    ** s
7c00: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
7c10: 29 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f  ) with a NULL po
7c20: 69 6e 74 65 72 20 61 72 67 75 6d 65 6e 74 20 69  inter argument i
7c30: 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
7c40: 6f 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  op. */.    retur
7c50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
7c60: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
7c70: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
7c80: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
7c90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
7ca0: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73  SE_BKPT;.  }.  s
7cb0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
7cc0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a  er(db->mutex);..
7cd0: 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73 63    /* Force xDisc
7ce0: 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e 20  onnect calls on 
7cf0: 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c  all virtual tabl
7d00: 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e 65  es */.  disconne
7d10: 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a 0a  ctAllVtab(db);..
7d20: 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61    /* If a transa
7d30: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74  ction is open, t
7d40: 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c  he disconnectAll
7d50: 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f 76  Vtab() call abov
7d60: 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  e.  ** will not 
7d70: 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20  have called the 
7d80: 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65  xDisconnect() me
7d90: 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74  thod on any virt
7da0: 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20  ual.  ** tables 
7db0: 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61  in the db->aVTra
7dc0: 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20  ns[] array. The 
7dd0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
7de0: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a  3VtabRollback().
7df0: 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64    ** call will d
7e00: 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f  o so. We need to
7e10: 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   do this before 
7e20: 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63  the check for ac
7e30: 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74  tive.  ** SQL st
7e40: 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20  atements below, 
7e50: 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69  as the v-table i
7e60: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61  mplementation ma
7e70: 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a  y be storing.  *
7e80: 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20  * some prepared 
7e90: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72  statements inter
7ea0: 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  nally..  */.  sq
7eb0: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
7ec0: 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67  k(db);..  /* Leg
7ed0: 61 63 79 20 62 65 68 61 76 69 6f 72 20 28 73 71  acy behavior (sq
7ee0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62 65  lite3_close() be
7ef0: 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72 65  havior) is to re
7f00: 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
7f10: 5f 42 55 53 59 20 69 66 20 74 68 65 20 63 6f 6e  _BUSY if the con
7f20: 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74 20  nection can not 
7f30: 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69  be closed immedi
7f40: 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
7f50: 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20 26  ( !forceZombie &
7f60: 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75  & connectionIsBu
7f70: 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71  sy(db) ){.    sq
7f80: 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
7f90: 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  g(db, SQLITE_BUS
7fa0: 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c  Y, "unable to cl
7fb0: 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e  ose due to unfin
7fc0: 61 6c 69 7a 65 64 20 22 0a 20 20 20 20 20 20 20  alized ".       
7fd0: 22 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75  "statements or u
7fe0: 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b 75 70  nfinished backup
7ff0: 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s");.    sqlite3
8000: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
8010: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74  >mutex);.    ret
8020: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
8030: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
8040: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
8050: 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  G.  if( sqlite3G
8060: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
8070: 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6c  log ){.    /* Cl
8080: 6f 73 69 6e 67 20 74 68 65 20 68 61 6e 64 6c 65  osing the handle
8090: 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74  . Fourth paramet
80a0: 65 72 20 69 73 20 70 61 73 73 65 64 20 74 68 65  er is passed the
80b0: 20 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20 20 20   value 2. */.   
80c0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
80d0: 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73 71 6c  nfig.xSqllog(sql
80e0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
80f0: 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64 62 2c  .pSqllogArg, db,
8100: 20 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 2);.  }.#end
8110: 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74  if..  /* Convert
8120: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
8130: 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20 61 6e  into a zombie an
8140: 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 2e  d then close it.
8150: 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67 69  .  */.  db->magi
8160: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
8170: 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c 69 74  _ZOMBIE;.  sqlit
8180: 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43  e3LeaveMutexAndC
8190: 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29 3b 0a  loseZombie(db);.
81a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
81b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f  OK;.}../*.** Two
81c0: 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 74   variations on t
81d0: 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65 72 66  he public interf
81e0: 61 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  ace for closing 
81f0: 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
8200: 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 73 71  nnection. The sq
8210: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 76 65  lite3_close() ve
8220: 72 73 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  rsion returns SQ
8230: 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a  LITE_BUSY and.**
8240: 20 6c 65 61 76 65 73 20 74 68 65 20 63 6f 6e 6e   leaves the conn
8250: 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 66  ection option if
8260: 20 74 68 65 72 65 20 61 72 65 20 75 6e 66 69 6e   there are unfin
8270: 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a  alized prepared.
8280: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72  ** statements or
8290: 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69   unfinished sqli
82a0: 74 65 33 5f 62 61 63 6b 75 70 73 2e 20 20 54 68  te3_backups.  Th
82b0: 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  e sqlite3_close_
82c0: 76 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f 6e 20  v2().** version 
82d0: 66 6f 72 63 65 73 20 74 68 65 20 63 6f 6e 6e 65  forces the conne
82e0: 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d 65 20  ction to become 
82f0: 61 20 7a 6f 6d 62 69 65 20 69 66 20 74 68 65 72  a zombie if ther
8300: 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65  e are.** unclose
8310: 64 20 72 65 73 6f 75 72 63 65 73 2c 20 61 6e 64  d resources, and
8320: 20 61 72 72 61 6e 67 65 73 20 66 6f 72 20 64 65   arranges for de
8330: 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65 6e 20  allocation when 
8340: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72 65 70  the last.** prep
8350: 61 72 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  are statement or
8360: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
8370: 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73  closes..*/.int s
8380: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c  qlite3_close(sql
8390: 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72  ite3 *db){ retur
83a0: 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64  n sqlite3Close(d
83b0: 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69  b,0); }.int sqli
83c0: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73 71 6c  te3_close_v2(sql
83d0: 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72  ite3 *db){ retur
83e0: 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64  n sqlite3Close(d
83f0: 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  b,1); }.../*.** 
8400: 43 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20  Close the mutex 
8410: 6f 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  on database conn
8420: 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a  ection db..**.**
8430: 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66   Furthermore, if
8440: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
8450: 74 69 6f 6e 20 64 62 20 69 73 20 61 20 7a 6f 6d  tion db is a zom
8460: 62 69 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61  bie (meaning tha
8470: 74 20 74 68 65 72 65 0a 2a 2a 20 68 61 73 20 62  t there.** has b
8480: 65 65 6e 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  een a prior call
8490: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   to sqlite3_clos
84a0: 65 28 64 62 29 20 6f 72 20 73 71 6c 69 74 65 33  e(db) or sqlite3
84b0: 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29 29 20 61  _close_v2(db)) a
84c0: 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73 71 6c 69  nd.** every sqli
84d0: 74 65 33 5f 73 74 6d 74 20 68 61 73 20 6e 6f 77  te3_stmt has now
84e0: 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
84f0: 61 6e 64 20 65 76 65 72 79 20 73 71 6c 69 74 65  and every sqlite
8500: 33 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a 2a 20  3_backup has.** 
8510: 66 69 6e 69 73 68 65 64 2c 20 74 68 65 6e 20 66  finished, then f
8520: 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65  ree all resource
8530: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
8540: 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43  e3LeaveMutexAndC
8550: 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c 69 74  loseZombie(sqlit
8560: 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45  e3 *db){.  HashE
8570: 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20 20 20  lem *i;         
8580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
8590: 73 68 20 74 61 62 6c 65 20 69 74 65 72 61 74 6f  sh table iterato
85a0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20  r */.  int j;.. 
85b0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
85c0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 73 71 6c   outstanding sql
85d0: 69 74 65 33 5f 73 74 6d 74 20 6f 72 20 73 71 6c  ite3_stmt or sql
85e0: 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65  ite3_backup obje
85f0: 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74  cts.  ** or if t
8600: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  he connection ha
8610: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  s not yet been c
8620: 6c 6f 73 65 64 20 62 79 20 73 71 6c 69 74 65 33  losed by sqlite3
8630: 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20 20 2a  _close_v2(),.  *
8640: 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c 65 61 76  * then just leav
8650: 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20  e the mutex and 
8660: 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69  return..  */.  i
8670: 66 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51  f( db->magic!=SQ
8680: 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49  LITE_MAGIC_ZOMBI
8690: 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e 49  E || connectionI
86a0: 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20  sBusy(db) ){.   
86b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
86c0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
86d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
86e0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
86f0: 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
8700: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
8710: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
8720: 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20 63 6c  tion has.  ** cl
8730: 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69 74 65 33  osed all sqlite3
8740: 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c 69 74 65  _stmt and sqlite
8750: 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  3_backup objects
8760: 20 61 6e 64 20 68 61 73 20 62 65 65 6e 0a 20 20   and has been.  
8770: 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  ** passed to sql
8780: 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65 61 6e  ite3_close (mean
8790: 69 6e 67 20 74 68 61 74 20 69 74 20 69 73 20 61  ing that it is a
87a0: 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65 72 65   zombie).  There
87b0: 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20 61 68  fore,.  ** go ah
87c0: 65 61 64 20 61 6e 64 20 66 72 65 65 20 61 6c 6c  ead and free all
87d0: 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 2a 2f   resources..  */
87e0: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e  ..  /* If a tran
87f0: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c  saction is open,
8800: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 54   roll it back. T
8810: 68 69 73 20 61 6c 73 6f 20 65 6e 73 75 72 65 73  his also ensures
8820: 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 61 6e   that if.  ** an
8830: 79 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  y database schem
8840: 61 73 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64  as have been mod
8850: 69 66 69 65 64 20 62 79 20 61 6e 20 75 6e 63 6f  ified by an unco
8860: 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74  mmitted transact
8870: 69 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20 61 72  ion.  ** they ar
8880: 65 20 72 65 73 65 74 2e 20 41 6e 64 20 74 68 61  e reset. And tha
8890: 74 20 74 68 65 20 72 65 71 75 69 72 65 64 20 62  t the required b
88a0: 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68  -tree mutex is h
88b0: 65 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a  eld to make.  **
88c0: 20 74 68 65 20 70 61 67 65 72 20 72 6f 6c 6c 62   the pager rollb
88d0: 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72  ack and schema r
88e0: 65 73 65 74 20 61 6e 20 61 74 6f 6d 69 63 20 6f  eset an atomic o
88f0: 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73  peration. */.  s
8900: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
8910: 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
8920: 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  ;..  /* Free any
8930: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76   outstanding Sav
8940: 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65  epoint structure
8950: 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  s. */.  sqlite3C
8960: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
8970: 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  b);..  /* Close 
8980: 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e  all database con
8990: 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f  nections */.  fo
89a0: 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62  r(j=0; j<db->nDb
89b0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; j++){.    stru
89c0: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
89d0: 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66  ->aDb[j];.    if
89e0: 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pDb->pBt ){.  
89f0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
8a00: 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74 29 3b  Close(pDb->pBt);
8a10: 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42 74 20  .      pDb->pBt 
8a20: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  = 0;.      if( j
8a30: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=1 ){.        p
8a40: 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b  Db->pSchema = 0;
8a50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8a60: 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68   }.  /* Clear th
8a70: 65 20 54 45 4d 50 20 73 63 68 65 6d 61 20 73 65  e TEMP schema se
8a80: 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6c 61 73  parately and las
8a90: 74 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61  t */.  if( db->a
8aa0: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[1].pSchema ){
8ab0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65  .    sqlite3Sche
8ac0: 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b  maClear(db->aDb[
8ad0: 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  1].pSchema);.  }
8ae0: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e  .  sqlite3VtabUn
8af0: 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20  lockList(db);.. 
8b00: 20 2f 2a 20 46 72 65 65 20 75 70 20 74 68 65 20   /* Free up the 
8b10: 61 72 72 61 79 20 6f 66 20 61 75 78 69 6c 69 61  array of auxilia
8b20: 72 79 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  ry databases */.
8b30: 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73    sqlite3Collaps
8b40: 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64  eDatabaseArray(d
8b50: 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  b);.  assert( db
8b60: 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73  ->nDb<=2 );.  as
8b70: 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64  sert( db->aDb==d
8b80: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a  b->aDbStatic );.
8b90: 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63  .  /* Tell the c
8ba0: 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20  ode in notify.c 
8bb0: 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74  that the connect
8bc0: 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f  ion no longer ho
8bd0: 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63  lds any.  ** loc
8be0: 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ks and does not 
8bf0: 72 65 71 75 69 72 65 20 61 6e 79 20 66 75 72 74  require any furt
8c00: 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66  her unlock-notif
8c10: 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a  y callbacks..  *
8c20: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  /.  sqlite3Conne
8c30: 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b  ctionClosed(db);
8c40: 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41  ..  for(j=0; j<A
8c50: 72 72 61 79 53 69 7a 65 28 64 62 2d 3e 61 46 75  rraySize(db->aFu
8c60: 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nc.a); j++){.   
8c70: 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c   FuncDef *pNext,
8c80: 20 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20   *pHash, *p;.   
8c90: 20 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63   for(p=db->aFunc
8ca0: 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73  .a[j]; p; p=pHas
8cb0: 68 29 7b 0a 20 20 20 20 20 20 70 48 61 73 68 20  h){.      pHash 
8cc0: 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20  = p->pHash;.    
8cd0: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
8ce0: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65        functionDe
8cf0: 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20  stroy(db, p);.  
8d00: 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d        pNext = p-
8d10: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
8d20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8d30: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20  , p);.        p 
8d40: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  = pNext;.      }
8d50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
8d60: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
8d70: 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  st(&db->aCollSeq
8d80: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
8d90: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
8da0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
8db0: 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69   (CollSeq *)sqli
8dc0: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
8dd0: 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79     /* Invoke any
8de0: 20 64 65 73 74 72 75 63 74 6f 72 73 20 72 65 67   destructors reg
8df0: 69 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c  istered for coll
8e00: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
8e10: 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20  ser data. */.   
8e20: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a   for(j=0; j<3; j
8e30: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
8e40: 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a  Coll[j].xDel ){.
8e50: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d          pColl[j]
8e60: 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70  .xDel(pColl[j].p
8e70: 55 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  User);.      }. 
8e80: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8e90: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c  DbFree(db, pColl
8ea0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
8eb0: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61  HashClear(&db->a
8ec0: 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65  CollSeq);.#ifnde
8ed0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
8ee0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72  RTUALTABLE.  for
8ef0: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
8f00: 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  st(&db->aModule)
8f10: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
8f20: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d  hNext(i)){.    M
8f30: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
8f40: 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61  odule *)sqliteHa
8f50: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
8f60: 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f  f( pMod->xDestro
8f70: 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d  y ){.      pMod-
8f80: 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e  >xDestroy(pMod->
8f90: 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pAux);.    }.   
8fa0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8fb0: 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20  b, pMod);.  }.  
8fc0: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
8fd0: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
8fe0: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
8ff0: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
9000: 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f  E_OK); /* Deallo
9010: 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64  cates any cached
9020: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20   error strings. 
9030: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  */.  sqlite3Valu
9040: 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b  eFree(db->pErr);
9050: 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45  .  sqlite3CloseE
9060: 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 23  xtensions(db);.#
9070: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
9080: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
9090: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
90a0: 3e 61 75 74 68 2e 7a 41 75 74 68 55 73 65 72 29  >auth.zAuthUser)
90b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
90c0: 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50  (db->auth.zAuthP
90d0: 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62  W);.#endif..  db
90e0: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
90f0: 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20  _MAGIC_ERROR;.. 
9100: 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74   /* The temp-dat
9110: 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20  abase schema is 
9120: 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72  allocated differ
9130: 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f  ently from the o
9140: 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a  ther schema.  **
9150: 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20   objects (using 
9160: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64  sqliteMalloc() d
9170: 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
9180: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
9190: 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20  Schema())..  ** 
91a0: 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  So it needs to b
91b0: 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f  e freed here. To
91c0: 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c  do: Why not roll
91d0: 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61   the temp schema
91e0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73   into.  ** the s
91f0: 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ame sqliteMalloc
9200: 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68  () as the one th
9210: 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  at allocates the
9220: 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20   database .  ** 
9230: 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a  structure?.  */.
9240: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9250: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  db, db->aDb[1].p
9260: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
9270: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
9280: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
9290: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
92a0: 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
92b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
92c0: 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ee(db->mutex);. 
92d0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f   assert( db->loo
92e0: 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29  kaside.nOut==0 )
92f0: 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61  ;  /* Fails on a
9300: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
9310: 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20  y leak */.  if( 
9320: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
9330: 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73  alloced ){.    s
9340: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
9350: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
9360: 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
9370: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 52  LITE_ENABLE_SQLR
9380: 52 0a 20 20 53 52 52 65 63 43 6c 6f 73 65 28 64  R.  SRRecClose(d
9390: 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20  b);.#endif.  .  
93a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29  sqlite3_free(db)
93b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
93c0: 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ack all database
93d0: 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72 69 70   files.  If trip
93e0: 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49  Code is not SQLI
93f0: 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61  TE_OK, then.** a
9400: 6e 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ny write cursors
9410: 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
9420: 20 28 22 74 72 69 70 70 65 64 22 20 2d 20 61 73   ("tripped" - as
9430: 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61 20   in "tripping a 
9440: 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b  circuit.** break
9450: 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74 6f  er") and made to
9460: 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64 65   return tripCode
9470: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
9480: 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74 74  y further.** att
9490: 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68 61  empts to use tha
94a0: 74 20 63 75 72 73 6f 72 2e 20 20 52 65 61 64 20  t cursor.  Read 
94b0: 63 75 72 73 6f 72 73 20 72 65 6d 61 69 6e 20 6f  cursors remain o
94c0: 70 65 6e 20 61 6e 64 20 76 61 6c 69 64 0a 2a 2a  pen and valid.**
94d0: 20 62 75 74 20 61 72 65 20 22 73 61 76 65 64 22   but are "saved"
94e0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 61 62   in case the tab
94f0: 6c 65 20 70 61 67 65 73 20 61 72 65 20 6d 6f 76  le pages are mov
9500: 65 64 20 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f  ed around..*/.vo
9510: 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
9520: 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  ckAll(sqlite3 *d
9530: 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29  b, int tripCode)
9540: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
9550: 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20   inTrans = 0;.  
9560: 69 6e 74 20 73 63 68 65 6d 61 43 68 61 6e 67 65  int schemaChange
9570: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
9580: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
9590: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
95a0: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
95b0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a  nMalloc();..  /*
95c0: 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72   Obtain all b-tr
95d0: 65 65 20 6d 75 74 65 78 65 73 20 62 65 66 6f 72  ee mutexes befor
95e0: 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c  e making any cal
95f0: 6c 73 20 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62  ls to BtreeRollb
9600: 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69  ack(). .  ** Thi
9610: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69  s is important i
9620: 6e 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73  n case the trans
9630: 61 63 74 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c  action being rol
9640: 6c 65 64 20 62 61 63 6b 20 68 61 73 0a 20 20 2a  led back has.  *
9650: 2a 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64  * modified the d
9660: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
9670: 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  If the b-tree mu
9680: 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20 74 61  texes are not ta
9690: 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74  ken.  ** here, t
96a0: 68 65 6e 20 61 6e 6f 74 68 65 72 20 73 68 61 72  hen another shar
96b0: 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63 74  ed-cache connect
96c0: 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61 6b 20  ion might sneak 
96d0: 69 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20  in between.  ** 
96e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 72 6f 6c  the database rol
96f0: 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61  lback and schema
9700: 20 72 65 73 65 74 2c 20 77 68 69 63 68 20 63 61   reset, which ca
9710: 6e 20 63 61 75 73 65 20 66 61 6c 73 65 0a 20 20  n cause false.  
9720: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 72 65  ** corruption re
9730: 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20 63 61  ports in some ca
9740: 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ses.  */.  sqlit
9750: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
9760: 64 62 29 3b 0a 20 20 73 63 68 65 6d 61 43 68 61  db);.  schemaCha
9770: 6e 67 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  nge = (db->flags
9780: 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   & SQLITE_Intern
9790: 43 68 61 6e 67 65 73 29 21 3d 30 20 26 26 20 64  Changes)!=0 && d
97a0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 3b  b->init.busy==0;
97b0: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ..  for(i=0; i<d
97c0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
97d0: 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d    Btree *p = db-
97e0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
97f0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
9800: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
9810: 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a  IsInTrans(p) ){.
9820: 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20          inTrans 
9830: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
9840: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
9850: 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70 43  ollback(p, tripC
9860: 6f 64 65 2c 20 21 73 63 68 65 6d 61 43 68 61 6e  ode, !schemaChan
9870: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
9880: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
9890: 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69  back(db);.  sqli
98a0: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
98b0: 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 28 64 62  oc();..  if( (db
98c0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49  ->flags&SQLITE_I
98d0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d 30  nternChanges)!=0
98e0: 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   && db->init.bus
98f0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  y==0 ){.    sqli
9900: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
9910: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
9920: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
9930: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
9940: 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d  nection(db);.  }
9950: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
9960: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20  eaveAll(db);..  
9970: 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64 20  /* Any deferred 
9980: 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
9990: 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62  tions have now b
99a0: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f  een resolved. */
99b0: 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  .  db->nDeferred
99c0: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Cons = 0;.  db->
99d0: 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
99e0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67   = 0;.  db->flag
99f0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66  s &= ~SQLITE_Def
9a00: 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66 20  erFKs;..  /* If 
9a10: 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  one has been con
9a20: 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20  figured, invoke 
9a30: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f  the rollback-hoo
9a40: 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  k callback */.  
9a50: 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  if( db->xRollbac
9a60: 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e  kCallback && (in
9a70: 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75  Trans || !db->au
9a80: 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20  toCommit) ){.   
9a90: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
9aa0: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c  llback(db->pRoll
9ab0: 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a  backArg);.  }.}.
9ac0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
9ad0: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 63 6f  static string co
9ae0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
9af0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
9b00: 74 6f 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  to the error cod
9b10: 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 69  e.** specified i
9b20: 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  n the argument..
9b30: 2a 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28  */.#if (defined(
9b40: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
9b50: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 29 20   SQLITE_OS_WIN) 
9b60: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
9b70: 45 5f 54 45 53 54 29 0a 63 6f 6e 73 74 20 63 68  E_TEST).const ch
9b80: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61  ar *sqlite3ErrNa
9b90: 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f  me(int rc){.  co
9ba0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
9bb0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72  = 0;.  int i, or
9bc0: 69 67 52 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72  igRc = rc;.  for
9bd0: 28 69 3d 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61  (i=0; i<2 && zNa
9be0: 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26  me==0; i++, rc &
9bf0: 3d 20 30 78 66 66 29 7b 0a 20 20 20 20 73 77 69  = 0xff){.    swi
9c00: 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 20  tch( rc ){.     
9c10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a   case SQLITE_OK:
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c30: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9c40: 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20 20 20  _OK";           
9c50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9c60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52    case SQLITE_ER
9c70: 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20 20 20  ROR:            
9c80: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9c90: 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20 20 20  E_ERROR";       
9ca0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9cb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
9cc0: 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20 20 20 20  NTERNAL:        
9cd0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9ce0: 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20  TE_INTERNAL";   
9cf0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9d00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9d10: 50 45 52 4d 3a 20 20 20 20 20 20 20 20 20 20 20  PERM:           
9d20: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9d30: 49 54 45 5f 50 45 52 4d 22 3b 20 20 20 20 20 20  ITE_PERM";      
9d40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9d50: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9d60: 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 20 20 20  _ABORT:         
9d70: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9d80: 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20 20 20  LITE_ABORT";    
9d90: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9da0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9db0: 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
9dc0: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
9dd0: 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
9de0: 42 41 43 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b  BACK";    break;
9df0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9e00: 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20 20 20  TE_BUSY:        
9e10: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9e20: 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20 20 20  SQLITE_BUSY";   
9e30: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9e40: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9e50: 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52  ITE_BUSY_RECOVER
9e60: 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  Y:      zName = 
9e70: 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43  "SQLITE_BUSY_REC
9e80: 4f 56 45 52 59 22 3b 20 20 20 20 20 62 72 65 61  OVERY";     brea
9e90: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9ea0: 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48  LITE_BUSY_SNAPSH
9eb0: 4f 54 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  OT:      zName =
9ec0: 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e   "SQLITE_BUSY_SN
9ed0: 41 50 53 48 4f 54 22 3b 20 20 20 20 20 62 72 65  APSHOT";     bre
9ee0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9ef0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20  QLITE_LOCKED:   
9f00: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9f10: 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  = "SQLITE_LOCKED
9f20: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
9f30: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9f40: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
9f50: 41 52 45 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65  AREDCACHE: zName
9f60: 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   = "SQLITE_LOCKE
9f70: 44 5f 53 48 41 52 45 44 43 41 43 48 45 22 3b 62  D_SHAREDCACHE";b
9f80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9f90: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20   SQLITE_NOMEM:  
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9fb0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45  e = "SQLITE_NOME
9fc0: 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  M";             
9fd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9fe0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
9ff0: 59 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  Y:           zNa
a000: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
a010: 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20 20 20 20  DONLY";         
a020: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a030: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
a040: 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e  LY_RECOVERY:  zN
a050: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
a060: 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22  ADONLY_RECOVERY"
a070: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
a080: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
a090: 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20 7a  NLY_CANTLOCK:  z
a0a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
a0b0: 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b  EADONLY_CANTLOCK
a0c0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
a0d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
a0e0: 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20  ONLY_ROLLBACK:  
a0f0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a100: 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43  READONLY_ROLLBAC
a110: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
a120: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
a130: 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20  DONLY_DBMOVED:  
a140: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a150: 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
a160: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
a170: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
a180: 54 45 52 52 55 50 54 3a 20 20 20 20 20 20 20 20  TERRUPT:        
a190: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a1a0: 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20 20 20  E_INTERRUPT";   
a1b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a1c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
a1d0: 4f 45 52 52 3a 20 20 20 20 20 20 20 20 20 20 20  OERR:           
a1e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a1f0: 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20  TE_IOERR";      
a200: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a210: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a220: 49 4f 45 52 52 5f 52 45 41 44 3a 20 20 20 20 20  IOERR_READ:     
a230: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a240: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b  ITE_IOERR_READ";
a250: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a260: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a270: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
a280: 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  D:   zName = "SQ
a290: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
a2a0: 5f 52 45 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a  _READ";  break;.
a2b0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a2c0: 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3a 20 20  E_IOERR_WRITE:  
a2d0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a2e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
a2f0: 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  E";       break;
a300: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a310: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20  TE_IOERR_FSYNC: 
a320: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a330: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
a340: 4e 43 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  NC";       break
a350: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a360: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
a370: 59 4e 43 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  YNC:    zName = 
a380: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49  "SQLITE_IOERR_DI
a390: 52 5f 46 53 59 4e 43 22 3b 20 20 20 62 72 65 61  R_FSYNC";   brea
a3a0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a3b0: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
a3c0: 41 54 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ATE:     zName =
a3d0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54   "SQLITE_IOERR_T
a3e0: 52 55 4e 43 41 54 45 22 3b 20 20 20 20 62 72 65  RUNCATE";    bre
a3f0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a400: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
a410: 54 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  T:        zName 
a420: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
a430: 46 53 54 41 54 22 3b 20 20 20 20 20 20 20 62 72  FSTAT";       br
a440: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a450: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
a460: 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  OCK:       zName
a470: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
a480: 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62  _UNLOCK";      b
a490: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a4a0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
a4b0: 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d  LOCK:       zNam
a4c0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
a4d0: 52 5f 52 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20  R_RDLOCK";      
a4e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a4f0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
a500: 45 4c 45 54 45 3a 20 20 20 20 20 20 20 7a 4e 61  ELETE:       zNa
a510: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
a520: 52 52 5f 44 45 4c 45 54 45 22 3b 20 20 20 20 20  RR_DELETE";     
a530: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a540: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
a550: 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e  NOMEM:        zN
a560: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
a570: 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20  ERR_NOMEM";     
a580: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a590: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
a5a0: 5f 41 43 43 45 53 53 3a 20 20 20 20 20 20 20 7a  _ACCESS:       z
a5b0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
a5c0: 4f 45 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20  OERR_ACCESS";   
a5d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a5e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
a5f0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
a600: 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  OCK:.           
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a620: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a630: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
a640: 52 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62  RESERVEDLOCK"; b
a650: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a660: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
a670: 43 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  CK:         zNam
a680: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
a690: 52 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20  R_LOCK";        
a6a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a6b0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
a6c0: 4c 4f 53 45 3a 20 20 20 20 20 20 20 20 7a 4e 61  LOSE:        zNa
a6d0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
a6e0: 52 52 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20 20  RR_CLOSE";      
a6f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a700: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
a710: 44 49 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e  DIR_CLOSE:    zN
a720: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
a730: 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20  ERR_DIR_CLOSE"; 
a740: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a750: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
a760: 5f 53 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a  _SHMOPEN:      z
a770: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
a780: 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20  OERR_SHMOPEN";  
a790: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a7a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
a7b0: 52 5f 53 48 4d 53 49 5a 45 3a 20 20 20 20 20 20  R_SHMSIZE:      
a7c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a7d0: 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20  IOERR_SHMSIZE"; 
a7e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a7f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
a800: 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20  RR_SHMLOCK:     
a810: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a820: 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b  _IOERR_SHMLOCK";
a830: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a840: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
a850: 45 52 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20  ERR_SHMMAP:     
a860: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a870: 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b  E_IOERR_SHMMAP";
a880: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a890: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
a8a0: 4f 45 52 52 5f 53 45 45 4b 3a 20 20 20 20 20 20  OERR_SEEK:      
a8b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a8c0: 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20  TE_IOERR_SEEK"; 
a8d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a8e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a8f0: 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
a900: 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  NT: zName = "SQL
a910: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
a920: 5f 4e 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20  _NOENT";break;. 
a930: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a940: 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20  _IOERR_MMAP:    
a950: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a960: 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22  LITE_IOERR_MMAP"
a970: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
a980: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a990: 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
a9a0: 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ATH:  zName = "S
a9b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
a9c0: 45 4d 50 50 41 54 48 22 3b 20 62 72 65 61 6b 3b  EMPPATH"; break;
a9d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a9e0: 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54  TE_IOERR_CONVPAT
a9f0: 48 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  H:     zName = "
aa00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e  SQLITE_IOERR_CON
aa10: 56 50 41 54 48 22 3b 20 20 20 20 62 72 65 61 6b  VPATH";    break
aa20: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
aa30: 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20  ITE_CORRUPT:    
aa40: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
aa50: 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22  "SQLITE_CORRUPT"
aa60: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
aa70: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
aa80: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
aa90: 42 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  B:       zName =
aaa0: 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   "SQLITE_CORRUPT
aab0: 5f 56 54 41 42 22 3b 20 20 20 20 20 20 62 72 65  _VTAB";      bre
aac0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
aad0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20  QLITE_NOTFOUND: 
aae0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
aaf0: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  = "SQLITE_NOTFOU
ab00: 4e 44 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  ND";          br
ab10: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ab20: 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20  SQLITE_FULL:    
ab30: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
ab40: 20 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22   = "SQLITE_FULL"
ab50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
ab60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ab70: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
ab80: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
ab90: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
aba0: 4f 50 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20  OPEN";          
abb0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
abc0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
abd0: 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61  N_NOTEMPDIR: zNa
abe0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
abf0: 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22  TOPEN_NOTEMPDIR"
ac00: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
ac10: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
ac20: 45 4e 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e  EN_ISDIR:     zN
ac30: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
ac40: 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20  NTOPEN_ISDIR";  
ac50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ac60: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
ac70: 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a  PEN_FULLPATH:  z
ac80: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
ac90: 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
aca0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
acb0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
acc0: 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20  OPEN_CONVPATH:  
acd0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ace0: 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54  CANTOPEN_CONVPAT
acf0: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  H"; break;.     
ad00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f   case SQLITE_PRO
ad10: 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20  TOCOL:          
ad20: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ad30: 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20  _PROTOCOL";     
ad40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ad50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d    case SQLITE_EM
ad60: 50 54 59 3a 20 20 20 20 20 20 20 20 20 20 20 20  PTY:            
ad70: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ad80: 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20  E_EMPTY";       
ad90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ada0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
adb0: 43 48 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20  CHEMA:          
adc0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
add0: 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20  TE_SCHEMA";     
ade0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
adf0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ae00: 54 4f 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20  TOOBIG:         
ae10: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ae20: 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20  ITE_TOOBIG";    
ae30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ae40: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ae50: 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20  _CONSTRAINT:    
ae60: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ae70: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22  LITE_CONSTRAINT"
ae80: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
ae90: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
aea0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49  E_CONSTRAINT_UNI
aeb0: 51 55 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  QUE:  zName = "S
aec0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
aed0: 5f 55 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b  _UNIQUE"; break;
aee0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
aef0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
af00: 49 47 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22  IGGER: zName = "
af10: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
af20: 54 5f 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b  T_TRIGGER";break
af30: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
af40: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
af50: 4f 52 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20  OREIGNKEY:.     
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
af80: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
af90: 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
afa0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
afb0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
afc0: 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20  NSTRAINT_CHECK: 
afd0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
afe0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45  E_CONSTRAINT_CHE
aff0: 43 4b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  CK";  break;.   
b000: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b010: 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
b020: 59 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20  YKEY:.          
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b040: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b050: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b060: 5f 50 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20  _PRIMARYKEY";   
b070: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b080: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
b090: 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61  INT_NOTNULL: zNa
b0a0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
b0b0: 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22  STRAINT_NOTNULL"
b0c0: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
b0d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b0e0: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a  AINT_COMMITHOOK:
b0f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b120: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
b130: 49 54 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b  ITHOOK";   break
b140: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b150: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56  ITE_CONSTRAINT_V
b160: 54 41 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  TAB:    zName = 
b170: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
b180: 4e 54 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61  NT_VTAB";   brea
b190: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b1a0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b1b0: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
b1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1d0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b1e0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
b1f0: 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20  AINT_FUNCTION"; 
b200: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b210: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
b220: 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20  STRAINT_ROWID:  
b230: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b240: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49  _CONSTRAINT_ROWI
b250: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
b260: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49    case SQLITE_MI
b270: 53 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20 20  SMATCH:         
b280: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b290: 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20  E_MISMATCH";    
b2a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b2b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d     case SQLITE_M
b2c0: 49 53 55 53 45 3a 20 20 20 20 20 20 20 20 20 20  ISUSE:          
b2d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b2e0: 54 45 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20  TE_MISUSE";     
b2f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b300: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b310: 4e 4f 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20  NOLFS:          
b320: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b330: 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20  ITE_NOLFS";     
b340: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b350: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b360: 5f 41 55 54 48 3a 20 20 20 20 20 20 20 20 20 20  _AUTH:          
b370: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b380: 4c 49 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20  LITE_AUTH";     
b390: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b3a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b3b0: 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20  E_FORMAT:       
b3c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b3d0: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20  QLITE_FORMAT";  
b3e0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b3f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b400: 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20  TE_RANGE:       
b410: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b420: 53 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20  SQLITE_RANGE";  
b430: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b440: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b450: 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20  ITE_NOTADB:     
b460: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b470: 22 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b  "SQLITE_NOTADB";
b480: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b490: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b4a0: 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20  LITE_ROW:       
b4b0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b4c0: 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20   "SQLITE_ROW";  
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
b4e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b4f0: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20  QLITE_NOTICE:   
b500: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b510: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  = "SQLITE_NOTICE
b520: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
b530: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b540: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
b550: 43 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65  COVER_WAL: zName
b560: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43   = "SQLITE_NOTIC
b570: 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62  E_RECOVER_WAL";b
b580: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b590: 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52   SQLITE_NOTICE_R
b5a0: 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a  ECOVER_ROLLBACK:
b5b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b5e0: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
b5f0: 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b  ROLLBACK"; break
b600: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b610: 49 54 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20  ITE_WARNING:    
b620: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b630: 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22  "SQLITE_WARNING"
b640: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
b650: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b660: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54  LITE_WARNING_AUT
b670: 4f 49 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d  OINDEX:  zName =
b680: 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47   "SQLITE_WARNING
b690: 5f 41 55 54 4f 49 4e 44 45 58 22 3b 20 62 72 65  _AUTOINDEX"; bre
b6a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b6b0: 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20  QLITE_DONE:     
b6c0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b6d0: 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b  = "SQLITE_DONE";
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
b6f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
b700: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
b710: 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72  .    static char
b720: 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73   zBuf[50];.    s
b730: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
b740: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
b750: 75 66 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e  uf, "SQLITE_UNKN
b760: 4f 57 4e 28 25 64 29 22 2c 20 6f 72 69 67 52 63  OWN(%d)", origRc
b770: 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a  );.    zName = z
b780: 42 75 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Buf;.  }.  retur
b790: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69  n zName;.}.#endi
b7a0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
b7b0: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
b7c0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
b7d0: 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  he kind of error
b7e0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
b7f0: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  e.** argument..*
b800: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
b810: 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e 74 20  lite3ErrStr(int 
b820: 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rc){.  static co
b830: 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20  nst char* const 
b840: 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  aMsg[] = {.    /
b850: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20  * SQLITE_OK     
b860: 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20       */ "not an 
b870: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
b880: 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20  QLITE_ERROR     
b890: 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20    */ "SQL logic 
b8a0: 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67  error or missing
b8b0: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
b8c0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  /* SQLITE_INTERN
b8d0: 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20  AL    */ 0,.    
b8e0: 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20  /* SQLITE_PERM  
b8f0: 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73        */ "access
b900: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
b910: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
b920: 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a  TE_ABORT       *
b930: 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75  / "callback requ
b940: 65 73 74 65 64 20 71 75 65 72 79 20 61 62 6f 72  ested query abor
b950: 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  t",.    /* SQLIT
b960: 45 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f  E_BUSY        */
b970: 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   "database is lo
b980: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
b990: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20  LITE_LOCKED     
b9a0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61   */ "database ta
b9b0: 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ble is locked",.
b9c0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
b9d0: 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75  MEM       */ "ou
b9e0: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20  t of memory",.  
b9f0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44    /* SQLITE_READ
ba00: 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65  ONLY    */ "atte
ba10: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72  mpt to write a r
ba20: 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  eadonly database
ba30: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
ba40: 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20  _INTERRUPT   */ 
ba50: 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20  "interrupted",. 
ba60: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45     /* SQLITE_IOE
ba70: 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73  RR       */ "dis
ba80: 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20  k I/O error",.  
ba90: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52    /* SQLITE_CORR
baa0: 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61  UPT     */ "data
bab0: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
bac0: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20  is malformed",. 
bad0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
bae0: 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b  FOUND    */ "unk
baf0: 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c  nown operation",
bb00: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
bb10: 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64  ULL        */ "d
bb20: 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20  atabase or disk 
bb30: 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a  is full",.    /*
bb40: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
bb50: 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74      */ "unable t
bb60: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
bb70: 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  file",.    /* SQ
bb80: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20  LITE_PROTOCOL   
bb90: 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f   */ "locking pro
bba0: 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53  tocol",.    /* S
bbb0: 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20  QLITE_EMPTY     
bbc0: 20 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74    */ "table cont
bbd0: 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20  ains no data",. 
bbe0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48     /* SQLITE_SCH
bbf0: 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74  EMA      */ "dat
bc00: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
bc10: 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f   changed",.    /
bc20: 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  * SQLITE_TOOBIG 
bc30: 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20       */ "string 
bc40: 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22  or blob too big"
bc50: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
bc60: 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22  CONSTRAINT  */ "
bc70: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
bc80: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
bc90: 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f  E_MISMATCH    */
bca0: 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61   "datatype misma
bcb0: 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  tch",.    /* SQL
bcc0: 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20  ITE_MISUSE      
bcd0: 2a 2f 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74  */ "library rout
bce0: 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f  ine called out o
bcf0: 66 20 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20  f sequence",.   
bd00: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53   /* SQLITE_NOLFS
bd10: 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65         */ "large
bd20: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73   file support is
bd30: 20 64 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20   disabled",.    
bd40: 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20  /* SQLITE_AUTH  
bd50: 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72        */ "author
bd60: 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c  ization denied",
bd70: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
bd80: 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61  ORMAT      */ "a
bd90: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
bda0: 65 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c  e format error",
bdb0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
bdc0: 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62  ANGE       */ "b
bdd0: 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e  ind or column in
bde0: 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dex out of range
bdf0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
be00: 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20  _NOTADB      */ 
be10: 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74  "file is encrypt
be20: 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64  ed or is not a d
be30: 61 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20  atabase",.  };. 
be40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
be50: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  r = "unknown err
be60: 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72  or";.  switch( r
be70: 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  c ){.    case SQ
be80: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
be90: 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ACK: {.      zEr
bea0: 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74  r = "abort due t
beb0: 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20  o ROLLBACK";.   
bec0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bed0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
bee0: 20 20 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b       rc &= 0xff;
bef0: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
bf00: 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41  S(rc>=0) && rc<A
bf10: 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26  rraySize(aMsg) &
bf20: 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b  & aMsg[rc]!=0 ){
bf30: 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20  .        zErr = 
bf40: 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20  aMsg[rc];.      
bf50: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
bf60: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
bf70: 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zErr;.}../*.**
bf80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
bf90: 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20  plements a busy 
bfa0: 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c  callback that sl
bfb0: 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a  eeps and tries.*
bfc0: 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20  * again until a 
bfd0: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
bfe0: 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20 74   reached.  The t
bff0: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a  imeout value is.
c000: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  ** an integer nu
c010: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
c020: 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20 61  onds passed in a
c030: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
c040: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
c050: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66  ic int sqliteDef
c060: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
c070: 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20  (. void *ptr,   
c080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
c090: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
c0a0: 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74  on */. int count
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
c0d0: 65 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65  es table has bee
c0e0: 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66  n busy */.){.#if
c0f0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c   SQLITE_OS_WIN |
c100: 7c 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20  | HAVE_USLEEP.  
c110: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
c120: 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20  delays[] =.     
c130: 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31  { 1, 2, 5, 10, 1
c140: 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20  5, 20, 25, 25,  
c150: 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30  25,  50,  50, 10
c160: 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  0 };.  static co
c170: 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20  nst u8 totals[] 
c180: 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33  =.     { 0, 1, 3
c190: 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33  ,  8, 18, 33, 53
c1a0: 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20  , 78, 103, 128, 
c1b0: 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65  178, 228 };.# de
c1c0: 66 69 6e 65 20 4e 44 45 4c 41 59 20 41 72 72 61  fine NDELAY Arra
c1d0: 79 53 69 7a 65 28 64 65 6c 61 79 73 29 0a 20 20  ySize(delays).  
c1e0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73  sqlite3 *db = (s
c1f0: 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20  qlite3 *)ptr;.  
c200: 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64 62  int timeout = db
c210: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20  ->busyTimeout;. 
c220: 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f   int delay, prio
c230: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 6f  r;..  assert( co
c240: 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  unt>=0 );.  if( 
c250: 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29  count < NDELAY )
c260: 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65  {.    delay = de
c270: 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20  lays[count];.   
c280: 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b   prior = totals[
c290: 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b  count];.  }else{
c2a0: 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c  .    delay = del
c2b0: 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20  ays[NDELAY-1];. 
c2c0: 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c     prior = total
c2d0: 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65  s[NDELAY-1] + de
c2e0: 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c  lay*(count-(NDEL
c2f0: 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66  AY-1));.  }.  if
c300: 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20  ( prior + delay 
c310: 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20  > timeout ){.   
c320: 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74   delay = timeout
c330: 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66   - prior;.    if
c340: 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74  ( delay<=0 ) ret
c350: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
c360: 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e  ite3OsSleep(db->
c370: 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30  pVfs, delay*1000
c380: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  );.  return 1;.#
c390: 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20 2a  else.  sqlite3 *
c3a0: 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29  db = (sqlite3 *)
c3b0: 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f  ptr;.  int timeo
c3c0: 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a  ut = ((sqlite3 *
c3d0: 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f  )ptr)->busyTimeo
c3e0: 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74  ut;.  if( (count
c3f0: 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f  +1)*1000 > timeo
c400: 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ut ){.    return
c410: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
c420: 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66  3OsSleep(db->pVf
c430: 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72  s, 1000000);.  r
c440: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
c450: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
c460: 74 68 65 20 67 69 76 65 6e 20 62 75 73 79 20 68  the given busy h
c470: 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  andler..**.** Th
c480: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
c490: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65  lled when an ope
c4a0: 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77 69  ration failed wi
c4b0: 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66  th a lock..** If
c4c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
c4d0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
c4e0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72  the lock is retr
c4f0: 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72  ied.  If it.** r
c500: 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70  eturns 0, the op
c510: 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77  eration aborts w
c520: 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55  ith an SQLITE_BU
c530: 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74  SY error..*/.int
c540: 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
c550: 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61  syHandler(BusyHa
c560: 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ndler *p){.  int
c570: 20 72 63 3b 0a 20 20 69 66 28 20 4e 45 56 45 52   rc;.  if( NEVER
c580: 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46 75  (p==0) || p->xFu
c590: 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73  nc==0 || p->nBus
c5a0: 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  y<0 ) return 0;.
c5b0: 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28    rc = p->xFunc(
c5c0: 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73  p->pArg, p->nBus
c5d0: 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  y);.  if( rc==0 
c5e0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20  ){.    p->nBusy 
c5f0: 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
c600: 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20     p->nBusy++;. 
c610: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20   }.  return rc; 
c620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
c630: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
c640: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f  busy callback fo
c650: 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61  r an Sqlite data
c660: 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67  base to the.** g
c670: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75  iven callback fu
c680: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
c690: 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  given argument..
c6a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  */.int sqlite3_b
c6b0: 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73  usy_handler(.  s
c6c0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e  qlite3 *db,.  in
c6d0: 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a  t (*xBusy)(void*
c6e0: 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
c6f0: 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51  Arg.){.#ifdef SQ
c700: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
c710: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
c720: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
c730: 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
c740: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 23 65  QLITE_MISUSE;.#e
c750: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
c760: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
c770: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73  utex);.  db->bus
c780: 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d  yHandler.xFunc =
c790: 20 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75   xBusy;.  db->bu
c7a0: 73 79 48 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d  syHandler.pArg =
c7b0: 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73   pArg;.  db->bus
c7c0: 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d  yHandler.nBusy =
c7d0: 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 54 69   0;.  db->busyTi
c7e0: 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 73 71 6c  meout = 0;.  sql
c7f0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
c800: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
c810: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c820: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
c830: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
c840: 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20  _CALLBACK./*.** 
c850: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
c860: 73 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63  s the progress c
c870: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
c880: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
c890: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
c8a0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
c8b0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
c8c0: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72  argument. The pr
c8d0: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
c8e0: 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  will.** be invok
c8f0: 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70  ed every nOps op
c900: 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  codes..*/.void s
c910: 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
c920: 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74  handler(.  sqlit
c930: 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e  e3 *db, .  int n
c940: 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72  Ops,.  int (*xPr
c950: 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20  ogress)(void*), 
c960: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
c970: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c980: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
c990: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
c9a0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
c9b0: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
c9c0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
c9d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
c9e0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
c9f0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
ca00: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
ca10: 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62  nOps>0 ){.    db
ca20: 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50  ->xProgress = xP
ca30: 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d  rogress;.    db-
ca40: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20  >nProgressOps = 
ca50: 28 75 6e 73 69 67 6e 65 64 29 6e 4f 70 73 3b 0a  (unsigned)nOps;.
ca60: 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73      db->pProgres
ca70: 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d  sArg = pArg;.  }
ca80: 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50  else{.    db->xP
ca90: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
caa0: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
cab0: 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70  s = 0;.    db->p
cac0: 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 30 3b  ProgressArg = 0;
cad0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
cae0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
caf0: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
cb00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
cb10: 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61 20  tine installs a 
cb20: 64 65 66 61 75 6c 74 20 62 75 73 79 20 68 61 6e  default busy han
cb30: 64 6c 65 72 20 74 68 61 74 20 77 61 69 74 73 20  dler that waits 
cb40: 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  for the.** speci
cb50: 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d  fied number of m
cb60: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f  illiseconds befo
cb70: 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a  re returning 0..
cb80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  */.int sqlite3_b
cb90: 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69  usy_timeout(sqli
cba0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29  te3 *db, int ms)
cbb0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
cbc0: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
cbd0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
cbe0: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
cbf0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
cc00: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
cc10: 6e 64 69 66 0a 20 20 69 66 28 20 6d 73 3e 30 20  ndif.  if( ms>0 
cc20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
cc30: 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20  usy_handler(db, 
cc40: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
cc50: 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  yCallback, (void
cc60: 2a 29 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62  *)db);.    db->b
cc70: 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b  usyTimeout = ms;
cc80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
cc90: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
cca0: 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  er(db, 0, 0);.  
ccb0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
ccc0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
ccd0: 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67  ause any pending
cce0: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74   operation to st
ccf0: 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65  op at its earlie
cd00: 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a  st opportunity..
cd10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
cd20: 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74 65  interrupt(sqlite
cd30: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
cd40: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
cd50: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
cd60: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
cd70: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
cd80: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
cd90: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
cda0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rn;.  }.#endif. 
cdb0: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
cdc0: 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  upted = 1;.}.../
cdd0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
cde0: 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74 68  on is exactly th
cdf0: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
ce00: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
ce10: 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74  n(), except.** t
ce20: 68 61 74 20 69 74 20 69 73 20 64 65 73 69 67 6e  hat it is design
ce30: 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
ce40: 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65  by internal code
ce50: 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  . The difference
ce60: 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61   is.** that if a
ce70: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20   malloc() fails 
ce80: 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  in sqlite3_creat
ce90: 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e  e_function(), an
cea0: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69   error code.** i
ceb0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
cec0: 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  he mallocFailed 
ced0: 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a  flag cleared. .*
cee0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65  /.int sqlite3Cre
cef0: 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ateFunc(.  sqlit
cf00: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
cf10: 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  char *zFunctionN
cf20: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  ame,.  int nArg,
cf30: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
cf40: 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20  id *pUserData,. 
cf50: 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73   void (*xFunc)(s
cf60: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
cf70: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
cf80: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
cf90: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
cfa0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
cfb0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
cfc0: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
cfd0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
cfe0: 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63  ),.  FuncDestruc
cff0: 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72  tor *pDestructor
d000: 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70  .){.  FuncDef *p
d010: 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20  ;.  int nName;. 
d020: 20 69 6e 74 20 65 78 74 72 61 46 6c 61 67 73 3b   int extraFlags;
d030: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
d040: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
d050: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  b->mutex) );.  i
d060: 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  f( zFunctionName
d070: 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 46  ==0 ||.      (xF
d080: 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c  unc && (xFinal |
d090: 7c 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20  | xStep)) || .  
d0a0: 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28      (!xFunc && (
d0b0: 78 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70  xFinal && !xStep
d0c0: 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 46  )) ||.      (!xF
d0d0: 75 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20  unc && (!xFinal 
d0e0: 26 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20  && xStep)) ||.  
d0f0: 20 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20      (nArg<-1 || 
d100: 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  nArg>SQLITE_MAX_
d110: 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c  FUNCTION_ARG) ||
d120: 0a 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61  .      (255<(nNa
d130: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
d140: 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e  en30( zFunctionN
d150: 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65  ame))) ){.    re
d160: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
d170: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  SE_BKPT;.  }..  
d180: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
d190: 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51  UNC_CONSTANT==SQ
d1a0: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
d1b0: 49 43 20 29 3b 0a 20 20 65 78 74 72 61 46 6c 61  IC );.  extraFla
d1c0: 67 73 20 3d 20 65 6e 63 20 26 20 20 53 51 4c 49  gs = enc &  SQLI
d1d0: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
d1e0: 3b 0a 20 20 65 6e 63 20 26 3d 20 28 53 51 4c 49  ;.  enc &= (SQLI
d1f0: 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c  TE_FUNC_ENCMASK|
d200: 53 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a  SQLITE_ANY);.  .
d210: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d220: 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49  MIT_UTF16.  /* I
d230: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  f SQLITE_UTF16 i
d240: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74  s specified as t
d250: 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65  he encoding type
d260: 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73  , transform this
d270: 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20  .  ** to one of 
d280: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f  SQLITE_UTF16LE o
d290: 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  r SQLITE_UTF16BE
d2a0: 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
d2b0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
d2c0: 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45  VE macro. SQLITE
d2d0: 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73  _UTF16 is not us
d2e0: 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ed internally.. 
d2f0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49   **.  ** If SQLI
d300: 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66  TE_ANY is specif
d310: 69 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76  ied, add three v
d320: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  ersions of the f
d330: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20  unction.  ** to 
d340: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a  the hash table..
d350: 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d    */.  if( enc==
d360: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a  SQLITE_UTF16 ){.
d370: 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45      enc = SQLITE
d380: 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
d390: 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53  }else if( enc==S
d3a0: 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20  QLITE_ANY ){.   
d3b0: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20   int rc;.    rc 
d3c0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
d3d0: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  unc(db, zFunctio
d3e0: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  nName, nArg, SQL
d3f0: 49 54 45 5f 55 54 46 38 7c 65 78 74 72 61 46 6c  ITE_UTF8|extraFl
d400: 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 70 55  ags,.         pU
d410: 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20  serData, xFunc, 
d420: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
d430: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
d440: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d450: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
d460: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
d470: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
d480: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
d490: 54 45 5f 55 54 46 31 36 4c 45 7c 65 78 74 72 61  TE_UTF16LE|extra
d4a0: 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
d4b0: 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e   pUserData, xFun
d4c0: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
d4d0: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
d4e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
d4f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d500: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
d510: 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20      }.    enc = 
d520: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a  SQLITE_UTF16BE;.
d530: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20    }.#else.  enc 
d540: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
d550: 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68  endif.  .  /* Ch
d560: 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69  eck if an existi
d570: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  ng function is b
d580: 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20  eing overridden 
d590: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73  or deleted. If s
d5a0: 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72  o,.  ** and ther
d5b0: 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
d5c0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51  , then return SQ
d5d0: 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20  LITE_BUSY. If a 
d5e0: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
d5f0: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
d600: 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68  n/deleted but th
d610: 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76  ere are no activ
d620: 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65  e VMs, allow the
d630: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  .  ** operation 
d640: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20  to continue but 
d650: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
d660: 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  recompiled state
d670: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20  ments..  */.  p 
d680: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
d690: 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74  ction(db, zFunct
d6a0: 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  ionName, nName, 
d6b0: 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30  nArg, (u8)enc, 0
d6c0: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 28 70  );.  if( p && (p
d6d0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
d6e0: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
d6f0: 4b 29 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41  K)==enc && p->nA
d700: 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20  rg==nArg ){.    
d710: 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  if( db->nVdbeAct
d720: 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ive ){.      sql
d730: 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
d740: 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
d750: 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62  , .        "unab
d760: 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64  le to delete/mod
d770: 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69 6f  ify user-functio
d780: 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20  n due to active 
d790: 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20  statements");.  
d7a0: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
d7b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
d7c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
d7d0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
d7e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
d7f0: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
d800: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
d810: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20  .    }.  }..  p 
d820: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
d830: 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74  ction(db, zFunct
d840: 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  ionName, nName, 
d850: 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31  nArg, (u8)enc, 1
d860: 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c  );.  assert(p ||
d870: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d880: 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  d);.  if( !p ){.
d890: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d8a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
d8b0: 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72 20 76  /* If an older v
d8c0: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 75  ersion of the fu
d8d0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20 63 6f  nction with a co
d8e0: 6e 66 69 67 75 72 65 64 20 64 65 73 74 72 75 63  nfigured destruc
d8f0: 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e  tor is.  ** bein
d900: 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76 6f 6b  g replaced invok
d910: 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
d920: 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20   function here. 
d930: 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44 65 73  */.  functionDes
d940: 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a 20 20  troy(db, p);..  
d950: 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20  if( pDestructor 
d960: 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74  ){.    pDestruct
d970: 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  or->nRef++;.  }.
d980: 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72    p->pDestructor
d990: 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72 3b 0a   = pDestructor;.
d9a0: 20 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d    p->funcFlags =
d9b0: 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26   (p->funcFlags &
d9c0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43   SQLITE_FUNC_ENC
d9d0: 4d 41 53 4b 29 20 7c 20 65 78 74 72 61 46 6c 61  MASK) | extraFla
d9e0: 67 73 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  gs;.  testcase( 
d9f0: 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  p->funcFlags & S
da00: 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
da10: 54 49 43 20 29 3b 0a 20 20 70 2d 3e 78 46 75 6e  TIC );.  p->xFun
da20: 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e  c = xFunc;.  p->
da30: 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b 0a 20  xStep = xStep;. 
da40: 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20   p->xFinalize = 
da50: 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73  xFinal;.  p->pUs
da60: 65 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61  erData = pUserDa
da70: 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20  ta;.  p->nArg = 
da80: 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74  (u16)nArg;.  ret
da90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
daa0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e  ../*.** Create n
dab0: 65 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  ew user function
dac0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
dad0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
dae0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
daf0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
db00: 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72  zFunc,.  int nAr
db10: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
db20: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
db30: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
db40: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
db50: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
db60: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
db70: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
db80: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
db90: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
dba0: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
dbb0: 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20  3_context*).){. 
dbc0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
dbd0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
dbe0: 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41  v2(db, zFunc, nA
dbf0: 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e  rg, enc, p, xFun
dc00: 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20  c, xStep,.      
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 46                xF
dc30: 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74  inal, 0);.}..int
dc40: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
dc50: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73  function_v2(.  s
dc60: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
dc70: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
dc80: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
dc90: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
dca0: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e  p,.  void (*xFun
dcb0: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
dcc0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
dcd0: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
dce0: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
dcf0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
dd00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
dd10: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
dd20: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
dd30: 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ext*),.  void (*
dd40: 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a  xDestroy)(void *
dd50: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ).){.  int rc = 
dd60: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
dd70: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
dd80: 70 41 72 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65  pArg = 0;..#ifde
dd90: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
dda0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
ddb0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
ddc0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
ddd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
dde0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
ddf0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
de00: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
de10: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78  >mutex);.  if( x
de20: 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70  Destroy ){.    p
de30: 41 72 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72  Arg = (FuncDestr
de40: 75 63 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44  uctor *)sqlite3D
de50: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
de60: 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72  sizeof(FuncDestr
de70: 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28  uctor));.    if(
de80: 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20   !pArg ){.      
de90: 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20  xDestroy(p);.   
dea0: 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20     goto out;.   
deb0: 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65   }.    pArg->xDe
dec0: 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79  stroy = xDestroy
ded0: 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65  ;.    pArg->pUse
dee0: 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20  rData = p;.  }. 
def0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
df00: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
df10: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
df20: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
df30: 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20  Final, pArg);.  
df40: 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
df50: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
df60: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
df70: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44  ITE_OK );.    xD
df80: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73  estroy(p);.    s
df90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
dfa0: 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75   pArg);.  }.. ou
dfb0: 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  t:.  rc = sqlite
dfc0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
dfd0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
dfe0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
dff0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
e000: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
e010: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e  TE_OMIT_UTF16.in
e020: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
e030: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73  _function16(.  s
e040: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
e050: 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74  nst void *zFunct
e060: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
e070: 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74  Arg,.  int eText
e080: 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  Rep,.  void *p,.
e090: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
e0a0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
e0b0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
e0c0: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ue**),.  void (*
e0d0: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
e0e0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
e0f0: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
e100: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
e110: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
e120: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
e130: 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23  char *zFunc8;..#
e140: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e150: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
e160: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
e170: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c  tyCheckOk(db) ||
e180: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d   zFunctionName==
e190: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
e1a0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
e1b0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
e1c0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
e1d0: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
e1e0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
e1f0: 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20  led );.  zFunc8 
e200: 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f  = sqlite3Utf16to
e210: 38 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  8(db, zFunctionN
e220: 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
e230: 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
e240: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
e250: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
e260: 38 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65  8, nArg, eTextRe
e270: 70 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74  p, p, xFunc, xSt
e280: 65 70 2c 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20  ep, xFinal,0);. 
e290: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e2a0: 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63  b, zFunc8);.  rc
e2b0: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
e2c0: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
e2d0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
e2e0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
e2f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
e300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61  if.../*.** Decla
e310: 72 65 20 74 68 61 74 20 61 20 66 75 6e 63 74 69  re that a functi
e320: 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  on has been over
e330: 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69 72 74  loaded by a virt
e340: 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
e350: 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   If the function
e360: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
e370: 61 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f  as a regular glo
e380: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  bal function, th
e390: 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
e3a0: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
e3b0: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
e3c0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
e3d0: 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61  then create.** a
e3e0: 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c   new one that al
e3f0: 77 61 79 73 20 74 68 72 6f 77 73 20 61 20 72 75  ways throws a ru
e400: 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a  n-time error.  .
e410: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75  **.** When virtu
e420: 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64  al tables intend
e430: 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f   to provide an o
e440: 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69  verloaded functi
e450: 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75  on, they.** shou
e460: 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ld call this rou
e470: 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  tine to make sur
e480: 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e  e the global fun
e490: 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a  ction exists..**
e4a0: 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69   A global functi
e4b0: 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e  on must exist in
e4c0: 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20   order for name 
e4d0: 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f  resolution to wo
e4e0: 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a  rk.** properly..
e4f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
e500: 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e  verload_function
e510: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
e520: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e530: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
e540: 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20  .){.  int nName 
e550: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
e560: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20  0(zName);.  int 
e570: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
e580: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e590: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
e5a0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
e5b0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
e5c0: 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 6e  || zName==0 || n
e5d0: 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20 72 65  Arg<-2 ){.    re
e5e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
e5f0: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e  SE_BKPT;.  }.#en
e600: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
e610: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
e620: 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  tex);.  if( sqli
e630: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
e640: 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  db, zName, nName
e650: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
e660: 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20  TF8, 0)==0 ){.  
e670: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
e680: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e 61  eateFunc(db, zNa
e690: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
e6a0: 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20  _UTF8,.         
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6c0: 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e 76 61    0, sqlite3Inva
e6d0: 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  lidFunction, 0, 
e6e0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20  0, 0);.  }.  rc 
e6f0: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
e700: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
e710: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
e720: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
e730: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
e740: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e750: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69  TRACE./*.** Regi
e760: 73 74 65 72 20 61 20 74 72 61 63 65 20 66 75 6e  ster a trace fun
e770: 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67  ction.  The pArg
e780: 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
e790: 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  usly registered 
e7a0: 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65 74 75  trace.** is retu
e7b0: 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20  rned.  .**.** A 
e7c0: 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e 63 74  NULL trace funct
e7d0: 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ion means that n
e7e0: 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65 78 65  o tracing is exe
e7f0: 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55  cutes.  A non-NU
e800: 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73 20 61  LL.** trace is a
e810: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
e820: 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69  nction that is i
e830: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 73 74  nvoked at the st
e840: 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53  art of each.** S
e850: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  QL statement..*/
e860: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 74  .void *sqlite3_t
e870: 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a 64 62  race(sqlite3 *db
e880: 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63 65 29  , void (*xTrace)
e890: 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
e8a0: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
e8b0: 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
e8c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e8d0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
e8e0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
e8f0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
e900: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
e910: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
e920: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
e930: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
e940: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
e950: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
e960: 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41  ld = db->pTraceA
e970: 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65  rg;.  db->xTrace
e980: 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d   = xTrace;.  db-
e990: 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72  >pTraceArg = pAr
e9a0: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
e9b0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
e9c0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
e9d0: 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69  ld;.}./*.** Regi
e9e0: 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66  ster a profile f
e9f0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
ea00: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
ea10: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
ea20: 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75  d .** profile fu
ea30: 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e  nction is return
ea40: 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ed.  .**.** A NU
ea50: 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74  LL profile funct
ea60: 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ion means that n
ea70: 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65  o profiling is e
ea80: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
ea90: 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  NULL.** profile 
eaa0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
eab0: 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
eac0: 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
ead0: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a  e conclusion of.
eae0: 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  ** each SQL stat
eaf0: 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75  ement that is ru
eb00: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
eb10: 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73  te3_profile(.  s
eb20: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
eb30: 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76  id (*xProfile)(v
eb40: 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
eb50: 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c  ,sqlite_uint64),
eb60: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
eb70: 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a  .  void *pOld;..
eb80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
eb90: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
eba0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
ebb0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
ebc0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
ebd0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
ebe0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ebf0: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
ec00: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
ec10: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
ec20: 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  d = db->pProfile
ec30: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66  Arg;.  db->xProf
ec40: 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a  ile = xProfile;.
ec50: 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72    db->pProfileAr
ec60: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
ec70: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ec80: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
ec90: 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e  turn pOld;.}.#en
eca0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
ecb0: 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  IT_TRACE */../*.
ecc0: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 66 75  ** Register a fu
ecd0: 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
ece0: 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  oked when a tran
ecf0: 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e  saction commits.
ed00: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b  .** If the invok
ed10: 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ed function retu
ed20: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
ed30: 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65  en the commit be
ed40: 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62  comes a.** rollb
ed50: 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ack..*/.void *sq
ed60: 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f  lite3_commit_hoo
ed70: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
ed80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
ed90: 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
eda0: 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
edb0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43  se */.  int (*xC
edc0: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c  allback)(void*),
edd0: 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f    /* Function to
ede0: 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20   invoke on each 
edf0: 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64  commit */.  void
ee00: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
ee10: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
ee20: 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
ee30: 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
ee40: 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51  pOld;..#ifdef SQ
ee50: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
ee60: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
ee70: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
ee80: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
ee90: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
eea0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
eeb0: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
eec0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
eed0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
eee0: 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
eef0: 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d  CommitArg;.  db-
ef00: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
ef10: 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
ef20: 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d  db->pCommitArg =
ef30: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
ef40: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
ef50: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
ef60: 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pOld;.}../*.**
ef70: 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
ef80: 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
ef90: 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 72  ed each time a r
efa0: 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a  ow is updated,.*
efb0: 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65  * inserted or de
efc0: 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 69 73  leted using this
efd0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
efe0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
eff0: 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f  qlite3_update_ho
f000: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
f010: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
f020: 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
f030: 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ok to this datab
f040: 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ase */.  void (*
f050: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
f060: 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20  ,int,char const 
f070: 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73  *,char const *,s
f080: 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20  qlite_int64),.  
f090: 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
f0a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
f0b0: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
f0c0: 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
f0d0: 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65  id *pRet;..#ifde
f0e0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
f0f0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
f100: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
f110: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
f120: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
f130: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
f140: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
f150: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
f160: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
f170: 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
f180: 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20  b->pUpdateArg;. 
f190: 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c   db->xUpdateCall
f1a0: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
f1b0: 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41  ;.  db->pUpdateA
f1c0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
f1d0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f1e0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
f1f0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
f200: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
f210: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
f220: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
f230: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
f240: 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  s rolled.** back
f250: 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
f260: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
f270: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72  .void *sqlite3_r
f280: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20  ollback_hook(.  
f290: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
f2a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
f2b0: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
f2c0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
f2d0: 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62  .  void (*xCallb
f2e0: 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20  ack)(void*), /* 
f2f0: 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  Callback functio
f300: 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  n */.  void *pAr
f310: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
f320: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
f330: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
f340: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b  ){.  void *pRet;
f350: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f360: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
f370: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
f380: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
f390: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
f3a0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
f3b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
f3c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
f3d0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
f3e0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
f3f0: 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62  Ret = db->pRollb
f400: 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52  ackArg;.  db->xR
f410: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
f420: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
f430: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20  b->pRollbackArg 
f440: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
f450: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
f460: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
f470: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
f480: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f490: 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  WAL./*.** The sq
f4a0: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
f4b0: 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
f4c0: 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ered by sqlite3_
f4d0: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
f4e0: 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20  nt()..** Invoke 
f4f0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
f500: 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75  kpoint if the nu
f510: 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
f520: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a  n the log file.*
f530: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
f540: 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72  n sqlite3.pWalAr
f550: 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74  g cast to an int
f560: 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65 20  eger (the value 
f570: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a  configured by.**
f580: 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
f590: 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20  int())..*/ .int 
f5a0: 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
f5b0: 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70  tHook(.  void *p
f5c0: 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  ClientData,     
f5d0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20  /* Argument */. 
f5e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
f5f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
f600: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ction */.  const
f610: 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
f620: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f    /* Database */
f630: 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20  .  int nFrame   
f640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f650: 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20  e of WAL */.){. 
f660: 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c   if( nFrame>=SQL
f670: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
f680: 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20  ClientData) ){. 
f690: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
f6a0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
f6b0: 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63     sqlite3_wal_c
f6c0: 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44  heckpoint(db, zD
f6d0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  b);.    sqlite3E
f6e0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
f6f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
f700: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
f710: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
f720: 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
f730: 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c  Configure an sql
f740: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
f750: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f  callback to auto
f760: 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70  matically checkp
f770: 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61  oint.** a databa
f780: 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74  se after committ
f790: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
f7a0: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
f7b0: 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65  Frame or.** more
f7c0: 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
f7d0: 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67  og file. Passing
f7e0: 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74   zero or a negat
f7f0: 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68 65  ive value as the
f800: 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d  .** nFrame param
f810: 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61 75  eter disables au
f820: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
f830: 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a  nts entirely..**
f840: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
f850: 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 74   registered by t
f860: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70  his function rep
f870: 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74 69  laces any existi
f880: 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72  ng callback.** r
f890: 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 20  egistered using 
f8a0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
f8b0: 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65  (). Likewise, re
f8c0: 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c  gistering a call
f8d0: 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71  back.** using sq
f8e0: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
f8f0: 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 75   disables the au
f900: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
f910: 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20  nt mechanism.** 
f920: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68  configured by th
f930: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
f940: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
f950: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73  autocheckpoint(s
f960: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
f970: 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20  nFrame){.#ifdef 
f980: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
f990: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
f9a0: 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44  ER(db);.  UNUSED
f9b0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d  _PARAMETER(nFram
f9c0: 65 29 3b 0a 23 65 6c 73 65 0a 23 69 66 64 65 66  e);.#else.#ifdef
f9d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
f9e0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
f9f0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
fa00: 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
fa10: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
fa20: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69  BKPT;.#endif.  i
fa30: 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20  f( nFrame>0 ){. 
fa40: 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68     sqlite3_wal_h
fa50: 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57  ook(db, sqlite3W
fa60: 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53  alDefaultHook, S
fa70: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
fa80: 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c  (nFrame));.  }el
fa90: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
faa0: 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20  wal_hook(db, 0, 
fab0: 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
fac0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fad0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  K;.}../*.** Regi
fae0: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
faf0: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
fb00: 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61  ch time a transa
fb10: 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e  ction is written
fb20: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69  .** into the wri
fb30: 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20  te-ahead-log by 
fb40: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
fb50: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
fb60: 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  d *sqlite3_wal_h
fb70: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
fb80: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
fb90: 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
fba0: 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
fbb0: 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  s db handle */. 
fbc0: 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29   int(*xCallback)
fbd0: 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33  (void *, sqlite3
fbe0: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  *, const char*, 
fbf0: 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  int),.  void *pA
fc00: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
fc10: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
fc20: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
fc30: 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20   to xCallback() 
fc40: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
fc50: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
fc60: 76 6f 69 64 20 2a 70 52 65 74 3b 0a 23 69 66 64  void *pRet;.#ifd
fc70: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
fc80: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
fc90: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
fca0: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
fcb0: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
fcc0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
fcd0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
fce0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
fcf0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
fd00: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
fd10: 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64  db->pWalArg;.  d
fd20: 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20  b->xWalCallback 
fd30: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
fd40: 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41 72  b->pWalArg = pAr
fd50: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
fd60: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
fd70: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
fd80: 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  et;.#else.  retu
fd90: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 0;.#endif.}..
fda0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74  /*.** Checkpoint
fdb0: 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a   database zDb..*
fdc0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  /.int sqlite3_wa
fdd0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
fde0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe00: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
fe10: 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
fe20: 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
fe30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
fe40: 6d 65 20 6f 66 20 61 74 74 61 63 68 65 64 20 64  me of attached d
fe50: 61 74 61 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c  atabase (or NULL
fe60: 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65  ) */.  int eMode
fe70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fe80: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
fe90: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61  _CHECKPOINT_* va
fea0: 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  lue */.  int *pn
feb0: 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Log,            
fec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
fed0: 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67   Size of WAL log
fee0: 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20   in frames */.  
fef0: 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 20  int *pnCkpt     
ff00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff10: 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75  /* OUT: Total nu
ff20: 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 63  mber of frames c
ff30: 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29  heckpointed */.)
ff40: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
ff50: 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74 75 72  OMIT_WAL.  retur
ff60: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  n SQLITE_OK;.#el
ff70: 73 65 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  se.  int rc;    
ff80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff90: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
ffa0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ode */.  int iDb
ffb0: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54   = SQLITE_MAX_AT
ffc0: 54 41 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69  TACHED;  /* sqli
ffd0: 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20  te3.aDb[] index 
ffe0: 6f 66 20 64 62 20 74 6f 20 63 68 65 63 6b 70 6f  of db to checkpo
fff0: 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  int */..#ifdef S
10000 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
10010 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
10020 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
10030 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
10040 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
10050 50 54 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  PT;.#endif..  /*
10060 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
10070 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
10080 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61   to -1 in case a
10090 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
100a0 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29  */.  if( pnLog )
100b0 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20   *pnLog = -1;.  
100c0 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e  if( pnCkpt ) *pn
100d0 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73  Ckpt = -1;..  as
100e0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
100f0 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d  CKPOINT_PASSIVE=
10100 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10110 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
10120 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61  T_FULL==1 );.  a
10130 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
10140 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54  ECKPOINT_RESTART
10150 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==2 );.  assert(
10160 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
10170 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29  NT_TRUNCATE==3 )
10180 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53 51  ;.  if( eMode<SQ
10190 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
101a0 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65  PASSIVE || eMode
101b0 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  >SQLITE_CHECKPOI
101c0 4e 54 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20  NT_TRUNCATE ){. 
101d0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
101e0 46 3a 20 52 2d 30 33 39 39 36 2d 31 32 30 38 38  F: R-03996-12088
101f0 20 54 68 65 20 4d 20 70 61 72 61 6d 65 74 65 72   The M parameter
10200 20 6d 75 73 74 20 62 65 20 61 20 76 61 6c 69 64   must be a valid
10210 20 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20 20 20   checkpoint.    
10220 2a 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20 20  ** mode: */.    
10230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
10240 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  SUSE;.  }..  sql
10250 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
10260 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
10270 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d  f( zDb && zDb[0]
10280 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   ){.    iDb = sq
10290 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
102a0 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20  db, zDb);.  }.  
102b0 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
102c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
102d0 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  OR;.    sqlite3E
102e0 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
102f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75  SQLITE_ERROR, "u
10300 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a  nknown database:
10310 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65   %s", zDb);.  }e
10320 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73  lse{.    db->bus
10330 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d  yHandler.nBusy =
10340 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
10350 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64  ite3Checkpoint(d
10360 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70  b, iDb, eMode, p
10370 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20  nLog, pnCkpt);. 
10380 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
10390 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72  db, rc);.  }.  r
103a0 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
103b0 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
103c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
103d0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
103e0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
103f0 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  f.}.../*.** Chec
10400 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
10410 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e  zDb. If zDb is N
10420 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62  ULL, or if the b
10430 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73  uffer zDb points
10440 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20  .** to contains 
10450 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74  a zero-length st
10460 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68  ring, all attach
10470 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ed databases are
10480 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65   .** checkpointe
10490 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
104a0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
104b0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
104c0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
104d0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
104e0 3a 20 52 2d 34 31 36 31 33 2d 32 30 35 35 33 20  : R-41613-20553 
104f0 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  The sqlite3_wal_
10500 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c 58 29 20  checkpoint(D,X) 
10510 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
10520 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 77 61  .  ** sqlite3_wa
10530 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
10540 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b  D,X,SQLITE_CHECK
10550 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c  POINT_PASSIVE,0,
10560 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  0). */.  return 
10570 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
10580 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 7a 44 62  kpoint_v2(db,zDb
10590 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  ,SQLITE_CHECKPOI
105a0 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29 3b  NT_PASSIVE,0,0);
105b0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
105c0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
105d0 2a 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69  * Run a checkpoi
105e0 6e 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69  nt on database i
105f0 44 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  Db. This is a no
10600 2d 6f 70 20 69 66 20 64 61 74 61 62 61 73 65 20  -op if database 
10610 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75  iDb is.** not cu
10620 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20  rrently open in 
10630 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  WAL mode..**.** 
10640 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
10650 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20   is open on the 
10660 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 63  database being c
10670 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69  heckpointed, thi
10680 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  s .** function r
10690 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f  eturns SQLITE_LO
106a0 43 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b  CKED and a check
106b0 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74  point is not att
106c0 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61  empted. If .** a
106d0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
106e0 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65  hile running the
106f0 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20   checkpoint, an 
10700 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
10710 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
10720 64 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49  d (i.e. SQLITE_I
10730 4f 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65  OERR). Otherwise
10740 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
10750 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20  ** The mutex on 
10760 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
10770 64 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  db should be hel
10780 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
10790 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73   The mutex.** as
107a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
107b0 65 20 73 70 65 63 69 66 69 63 20 62 2d 74 72 65  e specific b-tre
107c0 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69  e being checkpoi
107d0 6e 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79  nted is taken by
107e0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
107f0 6e 20 77 68 69 6c 65 20 74 68 65 20 63 68 65 63  n while the chec
10800 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e  kpoint is runnin
10810 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20  g..**.** If iDb 
10820 69 73 20 70 61 73 73 65 64 20 53 51 4c 49 54 45  is passed SQLITE
10830 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74  _MAX_ATTACHED, t
10840 68 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64  hen all attached
10850 20 64 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a   databases are.*
10860 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20  * checkpointed. 
10870 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  If an error is e
10880 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73  ncountered it is
10890 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69   returned immedi
108a0 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74  ately -.** no at
108b0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
108c0 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20   checkpoint any 
108d0 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61  remaining databa
108e0 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ses..**.** Param
108f0 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e  eter eMode is on
10900 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43  e of SQLITE_CHEC
10910 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20  KPOINT_PASSIVE, 
10920 46 55 4c 4c 20 6f 72 20 52 45 53 54 41 52 54 2e  FULL or RESTART.
10930 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
10940 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
10950 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
10960 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a  int eMode, int *
10970 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b  pnLog, int *pnCk
10980 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pt){.  int rc = 
10990 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
109a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
109b0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
109c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
109d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
109e0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
109f0 72 6f 75 67 68 20 61 74 74 61 63 68 65 64 20 64  rough attached d
10a00 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73  bs */.  int bBus
10a10 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
10a20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
10a30 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68  if SQLITE_BUSY h
10a40 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  as been encounte
10a50 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  red */..  assert
10a60 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10a70 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
10a80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e  );.  assert( !pn
10a90 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d  Log || *pnLog==-
10aa0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
10ab0 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70  pnCkpt || *pnCkp
10ac0 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28  t==-1 );..  for(
10ad0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26  i=0; i<db->nDb &
10ae0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
10af0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
10b00 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51  ==iDb || iDb==SQ
10b10 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
10b20 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
10b30 73 71 6c 69 74 65 33 42 74 72 65 65 43 68 65 63  sqlite3BtreeChec
10b40 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69  kpoint(db->aDb[i
10b50 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e  ].pBt, eMode, pn
10b60 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20  Log, pnCkpt);.  
10b70 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20      pnLog = 0;. 
10b80 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b       pnCkpt = 0;
10b90 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
10ba0 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
10bb0 20 20 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b        bBusy = 1;
10bc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
10bd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
10be0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
10bf0 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
10c00 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20  _OK && bBusy) ? 
10c10 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63  SQLITE_BUSY : rc
10c20 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
10c30 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
10c40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
10c50 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72  ction returns tr
10c60 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72  ue if main-memor
10c70 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  y should be used
10c80 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61   instead of.** a
10c90 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
10ca0 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61  for transient pa
10cb0 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74  ger files and st
10cc0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
10cd0 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  ..** The value r
10ce0 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20  eturned depends 
10cf0 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
10d00 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28  db->temp_store (
10d10 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d  runtime.** param
10d20 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f  eter) and the co
10d30 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65  mpile time value
10d40 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f   of SQLITE_TEMP_
10d50 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f  STORE. The.** fo
10d60 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
10d70 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c 61  scribes the rela
10d80 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
10d90 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65   these two value
10da0 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75  s.** and this fu
10db0 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76  nctions return v
10dc0 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51  alue..**.**   SQ
10dd0 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20  LITE_TEMP_STORE 
10de0 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f      db->temp_sto
10df0 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20  re     Location 
10e00 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  of temporary dat
10e10 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  abase.**   -----
10e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
10e30 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
10e40 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
10e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e60 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
10e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
10e80 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
10e90 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
10ea0 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ec0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
10ed0 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
10ee0 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20  eturn 0).**   1 
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f00 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
10f10 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
10f20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
10f30 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
10f40 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
10f50 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
10f60 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
10f70 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
10f80 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
10fa0 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
10fb0 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fe0 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
10ff0 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 1).**   2     
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11010 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
11020 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
11030 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20  turn 1).**   3  
11040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11050 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20     any          
11060 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
11070 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e  (return 1).*/.in
11080 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  t sqlite3TempInM
11090 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69  emory(const sqli
110a0 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51  te3 *db){.#if SQ
110b0 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
110c0 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62  =1.  return ( db
110d0 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20  ->temp_store==2 
110e0 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  );.#endif.#if SQ
110f0 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
11100 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62  =2.  return ( db
11110 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20  ->temp_store!=1 
11120 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  );.#endif.#if SQ
11130 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
11140 3d 33 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  =3.  return 1;.#
11150 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
11160 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c  _TEMP_STORE<1 ||
11170 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
11180 52 45 3e 33 0a 20 20 72 65 74 75 72 6e 20 30 3b  RE>3.  return 0;
11190 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
111a0 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e   Return UTF-8 en
111b0 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  coded English la
111c0 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
111d0 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
111e0 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a  ecent.** error..
111f0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
11200 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71  qlite3_errmsg(sq
11210 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f  lite3 *db){.  co
11220 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
11230 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65  f( !db ){.    re
11240 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53  turn sqlite3ErrS
11250 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  tr(SQLITE_NOMEM)
11260 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
11270 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
11280 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
11290 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
112a0 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d  3ErrStr(SQLITE_M
112b0 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d  ISUSE_BKPT);.  }
112c0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
112d0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
112e0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
112f0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
11300 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53   z = sqlite3ErrS
11310 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  tr(SQLITE_NOMEM)
11320 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
11330 65 73 74 63 61 73 65 28 20 64 62 2d 3e 70 45 72  estcase( db->pEr
11340 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d 20  r==0 );.    z = 
11350 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
11360 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45  alue_text(db->pE
11370 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rr);.    assert(
11380 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
11390 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  ed );.    if( z=
113a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  =0 ){.      z = 
113b0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
113c0 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20  ->errCode);.    
113d0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
113e0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
113f0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
11400 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   z;.}..#ifndef S
11410 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
11420 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
11430 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67  F-16 encoded Eng
11440 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
11450 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  planation of the
11460 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
11470 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  error..*/.const 
11480 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72  void *sqlite3_er
11490 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a  rmsg16(sqlite3 *
114a0 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  db){.  static co
114b0 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d  nst u16 outOfMem
114c0 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20  [] = {.    'o', 
114d0 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27  'u', 't', ' ', '
114e0 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d  o', 'f', ' ', 'm
114f0 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27  ', 'e', 'm', 'o'
11500 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20  , 'r', 'y', 0.  
11510 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
11520 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d  t u16 misuse[] =
11530 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27 2c   {.    'l', 'i',
11540 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c 20   'b', 'r', 'a', 
11550 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a  'r', 'y', ' ', .
11560 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27 75      'r', 'o', 'u
11570 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e 27  ', 't', 'i', 'n'
11580 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'e', ' ', .   
11590 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20   'c', 'a', 'l', 
115a0 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20 27  'l', 'e', 'd', '
115b0 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 75   ', .    'o', 'u
115c0 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20 20  ', 't', ' ', .  
115d0 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c    'o', 'f', ' ',
115e0 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c 20   .    's', 'e', 
115f0 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20 27  'q', 'u', 'e', '
11600 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30 0a  n', 'c', 'e', 0.
11610 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f    };..  const vo
11620 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62  id *z;.  if( !db
11630 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
11640 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b  void *)outOfMem;
11650 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
11660 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
11670 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
11680 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a    return (void *
11690 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73  )misuse;.  }.  s
116a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
116b0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
116c0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
116d0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d  ailed ){.    z =
116e0 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65   (void *)outOfMe
116f0 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  m;.  }else{.    
11700 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
11710 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72  e_text16(db->pEr
11720 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  r);.    if( z==0
11730 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11740 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
11750 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73  , db->errCode, s
11760 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d  qlite3ErrStr(db-
11770 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20 20 20 20  >errCode));.    
11780 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
11790 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70  lue_text16(db->p
117a0 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Err);.    }.    
117b0 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61  /* A malloc() ma
117c0 79 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 69  y have failed wi
117d0 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f  thin the call to
117e0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
117f0 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61  ext16().    ** a
11800 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69 73  bove. If this is
11810 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
11820 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  the db->mallocFa
11830 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20  iled flag needs 
11840 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65  to.    ** be cle
11850 61 72 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  ared before retu
11860 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64  rning. Do this d
11870 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
11880 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73   of via.    ** s
11890 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 29 2c  qlite3ApiExit(),
118a0 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e   to avoid settin
118b0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  g the database h
118c0 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73  andle error mess
118d0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
118e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
118f0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
11900 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
11910 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
11920 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
11930 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
11940 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
11950 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  Return the most 
11960 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  recent error cod
11970 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
11980 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65  n SQLite routine
11990 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20  . If NULL is.** 
119a0 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
119b0 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75  unction, we assu
119c0 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  me a malloc() fa
119d0 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69  iled during sqli
119e0 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69  te3_open()..*/.i
119f0 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  nt sqlite3_errco
11a00 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  de(sqlite3 *db){
11a10 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71  .  if( db && !sq
11a20 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
11a30 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
11a40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11a50 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
11a60 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20   }.  if( !db || 
11a70 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11a80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11a90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
11aa0 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72  .  return db->er
11ab0 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d  rCode & db->errM
11ac0 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  ask;.}.int sqlit
11ad0 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
11ae0 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ode(sqlite3 *db)
11af0 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73  {.  if( db && !s
11b00 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
11b10 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
11b20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11b30 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
11b40 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c    }.  if( !db ||
11b50 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11b60 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
11b70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
11b80 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65  }.  return db->e
11b90 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrCode;.}../*.**
11ba0 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   Return a string
11bb0 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
11bc0 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  the kind of erro
11bd0 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  r specified in t
11be0 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  he.** argument. 
11bf0 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20 73   For now, this s
11c00 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68 65 20  imply calls the 
11c10 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74 65 33  internal sqlite3
11c20 45 72 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63  ErrStr().** func
11c30 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  tion..*/.const c
11c40 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
11c50 73 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 72  str(int rc){.  r
11c60 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
11c70 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Str(rc);.}../*.*
11c80 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
11c90 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
11ca0 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 22  n for database "
11cb0 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69  db".  The name i
11cc0 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74  s zName.** and t
11cd0 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65  he encoding is e
11ce0 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nc..*/.static in
11cf0 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  t createCollatio
11d00 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  n(.  sqlite3* db
11d10 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
11d20 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63  zName, .  u8 enc
11d30 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a  ,.  void* pCtx,.
11d40 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
11d50 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
11d60 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
11d70 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28   void*),.  void(
11d80 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b  *xDel)(void*).){
11d90 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
11da0 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20  l;.  int enc2;. 
11db0 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
11dc0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
11dd0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
11de0 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46  /* If SQLITE_UTF
11df0 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20  16 is specified 
11e00 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  as the encoding 
11e10 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20  type, transform 
11e20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65  this.  ** to one
11e30 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   of SQLITE_UTF16
11e40 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46  LE or SQLITE_UTF
11e50 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20  16BE using the. 
11e60 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   ** SQLITE_UTF16
11e70 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51  NATIVE macro. SQ
11e80 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f  LITE_UTF16 is no
11e90 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  t used internall
11ea0 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d  y..  */.  enc2 =
11eb0 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73 65   enc;.  testcase
11ec0 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
11ed0 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63 61  TF16 );.  testca
11ee0 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  se( enc2==SQLITE
11ef0 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29  _UTF16_ALIGNED )
11f00 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53 51  ;.  if( enc2==SQ
11f10 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e  LITE_UTF16 || en
11f20 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
11f30 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20 20  _ALIGNED ){.    
11f40 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55 54  enc2 = SQLITE_UT
11f50 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20  F16NATIVE;.  }. 
11f60 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54 45   if( enc2<SQLITE
11f70 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51  _UTF8 || enc2>SQ
11f80 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b 0a  LITE_UTF16BE ){.
11f90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11fa0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
11fb0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
11fc0 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72  f this call is r
11fd0 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61  emoving or repla
11fe0 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67  cing an existing
11ff0 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a   collation .  **
12000 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f   sequence. If so
12010 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
12020 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75  active VMs, retu
12030 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65 72  rn busy. If ther
12040 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63  e.  ** are no ac
12050 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69  tive VMs, invali
12060 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d  date any pre-com
12070 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
12080 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d  ..  */.  pColl =
12090 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
120a0 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32  Seq(db, (u8)enc2
120b0 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69  , zName, 0);.  i
120c0 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
120d0 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69  l->xCmp ){.    i
120e0 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  f( db->nVdbeActi
120f0 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ve ){.      sqli
12100 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
12110 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
12120 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c   .        "unabl
12130 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69  e to delete/modi
12140 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  fy collation seq
12150 75 65 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74  uence due to act
12160 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29  ive statements")
12170 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
12180 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
12190 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
121a0 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
121b0 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20 20  ments(db);..    
121c0 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  /* If collation 
121d0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77  sequence pColl w
121e0 61 73 20 63 72 65 61 74 65 64 20 64 69 72 65 63  as created direc
121f0 74 6c 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  tly by a call to
12200 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
12210 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
12220 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61  , and not genera
12230 74 65 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c  ted by synthColl
12240 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68  Seq(),.    ** th
12250 65 6e 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61  en any copies ma
12260 64 65 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53  de by synthCollS
12270 65 71 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20  eq() need to be 
12280 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20  invalidated..   
12290 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74   ** Also, collat
122a0 69 6f 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d  ion destructor -
122b0 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20   CollSeq.xDel() 
122c0 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e  - function may n
122d0 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
122e0 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20   called..    */ 
122f0 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d  .    if( (pColl-
12300 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55  >enc & ~SQLITE_U
12310 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65  TF16_ALIGNED)==e
12320 6e 63 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  nc2 ){.      Col
12330 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71  lSeq *aColl = sq
12340 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
12350 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61  b->aCollSeq, zNa
12360 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  me);.      int j
12370 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
12380 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<3; j++){.    
12390 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d      CollSeq *p =
123a0 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   &aColl[j];.    
123b0 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d      if( p->enc==
123c0 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20  pColl->enc ){.  
123d0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78          if( p->x
123e0 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Del ){.         
123f0 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55     p->xDel(p->pU
12400 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ser);.          
12410 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78  }.          p->x
12420 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Cmp = 0;.       
12430 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
12440 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  .  }..  pColl = 
12450 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
12460 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c  eq(db, (u8)enc2,
12470 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66   zName, 1);.  if
12480 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74  ( pColl==0 ) ret
12490 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
124a0 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20  ;.  pColl->xCmp 
124b0 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43  = xCompare;.  pC
124c0 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74  oll->pUser = pCt
124d0 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c  x;.  pColl->xDel
124e0 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c   = xDel;.  pColl
124f0 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63  ->enc = (u8)(enc
12500 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54  2 | (enc & SQLIT
12510 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
12520 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  );.  sqlite3Erro
12530 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  r(db, SQLITE_OK)
12540 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12550 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
12560 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e  This array defin
12570 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f  es hard upper bo
12580 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61  unds on limit va
12590 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  lues.  The.** in
125a0 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62  itializer must b
125b0 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77  e kept in sync w
125c0 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c  ith the SQLITE_L
125d0 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e  IMIT_*.** #defin
125e0 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e  es in sqlite3.h.
125f0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
12600 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b   int aHardLimit[
12610 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d  ] = {.  SQLITE_M
12620 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  AX_LENGTH,.  SQL
12630 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
12640 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
12650 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54  _COLUMN,.  SQLIT
12660 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
12670 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
12680 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a  OMPOUND_SELECT,.
12690 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42    SQLITE_MAX_VDB
126a0 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  E_OP,.  SQLITE_M
126b0 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c  AX_FUNCTION_ARG,
126c0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  .  SQLITE_MAX_AT
126d0 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45  TACHED,.  SQLITE
126e0 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
126f0 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  N_LENGTH,.  SQLI
12700 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
12710 4e 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20  NUMBER,      /* 
12720 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33  IMP: R-38091-323
12730 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d  52 */.  SQLITE_M
12740 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
12750 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  ,.  SQLITE_MAX_W
12760 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d  ORKER_THREADS,.}
12770 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  ;../*.** Make su
12780 72 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69  re the hard limi
12790 74 73 20 61 72 65 20 73 65 74 20 74 6f 20 72 65  ts are set to re
127a0 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a  asonable values.
127b0 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
127c0 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65  X_LENGTH<100.# e
127d0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
127e0 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
127f0 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64  t least 100.#end
12800 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
12810 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30  X_SQL_LENGTH<100
12820 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
12830 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d  MAX_SQL_LENGTH m
12840 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
12850 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  100.#endif.#if S
12860 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
12870 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  NGTH>SQLITE_MAX_
12880 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53  LENGTH.# error S
12890 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
128a0 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65  NGTH must not be
128b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51   greater than SQ
128c0 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a  LITE_MAX_LENGTH.
128d0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
128e0 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
128f0 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20  ELECT<2.# error 
12900 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
12910 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20  UND_SELECT must 
12920 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65  be at least 2.#e
12930 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
12940 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23  MAX_VDBE_OP<40.#
12950 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
12960 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62  X_VDBE_OP must b
12970 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65  e at least 40.#e
12980 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
12990 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
129a0 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  <0 || SQLITE_MAX
129b0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30  _FUNCTION_ARG>10
129c0 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
129d0 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
129e0 52 47 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  RG must be betwe
129f0 65 6e 20 30 20 61 6e 64 20 31 30 30 30 0a 23 65  en 0 and 1000.#e
12a00 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
12a10 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c  MAX_ATTACHED<0 |
12a20 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  | SQLITE_MAX_ATT
12a30 41 43 48 45 44 3e 31 32 35 0a 23 20 65 72 72 6f  ACHED>125.# erro
12a40 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  r SQLITE_MAX_ATT
12a50 41 43 48 45 44 20 6d 75 73 74 20 62 65 20 62 65  ACHED must be be
12a60 74 77 65 65 6e 20 30 20 61 6e 64 20 31 32 35 0a  tween 0 and 125.
12a70 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
12a80 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
12a90 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72  RN_LENGTH<1.# er
12aa0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
12ab0 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
12ac0 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
12ad0 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  ast 1.#endif.#if
12ae0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
12af0 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72  MN>32767.# error
12b00 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
12b10 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65  MN must not exce
12b20 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a  ed 32767.#endif.
12b30 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  #if SQLITE_MAX_T
12b40 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23  RIGGER_DEPTH<1.#
12b50 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
12b60 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
12b70 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
12b80 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   1.#endif.#if SQ
12b90 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
12ba0 54 48 52 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c  THREADS<0 || SQL
12bb0 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
12bc0 48 52 45 41 44 53 3e 35 30 0a 23 20 65 72 72 6f  HREADS>50.# erro
12bd0 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  r SQLITE_MAX_WOR
12be0 4b 45 52 5f 54 48 52 45 41 44 53 20 6d 75 73 74  KER_THREADS must
12bf0 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
12c00 64 20 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  d 50.#endif.../*
12c10 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
12c20 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e  alue of a limit.
12c30 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64    Report the old
12c40 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e   value..** If an
12c50 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69   invalid limit i
12c60 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69 65 64  ndex is supplied
12c70 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20  , report -1..** 
12c80 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
12c90 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74  but still report
12ca0 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69   the old value i
12cb0 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d  f the.** new lim
12cc0 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
12cd0 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65  **.** A new lowe
12ce0 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74  r limit does not
12cf0 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67   shrink existing
12d00 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20   constructs..** 
12d10 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e  It merely preven
12d20 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74  ts new construct
12d30 73 20 74 68 61 74 20 65 78 63 65 65 64 20 74 68  s that exceed th
12d40 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20  e limit.** from 
12d50 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  forming..*/.int 
12d60 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71  sqlite3_limit(sq
12d70 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c  lite3 *db, int l
12d80 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c  imitId, int newL
12d90 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64  imit){.  int old
12da0 4c 69 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20 53  Limit;..#ifdef S
12db0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
12dc0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
12dd0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
12de0 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
12df0 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
12e00 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
12e10 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn -1;.  }.#endi
12e20 66 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  f..  /* EVIDENCE
12e30 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30  -OF: R-30189-540
12e40 39 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69  97 For each limi
12e50 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54  t category SQLIT
12e60 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a  E_LIMIT_NAME.  *
12e70 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72  * there is a har
12e80 64 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65  d upper bound se
12e90 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t at compile-tim
12ea0 65 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63  e by a C preproc
12eb0 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f  essor.  ** macro
12ec0 20 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d   called SQLITE_M
12ed0 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f  AX_NAME. (The "_
12ee0 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e  LIMIT_" in the n
12ef0 61 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ame is changed t
12f00 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29  o.  ** "_MAX_".)
12f10 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
12f20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
12f30 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d  E_LIMIT_LENGTH]=
12f40 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47  =SQLITE_MAX_LENG
12f50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
12f60 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
12f70 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
12f80 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
12f90 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  SQL_LENGTH );.  
12fa0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
12fb0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
12fc0 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f  COLUMN]==SQLITE_
12fd0 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  MAX_COLUMN );.  
12fe0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
12ff0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
13000 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c  EXPR_DEPTH]==SQL
13010 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
13020 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
13030 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13040 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
13050 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45  _SELECT]==SQLITE
13060 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
13070 4c 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28  LECT);.  assert(
13080 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
13090 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50  TE_LIMIT_VDBE_OP
130a0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  ]==SQLITE_MAX_VD
130b0 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72  BE_OP );.  asser
130c0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
130d0 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54  LITE_LIMIT_FUNCT
130e0 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45  ION_ARG]==SQLITE
130f0 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
13100 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  G );.  assert( a
13110 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
13120 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d  _LIMIT_ATTACHED]
13130 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  ==SQLITE_MAX_ATT
13140 41 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ACHED );.  asser
13150 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
13160 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
13170 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d  PATTERN_LENGTH]=
13180 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
131c0 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
131d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
131e0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
131f0 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
13200 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  MBER]==SQLITE_MA
13210 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
13220 52 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  R);.  assert( aH
13230 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
13240 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
13250 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  PTH]==SQLITE_MAX
13260 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29  _TRIGGER_DEPTH )
13270 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
13280 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
13290 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
132a0 44 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  DS]==SQLITE_MAX_
132b0 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 29  WORKER_THREADS )
132c0 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
132d0 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
132e0 54 48 52 45 41 44 53 3d 3d 28 53 51 4c 49 54 45  THREADS==(SQLITE
132f0 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a  _N_LIMIT-1) );..
13300 0a 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30  .  if( limitId<0
13310 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c   || limitId>=SQL
13320 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20  ITE_N_LIMIT ){. 
13330 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
13340 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64  }.  oldLimit = d
13350 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  b->aLimit[limitI
13360 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d  d];.  if( newLim
13370 69 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20  it>=0 ){        
13380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d             /* IM
13390 50 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32  P: R-52476-28732
133a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c   */.    if( newL
133b0 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b  imit>aHardLimit[
133c0 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20  limitId] ){.    
133d0 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61    newLimit = aHa
133e0 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  rdLimit[limitId]
133f0 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34  ;  /* IMP: R-514
13400 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20  63-25634 */.    
13410 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74  }.    db->aLimit
13420 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c  [limitId] = newL
13430 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  imit;.  }.  retu
13440 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20  rn oldLimit;    
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13460 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31   /* IMP: R-53341
13470 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 23 69 66 20  -35419 */.}.#if 
13480 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
13490 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49  NABLE_AUTO_PROFI
134a0 4c 45 29 0a 2f 2a 20 73 74 64 65 72 72 20 6c 6f  LE)./* stderr lo
134b0 67 67 69 6e 67 20 2a 2f 0a 76 6f 69 64 20 5f 73  gging */.void _s
134c0 71 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69  qlite_auto_profi
134d0 6c 65 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f  le(void *aux, co
134e0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 2c 20 75  nst char *sql, u
134f0 36 34 20 6e 73 29 3b 0a 76 6f 69 64 20 5f 73 71  64 ns);.void _sq
13500 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 28  lite_auto_trace(
13510 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74  void *aux, const
13520 20 63 68 61 72 20 2a 73 71 6c 29 3b 0a 76 6f 69   char *sql);.voi
13530 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 70  d _sqlite_auto_p
13540 72 6f 66 69 6c 65 28 76 6f 69 64 20 2a 61 75 78  rofile(void *aux
13550 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  , const char *sq
13560 6c 2c 20 75 36 34 20 6e 73 29 20 7b 0a 23 70 72  l, u64 ns) {.#pr
13570 61 67 6d 61 20 75 6e 75 73 65 64 28 61 75 78 29  agma unused(aux)
13580 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
13590 2c 20 22 51 75 65 72 79 3a 20 25 73 5c 6e 20 45  , "Query: %s\n E
135a0 78 65 63 75 74 69 6f 6e 20 54 69 6d 65 3a 20 25  xecution Time: %
135b0 6c 6c 75 20 6d 73 5c 6e 22 2c 20 73 71 6c 2c 20  llu ms\n", sql, 
135c0 6e 73 20 2f 20 31 30 30 30 30 30 30 29 3b 0a 7d  ns / 1000000);.}
135d0 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75  .void _sqlite_au
135e0 74 6f 5f 74 72 61 63 65 28 76 6f 69 64 20 2a 61  to_trace(void *a
135f0 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ux, const char *
13600 73 71 6c 29 20 7b 0a 09 66 70 72 69 6e 74 66 28  sql) {..fprintf(
13610 73 74 64 65 72 72 2c 20 22 54 72 61 63 65 53 51  stderr, "TraceSQ
13620 4c 28 25 70 29 3a 20 25 73 5c 6e 22 2c 20 61 75  L(%p): %s\n", au
13630 78 2c 20 73 71 6c 29 3b 0a 7d 0a 0a 2f 2a 20 73  x, sql);.}../* s
13640 79 73 6c 6f 67 20 6c 6f 67 67 69 6e 67 20 2a 2f  yslog logging */
13650 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 6c 2e 68  .#include <asl.h
13660 3e 0a 73 74 61 74 69 63 20 61 73 6c 63 6c 69 65  >.static aslclie
13670 6e 74 20 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e  nt autolog_clien
13680 74 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63  t = NULL;.static
13690 20 76 6f 69 64 20 5f 63 6c 6f 73 65 5f 61 73 6c   void _close_asl
136a0 5f 6c 6f 67 28 29 20 7b 0a 20 20 69 66 28 20 4e  _log() {.  if( N
136b0 55 4c 4c 21 3d 61 75 74 6f 6c 6f 67 5f 63 6c 69  ULL!=autolog_cli
136c0 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 6c 5f 63  ent ){.    asl_c
136d0 6c 6f 73 65 28 61 75 74 6f 6c 6f 67 5f 63 6c 69  lose(autolog_cli
136e0 65 6e 74 29 3b 0a 20 20 20 20 61 75 74 6f 6c 6f  ent);.    autolo
136f0 67 5f 63 6c 69 65 6e 74 20 3d 20 4e 55 4c 4c 3b  g_client = NULL;
13700 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
13710 69 64 20 5f 6f 70 65 6e 5f 61 73 6c 5f 6c 6f 67  id _open_asl_log
13720 28 29 20 7b 0a 20 20 69 66 28 20 4e 55 4c 4c 3d  () {.  if( NULL=
13730 3d 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20  =autolog_client 
13740 29 7b 0a 20 20 20 20 61 75 74 6f 6c 6f 67 5f 63  ){.    autolog_c
13750 6c 69 65 6e 74 20 3d 20 61 73 6c 5f 6f 70 65 6e  lient = asl_open
13760 28 22 53 51 4c 69 74 65 22 2c 20 4e 55 4c 4c 2c  ("SQLite", NULL,
13770 20 30 29 3b 0a 20 20 20 20 61 74 65 78 69 74 28   0);.    atexit(
13780 5f 63 6c 6f 73 65 5f 61 73 6c 5f 6c 6f 67 29 3b  _close_asl_log);
13790 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 5f 73 71  .  }.}..void _sq
137a0 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c  lite_auto_profil
137b0 65 5f 73 79 73 6c 6f 67 28 76 6f 69 64 20 2a 61  e_syslog(void *a
137c0 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ux, const char *
137d0 73 71 6c 2c 20 75 36 34 20 6e 73 29 3b 0a 76 6f  sql, u64 ns);.vo
137e0 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f  id _sqlite_auto_
137f0 74 72 61 63 65 5f 73 79 73 6c 6f 67 28 76 6f 69  trace_syslog(voi
13800 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68  d *aux, const ch
13810 61 72 20 2a 73 71 6c 29 3b 0a 76 6f 69 64 20 5f  ar *sql);.void _
13820 73 71 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66  sqlite_auto_prof
13830 69 6c 65 5f 73 79 73 6c 6f 67 28 76 6f 69 64 20  ile_syslog(void 
13840 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72  *aux, const char
13850 20 2a 73 71 6c 2c 20 75 36 34 20 6e 73 29 20 7b   *sql, u64 ns) {
13860 0a 23 70 72 61 67 6d 61 20 75 6e 75 73 65 64 28  .#pragma unused(
13870 61 75 78 29 0a 09 61 73 6c 5f 6c 6f 67 28 61 75  aux)..asl_log(au
13880 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 2c 20 4e 55  tolog_client, NU
13890 4c 4c 2c 20 41 53 4c 5f 4c 45 56 45 4c 5f 4e 4f  LL, ASL_LEVEL_NO
138a0 54 49 43 45 2c 20 22 51 75 65 72 79 3a 20 25 73  TICE, "Query: %s
138b0 5c 6e 20 45 78 65 63 75 74 69 6f 6e 20 54 69 6d  \n Execution Tim
138c0 65 3a 20 25 6c 6c 75 20 6d 73 5c 6e 22 2c 20 73  e: %llu ms\n", s
138d0 71 6c 2c 20 6e 73 20 2f 20 31 30 30 30 30 30 30  ql, ns / 1000000
138e0 29 3b 0a 7d 0a 76 6f 69 64 20 5f 73 71 6c 69 74  );.}.void _sqlit
138f0 65 5f 61 75 74 6f 5f 74 72 61 63 65 5f 73 79 73  e_auto_trace_sys
13900 6c 6f 67 28 76 6f 69 64 20 2a 61 75 78 2c 20 63  log(void *aux, c
13910 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 29 20  onst char *sql) 
13920 7b 0a 09 61 73 6c 5f 6c 6f 67 28 61 75 74 6f 6c  {..asl_log(autol
13930 6f 67 5f 63 6c 69 65 6e 74 2c 20 4e 55 4c 4c 2c  og_client, NULL,
13940 20 41 53 4c 5f 4c 45 56 45 4c 5f 4e 4f 54 49 43   ASL_LEVEL_NOTIC
13950 45 2c 20 22 54 72 61 63 65 53 51 4c 28 25 70 29  E, "TraceSQL(%p)
13960 3a 20 25 73 5c 6e 22 2c 20 61 75 78 2c 20 73 71  : %s\n", aux, sq
13970 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  l);.}.#endif../*
13980 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
13990 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 72  n is used to par
139a0 73 65 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64  se both URIs and
139b0 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d   non-URI filenam
139c0 65 73 20 70 61 73 73 65 64 20 62 79 20 74 68 65  es passed by the
139d0 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20  .** user to API 
139e0 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65  functions sqlite
139f0 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69  3_open() or sqli
13a00 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61  te3_open_v2(), a
13a10 6e 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a  nd for database.
13a20 2a 2a 20 55 52 49 73 20 73 70 65 63 69 66 69 65  ** URIs specifie
13a30 64 20 61 73 20 70 61 72 74 20 6f 66 20 41 54 54  d as part of ATT
13a40 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ACH statements..
13a50 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
13a60 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
13a70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65   function is the
13a80 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   name of the VFS
13a90 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61   to use (or.** a
13aa0 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79   NULL to signify
13ab0 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
13ac0 29 20 69 66 20 74 68 65 20 55 52 49 20 64 6f 65  ) if the URI doe
13ad0 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
13ae0 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65  "vfs=xxx".** que
13af0 72 79 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68  ry parameter. Th
13b00 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
13b10 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55  t contains the U
13b20 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66  RI (or non-URI f
13b30 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65  ilename).** itse
13b40 6c 66 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75  lf. When this fu
13b50 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13b60 20 74 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72   the *pFlags var
13b70 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e  iable should con
13b80 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61  tain.** the defa
13b90 75 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65  ult flags to ope
13ba0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
13bb0 61 6e 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20  andle with. The 
13bc0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
13bd0 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62  ** *pFlags may b
13be0 65 20 75 70 64 61 74 65 64 20 62 65 66 6f 72 65  e updated before
13bf0 20 72 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68   returning if th
13c00 65 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63  e URI filename c
13c10 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63  ontains .** "cac
13c20 68 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65  he=xxx" or "mode
13c30 3d 78 78 78 22 20 71 75 65 72 79 20 70 61 72 61  =xxx" query para
13c40 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  meters..**.** If
13c50 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
13c60 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
13c70 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
13c80 20 2a 70 70 56 66 73 20 69 73 20 73 65 74 20 74   *ppVfs is set t
13c90 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
13ca0 65 20 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c  e VFS that shoul
13cb0 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65  d be used to ope
13cc0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
13cd0 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20  ile. *pzFile is 
13ce0 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20  set to.** point 
13cf0 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
13d00 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20  aining the name 
13d10 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f  of the file to o
13d20 70 65 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a  pen. It is the .
13d30 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
13d40 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
13d50 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  to eventually ca
13d60 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ll sqlite3_free(
13d70 29 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20  ) to release.** 
13d80 74 68 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  this buffer..**.
13d90 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
13da0 63 63 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53  ccurs, then an S
13db0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
13dc0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
13dd0 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61   *pzErrMsg.** ma
13de0 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e  y be set to poin
13df0 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
13e00 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c  ntaining an Engl
13e10 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72  ish language err
13e20 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20  or .** message. 
13e30 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
13e40 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
13e50 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
13e60 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20  ally release.** 
13e70 74 68 69 73 20 62 75 66 66 65 72 20 62 79 20 63  this buffer by c
13e80 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66  alling sqlite3_f
13e90 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ree()..*/.int sq
13ea0 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 0a 20  lite3ParseUri(. 
13eb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
13ec0 66 61 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20  faultVfs,       
13ed0 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69   /* VFS to use i
13ee0 66 20 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71  f no "vfs=xxx" q
13ef0 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  uery option */. 
13f00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72   const char *zUr
13f10 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i,              
13f20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74   /* Nul-terminat
13f30 65 64 20 55 52 49 20 74 6f 20 70 61 72 73 65 20  ed URI to parse 
13f40 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
13f50 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20  t *pFlags,      
13f60 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
13f70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20  SQLITE_OPEN_XXX 
13f80 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  flags */.  sqlit
13f90 65 33 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20  e3_vfs **ppVfs, 
13fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
13fb0 54 3a 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f  T: VFS to use */
13fc0 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c   .  char **pzFil
13fd0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
13fe0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65      /* OUT: File
13ff0 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  name component o
14000 66 20 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20  f URI */.  char 
14010 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20  **pzErrMsg      
14020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
14030 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  T: Error message
14040 20 28 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f   (if rc!=SQLITE_
14050 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  OK) */.){.  int 
14060 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14070 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
14080 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a  lags = *pFlags;.
14090 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
140a0 66 73 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73  fs = zDefaultVfs
140b0 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  ;.  char *zFile;
140c0 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74  .  char c;.  int
140d0 20 6e 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53   nUri = sqlite3S
140e0 74 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a  trlen30(zUri);..
140f0 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72    assert( *pzErr
14100 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  Msg==0 );..  if(
14110 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54   ((flags & SQLIT
14120 45 5f 4f 50 45 4e 5f 55 52 49 29 20 20 20 20 20  E_OPEN_URI)     
14130 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
14140 52 2d 34 38 37 32 35 2d 33 32 32 30 36 20 2a 2f  R-48725-32206 */
14150 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
14160 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
14170 66 69 67 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a  fig.bOpenUri) /*
14180 20 49 4d 50 3a 20 52 2d 35 31 36 38 39 2d 34 36   IMP: R-51689-46
14190 35 34 38 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72  548 */.   && nUr
141a0 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a  i>=5 && memcmp(z
141b0 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29  Uri, "file:", 5)
141c0 3d 3d 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37  ==0 /* IMP: R-57
141d0 38 38 34 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29  884-37496 */.  )
141e0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74  {.    char *zOpt
141f0 3b 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65  ;.    int eState
14200 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14210 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74      /* Parser st
14220 61 74 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67  ate when parsing
14230 20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20   URI */.    int 
14240 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  iIn;            
14250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
14260 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64  ut character ind
14270 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  ex */.    int iO
14280 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
14290 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
142a0 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65  t character inde
142b0 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  x */.    int nBy
142c0 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20  te = nUri+2;    
142d0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
142e0 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  of space to allo
142f0 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  cate */..    /* 
14300 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 53 51  Make sure the SQ
14310 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c  LITE_OPEN_URI fl
14320 61 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64  ag is set to ind
14330 69 63 61 74 65 20 74 6f 20 74 68 65 20 56 46 53  icate to the VFS
14340 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d   xOpen .    ** m
14350 65 74 68 6f 64 20 74 68 61 74 20 74 68 65 72 65  ethod that there
14360 20 6d 61 79 20 62 65 20 65 78 74 72 61 20 70 61   may be extra pa
14370 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69  rameters followi
14380 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65  ng the file-name
14390 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20  .  */.    flags 
143a0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  |= SQLITE_OPEN_U
143b0 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e  RI;..    for(iIn
143c0 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49  =0; iIn<nUri; iI
143d0 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a  n++) nByte += (z
143e0 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a  Uri[iIn]=='&');.
143f0 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69      zFile = sqli
14400 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
14410 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c  );.    if( !zFil
14420 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
14430 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20 69 49  E_NOMEM;..    iI
14440 6e 20 3d 20 35 3b 0a 23 69 66 6e 64 65 66 20 53  n = 5;.#ifndef S
14450 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f  QLITE_ALLOW_URI_
14460 41 55 54 48 4f 52 49 54 59 0a 20 20 20 20 2f 2a  AUTHORITY.    /*
14470 20 44 69 73 63 61 72 64 20 74 68 65 20 73 63 68   Discard the sch
14480 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69 74  eme and authorit
14490 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74 68  y segments of th
144a0 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66  e URI. */.    if
144b0 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26  ( zUri[5]=='/' &
144c0 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29  & zUri[6]=='/' )
144d0 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b  {.      iIn = 7;
144e0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55  .      while( zU
144f0 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b  ri[iIn] && zUri[
14500 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b  iIn]!='/' ) iIn+
14510 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 49 6e  +;.      if( iIn
14520 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36 20  !=7 && (iIn!=16 
14530 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c  || memcmp("local
14540 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c  host", &zUri[7],
14550 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   9)) ){.        
14560 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
14570 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76  te3_mprintf("inv
14580 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72 69  alid uri authori
14590 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20  ty: %.*s", .    
145a0 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20 26          iIn-7, &
145b0 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20  zUri[7]);.      
145c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
145d0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ROR;.        got
145e0 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b  o parse_uri_out;
145f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
14600 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f  endif..    /* Co
14610 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  py the filename 
14620 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70 61  and any query pa
14630 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68  rameters into th
14640 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20  e zFile buffer. 
14650 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25  .    ** Decode %
14660 48 48 20 65 73 63 61 70 65 20 63 6f 64 65 73 20  HH escape codes 
14670 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a  along the way. .
14680 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69      **.    ** Wi
14690 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20  thin this loop, 
146a0 76 61 72 69 61 62 6c 65 20 65 53 74 61 74 65 20  variable eState 
146b0 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c  may be set to 0,
146c0 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69   1 or 2, dependi
146d0 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ng.    ** on the
146e0 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
146f0 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  . As follows:.  
14700 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a    **.    **   0:
14710 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61   Parsing file-na
14720 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20  me..    **   1: 
14730 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63  Parsing name sec
14740 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76  tion of a name=v
14750 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d  alue query param
14760 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32  eter..    **   2
14770 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20  : Parsing value 
14780 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d  section of a nam
14790 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61  e=value query pa
147a0 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a  rameter..    */.
147b0 20 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a      eState = 0;.
147c0 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
147d0 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26  zUri[iIn])!=0 &&
147e0 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20   c!='#' ){.     
147f0 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66   iIn++;.      if
14800 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20  ( c=='%' .      
14810 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
14820 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a  git(zUri[iIn]) .
14830 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
14840 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69  3Isxdigit(zUri[i
14850 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b  In+1]) .      ){
14860 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74  .        int oct
14870 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78  et = (sqlite3Hex
14880 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b  ToInt(zUri[iIn++
14890 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20  ]) << 4);.      
148a0 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74    octet += sqlit
148b0 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b  e3HexToInt(zUri[
148c0 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20  iIn++]);..      
148d0 20 20 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e    assert( octet>
148e0 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20  =0 && octet<256 
148f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  );.        if( o
14900 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ctet==0 ){.     
14910 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
14920 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
14930 6e 20 22 25 30 30 22 20 61 70 70 65 61 72 73 20  n "%00" appears 
14940 77 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20  within the URI. 
14950 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  In this.        
14960 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e    ** case we ign
14970 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20  ore all text in 
14980 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
14990 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20   the path, name 
149a0 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
149b0 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20  value currently 
149c0 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f  being parsed. So
149d0 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72   ignore the curr
149e0 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 20  ent character.  
149f0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73          ** and s
14a00 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  kip to the next 
14a10 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c  "?", "=" or "&",
14a20 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
14a30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68   */.          wh
14a40 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69  ile( (c = zUri[i
14a50 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23  In])!=0 && c!='#
14a60 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
14a70 20 26 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c   && (eState!=0 |
14a80 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20  | c!='?').      
14a90 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
14aa0 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27  te!=1 || (c!='='
14ab0 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20   && c!='&')).   
14ac0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
14ad0 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27  State!=2 || c!='
14ae0 26 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  &').          ){
14af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e  .            iIn
14b00 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
14b10 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
14b20 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
14b30 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b        c = octet;
14b40 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
14b50 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63   eState==1 && (c
14b60 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29  =='&' || c=='=')
14b70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
14b80 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30  zFile[iOut-1]==0
14b90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
14ba0 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e   An empty option
14bb0 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68   name. Ignore th
14bc0 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65  is option altoge
14bd0 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ther. */.       
14be0 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69     while( zUri[i
14bf0 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d  In] && zUri[iIn]
14c00 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49  !='#' && zUri[iI
14c10 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b  n-1]!='&' ) iIn+
14c20 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  +;.          con
14c30 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
14c40 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
14c50 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '&' ){.         
14c60 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
14c70 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d   '\0';.        }
14c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
14c90 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20  eState = 2;.    
14ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20      }.        c 
14cb0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
14cc0 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20   if( (eState==0 
14cd0 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65  && c=='?') || (e
14ce0 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27  State==2 && c=='
14cf0 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  &') ){.        c
14d00 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53   = 0;.        eS
14d10 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tate = 1;.      
14d20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f  }.      zFile[iO
14d30 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d  ut++] = c;.    }
14d40 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 3d  .    if( eState=
14d50 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  =1 ) zFile[iOut+
14d60 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  +] = '\0';.    z
14d70 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
14d80 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69  \0';.    zFile[i
14d90 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a  Out++] = '\0';..
14da0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
14db0 74 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f  there were any o
14dc0 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64  ptions specified
14dd0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
14de0 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20 20  interpreted .   
14df0 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e   ** here. Option
14e00 73 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 72  s that are inter
14e10 70 72 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c  preted here incl
14e20 75 64 65 20 22 76 66 73 22 20 61 6e 64 20 74 68  ude "vfs" and th
14e30 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ose that.    ** 
14e40 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c  correspond to fl
14e50 61 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ags that may be 
14e60 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71  passed to the sq
14e70 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a  lite3_open_v2().
14e80 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a      ** method. *
14e90 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46  /.    zOpt = &zF
14ea0 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ile[sqlite3Strle
14eb0 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20  n30(zFile)+1];. 
14ec0 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30     while( zOpt[0
14ed0 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ] ){.      int n
14ee0 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Opt = sqlite3Str
14ef0 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20  len30(zOpt);.   
14f00 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20     char *zVal = 
14f10 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20  &zOpt[nOpt+1];. 
14f20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20       int nVal = 
14f30 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
14f40 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66  zVal);..      if
14f50 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d  ( nOpt==3 && mem
14f60 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c  cmp("vfs", zOpt,
14f70 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   3)==0 ){.      
14f80 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20    zVfs = zVal;. 
14f90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14fa0 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d      struct OpenM
14fb0 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ode {.          
14fc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
14fd0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64           int mod
14fe0 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d  e;.        } *aM
14ff0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
15000 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65   char *zModeType
15010 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
15020 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  t mask = 0;.    
15030 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20      int limit = 
15040 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  0;..        if( 
15050 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d  nOpt==5 && memcm
15060 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c  p("cache", zOpt,
15070 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   5)==0 ){.      
15080 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63      static struc
15090 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68  t OpenMode aCach
150a0 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  eMode[] = {.    
150b0 20 20 20 20 20 20 20 20 7b 20 22 73 68 61 72 65          { "share
150c0 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  d",  SQLITE_OPEN
150d0 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a  _SHAREDCACHE },.
150e0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 70              { "p
150f0 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  rivate", SQLITE_
15100 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
15110 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
15120 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20   { 0, 0 }.      
15130 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20      };..        
15140 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f    mask = SQLITE_
15150 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
15160 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49  |SQLITE_OPEN_PRI
15170 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20  VATECACHE;.     
15180 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61       aMode = aCa
15190 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20  cheMode;.       
151a0 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b     limit = mask;
151b0 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65  .          zMode
151c0 54 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a  Type = "cache";.
151d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
151e0 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26    if( nOpt==4 &&
151f0 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20   memcmp("mode", 
15200 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20  zOpt, 4)==0 ){. 
15210 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
15220 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
15230 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a  aOpenMode[] = {.
15240 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72              { "r
15250 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  o",  SQLITE_OPEN
15260 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20  _READONLY },.   
15270 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c           { "rw",
15280 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
15290 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20  ADWRITE }, .    
152a0 20 20 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c          { "rwc",
152b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
152c0 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
152d0 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20  OPEN_CREATE },. 
152e0 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d 65             { "me
152f0 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50  mory", SQLITE_OP
15300 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20  EN_MEMORY },.   
15310 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20           { 0, 0 
15320 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a  }.          };..
15330 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d            mask =
15340 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
15350 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f  DONLY | SQLITE_O
15360 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20  PEN_READWRITE.  
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15380 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
15390 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
153a0 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20  PEN_MEMORY;.    
153b0 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f        aMode = aO
153c0 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20  penMode;.       
153d0 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20     limit = mask 
153e0 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  & flags;.       
153f0 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22     zModeType = "
15400 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20  access";.       
15410 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
15420 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  aMode ){.       
15430 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
15440 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30      int mode = 0
15450 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
15460 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b  i=0; aMode[i].z;
15470 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
15480 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15490 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20   = aMode[i].z;. 
154a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
154b0 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  Val==sqlite3Strl
154c0 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65  en30(z) && 0==me
154d0 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56  mcmp(zVal, z, nV
154e0 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  al) ){.         
154f0 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64       mode = aMod
15500 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20  e[i].mode;.     
15510 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
15520 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
15530 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15540 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20      if( mode==0 
15550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
15560 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
15570 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73  e3_mprintf("no s
15580 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22  uch %s mode: %s"
15590 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61  , zModeType, zVa
155a0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
155b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
155c0 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  R;.            g
155d0 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
155e0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
155f0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 6f           if( (mo
15600 64 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  de & ~SQLITE_OPE
15610 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20  N_MEMORY)>limit 
15620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
15630 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
15640 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d  e3_mprintf("%s m
15650 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a  ode not allowed:
15660 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
15670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d                zM
15690 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a  odeType, zVal);.
156a0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
156b0 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
156c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
156d0 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
156e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
156f0 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61      flags = (fla
15700 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f  gs & ~mask) | mo
15710 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  de;.        }.  
15720 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70      }..      zOp
15730 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31  t = &zVal[nVal+1
15740 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  ];.    }..  }els
15750 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73  e{.    zFile = s
15760 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55  qlite3_malloc(nU
15770 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 21  ri+2);.    if( !
15780 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53  zFile ) return S
15790 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
157a0 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a   memcpy(zFile, z
157b0 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20  Uri, nUri);.    
157c0 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c  zFile[nUri] = '\
157d0 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55  0';.    zFile[nU
157e0 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ri+1] = '\0';.  
157f0 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
15800 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d  TE_OPEN_URI;.  }
15810 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c  ..  *ppVfs = sql
15820 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56  ite3_vfs_find(zV
15830 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66  fs);.  if( *ppVf
15840 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45  s==0 ){.    *pzE
15850 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
15860 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68  mprintf("no such
15870 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29   vfs: %s", zVfs)
15880 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
15890 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61  E_ERROR;.  }. pa
158a0 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69  rse_uri_out:.  i
158b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
158c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
158d0 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20  free(zFile);.   
158e0 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a   zFile = 0;.  }.
158f0 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67    *pFlags = flag
15900 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a  s;.  *pzFile = z
15910 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  File;.  return r
15920 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  c;.}..#if define
15930 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
15940 41 55 54 4f 5f 50 52 4f 46 49 4c 45 29 0a 23 64  AUTO_PROFILE).#d
15950 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 41 55 54  efine SQLITE_AUT
15960 4f 4c 4f 47 47 49 4e 47 5f 53 54 44 45 52 52 20  OLOGGING_STDERR 
15970 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  1.#define SQLITE
15980 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53  _AUTOLOGGING_SYS
15990 4c 4f 47 20 32 0a 73 74 61 74 69 63 20 76 6f 69  LOG 2.static voi
159a0 64 20 65 6e 61 62 6c 65 41 75 74 6f 4c 6f 67 67  d enableAutoLogg
159b0 69 6e 67 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ing(.  sqlite3 *
159c0 64 62 0a 29 7b 0a 20 20 63 68 61 72 20 2a 65 6e  db.){.  char *en
159d0 76 70 72 6f 66 69 6c 65 20 3d 20 67 65 74 65 6e  vprofile = geten
159e0 76 28 22 53 51 4c 49 54 45 5f 41 55 54 4f 5f 50  v("SQLITE_AUTO_P
159f0 52 4f 46 49 4c 45 22 29 3b 0a 20 20 0a 20 20 69  ROFILE");.  .  i
15a00 66 28 20 65 6e 76 70 72 6f 66 69 6c 65 21 3d 4e  f( envprofile!=N
15a10 55 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20 77  ULL ){.    int w
15a20 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  here = 0;.    if
15a30 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70 28 22  ( !strncasecmp("
15a40 31 22 2c 20 65 6e 76 70 72 6f 66 69 6c 65 2c 20  1", envprofile, 
15a50 31 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  1) ){.      if( 
15a60 69 73 61 74 74 79 28 32 29 20 29 7b 0a 20 20 20  isatty(2) ){.   
15a70 20 20 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c       where = SQL
15a80 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f  ITE_AUTOLOGGING_
15a90 53 54 44 45 52 52 3b 0a 20 20 20 20 20 20 7d 65  STDERR;.      }e
15aa0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 65  lse{.        whe
15ab0 72 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f  re = SQLITE_AUTO
15ac0 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a  LOGGING_SYSLOG;.
15ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
15ae0 73 65 20 69 66 28 20 21 73 74 72 6e 63 61 73 65  se if( !strncase
15af0 63 6d 70 28 22 73 74 64 65 72 72 22 2c 20 65 6e  cmp("stderr", en
15b00 76 70 72 6f 66 69 6c 65 2c 20 36 29 20 29 7b 0a  vprofile, 6) ){.
15b10 20 20 20 20 20 20 77 68 65 72 65 20 3d 20 53 51        where = SQ
15b20 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47  LITE_AUTOLOGGING
15b30 5f 53 54 44 45 52 52 3b 0a 20 20 20 20 7d 20 65  _STDERR;.    } e
15b40 6c 73 65 20 69 66 28 20 21 73 74 72 6e 63 61 73  lse if( !strncas
15b50 65 63 6d 70 28 22 73 79 73 6c 6f 67 22 2c 20 65  ecmp("syslog", e
15b60 6e 76 70 72 6f 66 69 6c 65 2c 20 36 29 20 29 7b  nvprofile, 6) ){
15b70 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d 20 53  .      where = S
15b80 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e  QLITE_AUTOLOGGIN
15b90 47 5f 53 59 53 4c 4f 47 3b 0a 20 20 20 20 7d 0a  G_SYSLOG;.    }.
15ba0 20 20 20 20 69 66 28 20 77 68 65 72 65 3d 3d 53      if( where==S
15bb0 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e  QLITE_AUTOLOGGIN
15bc0 47 5f 53 54 44 45 52 52 20 29 7b 0a 20 20 20 20  G_STDERR ){.    
15bd0 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c    sqlite3_profil
15be0 65 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75  e(db, _sqlite_au
15bf0 74 6f 5f 70 72 6f 66 69 6c 65 2c 20 64 62 29 3b  to_profile, db);
15c00 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77  .    }else if( w
15c10 68 65 72 65 3d 3d 53 51 4c 49 54 45 5f 41 55 54  here==SQLITE_AUT
15c20 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 20  OLOGGING_SYSLOG 
15c30 29 7b 0a 20 20 20 20 20 20 5f 6f 70 65 6e 5f 61  ){.      _open_a
15c40 73 6c 5f 6c 6f 67 28 29 3b 0a 20 20 20 20 20 20  sl_log();.      
15c50 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
15c60 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f  db, _sqlite_auto
15c70 5f 70 72 6f 66 69 6c 65 5f 73 79 73 6c 6f 67 2c  _profile_syslog,
15c80 20 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   db);.    }.  }.
15c90 20 20 63 68 61 72 20 2a 65 6e 76 74 72 61 63 65    char *envtrace
15ca0 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54   = getenv("SQLIT
15cb0 45 5f 41 55 54 4f 5f 54 52 41 43 45 22 29 3b 0a  E_AUTO_TRACE");.
15cc0 20 20 69 66 28 20 65 6e 76 74 72 61 63 65 21 3d    if( envtrace!=
15cd0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20  NULL ){.    int 
15ce0 77 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 69  where = 0;.    i
15cf0 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70 28  f( !strncasecmp(
15d00 22 31 22 2c 20 65 6e 76 74 72 61 63 65 2c 20 31  "1", envtrace, 1
15d10 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
15d20 73 61 74 74 79 28 32 29 20 29 7b 0a 20 20 20 20  satty(2) ){.    
15d30 20 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49      where = SQLI
15d40 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
15d50 54 44 45 52 52 3b 0a 20 20 20 20 20 20 7d 65 6c  TDERR;.      }el
15d60 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72  se{.        wher
15d70 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c  e = SQLITE_AUTOL
15d80 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20  OGGING_SYSLOG;. 
15d90 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
15da0 65 20 69 66 28 20 21 73 74 72 6e 63 61 73 65 63  e if( !strncasec
15db0 6d 70 28 22 73 74 64 65 72 72 22 2c 20 65 6e 76  mp("stderr", env
15dc0 74 72 61 63 65 2c 20 36 29 20 29 7b 0a 20 20 20  trace, 6) ){.   
15dd0 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54     where = SQLIT
15de0 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54  E_AUTOLOGGING_ST
15df0 44 45 52 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65  DERR;.    } else
15e00 20 69 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d   if( !strncasecm
15e10 70 28 22 73 79 73 6c 6f 67 22 2c 20 65 6e 76 74  p("syslog", envt
15e20 72 61 63 65 2c 20 36 29 20 29 7b 0a 20 20 20 20  race, 6) ){.    
15e30 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45    where = SQLITE
15e40 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53  _AUTOLOGGING_SYS
15e50 4c 4f 47 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  LOG;.    }.    i
15e60 66 28 20 77 68 65 72 65 3d 3d 53 51 4c 49 54 45  f( where==SQLITE
15e70 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44  _AUTOLOGGING_STD
15e80 45 52 52 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ERR ){.      sql
15e90 69 74 65 33 5f 74 72 61 63 65 28 64 62 2c 20 5f  ite3_trace(db, _
15ea0 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63  sqlite_auto_trac
15eb0 65 2c 20 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73  e, db);.    }els
15ec0 65 20 69 66 28 20 77 68 65 72 65 3d 3d 53 51 4c  e if( where==SQL
15ed0 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f  ITE_AUTOLOGGING_
15ee0 53 59 53 4c 4f 47 20 29 7b 0a 20 20 20 20 20 20  SYSLOG ){.      
15ef0 5f 6f 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28 29 3b  _open_asl_log();
15f00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
15f10 72 61 63 65 28 64 62 2c 20 5f 73 71 6c 69 74 65  race(db, _sqlite
15f20 5f 61 75 74 6f 5f 74 72 61 63 65 5f 73 79 73 6c  _auto_trace_sysl
15f30 6f 67 2c 20 64 62 29 3b 0a 20 20 20 20 7d 0a 20  og, db);.    }. 
15f40 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
15f50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15f60 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66  does the work of
15f70 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62   opening a datab
15f80 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66  ase on behalf of
15f90 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  .** sqlite3_open
15fa0 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f  () and sqlite3_o
15fb0 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74  pen16(). The dat
15fc0 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22  abase filename "
15fd0 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20  zFilename"  .** 
15fe0 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  is UTF-8 encoded
15ff0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16000 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20  openDatabase(.  
16010 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
16020 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61  ename, /* Databa
16030 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d  se filename UTF-
16040 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73  8 encoded */.  s
16050 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20  qlite3 **ppDb,  
16060 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
16070 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65 20  turned database 
16080 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69  handle */.  unsi
16090 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20  gned int flags, 
160a0 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61     /* Operationa
160b0 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e  l flags */.  con
160c0 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20  st char *zVfs   
160d0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
160e0 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f  he VFS to use */
160f0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
16100 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
16110 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61        /* Store a
16120 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20  llocated handle 
16130 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  here */.  int rc
16140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
16160 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
16170 74 20 69 73 54 68 72 65 61 64 73 61 66 65 3b 20  t isThreadsafe; 
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16190 20 54 72 75 65 20 66 6f 72 20 74 68 72 65 61 64   True for thread
161a0 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  safe connections
161b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65   */.  char *zOpe
161c0 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
161d0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d        /* Filenam
161e0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61  e argument to pa
161f0 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28  ss to BtreeOpen(
16200 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72  ) */.  char *zEr
16210 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20  rMsg = 0;       
16220 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
16230 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c  message from sql
16240 69 74 65 33 50 61 72 73 65 55 72 69 28 29 20 2a  ite3ParseUri() *
16250 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
16260 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
16270 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20  R.  if( ppDb==0 
16280 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
16290 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
162a0 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b  dif.  *ppDb = 0;
162b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
162c0 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
162d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
162e0 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
162f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
16300 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e  .#endif..  /* On
16310 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c  ly allow sensibl
16320 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  e combinations o
16330 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 66 6c  f bits in the fl
16340 61 67 73 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a  ags argument.  .
16350 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65 72    ** Throw an er
16360 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73  ror if any non-s
16370 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ense combination
16380 20 69 73 20 75 73 65 64 2e 20 20 49 66 20 77 65   is used.  If we
16390 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f  .  ** do not blo
163a0 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69  ck illegal combi
163b0 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c 20 69 74  nations here, it
163c0 20 63 6f 75 6c 64 20 74 72 69 67 67 65 72 0a 20   could trigger. 
163d0 20 2a 2a 20 61 73 73 65 72 74 28 29 20 73 74 61   ** assert() sta
163e0 74 65 6d 65 6e 74 73 20 69 6e 20 64 65 65 70 65  tements in deepe
163f0 72 20 6c 61 79 65 72 73 2e 20 20 53 65 6e 73 69  r layers.  Sensi
16400 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ble combinations
16410 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a  .  ** are:.  **.
16420 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54 45    **  1:  SQLITE
16430 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20  _OPEN_READONLY. 
16440 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54 45 5f   **  2:  SQLITE_
16450 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20  OPEN_READWRITE. 
16460 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54 45 5f   **  6:  SQLITE_
16470 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
16480 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
16490 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ATE.  */.  asser
164a0 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  t( SQLITE_OPEN_R
164b0 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31  EADONLY  == 0x01
164c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
164d0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
164e0 49 54 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20  ITE == 0x02 );. 
164f0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
16500 4f 50 45 4e 5f 43 52 45 41 54 45 20 20 20 20 3d  OPEN_CREATE    =
16510 3d 20 30 78 30 34 20 29 3b 0a 20 20 74 65 73 74  = 0x04 );.  test
16520 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
16530 26 37 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a  &7))==0x02 ); /*
16540 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74   READONLY */.  t
16550 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
16560 61 67 73 26 37 29 29 3d 3d 30 78 30 34 20 29 3b  ags&7))==0x04 );
16570 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 2a 2f   /* READWRITE */
16580 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c  .  testcase( (1<
16590 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 34  <(flags&7))==0x4
165a0 30 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54  0 ); /* READWRIT
165b0 45 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20 20  E | CREATE */.  
165c0 69 66 28 20 28 28 31 3c 3c 28 66 6c 61 67 73 26  if( ((1<<(flags&
165d0 37 29 29 20 26 20 30 78 34 36 29 3d 3d 30 20 29  7)) & 0x46)==0 )
165e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
165f0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
16600 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 35 34 39    /* IMP: R-6549
16610 37 2d 34 34 35 39 34 20 2a 2f 0a 20 20 7d 0a 0a  7-44594 */.  }..
16620 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
16630 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
16640 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  utex==0 ){.    i
16650 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
16660 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
16670 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
16680 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20  _NOMUTEX ){.    
16690 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30  isThreadsafe = 0
166a0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
166b0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
166c0 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20  N_FULLMUTEX ){. 
166d0 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
166e0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
166f0 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
16700 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
16710 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b  nfig.bFullMutex;
16720 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
16730 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50   & SQLITE_OPEN_P
16740 52 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20  RIVATECACHE ){. 
16750 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
16760 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
16770 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ACHE;.  }else if
16780 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
16790 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68  onfig.sharedCach
167a0 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20  eEnabled ){.    
167b0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
167c0 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
167d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ;.  }..  /* Remo
167e0 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20  ve harmful bits 
167f0 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70  from the flags p
16800 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20  arameter.  **.  
16810 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50  ** The SQLITE_OP
16820 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53  EN_NOMUTEX and S
16830 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
16840 55 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a  UTEX flags were.
16850 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20    ** dealt with 
16860 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
16870 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73  code block.  Bes
16880 69 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20  ides these, the 
16890 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20  only.  ** valid 
168a0 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20  input flags for 
168b0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
168c0 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45  ) are SQLITE_OPE
168d0 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a  N_READONLY,.  **
168e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
168f0 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f  DWRITE, SQLITE_O
16900 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c 49  PEN_CREATE, SQLI
16910 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
16920 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  CHE,.  ** SQLITE
16930 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
16940 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65 73  HE, and some res
16950 65 72 76 65 64 20 62 69 74 73 2e 20 20 53 69 6c  erved bits.  Sil
16960 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20  ently mask.  ** 
16970 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c  off all other fl
16980 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67  ags..  */.  flag
16990 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f  s &=  ~( SQLITE_
169a0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
169b0 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  SE |.           
169c0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
169d0 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20  EXCLUSIVE |.    
169e0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
169f0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c  E_OPEN_MAIN_DB |
16a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16a10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
16a20 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20  _DB | .         
16a30 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
16a40 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
16a50 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
16a60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
16a70 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  N_JOURNAL | .   
16a80 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
16a90 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
16aa0 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
16ab0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
16ac0 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20  EN_SUBJOURNAL | 
16ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16ae0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
16af0 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20  ER_JOURNAL |.   
16b00 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
16b10 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
16b20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
16b30 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
16b40 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  LMUTEX |.       
16b50 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
16b60 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20  PEN_WAL.        
16b70 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c       );..  /* Al
16b80 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
16b90 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
16ba0 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74   */.  db = sqlit
16bb0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
16bc0 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b  zeof(sqlite3) );
16bd0 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67  .  if( db==0 ) g
16be0 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
16bf0 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61    if( isThreadsa
16c00 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75  fe ){.    db->mu
16c10 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
16c20 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
16c30 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b  UTEX_RECURSIVE);
16c40 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74  .    if( db->mut
16c50 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex==0 ){.      s
16c60 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b  qlite3_free(db);
16c70 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  .      db = 0;. 
16c80 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62       goto opendb
16c90 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
16ca0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16cb0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
16cc0 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
16cd0 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44  = 0xff;.  db->nD
16ce0 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67  b = 2;.  db->mag
16cf0 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
16d00 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44  C_BUSY;.  db->aD
16d10 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
16d20 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69  c;..  assert( si
16d30 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29  zeof(db->aLimit)
16d40 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69  ==sizeof(aHardLi
16d50 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79  mit) );.  memcpy
16d60 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61  (db->aLimit, aHa
16d70 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28  rdLimit, sizeof(
16d80 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20  db->aLimit));.  
16d90 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
16da0 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
16db0 48 52 45 41 44 53 5d 20 3d 20 53 51 4c 49 54 45  HREADS] = SQLITE
16dc0 5f 44 45 46 41 55 4c 54 5f 57 4f 52 4b 45 52 5f  _DEFAULT_WORKER_
16dd0 54 48 52 45 41 44 53 3b 0a 20 20 64 62 2d 3e 61  THREADS;.  db->a
16de0 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
16df0 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63   db->nextAutovac
16e00 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d   = -1;.  db->szM
16e10 6d 61 70 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  map = sqlite3Glo
16e20 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
16e30 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65  ;.  db->nextPage
16e40 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  size = 0;.  db->
16e50 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d  nMaxSorterMmap =
16e60 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20 20 64   0x7FFFFFFF;.  d
16e70 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
16e80 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
16e90 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65   | SQLITE_Enable
16ea0 54 72 69 67 67 65 72 20 7c 20 53 51 4c 49 54 45  Trigger | SQLITE
16eb0 5f 43 61 63 68 65 53 70 69 6c 6c 0a 23 69 66 20  _CacheSpill.#if 
16ec0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
16ed0 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49  DEFAULT_AUTOMATI
16ee0 43 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c 49  C_INDEX) || SQLI
16ef0 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d  TE_DEFAULT_AUTOM
16f00 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 20  ATIC_INDEX.     
16f10 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
16f20 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23  LITE_AutoIndex.#
16f30 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
16f40 5f 44 45 46 41 55 4c 54 5f 43 4b 50 54 46 55 4c  _DEFAULT_CKPTFUL
16f50 4c 46 53 59 4e 43 0a 20 20 20 20 20 20 20 20 20  LFSYNC.         
16f60 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
16f70 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63 0a 23  _CkptFullFSync.#
16f80 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
16f90 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f  _DEFAULT_FILE_FO
16fa0 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20  RMAT<4.         
16fb0 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
16fc0 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23  _LegacyFileFmt.#
16fd0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
16fe0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f  ITE_ENABLE_LOAD_
16ff0 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20  EXTENSION.      
17000 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
17010 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f  ITE_LoadExtensio
17020 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  n.#endif.#if SQL
17030 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43 55  ITE_DEFAULT_RECU
17040 52 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a 20  RSIVE_TRIGGERS. 
17050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17060 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67  | SQLITE_RecTrig
17070 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66 20  gers.#endif.#if 
17080 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
17090 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b  EFAULT_FOREIGN_K
170a0 45 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f 44  EYS) && SQLITE_D
170b0 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b  EFAULT_FOREIGN_K
170c0 45 59 53 0a 20 20 20 20 20 20 20 20 20 20 20 20  EYS.            
170d0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f       | SQLITE_Fo
170e0 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66  reignKeys.#endif
170f0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
17100 49 54 45 5f 52 45 56 45 52 53 45 5f 55 4e 4f 52  ITE_REVERSE_UNOR
17110 44 45 52 45 44 5f 53 45 4c 45 43 54 53 29 0a 20  DERED_SELECTS). 
17120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17130 7c 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65  | SQLITE_Reverse
17140 4f 72 64 65 72 0a 23 65 6e 64 69 66 0a 20 20 20  Order.#endif.   
17150 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48 61     ;.  sqlite3Ha
17160 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c  shInit(&db->aCol
17170 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53  lSeq);.#ifndef S
17180 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
17190 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65  ALTABLE.  sqlite
171a0 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61  3HashInit(&db->a
171b0 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  Module);.#endif.
171c0 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65  .  /* Add the de
171d0 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
171e0 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e  sequence BINARY.
171f0 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f   BINARY works fo
17200 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a  r both UTF-8.  *
17210 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f  * and UTF-16, so
17220 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66   add a version f
17230 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64  or each to avoid
17240 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79   any unnecessary
17250 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e  .  ** conversion
17260 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f  s. The only erro
17270 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72  r that can occur
17280 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f   here is a mallo
17290 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a  c() failure..  *
172a0 2a 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d  *.  ** EVIDENCE-
172b0 4f 46 3a 20 52 2d 35 32 37 38 36 2d 34 34 38 37  OF: R-52786-4487
172c0 38 20 53 51 4c 69 74 65 20 64 65 66 69 6e 65 73  8 SQLite defines
172d0 20 74 68 72 65 65 20 62 75 69 6c 74 2d 69 6e 20   three built-in 
172e0 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 2a 2a 20 66  collating.  ** f
172f0 75 6e 63 74 69 6f 6e 73 3a 0a 20 20 2a 2f 0a 20  unctions:.  */. 
17300 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
17310 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53  (db, "BINARY", S
17320 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62  QLITE_UTF8, 0, b
17330 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
17340 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
17350 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20  n(db, "BINARY", 
17360 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
17370 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  0, binCollFunc, 
17380 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
17390 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52  ation(db, "BINAR
173a0 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  Y", SQLITE_UTF16
173b0 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75  LE, 0, binCollFu
173c0 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
173d0 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e  Collation(db, "N
173e0 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55  OCASE", SQLITE_U
173f0 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f  TF8, 0, nocaseCo
17400 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b  llatingFunc, 0);
17410 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
17420 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20  on(db, "RTRIM", 
17430 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f  SQLITE_UTF8, (vo
17440 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75  id*)1, binCollFu
17450 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  nc, 0);.  if( db
17460 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
17470 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  {.    goto opend
17480 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20  b_out;.  }.  /* 
17490 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
174a0 38 33 30 38 2d 31 37 32 32 34 20 54 68 65 20 64  8308-17224 The d
174b0 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
174c0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c   function for al
174d0 6c 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 69  l.  ** strings i
174e0 73 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a  s BINARY. .  */.
174f0 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20    db->pDfltColl 
17500 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
17510 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f  lSeq(db, SQLITE_
17520 55 54 46 38 2c 20 22 42 49 4e 41 52 59 22 2c 20  UTF8, "BINARY", 
17530 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  0);.  assert( db
17540 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29  ->pDfltColl!=0 )
17550 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  ;..  /* Parse th
17560 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61  e filename/URI a
17570 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64 62  rgument. */.  db
17580 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c  ->openFlags = fl
17590 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ags;.  rc = sqli
175a0 74 65 33 50 61 72 73 65 55 72 69 28 7a 56 66 73  te3ParseUri(zVfs
175b0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c  , zFilename, &fl
175c0 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20  ags, &db->pVfs, 
175d0 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67  &zOpen, &zErrMsg
175e0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
175f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
17600 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
17610 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  EM ) db->mallocF
17620 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 73  ailed = 1;.    s
17630 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
17640 73 67 28 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d  sg(db, rc, zErrM
17650 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a  sg ? "%s" : 0, z
17660 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  ErrMsg);.    sql
17670 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
17680 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65  g);.    goto ope
17690 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ndb_out;.  }..  
176a0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b  /* Open the back
176b0 65 6e 64 20 64 61 74 61 62 61 73 65 20 64 72 69  end database dri
176c0 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ver */.  rc = sq
176d0 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64  lite3BtreeOpen(d
176e0 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20  b->pVfs, zOpen, 
176f0 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e  db, &db->aDb[0].
17700 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  pBt, 0,.        
17710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17720 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f  flags | SQLITE_O
17730 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20  PEN_MAIN_DB);.  
17740 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17750 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
17760 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
17770 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  MEM ){.      rc 
17780 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
17790 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
177a0 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a  3Error(db, rc);.
177b0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
177c0 6f 75 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  out;.  }.  sqlit
177d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 64 62 2d  e3BtreeEnter(db-
177e0 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
177f0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65  db->aDb[0].pSche
17800 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  ma = sqlite3Sche
17810 6d 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44  maGet(db, db->aD
17820 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28  b[0].pBt);.  if(
17830 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
17840 65 64 20 29 20 45 4e 43 28 64 62 29 20 3d 20 53  ed ) ENC(db) = S
17850 43 48 45 4d 41 5f 45 4e 43 28 64 62 29 3b 0a 20  CHEMA_ENC(db);. 
17860 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
17870 76 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  ve(db->aDb[0].pB
17880 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  t);.  db->aDb[1]
17890 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  .pSchema = sqlit
178a0 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
178b0 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65  0);..  /* The de
178c0 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76  fault safety_lev
178d0 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  el for the main 
178e0 64 61 74 61 62 61 73 65 20 69 73 20 27 66 75 6c  database is 'ful
178f0 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70  l'; for the temp
17900 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69  .  ** database i
17910 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69  t is 'NONE'. Thi
17920 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61  s matches the pa
17930 67 65 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c  ger layer defaul
17940 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d  ts.  .  */.  db-
17950 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  >aDb[0].zName = 
17960 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44  "main";.  db->aD
17970 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[0].safety_leve
17980 6c 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62  l = 3;.  db->aDb
17990 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d  [1].zName = "tem
179a0 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  p";.  db->aDb[1]
179b0 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
179c0 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  1;..  db->magic 
179d0 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f  = SQLITE_MAGIC_O
179e0 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  PEN;.  if( db->m
179f0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
17a00 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
17a10 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ut;.  }..  /* Re
17a20 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74  gister all built
17a30 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62  -in functions, b
17a40 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ut do not attemp
17a50 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20  t to read the.  
17a60 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65  ** database sche
17a70 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20  ma yet. This is 
17a80 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68  delayed until th
17a90 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
17aa0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69   database.  ** i
17ab0 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f  s accessed..  */
17ac0 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
17ad0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
17ae0 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65    sqlite3Registe
17af0 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e  rBuiltinFunction
17b00 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61  s(db);..  /* Loa
17b10 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65  d automatic exte
17b20 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69  nsions - extensi
17b30 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 62 65  ons that have be
17b40 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20 20  en registered.  
17b50 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
17b60 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65  ite3_automatic_e
17b70 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a  xtension() API..
17b80 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
17b90 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
17ba0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17bb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
17bc0 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e  te3AutoLoadExten
17bd0 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20 72  sions(db);.    r
17be0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
17bf0 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66 28  ode(db);.    if(
17c00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17c10 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  {.      goto ope
17c20 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ndb_out;.    }. 
17c30 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
17c40 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20  E_ENABLE_FTS1.  
17c50 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
17c60 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74  ailed ){.    ext
17c70 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46  ern int sqlite3F
17c80 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a  ts1Init(sqlite3*
17c90 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
17ca0 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b  te3Fts1Init(db);
17cb0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
17cc0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17cd0 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64 62  E_FTS2.  if( !db
17ce0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
17cf0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
17d00 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ){.    extern in
17d10 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69  t sqlite3Fts2Ini
17d20 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  t(sqlite3*);.   
17d30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
17d40 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  2Init(db);.  }.#
17d50 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
17d60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
17d70 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
17d80 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
17d90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17da0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
17db0 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  3Init(db);.  }.#
17dc0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
17dd0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a  LITE_ENABLE_ICU.
17de0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
17df0 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
17e00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17e10 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49  rc = sqlite3IcuI
17e20 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
17e30 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
17e40 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a  TE_ENABLE_RTREE.
17e50 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
17e60 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
17e70 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72  QLITE_OK){.    r
17e80 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65  c = sqlite3Rtree
17e90 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
17ea0 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c  ndif..  /* -DSQL
17eb0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
17ec0 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73  ING_MODE=1 makes
17ed0 20 45 58 43 4c 55 53 49 56 45 20 74 68 65 20 64   EXCLUSIVE the d
17ee0 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20  efault locking. 
17ef0 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c   ** mode.  -DSQL
17f00 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
17f10 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20  ING_MODE=0 make 
17f20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75  NORMAL the defau
17f30 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20  lt locking.  ** 
17f40 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74  mode.  Doing not
17f50 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f  hing at all also
17f60 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68   makes NORMAL th
17f70 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a  e default..  */.
17f80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
17f90 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
17fa0 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63  DE.  db->dfltLoc
17fb0 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44  kMode = SQLITE_D
17fc0 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
17fd0 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ODE;.  sqlite3Pa
17fe0 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73  gerLockingMode(s
17ff0 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
18000 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
18010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18020 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
18030 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
18040 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66  NG_MODE);.#endif
18050 0a 0a 20 20 69 66 28 20 72 63 20 29 20 73 71 6c  ..  if( rc ) sql
18060 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
18070 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20  );..  /* Enable 
18080 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61  the lookaside-ma
18090 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a  lloc subsystem *
180a0 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69  /.  setupLookasi
180b0 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65  de(db, 0, sqlite
180c0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
180d0 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20  Lookaside,.     
180e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180f0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
18100 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64  Config.nLookasid
18110 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77  e);..  sqlite3_w
18120 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
18130 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46  t(db, SQLITE_DEF
18140 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45  AULT_WAL_AUTOCHE
18150 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64  CKPOINT);..opend
18160 62 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  b_out:.  sqlite3
18170 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20  _free(zOpen);.  
18180 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73  if( db ){.    as
18190 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21  sert( db->mutex!
181a0 3d 30 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61  =0 || isThreadsa
181b0 66 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  fe==0 || sqlite3
181c0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
181d0 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20  llMutex==0 );.  
181e0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
181f0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
18200 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
18210 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
18220 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
18230 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
18240 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72  NOMEM );.  if( r
18250 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
18260 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
18270 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62  lose(db);.    db
18280 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
18290 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
182a0 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
182b0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
182c0 53 49 43 4b 3b 0a 20 20 7d 0a 23 69 66 20 64 65  SICK;.  }.#if de
182d0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
182e0 20 26 26 20 45 4e 41 42 4c 45 5f 46 4f 52 43 45   && ENABLE_FORCE
182f0 5f 57 41 4c 0a 20 20 69 66 28 20 64 62 20 26 26  _WAL.  if( db &&
18300 20 21 72 63 20 29 7b 0a 20 20 20 20 69 66 20 28   !rc ){.    if (
18310 28 30 20 3d 3d 20 61 63 63 65 73 73 28 22 2f 76  (0 == access("/v
18320 61 72 2f 64 62 2f 65 6e 61 62 6c 65 46 6f 72 63  ar/db/enableForc
18330 65 57 41 4c 22 2c 20 52 5f 4f 4b 29 29 29 20 7b  eWAL", R_OK))) {
18340 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
18350 45 42 55 47 0a 20 20 20 20 20 20 66 70 72 69 6e  EBUG.      fprin
18360 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 69  tf(stderr, "SQLi
18370 74 65 20 57 41 4c 20 6a 6f 75 72 6e 61 6c 5f 6d  te WAL journal_m
18380 6f 64 65 20 45 4e 41 42 4c 45 44 20 62 79 20 64  ode ENABLED by d
18390 65 66 61 75 6c 74 2e 5c 6e 22 29 3b 0a 23 65 6e  efault.\n");.#en
183a0 64 69 66 0a 20 20 20 20 20 20 0a 20 20 20 20 20  dif.      .     
183b0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
183c0 2c 20 22 70 72 61 67 6d 61 20 6a 6f 75 72 6e 61  , "pragma journa
183d0 6c 5f 6d 6f 64 65 3d 77 61 6c 22 2c 20 4e 55 4c  l_mode=wal", NUL
183e0 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  L, NULL, NULL);.
183f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
18400 42 55 47 0a 2f 2f 20 20 20 20 7d 20 65 6c 73 65  BUG.//    } else
18410 20 7b 0a 2f 2f 20 20 20 20 20 20 66 70 72 69 6e   {.//      fprin
18420 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 69  tf(stderr, "SQLi
18430 74 65 20 57 41 4c 20 6a 6f 75 72 6e 61 6c 5f 6d  te WAL journal_m
18440 6f 64 65 20 4e 4f 54 20 45 4e 41 42 4c 45 44 20  ode NOT ENABLED 
18450 62 79 20 64 65 66 61 75 6c 74 2e 5c 6e 22 29 3b  by default.\n");
18460 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
18470 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
18480 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
18490 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49 4c 45 29  LE_AUTO_PROFILE)
184a0 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 72 63  .  if( db && !rc
184b0 20 29 7b 0a 20 20 20 20 65 6e 61 62 6c 65 41 75   ){.    enableAu
184c0 74 6f 4c 6f 67 67 69 6e 67 28 64 62 29 3b 0a 20  toLogging(db);. 
184d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44   }.#endif.  *ppD
184e0 62 20 3d 20 64 62 3b 0a 23 69 66 64 65 66 20 53  b = db;.#ifdef S
184f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
18500 52 52 0a 20 20 53 52 52 65 63 4f 70 65 6e 28 64  RR.  SRRecOpen(d
18510 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 66 6c  b, zFilename, fl
18520 61 67 73 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  ags);.#endif.#if
18530 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18540 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73  E_SQLLOG.  if( s
18550 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18560 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20  ig.xSqllog ){.  
18570 20 20 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64    /* Opening a d
18580 62 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68  b handle. Fourth
18590 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61   parameter is pa
185a0 73 73 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76  ssed 0. */.    v
185b0 6f 69 64 20 2a 70 41 72 67 20 3d 20 73 71 6c 69  oid *pArg = sqli
185c0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
185d0 70 53 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20  pSqllogArg;.    
185e0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
185f0 66 69 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67  fig.xSqllog(pArg
18600 2c 20 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , db, zFilename,
18610 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
18620 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
18630 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a  ApiExit(0, rc);.
18640 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
18650 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e  new database han
18660 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
18670 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73  te3_open(.  cons
18680 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
18690 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a  e, .  sqlite3 **
186a0 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72  ppDb .){.  retur
186b0 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  n openDatabase(z
186c0 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a  Filename, ppDb,.
186d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186e0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
186f0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
18700 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
18710 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
18720 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63  te3_open_v2(.  c
18730 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
18740 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61  ame,   /* Databa
18750 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46  se filename (UTF
18760 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -8) */.  sqlite3
18770 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20   **ppDb,        
18780 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20   /* OUT: SQLite 
18790 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
187a0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
187b0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
187c0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
187d0 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20  *zVfs        /* 
187e0 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75  Name of VFS modu
187f0 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  le to use */.){.
18800 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
18810 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20  abase(filename, 
18820 70 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20  ppDb, (unsigned 
18830 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29  int)flags, zVfs)
18840 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
18850 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
18860 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
18870 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
18880 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
18890 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20  open16(.  const 
188a0 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  void *zFilename,
188b0 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
188c0 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  Db.){.  char con
188d0 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20  st *zFilename8; 
188e0 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65    /* zFilename e
188f0 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20  ncoded in UTF-8 
18900 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31  instead of UTF-1
18910 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  6 */.  sqlite3_v
18920 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
18930 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51  t rc;..#ifdef SQ
18940 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
18950 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62  ARMOR.  if( ppDb
18960 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
18970 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
18980 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20  .#endif.  *ppDb 
18990 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
189a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
189b0 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  T.  rc = sqlite3
189c0 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
189d0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
189e0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66   rc;.#endif.  if
189f0 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ( zFilename==0 )
18a00 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 5c 30   zFilename = "\0
18a10 30 30 5c 30 30 30 22 3b 0a 20 20 70 56 61 6c 20  00\000";.  pVal 
18a20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
18a30 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
18a40 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
18a50 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
18a60 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
18a70 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  VE, SQLITE_STATI
18a80 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38  C);.  zFilename8
18a90 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
18aa0 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45  ext(pVal, SQLITE
18ab0 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46  _UTF8);.  if( zF
18ac0 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20  ilename8 ){.    
18ad0 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73  rc = openDatabas
18ae0 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70  e(zFilename8, pp
18af0 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
18b00 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
18b10 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
18b20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
18b30 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73  EATE, 0);.    as
18b40 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72  sert( *ppDb || r
18b50 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
18b60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
18b70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48  QLITE_OK && !DbH
18b80 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62  asProperty(*ppDb
18b90 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , 0, DB_SchemaLo
18ba0 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20 53  aded) ){.      S
18bb0 43 48 45 4d 41 5f 45 4e 43 28 2a 70 70 44 62 29  CHEMA_ENC(*ppDb)
18bc0 20 3d 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20   = ENC(*ppDb) = 
18bd0 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
18be0 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  VE;.    }.  }els
18bf0 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
18c00 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
18c10 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
18c20 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72  (pVal);..  retur
18c30 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  n sqlite3ApiExit
18c40 28 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69  (0, rc);.}.#endi
18c50 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
18c60 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
18c70 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
18c80 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
18c90 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
18ca0 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
18cb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
18cc0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
18cd0 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
18ce0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18cf0 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
18d00 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
18d10 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
18d20 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
18d30 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
18d40 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72 65  t void*).){.  re
18d50 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
18d60 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
18d70 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c  (db, zName, enc,
18d80 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
18d90 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   0);.}../*.** Re
18da0 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
18db0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
18dc0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
18dd0 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
18de0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
18df0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
18e00 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
18e10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18e20 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
18e30 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
18e40 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
18e50 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
18e60 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
18e70 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
18e80 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
18e90 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
18ea0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18eb0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
18ec0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
18ed0 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
18ee0 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
18ef0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
18f00 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
18f10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
18f20 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
18f30 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
18f40 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
18f50 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
18f60 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  ion(db, zName, (
18f70 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  u8)enc, pCtx, xC
18f80 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20  ompare, xDel);. 
18f90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
18fa0 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
18fb0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
18fc0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
18fd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18fe0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18ff0 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
19000 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
19010 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
19020 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
19030 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
19040 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
19050 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36  eate_collation16
19060 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
19070 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
19080 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63  zName,.  int enc
19090 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
190a0 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
190b0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
190c0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
190d0 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  t void*).){.  in
190e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
190f0 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38  ;.  char *zName8
19100 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
19110 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
19120 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
19130 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
19140 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20  ) || zName==0 ) 
19150 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
19160 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
19170 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
19180 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
19190 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
191a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
191b0 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71  );.  zName8 = sq
191c0 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62  lite3Utf16to8(db
191d0 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
191e0 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
191f0 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29  ;.  if( zName8 )
19200 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74  {.    rc = creat
19210 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
19220 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20  Name8, (u8)enc, 
19230 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
19240 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
19250 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38  bFree(db, zName8
19260 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
19270 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
19280 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
19290 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
192a0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
192b0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
192c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
192d0 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
192e0 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
192f0 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
19300 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
19310 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
19320 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
19330 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
19340 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
19350 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
19360 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
19370 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
19380 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69  n_needed(.  sqli
19390 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
193a0 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
193b0 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
193c0 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71  Needed)(void*,sq
193d0 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
193e0 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  Rep,const char*)
193f0 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
19400 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
19410 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
19420 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
19430 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
19440 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
19450 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
19460 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
19470 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78  >mutex);.  db->x
19480 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f  CollNeeded = xCo
19490 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e  llNeeded;.  db->
194a0 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
194b0 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65  0;.  db->pCollNe
194c0 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e  ededArg = pCollN
194d0 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69  eededArg;.  sqli
194e0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
194f0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
19500 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19510 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
19520 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
19530 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
19540 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
19550 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
19560 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
19570 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
19580 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
19590 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
195a0 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
195b0 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
195c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
195d0 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36  llation_needed16
195e0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
195f0 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e   .  void *pCollN
19600 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69  eededArg, .  voi
19610 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  d(*xCollNeeded16
19620 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a  )(void*,sqlite3*
19630 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f  ,int eTextRep,co
19640 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23 69  nst void*).){.#i
19650 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
19660 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
19670 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
19680 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
19690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
196a0 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
196b0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
196c0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
196d0 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
196e0 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  eded = 0;.  db->
196f0 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
19700 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20  xCollNeeded16;. 
19710 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
19720 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
19730 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
19740 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
19750 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
19760 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
19770 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
19780 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69  MIT_UTF16 */..#i
19790 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
197a0 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
197b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
197c0 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68   is now an anach
197d0 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20  ronism. It used 
197e0 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  to be used to re
197f0 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20  cover from a.** 
19800 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
19810 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77  , but SQLite now
19820 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d   does this autom
19830 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  atically..*/.int
19840 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f   sqlite3_global_
19850 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20  recover(void){. 
19860 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19870 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
19880 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77  ** Test to see w
19890 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
198a0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
198b0 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f  ction is in auto
198c0 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20  commit.** mode. 
198d0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
198e0 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20  it is and FALSE 
198f0 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d  if not.  Autocom
19900 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a  mit mode is on.*
19910 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41  * by default.  A
19920 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73  utocommit is dis
19930 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e  abled by a BEGIN
19940 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
19950 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74  eenabled.** by t
19960 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f  he next COMMIT o
19970 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69  r ROLLBACK..*/.i
19980 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  nt sqlite3_get_a
19990 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65  utocommit(sqlite
199a0 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
199b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
199c0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
199d0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
199e0 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
199f0 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
19a00 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
19a10 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
19a20 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75  .  return db->au
19a30 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a  toCommit;.}../*.
19a40 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
19a50 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75   routines are su
19a60 62 73 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f  bstitutes for co
19a70 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43  nstants SQLITE_C
19a80 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54  ORRUPT,.** SQLIT
19a90 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45  E_MISUSE, SQLITE
19aa0 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54  _CANTOPEN, SQLIT
19ab0 45 5f 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73  E_IOERR and poss
19ac0 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72  ibly other error
19ad0 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20  .** constants.  
19ae0 54 68 65 79 20 73 65 72 76 65 20 74 77 6f 20 70  They serve two p
19af0 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  urposes:.**.**  
19b00 20 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20   1.  Serve as a 
19b10 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65  convenient place
19b20 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
19b30 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67  oint in a debugg
19b40 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64  er.**       to d
19b50 65 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69  etect when versi
19b60 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  on error conditi
19b70 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ons occurs..**.*
19b80 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73  *   2.  Invoke s
19b90 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20  qlite3_log() to 
19ba0 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72  provide the sour
19bb0 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e  ce code location
19bc0 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20   where.**       
19bd0 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  a low-level erro
19be0 72 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63  r is first detec
19bf0 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
19c00 74 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28  te3CorruptError(
19c10 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
19c20 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
19c30 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
19c40 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  g!=0 );.  sqlite
19c50 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52  3_log(SQLITE_COR
19c60 52 55 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20  RUPT,.          
19c70 20 20 20 20 22 64 61 74 61 62 61 73 65 20 63 6f      "database co
19c80 72 72 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65  rruption at line
19c90 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c   %d of [%.10s]",
19ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
19cb0 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65  ineno, 20+sqlite
19cc0 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
19cd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
19ce0 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71  ORRUPT;.}.int sq
19cf0 6c 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72  lite3MisuseError
19d00 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
19d10 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
19d20 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
19d30 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  og!=0 );.  sqlit
19d40 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49  e3_log(SQLITE_MI
19d50 53 55 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20  SUSE, .         
19d60 20 20 20 20 20 22 6d 69 73 75 73 65 20 61 74 20       "misuse at 
19d70 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
19d80 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
19d90 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
19da0 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
19db0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
19dc0 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74  TE_MISUSE;.}.int
19dd0 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e   sqlite3Cantopen
19de0 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
19df0 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
19e00 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
19e10 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
19e20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
19e30 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20  TE_CANTOPEN, .  
19e40 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e              "can
19e50 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74  not open file at
19e60 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31   line %d of [%.1
19e70 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  0s]",.          
19e80 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73      lineno, 20+s
19e90 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
19ea0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
19eb0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a  ITE_CANTOPEN;.}.
19ec0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19ed0 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
19ee0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
19ef0 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75   convenience rou
19f00 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20  tine that makes 
19f10 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68  sure that all th
19f20 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a  read-specific.**
19f30 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74   data for this t
19f40 68 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64  hread has been d
19f50 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a  eallocated..**.*
19f60 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67  * SQLite no long
19f70 65 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73  er uses thread-s
19f80 70 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20  pecific data so 
19f90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
19fa0 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20  now a.** no-op. 
19fb0 20 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20   It is retained 
19fc0 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63  for historical c
19fd0 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f  ompatibility..*/
19fe0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68  .void sqlite3_th
19ff0 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69  read_cleanup(voi
1a000 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  d){.}.#endif../*
1a010 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20  .** Return meta 
1a020 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
1a030 74 20 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c  t a specific col
1a040 75 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73  umn of a databas
1a050 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20  e table..** See 
1a060 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74  comment in sqlit
1a070 65 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69  e3.h (sqlite.h.i
1a080 6e 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  n) for details..
1a090 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
1a0a0 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
1a0b0 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33 20  data(.  sqlite3 
1a0c0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
1a0d0 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1a0e0 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f  n handle */.  co
1a0f0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
1a100 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  e,        /* Dat
1a110 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55  abase name or NU
1a120 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  LL */.  const ch
1a130 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20  ar *zTableName, 
1a140 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d      /* Table nam
1a150 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1a160 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20  r *zColumnName, 
1a170 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d     /* Column nam
1a180 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  e */.  char cons
1a190 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20  t **pzDataType, 
1a1a0 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65     /* OUTPUT: De
1a1b0 63 6c 61 72 65 64 20 64 61 74 61 20 74 79 70 65  clared data type
1a1c0 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
1a1d0 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20   **pzCollSeq,   
1a1e0 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c    /* OUTPUT: Col
1a1f0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1a200 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  name */.  int *p
1a210 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20  NotNull,        
1a220 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
1a230 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c   True if NOT NUL
1a240 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69  L constraint exi
1a250 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50  sts */.  int *pP
1a260 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20 20  rimaryKey,      
1a270 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
1a280 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70  True if column p
1a290 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69  art of PK */.  i
1a2a0 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20 20  nt *pAutoinc    
1a2b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1a2c0 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f  TPUT: True if co
1a2d0 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63  lumn is auto-inc
1a2e0 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  rement */.){.  i
1a2f0 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
1a300 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61  ErrMsg = 0;.  Ta
1a310 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20  ble *pTab = 0;. 
1a320 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20   Column *pCol = 
1a330 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
1a340 30 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  0;..  char const
1a350 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b   *zDataType = 0;
1a360 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
1a370 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69  CollSeq = 0;.  i
1a380 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a  nt notnull = 0;.
1a390 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79    int primarykey
1a3a0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f   = 0;.  int auto
1a3b0 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45  inc = 0;..  /* E
1a3c0 6e 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  nsure the databa
1a3d0 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65  se schema has be
1a3e0 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73  en loaded */.  s
1a3f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1a400 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1a410 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1a420 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20  erAll(db);.  rc 
1a430 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62  = sqlite3Init(db
1a440 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
1a450 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
1a460 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   ){.    goto err
1a470 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
1a480 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  * Locate the tab
1a490 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a  le in question *
1a4a0 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  /.  pTab = sqlit
1a4b0 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
1a4c0 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e  zTableName, zDbN
1a4d0 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61  ame);.  if( !pTa
1a4e0 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  b || pTab->pSele
1a4f0 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d  ct ){.    pTab =
1a500 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   0;.    goto err
1a510 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
1a520 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d  * Find the colum
1a530 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f  n for which info
1a540 20 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f   is requested */
1a550 0a 20 20 69 66 28 20 7a 43 6f 6c 75 6d 6e 4e 61  .  if( zColumnNa
1a560 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  me==0 ){.    /* 
1a570 51 75 65 72 79 20 66 6f 72 20 65 78 69 73 74 61  Query for exista
1a580 6e 63 65 20 6f 66 20 74 61 62 6c 65 20 6f 6e 6c  nce of table onl
1a590 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  y */.  }else{.  
1a5a0 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
1a5b0 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
1a5c0 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43  Col++){.      pC
1a5d0 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
1a5e0 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66  [iCol];.      if
1a5f0 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  ( 0==sqlite3StrI
1a600 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c  Cmp(pCol->zName,
1a610 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b   zColumnName) ){
1a620 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1a630 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a640 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62    if( iCol==pTab
1a650 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
1a660 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
1a670 62 29 20 26 26 20 73 71 6c 69 74 65 33 49 73 52  b) && sqlite3IsR
1a680 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  owid(zColumnName
1a690 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  ) ){.        iCo
1a6a0 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
1a6b0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20  .        pCol = 
1a6c0 69 43 6f 6c 3e 3d 30 20 3f 20 26 70 54 61 62 2d  iCol>=0 ? &pTab-
1a6d0 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 20 3a 20 30 3b  >aCol[iCol] : 0;
1a6e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1a6f0 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a        pTab = 0;.
1a700 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72          goto err
1a710 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  or_out;.      }.
1a720 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1a730 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
1a740 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d  ock stores the m
1a750 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
1a760 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
1a770 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68  urned.  ** to th
1a780 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61  e caller in loca
1a790 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74  l variables zDat
1a7a0 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c  aType, zCollSeq,
1a7b0 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72   notnull, primar
1a7c0 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75  ykey.  ** and au
1a7d0 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70  toinc. At this p
1a7e0 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65 20 74  oint there are t
1a7f0 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  wo possibilities
1a800 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20  :.  ** .  **    
1a810 20 31 2e 20 54 68 65 20 73 70 65 63 69 66 69 65   1. The specifie
1a820 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61  d column name wa
1a830 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20  s rowid", "oid" 
1a840 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20  or "_rowid_" .  
1a850 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74 68  **        and th
1a860 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63  ere is no explic
1a870 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50  itly declared IP
1a880 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a  K column. .  **.
1a890 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20    **     2. The 
1a8a0 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76  table is not a v
1a8b0 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75  iew and the colu
1a8c0 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69  mn name identifi
1a8d0 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20  ed an .  **     
1a8e0 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65     explicitly de
1a8f0 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43  clared column. C
1a900 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  opy meta informa
1a910 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e  tion from *pCol.
1a920 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f  .  */ .  if( pCo
1a930 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79  l ){.    zDataTy
1a940 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  pe = pCol->zType
1a950 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d  ;.    zCollSeq =
1a960 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20   pCol->zColl;.  
1a970 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c    notnull = pCol
1a980 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20  ->notNull!=0;.  
1a990 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20    primarykey  = 
1a9a0 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20  (pCol->colFlags 
1a9b0 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  & COLFLAG_PRIMKE
1a9c0 59 29 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69  Y)!=0;.    autoi
1a9d0 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  nc = pTab->iPKey
1a9e0 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d  ==iCol && (pTab-
1a9f0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
1aa00 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30  utoincrement)!=0
1aa10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
1aa20 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45  DataType = "INTE
1aa30 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72  GER";.    primar
1aa40 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  ykey = 1;.  }.  
1aa50 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b  if( !zCollSeq ){
1aa60 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20  .    zCollSeq = 
1aa70 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65  "BINARY";.  }..e
1aa80 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  rror_out:.  sqli
1aa90 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
1aaa0 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74  (db);..  /* Whet
1aab0 68 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  her the function
1aac0 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20   call succeeded 
1aad0 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74  or failed, set t
1aae0 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  he output parame
1aaf0 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61  ters.  ** to wha
1ab00 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61  tever their loca
1ab10 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63  l counterparts c
1ab20 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72  ontain. If an er
1ab30 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20  ror did occur,. 
1ab40 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68 65   ** this has the
1ab50 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69   effect of zeroi
1ab60 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61  ng all output pa
1ab70 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20  rameters..  */. 
1ab80 20 69 66 28 20 70 7a 44 61 74 61 54 79 70 65 20   if( pzDataType 
1ab90 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20  ) *pzDataType = 
1aba0 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28  zDataType;.  if(
1abb0 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a   pzCollSeq ) *pz
1abc0 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53  CollSeq = zCollS
1abd0 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75  eq;.  if( pNotNu
1abe0 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d  ll ) *pNotNull =
1abf0 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20   notnull;.  if( 
1ac00 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70  pPrimaryKey ) *p
1ac10 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69  PrimaryKey = pri
1ac20 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70  marykey;.  if( p
1ac30 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f  Autoinc ) *pAuto
1ac40 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a  inc = autoinc;..
1ac50 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
1ac60 3d 72 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a  =rc && !pTab ){.
1ac70 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1ac80 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  e(db, zErrMsg);.
1ac90 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71      zErrMsg = sq
1aca0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1acb0 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20   "no such table 
1acc0 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20  column: %s.%s", 
1acd0 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20  zTableName,.    
1ace0 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29      zColumnName)
1acf0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
1ad00 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73  E_ERROR;.  }.  s
1ad10 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
1ad20 73 67 28 64 62 2c 20 72 63 2c 20 28 7a 45 72 72  sg(db, rc, (zErr
1ad30 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72  Msg?"%s":0), zEr
1ad40 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
1ad50 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d  DbFree(db, zErrM
1ad60 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  sg);.  rc = sqli
1ad70 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
1ad80 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
1ad90 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1ada0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
1adb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  c;.}../*.** Slee
1adc0 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
1add0 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
1ade0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
1adf0 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73   slept..*/.int s
1ae00 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74  qlite3_sleep(int
1ae10 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   ms){.  sqlite3_
1ae20 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74  vfs *pVfs;.  int
1ae30 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71   rc;.  pVfs = sq
1ae40 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1ae50 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30  );.  if( pVfs==0
1ae60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
1ae70 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
1ae80 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73   works in millis
1ae90 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20  econds, but the 
1aea0 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65  underlying OsSle
1aeb0 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75  ep() .  ** API u
1aec0 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  ses microseconds
1aed0 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30 30 30  . Hence the 1000
1aee0 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  's..  */.  rc = 
1aef0 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28  (sqlite3OsSleep(
1af00 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31  pVfs, 1000*ms)/1
1af10 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  000);.  return r
1af20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  c;.}../*.** Enab
1af30 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
1af40 65 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c  e extended resul
1af50 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t codes..*/.int 
1af60 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
1af70 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71  _result_codes(sq
1af80 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f  lite3 *db, int o
1af90 6e 6f 66 66 29 7b 0a 23 69 66 64 65 66 20 53 51  noff){.#ifdef SQ
1afa0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1afb0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1afc0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1afd0 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
1afe0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1aff0 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
1b000 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1b010 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
1b020 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66  ->errMask = onof
1b030 66 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a  f ? 0xffffffff :
1b040 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33   0xff;.  sqlite3
1b050 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1b060 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1b070 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b080 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
1b090 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65   xFileControl me
1b0a0 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63  thod on a partic
1b0b0 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a  ular database..*
1b0c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69  /.int sqlite3_fi
1b0d0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  le_control(sqlit
1b0e0 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
1b0f0 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74  ar *zDbName, int
1b100 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
1b110 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1b120 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72  ITE_ERROR;.  Btr
1b130 65 65 20 2a 70 42 74 72 65 65 3b 0a 0a 23 69 66  ee *pBtree;..#if
1b140 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1b150 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1b160 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1b170 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
1b180 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
1b190 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
1b1a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b1b0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1b1c0 3b 0a 20 20 70 42 74 72 65 65 20 3d 20 73 71 6c  ;.  pBtree = sql
1b1d0 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
1b1e0 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  e(db, zDbName);.
1b1f0 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
1b200 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
1b210 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  r;.    sqlite3_f
1b220 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c  ile *fd;.    sql
1b230 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1b240 42 74 72 65 65 29 3b 0a 20 20 20 20 70 50 61 67  Btree);.    pPag
1b250 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
1b260 65 50 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a  ePager(pBtree);.
1b270 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b280 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 66 64 20  er!=0 );.    fd 
1b290 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
1b2a0 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  le(pPager);.    
1b2b0 61 73 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b  assert( fd!=0 );
1b2c0 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c  .    if( op==SQL
1b2d0 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50  ITE_FCNTL_FILE_P
1b2e0 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20  OINTER ){.      
1b2f0 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a  *(sqlite3_file**
1b300 29 70 41 72 67 20 3d 20 66 64 3b 0a 20 20 20 20  )pArg = fd;.    
1b310 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1b320 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1b330 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
1b340 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b350 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
1b360 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 23  fd, op, pArg);.#
1b370 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b380 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 69 66 28  IT_WAL.      if(
1b390 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc==SQLITE_OK)
1b3a0 26 26 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  &&(op==SQLITE_FC
1b3b0 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 29 26  NTL_LAST_ERRNO)&
1b3c0 26 28 2a 28 69 6e 74 20 2a 29 70 41 72 67 3d 3d  &(*(int *)pArg==
1b3d0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0) ){.        sq
1b3e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 57 61 6c  lite3_file *pWal
1b3f0 46 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Fd = sqlite3Page
1b400 72 57 61 6c 46 69 6c 65 28 70 50 61 67 65 72 29  rWalFile(pPager)
1b410 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
1b420 61 6c 46 64 26 26 28 70 57 61 6c 46 64 2d 3e 70  alFd&&(pWalFd->p
1b430 4d 65 74 68 6f 64 73 29 20 29 7b 0a 20 20 20 20  Methods) ){.    
1b440 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b450 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
1b460 70 57 61 6c 46 64 2c 20 6f 70 2c 20 70 41 72 67  pWalFd, op, pArg
1b470 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1b480 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1b490 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1b4a0 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
1b4b0 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  D;.    }.    sql
1b4c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1b4d0 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Btree);.  }.  sq
1b4e0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
1b4f0 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
1b500 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1b510 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
1b520 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  c;.}../*.** Inte
1b530 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65 73  rface to the tes
1b540 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69  ting logic..*/.i
1b550 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  nt sqlite3_test_
1b560 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20  control(int op, 
1b570 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ...){.  int rc =
1b580 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
1b590 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f  TE_OMIT_BUILTIN_
1b5a0 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74 20 61  TEST.  va_list a
1b5b0 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
1b5c0 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
1b5d0 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20   op ){..    /*. 
1b5e0 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63     ** Save the c
1b5f0 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
1b600 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f  the PRNG..    */
1b610 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b620 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53  _TESTCTRL_PRNG_S
1b630 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  AVE: {.      sql
1b640 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61 74  ite3PrngSaveStat
1b650 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
1b660 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1b670 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74      ** Restore t
1b680 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
1b690 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74  PRNG to the last
1b6a0 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73 69   state saved usi
1b6b0 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53  ng.    ** PRNG_S
1b6c0 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41  AVE.  If PRNG_SA
1b6d0 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65 66  VE has never bef
1b6e0 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ore been called,
1b6f0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69   then.    ** thi
1b700 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65  s verb acts like
1b710 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20   PRNG_RESET..   
1b720 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1b730 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
1b740 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20  G_RESTORE: {.   
1b750 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65     sqlite3PrngRe
1b760 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20  storeState();.  
1b770 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b780 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1b790 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20 62  Reset the PRNG b
1b7a0 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69  ack to its unini
1b7b0 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20  tialized state. 
1b7c0 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20   The next call. 
1b7d0 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
1b7e0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69  _randomness() wi
1b7f0 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50 52  ll reseed the PR
1b800 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  NG using a singl
1b810 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  e call.    ** to
1b820 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73   the xRandomness
1b830 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64   method of the d
1b840 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20  efault VFS..    
1b850 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1b860 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
1b870 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20  _RESET: {.      
1b880 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
1b890 73 73 28 30 2c 30 29 3b 0a 20 20 20 20 20 20 62  ss(0,0);.      b
1b8a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1b8b0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1b8c0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1b8d0 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69  (BITVEC_TEST, si
1b8e0 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20  ze, program).   
1b8f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61   **.    ** Run a
1b900 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61 20   test against a 
1b910 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66  Bitvec object of
1b920 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67   size.  The prog
1b930 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20  ram argument.   
1b940 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20   ** is an array 
1b950 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74  of integers that
1b960 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65 73   defines the tes
1b970 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e  t.  Return -1 on
1b980 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79   a.    ** memory
1b990 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1b9a0 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c  r, 0 on success,
1b9b0 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72   or non-zero for
1b9c0 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a   an error..    *
1b9d0 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65  * See the sqlite
1b9e0 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
1b9f0 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  st() for additio
1ba00 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
1ba10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1ba20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1ba30 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a  _BITVEC_TEST: {.
1ba40 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
1ba50 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
1ba60 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67        int *aProg
1ba70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1ba80 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t*);.      rc = 
1ba90 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
1baa0 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72  ltinTest(sz, aPr
1bab0 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  og);.      break
1bac0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1bad0 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1bae0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41 55  test_control(FAU
1baf0 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 78 43 61 6c  LT_INSTALL, xCal
1bb00 6c 62 61 63 6b 29 0a 20 20 20 20 2a 2a 0a 20 20  lback).    **.  
1bb10 20 20 2a 2a 20 41 72 72 61 6e 67 65 20 74 6f 20    ** Arrange to 
1bb20 69 6e 76 6f 6b 65 20 78 43 61 6c 6c 62 61 63 6b  invoke xCallback
1bb30 28 29 20 77 68 65 6e 65 76 65 72 20 73 71 6c 69  () whenever sqli
1bb40 74 65 33 46 61 75 6c 74 53 69 6d 28 29 20 69 73  te3FaultSim() is
1bb50 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a 20   called,.    ** 
1bb60 69 66 20 78 43 61 6c 6c 62 61 63 6b 20 69 73 20  if xCallback is 
1bb70 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a  not NULL..    **
1bb80 0a 20 20 20 20 2a 2a 20 41 73 20 61 20 74 65 73  .    ** As a tes
1bb90 74 20 6f 66 20 74 68 65 20 66 61 75 6c 74 20 73  t of the fault s
1bba0 69 6d 75 6c 61 74 6f 72 20 6d 65 63 68 61 6e 69  imulator mechani
1bbb0 73 6d 20 69 74 73 65 6c 66 2c 20 73 71 6c 69 74  sm itself, sqlit
1bbc0 65 33 46 61 75 6c 74 53 69 6d 28 30 29 0a 20 20  e3FaultSim(0).  
1bbd0 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 69    ** is called i
1bbe0 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
1bbf0 20 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65 20   installing the 
1bc00 6e 65 77 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64  new callback and
1bc10 20 74 68 65 20 72 65 74 75 72 6e 0a 20 20 20 20   the return.    
1bc20 2a 2a 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 71  ** value from sq
1bc30 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29  lite3FaultSim(0)
1bc40 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 74   becomes the ret
1bc50 75 72 6e 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  urn from.    ** 
1bc60 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1bc70 74 72 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  trol()..    */. 
1bc80 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1bc90 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e  ESTCTRL_FAULT_IN
1bca0 53 54 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 2f  STALL: {.      /
1bcb0 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20  * MSVC is picky 
1bcc0 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75  about pulling fu
1bcd0 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20  nc ptrs from va 
1bce0 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  lists..      ** 
1bcf0 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d  http://support.m
1bd00 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f  icrosoft.com/kb/
1bd10 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73  47961.      ** s
1bd20 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1bd30 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b  ig.xTestCallback
1bd40 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1bd50 74 28 2a 29 28 69 6e 74 29 29 3b 0a 20 20 20 20  t(*)(int));.    
1bd60 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
1bd70 65 66 20 69 6e 74 28 2a 54 45 53 54 43 41 4c 4c  ef int(*TESTCALL
1bd80 42 41 43 4b 46 55 4e 43 5f 74 29 28 69 6e 74 29  BACKFUNC_t)(int)
1bd90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
1bda0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73  lobalConfig.xTes
1bdb0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61  tCallback = va_a
1bdc0 72 67 28 61 70 2c 20 54 45 53 54 43 41 4c 4c 42  rg(ap, TESTCALLB
1bdd0 41 43 4b 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20  ACKFUNC_t);.    
1bde0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 61    rc = sqlite3Fa
1bdf0 75 6c 74 53 69 6d 28 30 29 3b 0a 20 20 20 20 20  ultSim(0);.     
1be00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1be10 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1be20 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1be30 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  ol(BENIGN_MALLOC
1be40 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20  _HOOKS, xBegin, 
1be50 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20  xEnd).    **.   
1be60 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f   ** Register hoo
1be70 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e  ks to call to in
1be80 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c  dicate which mal
1be90 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a  loc() failures .
1bea0 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67      ** are benig
1beb0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
1bec0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1bed0 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  RL_BENIGN_MALLOC
1bee0 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20  _HOOKS: {.      
1bef0 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76  typedef void (*v
1bf00 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f  oid_function)(vo
1bf10 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f  id);.      void_
1bf20 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e  function xBenign
1bf30 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69  Begin;.      voi
1bf40 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69  d_function xBeni
1bf50 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65  gnEnd;.      xBe
1bf60 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61  nignBegin = va_a
1bf70 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63  rg(ap, void_func
1bf80 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65  tion);.      xBe
1bf90 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67  nignEnd = va_arg
1bfa0 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69  (ap, void_functi
1bfb0 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  on);.      sqlit
1bfc0 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f  e3BenignMallocHo
1bfd0 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e  oks(xBenignBegin
1bfe0 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20  , xBenignEnd);. 
1bff0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c000 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1c010 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1c020 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1c030 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
1c040 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  YTE, unsigned in
1c050 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
1c060 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44 49  ** Set the PENDI
1c070 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20 76  NG byte to the v
1c080 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67 75  alue in the argu
1c090 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20  ment, if X>0..  
1c0a0 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61    ** Make no cha
1c0b0 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52  nges if X==0.  R
1c0c0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
1c0d0 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62  of the pending b
1c0e0 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74  yte.    ** as it
1c0f0 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65   existing before
1c100 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
1c110 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a  s called..    **
1c120 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e  .    ** IMPORTAN
1c130 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65  T:  Changing the
1c140 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72   PENDING byte fr
1c150 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72 65  om 0x40000000 re
1c160 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20  sults in.    ** 
1c170 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
1c180 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
1c190 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20  rmat.  Changing 
1c1a0 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
1c1b0 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e  .    ** while an
1c1c0 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  y database conne
1c1d0 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65  ction is open re
1c1e0 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e  sults in undefin
1c1f0 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65  ed and.    ** de
1c200 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76 69  leterious behavi
1c210 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  or..    */.    c
1c220 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1c230 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45  TRL_PENDING_BYTE
1c240 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 50  : {.      rc = P
1c250 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66  ENDING_BYTE;.#if
1c260 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c270 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20 20  _WSD.      {.   
1c280 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e       unsigned in
1c290 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72  t newVal = va_ar
1c2a0 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69  g(ap, unsigned i
1c2b0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nt);.        if(
1c2c0 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65   newVal ) sqlite
1c2d0 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e  3PendingByte = n
1c2e0 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23  ewVal;.      }.#
1c2f0 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
1c300 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1c310 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
1c320 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1c330 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
1c340 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20  SERT, int X).   
1c350 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1c360 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
1c370 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
1c380 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
1c390 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73  r not.    ** ass
1c3a0 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65  ert() was enable
1c3b0 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1c3c0 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65  e.  If X is true
1c3d0 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20   and assert().  
1c3e0 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c    ** is enabled,
1c3f0 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
1c400 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20   value is true. 
1c410 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e   If X is true an
1c420 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28  d.    ** assert(
1c430 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
1c440 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
1c450 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49  alue is zero.  I
1c460 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61  f X is.    ** fa
1c470 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  lse and assert()
1c480 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
1c490 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20  n the assertion 
1c4a0 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20  fires and the.  
1c4b0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f    ** process abo
1c4c0 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66 61  rts.  If X is fa
1c4d0 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  lse and assert()
1c4e0 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68   is disabled, th
1c4f0 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  en the.    ** re
1c500 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
1c510 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ro..    */.    c
1c520 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1c530 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20  TRL_ASSERT: {.  
1c540 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74      volatile int
1c550 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73   x = 0;.      as
1c560 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61 72  sert( (x = va_ar
1c570 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b  g(ap,int))!=0 );
1c580 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a 20  .      rc = x;. 
1c590 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c5a0 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  }...    /*.    *
1c5b0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1c5c0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1c5d0 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20  ESTCTRL_ALWAYS, 
1c5e0 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
1c5f0 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e    ** This action
1c600 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d   provides a run-
1c610 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65  time test to see
1c620 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53 20   how the ALWAYS 
1c630 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52  and.    ** NEVER
1c640 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65 66   macros were def
1c650 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
1c660 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  time..    **.   
1c670 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76   ** The return v
1c680 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28 58  alue is ALWAYS(X
1c690 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ).  .    **.    
1c6a0 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64  ** The recommend
1c6b0 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32 2e  ed test is X==2.
1c6c0 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
1c6d0 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61 74  value is 2, that
1c6e0 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c   means.    ** AL
1c6f0 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52  WAYS() and NEVER
1c700 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f  () are both no-o
1c710 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d  p pass-through m
1c720 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  acros, which is 
1c730 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
1c740 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20  lt setting.  If 
1c750 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1c760 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57 41   is 1, then ALWA
1c770 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a 20  YS() is either. 
1c780 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64     ** hard-coded
1c790 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73 65   to true or else
1c7a0 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20 69   it asserts if i
1c7b0 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ts argument is f
1c7c0 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  alse..    ** The
1c7d0 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72 20   first behavior 
1c7e0 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74  (hard-coded to t
1c7f0 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73 65  rue) is the case
1c800 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
1c810 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1c820 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
1c830 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
1c840 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  d and the second
1c850 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f 72  .    ** behavior
1c860 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65 20   (assert if the 
1c870 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41  argument to ALWA
1c880 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20 69  YS() is false) i
1c890 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20  s the case if.  
1c8a0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54    ** SQLITE_TEST
1c8b0 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77  CTRL_ASSERT show
1c8c0 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20  s that assert() 
1c8d0 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20  is enabled..    
1c8e0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75  **.    ** The ru
1c8f0 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f 63  n-time test proc
1c900 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b  edure might look
1c910 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20   something like 
1c920 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
1c930 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69 74   **    if( sqlit
1c940 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1c950 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1c960 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b  ALWAYS, 2)==2 ){
1c970 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
1c980 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56  ALWAYS() and NEV
1c990 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70  ER() are no-op p
1c9a0 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72  ass-through macr
1c9b0 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c  os.    **    }el
1c9c0 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  se if( sqlite3_t
1c9d0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1c9e0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
1c9f0 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a  RT, 1) ){.    **
1ca00 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
1ca10 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74 20  x) asserts that 
1ca20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45 52  x is true. NEVER
1ca30 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69 73  (x) asserts x is
1ca40 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20   false..    **  
1ca50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20    }else{.    ** 
1ca60 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78       // ALWAYS(x
1ca70 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
1ca80 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73 20  1.  NEVER(x) is 
1ca90 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20  a constant 0..  
1caa0 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f    **    }.    */
1cab0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1cac0 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
1cad0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  : {.      int x 
1cae0 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
1caf0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c 57  ;.      rc = ALW
1cb00 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62 72  AYS(x);.      br
1cb10 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1cb20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c 69  /*.    **   sqli
1cb30 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1cb40 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1cb50 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a 20 20 20  _BYTEORDER);.   
1cb60 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 69   **.    ** The i
1cb70 6e 74 65 67 65 72 20 72 65 74 75 72 6e 65 64 20  nteger returned 
1cb80 72 65 76 65 61 6c 73 20 74 68 65 20 62 79 74 65  reveals the byte
1cb90 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20 63 6f  -order of the co
1cba0 6d 70 75 74 65 72 20 6f 6e 20 77 68 69 63 68 0a  mputer on which.
1cbb0 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 69 73      ** SQLite is
1cbc0 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a   running:.    **
1cbd0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 31 20  .    **       1 
1cbe0 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20      big-endian, 
1cbf0 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74     determined at
1cc00 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a   run-time.    **
1cc10 20 20 20 20 20 20 31 30 20 20 20 20 20 6c 69 74        10     lit
1cc20 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65  tle-endian, dete
1cc30 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69  rmined at run-ti
1cc40 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33 32 31 30  me.    **  43210
1cc50 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e  1     big-endian
1cc60 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20  ,    determined 
1cc70 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  at compile-time.
1cc80 20 20 20 20 2a 2a 20 20 31 32 33 34 31 30 20 20      **  123410  
1cc90 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e     little-endian
1cca0 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20  , determined at 
1ccb0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20  compile-time.   
1ccc0 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 53 51   */ .    case SQ
1ccd0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59  LITE_TESTCTRL_BY
1cce0 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20 20  TEORDER: {.     
1ccf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 59 54   rc = SQLITE_BYT
1cd00 45 4f 52 44 45 52 2a 31 30 30 20 2b 20 53 51 4c  EORDER*100 + SQL
1cd10 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e  ITE_LITTLEENDIAN
1cd20 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f 42 49 47  *10 + SQLITE_BIG
1cd30 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20 62 72  ENDIAN;.      br
1cd40 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1cd50 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1cd60 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1cd70 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
1cd80 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  E, sqlite3 *db, 
1cd90 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
1cda0 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65    ** Set the nRe
1cdb0 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20  serve size to N 
1cdc0 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
1cdd0 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74  abase on the dat
1cde0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e  abase.    ** con
1cdf0 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20  nection db..    
1ce00 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1ce10 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45  TE_TESTCTRL_RESE
1ce20 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RVE: {.      sql
1ce30 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
1ce40 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
1ce50 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76  .      int x = v
1ce60 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
1ce70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
1ce80 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1ce90 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ex);.      sqlit
1cea0 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
1ceb0 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  ze(db->aDb[0].pB
1cec0 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20  t, 0, x, 0);.   
1ced0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1cee0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1cef0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1cf00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73      }..    /*  s
1cf10 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1cf20 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1cf30 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
1cf40 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  S, sqlite3 *db, 
1cf50 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
1cf60 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64    ** Enable or d
1cf70 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f  isable various o
1cf80 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72  ptimizations for
1cf90 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
1cfa0 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20  s.  The .    ** 
1cfb0 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20  argument N is a 
1cfc0 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d  bitmask of optim
1cfd0 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64  izations to be d
1cfe0 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f  isabled.  For no
1cff0 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72  rmal.    ** oper
1d000 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62  ation N should b
1d010 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20 69  e 0.  The idea i
1d020 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70 72  s that a test pr
1d030 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a  ogram (like the.
1d040 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63      ** SQL Logic
1d050 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73   Test or SLT tes
1d060 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75  t module) can ru
1d070 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d  n the same SQL m
1d080 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20  ultiple times.  
1d090 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75    ** with variou
1d0a0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  s optimizations 
1d0b0 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69  disabled to veri
1d0c0 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  fy that the same
1d0d0 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69   answer.    ** i
1d0e0 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76  s obtained in ev
1d0f0 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  ery case..    */
1d100 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1d110 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
1d120 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20  ZATIONS: {.     
1d130 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
1d140 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
1d150 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64  3*);.      db->d
1d160 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31 36  bOptFlags = (u16
1d170 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  )(va_arg(ap, int
1d180 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20 20  ) & 0xffff);.   
1d190 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d1a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
1d1b0 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20  _KEYWORD.    /* 
1d1c0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1d1d0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1d1e0 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20  CTRL_ISKEYWORD, 
1d1f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72  const char *zWor
1d200 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d).    **.    **
1d210 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61 20 6b   If zWord is a k
1d220 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65  eyword recognize
1d230 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2c  d by the parser,
1d240 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
1d250 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  .    ** number o
1d260 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  f keywords.  Or 
1d270 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20  if zWord is not 
1d280 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74 75 72  a keyword, retur
1d290 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  n 0..    ** .   
1d2a0 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 66 65   ** This test fe
1d2b0 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 61 76  ature is only av
1d2c0 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 61  ailable in the a
1d2d0 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63  malgamation sinc
1d2e0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c  e.    ** the SQL
1d2f0 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61  ITE_N_KEYWORD ma
1d300 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  cro is not defin
1d310 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  ed in this file 
1d320 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a  if SQLite.    **
1d330 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e 67 20   is built using 
1d340 73 65 70 61 72 61 74 65 20 73 6f 75 72 63 65 20  separate source 
1d350 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  files..    */.  
1d360 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1d370 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44  STCTRL_ISKEYWORD
1d380 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  : {.      const 
1d390 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61  char *zWord = va
1d3a0 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63  _arg(ap, const c
1d3b0 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  har*);.      int
1d3c0 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
1d3d0 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20  en30(zWord);.   
1d3e0 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33     rc = (sqlite3
1d3f0 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75 38 2a  KeywordCode((u8*
1d400 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49  )zWord, n)!=TK_I
1d410 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45  D) ? SQLITE_N_KE
1d420 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20 20  YWORD : 0;.     
1d430 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1d440 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71  ndif ..    /* sq
1d450 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1d460 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1d470 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43  RL_SCRATCHMALLOC
1d480 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46 72  , sz, &pNew, pFr
1d490 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ee);.    **.    
1d4a0 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20 69 6e  ** Pass pFree in
1d4b0 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61 74 63  to sqlite3Scratc
1d4c0 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20 2a 2a  hFree(). .    **
1d4d0 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20 61 6c   If sz>0 then al
1d4e0 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74 63 68  locate a scratch
1d4f0 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70 4e 65   buffer into pNe
1d500 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  w.  .    */.    
1d510 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1d520 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c  CTRL_SCRATCHMALL
1d530 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64  OC: {.      void
1d540 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65 77   *pFree, **ppNew
1d550 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
1d560 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f 61 72        sz = va_ar
1d570 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
1d580 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61 72 67    ppNew = va_arg
1d590 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20 20  (ap, void**);.  
1d5a0 20 20 20 20 70 46 72 65 65 20 3d 20 76 61 5f 61      pFree = va_a
1d5b0 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20  rg(ap, void*);. 
1d5c0 20 20 20 20 20 69 66 28 20 73 7a 20 29 20 2a 70       if( sz ) *p
1d5d0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 63  pNew = sqlite3Sc
1d5e0 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b  ratchMalloc(sz);
1d5f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63  .      sqlite3Sc
1d600 72 61 74 63 68 46 72 65 65 28 70 46 72 65 65 29  ratchFree(pFree)
1d610 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d620 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1d630 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1d640 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1d650 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
1d660 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b  ULT, int onoff);
1d670 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1d680 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66  f parameter onof
1d690 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63  f is non-zero, c
1d6a0 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77 72 61  onfigure the wra
1d6b0 70 70 65 72 73 20 73 6f 20 74 68 61 74 20 61 6c  ppers so that al
1d6c0 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75  l.    ** subsequ
1d6d0 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63  ent calls to loc
1d6e0 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76 61 72  altime() and var
1d6f0 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20 6f  iants fail. If o
1d700 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20  noff is zero,.  
1d710 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20 73    ** undo this s
1d720 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  etting..    */. 
1d730 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1d740 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
1d750 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20  E_FAULT: {.     
1d760 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1d770 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46  nfig.bLocaltimeF
1d780 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28 61 70  ault = va_arg(ap
1d790 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
1d7a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1d7b0 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1d7c0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1d7d0 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f  _TESTCTRL_NEVER_
1d7e0 43 4f 52 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20  CORRUPT, int);. 
1d7f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
1d800 20 6f 72 20 63 6c 65 61 72 20 61 20 66 6c 61 67   or clear a flag
1d810 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
1d820 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
1d830 65 20 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73  e file is always
1d840 20 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f   well-.    ** fo
1d850 72 6d 65 64 20 61 6e 64 20 6e 65 76 65 72 20 63  rmed and never c
1d860 6f 72 72 75 70 74 2e 20 20 54 68 69 73 20 66 6c  orrupt.  This fl
1d870 61 67 20 69 73 20 63 6c 65 61 72 20 62 79 20 64  ag is clear by d
1d880 65 66 61 75 6c 74 2c 20 69 6e 64 69 63 61 74 69  efault, indicati
1d890 6e 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 64  ng that.    ** d
1d8a0 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 6d 69  atabase files mi
1d8b0 67 68 74 20 68 61 76 65 20 61 72 62 69 74 72 61  ght have arbitra
1d8c0 72 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  ry corruption.  
1d8d0 53 65 74 74 69 6e 67 20 74 68 65 20 66 6c 61 67  Setting the flag
1d8e0 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74   during.    ** t
1d8f0 65 73 74 69 6e 67 20 63 61 75 73 65 73 20 63 65  esting causes ce
1d900 72 74 61 69 6e 20 61 73 73 65 72 74 28 29 20 73  rtain assert() s
1d910 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65  tatements in the
1d920 20 63 6f 64 65 20 74 6f 20 62 65 20 61 63 74 69   code to be acti
1d930 76 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 68 61  vated.    ** tha
1d940 74 20 64 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76  t demonstrat inv
1d950 61 72 69 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d  ariants on well-
1d960 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
1d970 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  files..    */.  
1d980 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1d990 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52  STCTRL_NEVER_COR
1d9a0 52 55 50 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  RUPT: {.      sq
1d9b0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1d9c0 67 2e 6e 65 76 65 72 43 6f 72 72 75 70 74 20 3d  g.neverCorrupt =
1d9d0 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1d9e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d9f0 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 20 20     }...    /*   
1da00 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1da10 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1da20 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41  CTRL_VDBE_COVERA
1da30 47 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70  GE, xCallback, p
1da40 74 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tr);.    **.    
1da50 2a 2a 20 53 65 74 20 74 68 65 20 56 44 42 45 20  ** Set the VDBE 
1da60 63 6f 76 65 72 61 67 65 20 63 61 6c 6c 62 61 63  coverage callbac
1da70 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 78 43  k function to xC
1da80 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 63 6f 6e  allback with con
1da90 74 65 78 74 20 0a 20 20 20 20 2a 2a 20 70 6f 69  text .    ** poi
1daa0 6e 74 65 72 20 70 74 72 2e 0a 20 20 20 20 2a 2f  nter ptr..    */
1dab0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1dac0 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43  _TESTCTRL_VDBE_C
1dad0 4f 56 45 52 41 47 45 3a 20 7b 0a 23 69 66 64 65  OVERAGE: {.#ifde
1dae0 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f  f SQLITE_VDBE_CO
1daf0 56 45 52 41 47 45 0a 20 20 20 20 20 20 74 79 70  VERAGE.      typ
1db00 65 64 65 66 20 76 6f 69 64 20 28 2a 62 72 61 6e  edef void (*bran
1db10 63 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76 6f 69  ch_callback)(voi
1db20 64 2a 2c 69 6e 74 2c 75 38 2c 75 38 29 3b 0a 20  d*,int,u8,u8);. 
1db30 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1db40 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65 42 72  alConfig.xVdbeBr
1db50 61 6e 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70  anch = va_arg(ap
1db60 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b  ,branch_callback
1db70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1db80 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64  GlobalConfig.pVd
1db90 62 65 42 72 61 6e 63 68 41 72 67 20 3d 20 76 61  beBranchArg = va
1dba0 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a 29 3b 0a  _arg(ap,void*);.
1dbb0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
1dbc0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1dbd0 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1dbe0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1dbf0 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f  TESTCTRL_SORTER_
1dc00 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78 29 3b  MMAP, db, nMax);
1dc10 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1dc20 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
1dc30 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20  TER_MMAP: {.    
1dc40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1dc50 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1dc60 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  e3*);.      db->
1dc70 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d  nMaxSorterMmap =
1dc80 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1dc90 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1dca0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1dcb0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1dcc0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1dcd0 54 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20 20 20  TRL_ISINIT);.   
1dce0 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75 72   **.    ** Retur
1dcf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 53  n SQLITE_OK if S
1dd00 51 4c 69 74 65 20 68 61 73 20 62 65 65 6e 20 69  QLite has been i
1dd10 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 53  nitialized and S
1dd20 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 0a 20  QLITE_ERROR if. 
1dd30 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20 20 2a     ** not..    *
1dd40 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1dd50 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49  E_TESTCTRL_ISINI
1dd60 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  T: {.      if( s
1dd70 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1dd80 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29 20 72  ig.isInit==0 ) r
1dd90 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1dda0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ddb0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1ddc0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1ddd0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1dde0 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62  TRL_IMPOSTER, db
1ddf0 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c  , dbName, onOff,
1de00 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a 20   tnum);.    **. 
1de10 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20     ** This test 
1de20 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73 65 64 20  control is used 
1de30 74 6f 20 63 72 65 61 74 65 20 69 6d 70 6f 73 74  to create impost
1de40 65 72 20 74 61 62 6c 65 73 2e 20 20 22 64 62 22  er tables.  "db"
1de50 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 20 20   is a pointer.  
1de60 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61    ** to the data
1de70 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
1de80 20 20 64 62 4e 61 6d 65 20 69 73 20 74 68 65 20    dbName is the 
1de90 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28 65  database name (e
1dea0 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20 20  x: "main" or.   
1deb0 20 2a 2a 20 22 74 65 6d 70 22 29 20 77 68 69 63   ** "temp") whic
1dec0 68 20 77 69 6c 6c 20 72 65 63 65 69 76 65 20 74  h will receive t
1ded0 68 65 20 69 6d 70 6f 73 74 65 72 2e 20 20 22 6f  he imposter.  "o
1dee0 6e 4f 66 66 22 20 74 75 72 6e 73 20 69 6d 70 6f  nOff" turns impo
1def0 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20 20  ster mode on.   
1df00 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74 6e   ** or off.  "tn
1df10 75 6d 22 20 69 73 20 74 68 65 20 72 6f 6f 74 20  um" is the root 
1df20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
1df30 65 65 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ee to which the 
1df40 69 6d 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a 20  imposter.    ** 
1df50 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e  table should con
1df60 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nect..    **.   
1df70 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f 73   ** Enable impos
1df80 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77 68  ter mode only wh
1df90 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 68 61  en the schema ha
1dfa0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
1dfb0 61 72 73 65 64 2e 20 20 54 68 65 6e 0a 20 20 20  arsed.  Then.   
1dfc0 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c 65   ** run a single
1dfd0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
1dfe0 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73 74  atement to const
1dff0 72 75 63 74 20 74 68 65 20 69 6d 70 6f 73 74 65  ruct the imposte
1e000 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 0a 20  r table in the. 
1e010 20 20 20 2a 2a 20 70 61 72 73 65 64 20 73 63 68     ** parsed sch
1e020 65 6d 61 2e 20 20 54 68 65 6e 20 74 75 72 6e 20  ema.  Then turn 
1e030 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 62 61  imposter mode ba
1e040 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20 20  ck off again..  
1e050 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6f    **.    ** If o
1e060 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75 6d  nOff==0 and tnum
1e070 3e 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68  >0 then reset th
1e080 65 20 73 63 68 65 6d 61 20 66 6f 72 20 61 6c 6c  e schema for all
1e090 20 64 61 74 61 62 61 73 65 73 2c 20 63 61 75 73   databases, caus
1e0a0 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  ing.    ** the s
1e0b0 63 68 65 6d 61 20 74 6f 20 62 65 20 72 65 70 61  chema to be repa
1e0c0 72 73 65 64 20 74 68 65 20 6e 65 78 74 20 74 69  rsed the next ti
1e0d0 6d 65 20 69 74 20 69 73 20 6e 65 65 64 65 64 2e  me it is needed.
1e0e0 20 20 54 68 69 73 20 68 61 73 20 74 68 65 0a 20    This has the. 
1e0f0 20 20 20 2a 2a 20 65 66 66 65 63 74 20 6f 66 20     ** effect of 
1e100 65 72 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70 6f  erasing all impo
1e110 73 74 65 72 20 74 61 62 6c 65 73 2e 0a 20 20 20  ster tables..   
1e120 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1e130 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
1e140 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  OSTER: {.      s
1e150 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
1e160 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
1e170 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e180 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1e190 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 64  >mutex);.      d
1e1a0 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73 71  b->init.iDb = sq
1e1b0 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
1e1c0 64 62 2c 20 76 61 5f 61 72 67 28 61 70 2c 63 6f  db, va_arg(ap,co
1e1d0 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20  nst char*));.   
1e1e0 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79     db->init.busy
1e1f0 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f   = db->init.impo
1e200 73 74 65 72 54 61 62 6c 65 20 3d 20 76 61 5f 61  sterTable = va_a
1e210 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
1e220 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e    db->init.newTn
1e230 75 6d 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69  um = va_arg(ap,i
1e240 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  nt);.      if( d
1e250 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
1e260 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  && db->init.newT
1e270 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  num>0 ){.       
1e280 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
1e290 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
1e2a0 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  ion(db);.      }
1e2b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1e2c0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1e2d0 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  utex);.      bre
1e2e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1e2f0 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64  va_end(ap);.#end
1e300 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1e310 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a  T_BUILTIN_TEST *
1e320 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
1e330 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
1e340 61 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e  a utility routin
1e350 65 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53  e, useful to VFS
1e360 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
1e370 2c 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a  , that checks.**
1e380 20 74 6f 20 73 65 65 20 69 66 20 61 20 64 61 74   to see if a dat
1e390 61 62 61 73 65 20 66 69 6c 65 20 77 61 73 20 61  abase file was a
1e3a0 20 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69   URI that contai
1e3b0 6e 65 64 20 61 20 73 70 65 63 69 66 69 63 20 71  ned a specific q
1e3c0 75 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74  uery .** paramet
1e3d0 65 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62  er, and if so ob
1e3e0 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20  tains the value 
1e3f0 6f 66 20 74 68 65 20 71 75 65 72 79 20 70 61 72  of the query par
1e400 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ameter..**.** Th
1e410 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
1e420 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65  ment is the file
1e430 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73  name pointer pas
1e440 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70  sed into the xOp
1e450 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  en().** method o
1e460 66 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e  f a VFS implemen
1e470 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61  tation.  The zPa
1e480 72 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ram argument is 
1e490 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
1e4a0 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ** query paramet
1e4b0 65 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69  er we seek.  Thi
1e4c0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1e4d0 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
1e4e0 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72  he zParam.** par
1e4f0 61 6d 65 74 65 72 20 69 66 20 69 74 20 65 78 69  ameter if it exi
1e500 73 74 73 2e 20 20 49 66 20 74 68 65 20 70 61 72  sts.  If the par
1e510 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20  ameter does not 
1e520 65 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74  exist, this rout
1e530 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  ine.** returns a
1e540 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a   NULL pointer..*
1e550 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1e560 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
1e570 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ter(const char *
1e580 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74  zFilename, const
1e590 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a   char *zParam){.
1e5a0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
1e5b0 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30 20  =0 || zParam==0 
1e5c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46  ) return 0;.  zF
1e5d0 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74  ilename += sqlit
1e5e0 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
1e5f0 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68 69  name) + 1;.  whi
1e600 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  le( zFilename[0]
1e610 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20   ){.    int x = 
1e620 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
1e630 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a  , zParam);.    z
1e640 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
1e650 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
1e660 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  ename) + 1;.    
1e670 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75 72  if( x==0 ) retur
1e680 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  n zFilename;.   
1e690 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
1e6a0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
1e6b0 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
1e6c0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1e6d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1e6e0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f  boolean value fo
1e6f0 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65  r a query parame
1e700 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
1e710 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
1e720 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1e730 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  ename, const cha
1e740 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62  r *zParam, int b
1e750 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  Dflt){.  const c
1e760 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
1e770 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
1e780 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
1e790 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44 66  );.  bDflt = bDf
1e7a0 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20  lt!=0;.  return 
1e7b0 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42 6f  z ? sqlite3GetBo
1e7c0 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20  olean(z, bDflt) 
1e7d0 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  : bDflt;.}../*.*
1e7e0 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62 69  * Return a 64-bi
1e7f0 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  t integer value 
1e800 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61  for a query para
1e810 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65  meter..*/.sqlite
1e820 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f  3_int64 sqlite3_
1e830 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e  uri_int64(.  con
1e840 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1e850 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  me,    /* Filena
1e860 6d 65 20 61 73 20 70 61 73 73 65 64 20 74 6f 20  me as passed to 
1e870 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  xOpen */.  const
1e880 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20   char *zParam,  
1e890 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72 61       /* URI para
1e8a0 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a  meter sought */.
1e8b0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1e8c0 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20 72  bDflt       /* r
1e8d0 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65 74  eturn if paramet
1e8e0 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f  er is missing */
1e8f0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1e900 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72   *z = sqlite3_ur
1e910 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c  i_parameter(zFil
1e920 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a  ename, zParam);.
1e930 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1e940 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73 71  v;.  if( z && sq
1e950 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
1e960 36 34 28 7a 2c 20 26 76 29 3d 3d 53 51 4c 49 54  64(z, &v)==SQLIT
1e970 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c  E_OK ){.    bDfl
1e980 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74  t = v;.  }.  ret
1e990 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a  urn bDflt;.}../*
1e9a0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42  .** Return the B
1e9b0 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65  tree pointer ide
1e9c0 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61  ntified by zDbNa
1e9d0 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  me.  Return NULL
1e9e0 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1e9f0 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33  /.Btree *sqlite3
1ea00 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71  DbNameToBtree(sq
1ea10 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1ea20 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
1ea30 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1ea40 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1ea50 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62  i++){.    if( db
1ea60 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20 20  ->aDb[i].pBt.   
1ea70 20 20 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d 30    && (zDbName==0
1ea80 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
1ea90 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d 3e  mp(zDbName, db->
1eaa0 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  aDb[i].zName)==0
1eab0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
1eac0 65 74 75 72 6e 20 64 62 2d 3e 61 44 62 5b 69 5d  eturn db->aDb[i]
1ead0 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  .pBt;.    }.  }.
1eae0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1eaf0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1eb00 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20  filename of the 
1eb10 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
1eb20 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
1eb30 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
1eb40 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  n..*/.const char
1eb50 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c   *sqlite3_db_fil
1eb60 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64  ename(sqlite3 *d
1eb70 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1eb80 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65  DbName){.  Btree
1eb90 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51   *pBt;.#ifdef SQ
1eba0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1ebb0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1ebc0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1ebd0 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
1ebe0 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
1ebf0 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
1ec00 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
1ec10 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44    pBt = sqlite3D
1ec20 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
1ec30 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74   zDbName);.  ret
1ec40 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65  urn pBt ? sqlite
1ec50 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
1ec60 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f  e(pBt) : 0;.}../
1ec70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
1ec80 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61   database is rea
1ec90 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72  d-only or 0 if r
1eca0 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75  ead/write.  Retu
1ecb0 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73  rn -1 if.** no s
1ecc0 75 63 68 20 64 61 74 61 62 61 73 65 20 65 78 69  uch database exi
1ecd0 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sts..*/.int sqli
1ece0 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28  te3_db_readonly(
1ecf0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
1ed00 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
1ed10 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  ){.  Btree *pBt;
1ed20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1ed30 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1ed40 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1ed50 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1ed60 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
1ed70 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1ed80 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
1ed90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74    }.#endif.  pBt
1eda0 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65   = sqlite3DbName
1edb0 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e  ToBtree(db, zDbN
1edc0 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
1edd0 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65  Bt ? sqlite3Btre
1ede0 65 49 73 52 65 61 64 6f 6e 6c 79 28 70 42 74 29  eIsReadonly(pBt)
1edf0 20 3a 20 2d 31 3b 0a 7d 0a 0a 23 69 66 20 28 53   : -1;.}..#if (S
1ee00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50  QLITE_ENABLE_APP
1ee10 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66  LE_SPI>0) && def
1ee20 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1ee30 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
1ee40 65 33 5f 70 72 69 76 61 74 65 2e 68 22 0a 0a 2f  e3_private.h"../
1ee50 2a 20 0a 2a 2a 20 54 65 73 74 69 6e 67 20 61 20  * .** Testing a 
1ee60 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 73 71  file path for sq
1ee70 6c 69 74 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  lite locks held 
1ee80 62 79 20 61 20 70 72 6f 63 65 73 73 20 49 44 2e  by a process ID.
1ee90 20 0a 2a 2a 20 52 65 74 75 72 6e 73 20 53 51 4c   .** Returns SQL
1eea0 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 4e  ITE_LOCKSTATE_ON
1eeb0 20 69 66 20 6c 6f 63 6b 73 20 61 72 65 20 70 72   if locks are pr
1eec0 65 73 65 6e 74 20 6f 6e 20 70 61 74 68 0a 2a 2a  esent on path.**
1eed0 20 74 68 61 74 20 77 6f 75 6c 64 20 70 72 65 76   that would prev
1eee0 65 6e 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ent writing to t
1eef0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
1ef00 69 6e 74 20 5f 73 71 6c 69 74 65 33 5f 6c 6f 63  int _sqlite3_loc
1ef10 6b 73 74 61 74 65 28 63 6f 6e 73 74 20 63 68 61  kstate(const cha
1ef20 72 20 2a 70 61 74 68 2c 20 70 69 64 5f 74 20 70  r *path, pid_t p
1ef30 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  id){.  sqlite3 *
1ef40 64 62 20 3d 20 4e 55 4c 4c 3b 0a 20 20 0a 20 20  db = NULL;.  .  
1ef50 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  if( sqlite3_open
1ef60 5f 76 32 28 70 61 74 68 2c 20 26 64 62 2c 20 53  _v2(path, &db, S
1ef70 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1ef80 4e 4c 59 2c 20 4e 55 4c 4c 29 20 3d 3d 20 53 51  NLY, NULL) == SQ
1ef90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 4c  LITE_OK ){.    L
1efa0 6f 63 6b 73 74 61 74 65 50 49 44 20 6c 6f 63 6b  ockstatePID lock
1efb0 73 74 61 74 65 20 3d 20 7b 70 69 64 2c 20 2d 31  state = {pid, -1
1efc0 7d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  };.    sqlite3_f
1efd0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
1efe0 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e  NULL, SQLITE_FCN
1eff0 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 5f 50 49 44  TL_LOCKSTATE_PID
1f000 2c 20 26 6c 6f 63 6b 73 74 61 74 65 29 3b 0a 20  , &lockstate);. 
1f010 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
1f020 28 64 62 29 3b 0a 20 20 20 20 69 6e 74 20 73 74  (db);.    int st
1f030 61 74 65 20 3d 20 6c 6f 63 6b 73 74 61 74 65 2e  ate = lockstate.
1f040 73 74 61 74 65 3b 0a 20 20 20 20 72 65 74 75 72  state;.    retur
1f050 6e 20 73 74 61 74 65 3b 0a 20 20 7d 0a 20 20 69  n state;.  }.  i
1f060 66 28 20 4e 55 4c 4c 21 3d 64 62 20 29 7b 20 0a  f( NULL!=db ){ .
1f070 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
1f080 65 28 64 62 29 3b 20 2f 2a 20 6e 65 65 64 20 74  e(db); /* need t
1f090 6f 20 63 6c 6f 73 65 20 65 76 65 6e 20 69 66 20  o close even if 
1f0a0 6f 70 65 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  open returns an 
1f0b0 65 72 72 6f 72 20 2a 2f 0a 20 20 7d 0a 20 20 72  error */.  }.  r
1f0c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
1f0d0 4b 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  KSTATE_ERROR;.}.
1f0e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1f0f0 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53  E_ENABLE_APPLE_S
1f100 50 49 20 2a 2f 0a                                PI */.