/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 0d708b9357776b5c9c36299def91df1d44e31e21:


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 76 6f 69 64 20  y only..*/.void 
0900: 28 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65  (*sqlite3IoTrace
0910: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e  )(const char*, .
0920: 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ..) = 0;.#endif.
0930: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f  ./*.** If the fo
0940: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
0950: 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74  ariable points t
0960: 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 68  o a string which
0970: 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20   is the.** name 
0980: 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  of a directory, 
0990: 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63 74  then that direct
09a0: 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ory will be used
09b0: 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d   to store.** tem
09c0: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a  porary files..**
09d0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
09e0: 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74   "PRAGMA temp_st
09f0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53  ore_directory" S
0a00: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63  QL command..*/.c
0a10: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 74 65 6d  har *sqlite3_tem
0a20: 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  p_directory = 0;
0a30: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ../*.** If the f
0a40: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
0a50: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
0a60: 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63  to a string whic
0a70: 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65  h is the.** name
0a80: 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c   of a directory,
0a90: 20 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63   then that direc
0aa0: 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65  tory will be use
0ab0: 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 61 6c  d to store.** al
0ac0: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  l database files
0ad0: 20 73 70 65 63 69 66 69 65 64 20 77 69 74 68 20   specified with 
0ae0: 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
0af0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ame..**.** See a
0b00: 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41 20  lso the "PRAGMA 
0b10: 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
0b20: 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61 6e  tory" SQL comman
0b30: 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  d..*/.char *sqli
0b40: 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
0b50: 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49  ry = 0;../*.** I
0b60: 6e 69 74 69 61 6c 69 7a 65 20 53 51 4c 69 74 65  nitialize SQLite
0b70: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  .  .**.** This r
0b80: 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
0b90: 61 6c 6c 65 64 20 74 6f 20 69 6e 69 74 69 61 6c  alled to initial
0ba0: 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ize the memory a
0bb0: 6c 6c 6f 63 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46  llocation,.** VF
0bc0: 53 2c 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62  S, and mutex sub
0bd0: 73 79 73 74 65 6d 73 20 70 72 69 6f 72 20 74 6f  systems prior to
0be0: 20 64 6f 69 6e 67 20 61 6e 79 20 73 65 72 69 6f   doing any serio
0bf0: 75 73 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20  us work with.** 
0c00: 53 51 4c 69 74 65 2e 20 20 42 75 74 20 61 73 20  SQLite.  But as 
0c10: 6c 6f 6e 67 20 61 73 20 79 6f 75 20 64 6f 20 6e  long as you do n
0c20: 6f 74 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20  ot compile with 
0c30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
0c40: 49 4e 49 54 0a 2a 2a 20 74 68 69 73 20 72 6f 75  INIT.** this rou
0c50: 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
0c60: 6c 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  led automaticall
0c70: 79 20 62 79 20 6b 65 79 20 72 6f 75 74 69 6e 65  y by key routine
0c80: 73 20 73 75 63 68 20 61 73 0a 2a 2a 20 73 71 6c  s such as.** sql
0c90: 69 74 65 33 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a  ite3_open().  .*
0ca0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0cb0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 65 78 63  e is a no-op exc
0cc0: 65 70 74 20 6f 6e 20 69 74 73 20 76 65 72 79 20  ept on its very 
0cd0: 66 69 72 73 74 20 63 61 6c 6c 20 66 6f 72 20 74  first call for t
0ce0: 68 65 20 70 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f  he process,.** o
0cf0: 72 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  r for the first 
0d00: 63 61 6c 6c 20 61 66 74 65 72 20 61 20 63 61 6c  call after a cal
0d10: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 68 75  l to sqlite3_shu
0d20: 74 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tdown..**.** The
0d30: 20 66 69 72 73 74 20 74 68 72 65 61 64 20 74 6f   first thread to
0d40: 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
0d50: 6e 65 20 72 75 6e 73 20 74 68 65 20 69 6e 69 74  ne runs the init
0d60: 69 61 6c 69 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a  ialization to.**
0d70: 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 66   completion.  If
0d80: 20 73 75 62 73 65 71 75 65 6e 74 20 74 68 72 65   subsequent thre
0d90: 61 64 73 20 63 61 6c 6c 20 74 68 69 73 20 72 6f  ads call this ro
0da0: 75 74 69 6e 65 20 62 65 66 6f 72 65 20 74 68 65  utine before the
0db0: 20 66 69 72 73 74 0a 2a 2a 20 74 68 72 65 61 64   first.** thread
0dc0: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 74 68   has finished th
0dd0: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
0de0: 20 70 72 6f 63 65 73 73 2c 20 74 68 65 6e 20 74   process, then t
0df0: 68 65 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  he subsequent.**
0e00: 20 74 68 72 65 61 64 73 20 6d 75 73 74 20 62 6c   threads must bl
0e10: 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ock until the fi
0e20: 72 73 74 20 74 68 72 65 61 64 20 66 69 6e 69 73  rst thread finis
0e30: 68 65 73 20 77 69 74 68 20 74 68 65 20 69 6e 69  hes with the ini
0e40: 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a  tialization..**.
0e50: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 68 72  ** The first thr
0e60: 65 61 64 20 6d 69 67 68 74 20 63 61 6c 6c 20 74  ead might call t
0e70: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 63 75  his routine recu
0e80: 72 73 69 76 65 6c 79 2e 20 20 52 65 63 75 72 73  rsively.  Recurs
0e90: 69 76 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ive.** calls to 
0ea0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  this routine sho
0eb0: 75 6c 64 20 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f  uld not block, o
0ec0: 66 20 63 6f 75 72 73 65 2e 20 20 4f 74 68 65 72  f course.  Other
0ed0: 77 69 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74  wise the.** init
0ee0: 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65  ialization proce
0ef0: 73 73 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 63  ss would never c
0f00: 6f 6d 70 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c  omplete..**.** L
0f10: 65 74 20 58 20 62 65 20 74 68 65 20 66 69 72 73  et X be the firs
0f20: 74 20 74 68 72 65 61 64 20 74 6f 20 65 6e 74 65  t thread to ente
0f30: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  r this routine. 
0f40: 20 4c 65 74 20 59 20 62 65 20 73 6f 6d 65 20 6f   Let Y be some o
0f50: 74 68 65 72 0a 2a 2a 20 74 68 72 65 61 64 2e 20  ther.** thread. 
0f60: 20 54 68 65 6e 20 77 68 69 6c 65 20 74 68 65 20   Then while the 
0f70: 69 6e 69 74 69 61 6c 20 69 6e 76 6f 63 61 74 69  initial invocati
0f80: 6f 6e 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  on of this routi
0f90: 6e 65 20 62 79 20 58 20 69 73 0a 2a 2a 20 69 6e  ne by X is.** in
0fa0: 63 6f 6d 70 6c 65 74 65 2c 20 69 74 20 69 73 20  complete, it is 
0fb0: 72 65 71 75 69 72 65 64 20 74 68 61 74 3a 0a 2a  required that:.*
0fc0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 61 6c 6c 73  *.**    *  Calls
0fd0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
0fe0: 20 66 72 6f 6d 20 59 20 6d 75 73 74 20 62 6c 6f   from Y must blo
0ff0: 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 6f 75 74  ck until the out
1000: 65 72 2d 6d 6f 73 74 0a 2a 2a 20 20 20 20 20 20  er-most.**      
1010: 20 63 61 6c 6c 20 62 79 20 58 20 63 6f 6d 70 6c   call by X compl
1020: 65 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  etes..**.**    *
1030: 20 20 52 65 63 75 72 73 69 76 65 20 63 61 6c 6c    Recursive call
1040: 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  s to this routin
1050: 65 20 66 72 6f 6d 20 74 68 72 65 61 64 20 58 20  e from thread X 
1060: 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
1070: 6c 79 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68  ly.**       with
1080: 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  out blocking..*/
1090: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 69  .int sqlite3_ini
10a0: 74 69 61 6c 69 7a 65 28 76 6f 69 64 29 7b 0a 20  tialize(void){. 
10b0: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
10c0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61  lite3_mutex *pMa
10d0: 73 74 65 72 3b 20 29 20 20 20 20 20 20 20 2f 2a  ster; )       /*
10e0: 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69 63   The main static
10f0: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 69 6e 74 20   mutex */.  int 
1100: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1120: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1130: 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64  lt code */..#ifd
1140: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1150: 53 44 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  SD.  rc = sqlite
1160: 33 5f 77 73 64 5f 69 6e 69 74 28 34 30 39 36 2c  3_wsd_init(4096,
1170: 20 32 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d   24);.  if( rc!=
1180: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1190: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11a0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
11b0: 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64  SQLite is alread
11c0: 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 6e 69  y completely ini
11d0: 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20 74  tialized, then t
11e0: 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f  his call.  ** to
11f0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1200: 69 7a 65 28 29 20 73 68 6f 75 6c 64 20 62 65 20  ize() should be 
1210: 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 74 68  a no-op.  But th
1220: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
1230: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 63 6f  .  ** must be co
1240: 6d 70 6c 65 74 65 2e 20 20 53 6f 20 69 73 49 6e  mplete.  So isIn
1250: 69 74 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 73  it must not be s
1260: 65 74 20 75 6e 74 69 6c 20 74 68 65 20 76 65 72  et until the ver
1270: 79 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68  y end.  ** of th
1280: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f  is routine..  */
1290: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
12a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69  obalConfig.isIni
12b0: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
12c0: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  E_OK;..  /* Make
12d0: 20 73 75 72 65 20 74 68 65 20 6d 75 74 65 78 20   sure the mutex 
12e0: 73 75 62 73 79 73 74 65 6d 20 69 73 20 69 6e 69  subsystem is ini
12f0: 74 69 61 6c 69 7a 65 64 2e 20 20 49 66 20 75 6e  tialized.  If un
1300: 61 62 6c 65 20 74 6f 20 0a 20 20 2a 2a 20 69 6e  able to .  ** in
1310: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 75 74  itialize the mut
1320: 65 78 20 73 75 62 73 79 73 74 65 6d 2c 20 72 65  ex subsystem, re
1330: 74 75 72 6e 20 65 61 72 6c 79 20 77 69 74 68 20  turn early with 
1340: 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 20  the error..  ** 
1350: 49 66 20 74 68 65 20 73 79 73 74 65 6d 20 69 73  If the system is
1360: 20 73 6f 20 73 69 63 6b 20 74 68 61 74 20 77 65   so sick that we
1370: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 61   are unable to a
1380: 6c 6c 6f 63 61 74 65 20 61 20 6d 75 74 65 78 2c  llocate a mutex,
1390: 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 6e  .  ** there is n
13a0: 6f 74 20 6d 75 63 68 20 53 51 4c 69 74 65 20 69  ot much SQLite i
13b0: 73 20 67 6f 69 6e 67 20 74 6f 20 62 65 20 61 62  s going to be ab
13c0: 6c 65 20 74 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20  le to do..  **. 
13d0: 20 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 73 75   ** The mutex su
13e0: 62 73 79 73 74 65 6d 20 6d 75 73 74 20 74 61 6b  bsystem must tak
13f0: 65 20 63 61 72 65 20 6f 66 20 73 65 72 69 61 6c  e care of serial
1400: 69 7a 69 6e 67 20 69 74 73 20 6f 77 6e 0a 20 20  izing its own.  
1410: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ** initializatio
1420: 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  n..  */.  rc = s
1430: 71 6c 69 74 65 33 4d 75 74 65 78 49 6e 69 74 28  qlite3MutexInit(
1440: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1450: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49  turn rc;..  /* I
1460: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61  nitialize the ma
1470: 6c 6c 6f 63 28 29 20 73 79 73 74 65 6d 20 61 6e  lloc() system an
1480: 64 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  d the recursive 
1490: 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65 78  pInitMutex mutex
14a0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 70 65 72  ..  ** This oper
14b0: 61 74 69 6f 6e 20 69 73 20 70 72 6f 74 65 63 74  ation is protect
14c0: 65 64 20 62 79 20 74 68 65 20 53 54 41 54 49 43  ed by the STATIC
14d0: 5f 4d 41 53 54 45 52 20 6d 75 74 65 78 2e 20 20  _MASTER mutex.  
14e0: 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 4d  Note that.  ** M
14f0: 75 74 65 78 41 6c 6c 6f 63 28 29 20 69 73 20 63  utexAlloc() is c
1500: 61 6c 6c 65 64 20 66 6f 72 20 61 20 73 74 61 74  alled for a stat
1510: 69 63 20 6d 75 74 65 78 20 70 72 69 6f 72 20 74  ic mutex prior t
1520: 6f 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  o initializing t
1530: 68 65 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73  he.  ** malloc s
1540: 75 62 73 79 73 74 65 6d 20 2d 20 74 68 69 73 20  ubsystem - this 
1550: 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65  implies that the
1560: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61   allocation of a
1570: 20 73 74 61 74 69 63 0a 20 20 2a 2a 20 6d 75 74   static.  ** mut
1580: 65 78 20 6d 75 73 74 20 6e 6f 74 20 72 65 71 75  ex must not requ
1590: 69 72 65 20 73 75 70 70 6f 72 74 20 66 72 6f 6d  ire support from
15a0: 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 75 62 73   the malloc subs
15b0: 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 4d 55  ystem..  */.  MU
15c0: 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
15d0: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
15e0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
15f0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
1600: 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
1610: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
1620: 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  ter);.  sqlite3G
1630: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75  lobalConfig.isMu
1640: 74 65 78 49 6e 69 74 20 3d 20 31 3b 0a 20 20 69  texInit = 1;.  i
1650: 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61  f( !sqlite3Globa
1660: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
1670: 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d  Init ){.    rc =
1680: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 49 6e   sqlite3MallocIn
1690: 69 74 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  it();.  }.  if( 
16a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
16c0: 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f  alConfig.isMallo
16d0: 63 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 69  cInit = 1;.    i
16e0: 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61  f( !sqlite3Globa
16f0: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1700: 65 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ex ){.      sqli
1710: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1720: 70 49 6e 69 74 4d 75 74 65 78 20 3d 0a 20 20 20  pInitMutex =.   
1730: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
1740: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
1750: 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
1760: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
1770: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1780: 2e 62 43 6f 72 65 4d 75 74 65 78 20 26 26 20 21  .bCoreMutex && !
1790: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17a0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29  fig.pInitMutex )
17b0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
17c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
17d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
17e0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17f0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1800: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1810: 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20  efInitMutex++;. 
1820: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1830: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1840: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20 69  );..  /* If rc i
1850: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
1860: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
1870: 68 65 6e 20 65 69 74 68 65 72 20 74 68 65 20 6d  hen either the m
1880: 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79  alloc.  ** subsy
1890: 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62  stem could not b
18a0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72  e initialized or
18b0: 20 74 68 65 20 73 79 73 74 65 6d 20 66 61 69 6c   the system fail
18c0: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  ed to allocate. 
18d0: 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d 75 74   ** the pInitMut
18e0: 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75 72 6e  ex mutex. Return
18f0: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74   an error in eit
1900: 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  her case.  */.  
1910: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1920: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1930: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  rc;.  }..  /* Do
1940: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1950: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1960: 75 6e 64 65 72 20 74 68 65 20 72 65 63 75 72 73  under the recurs
1970: 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a  ive mutex so.  *
1980: 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  * that we will b
1990: 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65  e able to handle
19a0: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
19b0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74   into.  ** sqlit
19c0: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e  e3_initialize().
19d0: 20 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20    The recursive 
19e0: 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  calls normally c
19f0: 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  ome through.  **
1a00: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
1a10: 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b  () when it invok
1a20: 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  es sqlite3_vfs_r
1a30: 65 67 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f  egister(), but o
1a40: 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73  ther.  ** recurs
1a50: 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20  ive calls might 
1a60: 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65  also be possible
1a70: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
1a80: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
1a90: 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53 51 4c  -00140-37445 SQL
1aa0: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
1ab0: 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c  y serializes cal
1ac0: 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  ls.  ** to the x
1ad0: 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20  Init method, so 
1ae0: 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64  the xInit method
1af0: 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72   need not be thr
1b00: 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20  eadsafe..  **.  
1b10: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1b20: 20 6d 75 74 65 78 20 69 73 20 77 68 61 74 20 73   mutex is what s
1b30: 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65 73 73  erializes access
1b40: 20 74 6f 20 74 68 65 20 61 70 70 64 65 66 20 70   to the appdef p
1b50: 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a  cache xInit.  **
1b60: 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 73   methods.  The s
1b70: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
1b80: 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20 61 6c  thods.xInit() al
1b90: 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20 69 6e  l is embedded in
1ba0: 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74   the.  ** call t
1bb0: 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49  o sqlite3PcacheI
1bc0: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a  nitialize()..  *
1bd0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1be0: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47  x_enter(sqlite3G
1bf0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
1c00: 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  tMutex);.  if( s
1c10: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1c20: 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20  ig.isInit==0 && 
1c30: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1c40: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d  fig.inProgress==
1c50: 30 20 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  0 ){.    FuncDef
1c60: 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26 47  Hash *pHash = &G
1c70: 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66 48 61 73  LOBAL(FuncDefHas
1c80: 68 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  h, sqlite3Global
1c90: 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20 20 20  Functions);.    
1ca0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1cb0: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d  fig.inProgress =
1cc0: 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   1;.    memset(p
1cd0: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
1ce0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e  sqlite3GlobalFun
1cf0: 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20 73 71  ctions));.    sq
1d00: 6c 69 74 65 33 52 65 67 69 73 74 65 72 47 6c 6f  lite3RegisterGlo
1d10: 62 61 6c 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a  balFunctions();.
1d20: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1d30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
1d40: 61 63 68 65 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  acheInit==0 ){. 
1d50: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d60: 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a  3PcacheInitializ
1d70: 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  e();.    }.    i
1d80: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1da0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1db0: 50 43 61 63 68 65 49 6e 69 74 20 3d 20 31 3b 0a  PCacheInit = 1;.
1dc0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1dd0: 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20 20 20 20  e3OsInit();.    
1de0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1df0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e00: 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 42 75   sqlite3PCacheBu
1e10: 66 66 65 72 53 65 74 75 70 28 20 73 71 6c 69 74  fferSetup( sqlit
1e20: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1e30: 50 61 67 65 2c 20 0a 20 20 20 20 20 20 20 20 20  Page, .         
1e40: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1e50: 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c  nfig.szPage, sql
1e60: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1e70: 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 73  .nPage);.      s
1e80: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1e90: 69 67 2e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  ig.isInit = 1;. 
1ea0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1eb0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
1ec0: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 7d  rogress = 0;.  }
1ed0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1ee0: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 47 6c  _leave(sqlite3Gl
1ef0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1f00: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f  Mutex);..  /* Go
1f10: 20 62 61 63 6b 20 75 6e 64 65 72 20 74 68 65 20   back under the 
1f20: 73 74 61 74 69 63 20 6d 75 74 65 78 20 61 6e 64  static mutex and
1f30: 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65   clean up the re
1f40: 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 6d 75 74  cursive.  ** mut
1f50: 65 78 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20  ex to prevent a 
1f60: 72 65 73 6f 75 72 63 65 20 6c 65 61 6b 2e 0a 20  resource leak.. 
1f70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1f80: 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
1f90: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f  r);.  sqlite3Glo
1fa0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
1fb0: 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28  itMutex--;.  if(
1fc0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1fd0: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1fe0: 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ex<=0 ){.    ass
1ff0: 65 72 74 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ert( sqlite3Glob
2000: 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69  alConfig.nRefIni
2010: 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20  tMutex==0 );.   
2020: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
2030: 72 65 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ree(sqlite3Globa
2040: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
2050: 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
2060: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
2070: 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 7d  itMutex = 0;.  }
2080: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2090: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
20a0: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
20b0: 77 69 6e 67 20 69 73 20 6a 75 73 74 20 61 20 73  wing is just a s
20c0: 61 6e 69 74 79 20 63 68 65 63 6b 20 74 6f 20 6d  anity check to m
20d0: 61 6b 65 20 73 75 72 65 20 53 51 4c 69 74 65 20  ake sure SQLite 
20e0: 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f  has.  ** been co
20f0: 6d 70 69 6c 65 64 20 63 6f 72 72 65 63 74 6c 79  mpiled correctly
2100: 2e 20 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  .  It is importa
2110: 6e 74 20 74 6f 20 72 75 6e 20 74 68 69 73 20 63  nt to run this c
2120: 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a 20 77 65  ode, but.  ** we
2130: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
2140: 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74 65 6e 20  un it too often 
2150: 61 6e 64 20 73 6f 61 6b 20 75 70 20 43 50 55 20  and soak up CPU 
2160: 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f 0a 20 20  cycles for no.  
2170: 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53 6f 20 77  ** reason.  So w
2180: 65 20 72 75 6e 20 69 74 20 6f 6e 63 65 20 64 75  e run it once du
2190: 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74  ring initializat
21a0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ion..  */.#ifnde
21b0: 66 20 4e 44 45 42 55 47 0a 23 69 66 6e 64 65 66  f NDEBUG.#ifndef
21c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
21d0: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a  ATING_POINT.  /*
21e0: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 6f 66   This section of
21f0: 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20 22 6f 75   code's only "ou
2200: 74 70 75 74 22 20 69 73 20 76 69 61 20 61 73 73  tput" is via ass
2210: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
2220: 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72 63 3d 3d  . */.  if ( rc==
2230: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2240: 20 75 36 34 20 78 20 3d 20 28 28 28 75 36 34 29   u64 x = (((u64)
2250: 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20 20 20 64  1)<<63)-1;.    d
2260: 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 61 73 73  ouble y;.    ass
2270: 65 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 38  ert(sizeof(x)==8
2280: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69  );.    assert(si
2290: 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65 6f 66 28  zeof(x)==sizeof(
22a0: 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  y));.    memcpy(
22b0: 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20  &y, &x, 8);.    
22c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 49  assert( sqlite3I
22d0: 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20 7d 0a 23  sNaN(y) );.  }.#
22e0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
22f0: 2f 2a 20 44 6f 20 65 78 74 72 61 20 69 6e 69 74  /* Do extra init
2300: 69 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73  ialization steps
2310: 20 72 65 71 75 65 73 74 65 64 20 62 79 20 74 68   requested by th
2320: 65 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  e SQLITE_EXTRA_I
2330: 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65  NIT.  ** compile
2340: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20 20  -time option..  
2350: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2360: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 66  _EXTRA_INIT.  if
2370: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2380: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
2390: 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 7b  Config.isInit ){
23a0: 0a 20 20 20 20 69 6e 74 20 53 51 4c 49 54 45 5f  .    int SQLITE_
23b0: 45 58 54 52 41 5f 49 4e 49 54 28 63 6f 6e 73 74  EXTRA_INIT(const
23c0: 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 72 63 20   char*);.    rc 
23d0: 3d 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  = SQLITE_EXTRA_I
23e0: 4e 49 54 28 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  NIT(0);.  }.#end
23f0: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
2400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74  .}../*.** Undo t
2410: 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 73 71  he effects of sq
2420: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
2430: 28 29 2e 20 20 4d 75 73 74 20 6e 6f 74 20 62 65  ().  Must not be
2440: 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 0a 2a 2a   called while.**
2450: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
2460: 61 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20  anding database 
2470: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d  connections or m
2480: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2490: 73 20 6f 72 0a 2a 2a 20 77 68 69 6c 65 20 61 6e  s or.** while an
24a0: 79 20 70 61 72 74 20 6f 66 20 53 51 4c 69 74 65  y part of SQLite
24b0: 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 69 6e   is otherwise in
24c0: 20 75 73 65 20 69 6e 20 61 6e 79 20 74 68 72 65   use in any thre
24d0: 61 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ad.  This.** rou
24e0: 74 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 72 65  tine is not thre
24f0: 61 64 73 61 66 65 2e 20 20 42 75 74 20 69 74 20  adsafe.  But it 
2500: 69 73 20 73 61 66 65 20 74 6f 20 69 6e 76 6f 6b  is safe to invok
2510: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  e this routine.*
2520: 2a 20 6f 6e 20 77 68 65 6e 20 53 51 4c 69 74 65  * on when SQLite
2530: 20 69 73 20 61 6c 72 65 61 64 79 20 73 68 75 74   is already shut
2540: 20 64 6f 77 6e 2e 20 20 49 66 20 53 51 4c 69 74   down.  If SQLit
2550: 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 68 75  e is already shu
2560: 74 20 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20 74  t down.** when t
2570: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
2580: 6e 76 6f 6b 65 64 2c 20 74 68 65 6e 20 74 68 69  nvoked, then thi
2590: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  s routine is a h
25a0: 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a  armless no-op..*
25b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68  /.int sqlite3_sh
25c0: 75 74 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 20 20  utdown(void){.  
25d0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
25e0: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  lConfig.isInit )
25f0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
2600: 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e 0a 20  EXTRA_SHUTDOWN. 
2610: 20 20 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 45     void SQLITE_E
2620: 58 54 52 41 5f 53 48 55 54 44 4f 57 4e 28 76 6f  XTRA_SHUTDOWN(vo
2630: 69 64 29 3b 0a 20 20 20 20 53 51 4c 49 54 45 5f  id);.    SQLITE_
2640: 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e 28 29  EXTRA_SHUTDOWN()
2650: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
2660: 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a 20  ite3_os_end();. 
2670: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
2680: 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28  _auto_extension(
2690: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
26a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69  obalConfig.isIni
26b0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
26c0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
26d0: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
26e0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
26f0: 50 63 61 63 68 65 53 68 75 74 64 6f 77 6e 28 29  PcacheShutdown()
2700: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
2710: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
2720: 68 65 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  heInit = 0;.  }.
2730: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2740: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c  balConfig.isMall
2750: 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  ocInit ){.    sq
2760: 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 29  lite3MallocEnd()
2770: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
2780: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c  balConfig.isMall
2790: 6f 63 49 6e 69 74 20 3d 20 30 3b 0a 0a 23 69 66  ocInit = 0;..#if
27a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27b0: 5f 53 48 55 54 44 4f 57 4e 5f 44 49 52 45 43 54  _SHUTDOWN_DIRECT
27c0: 4f 52 49 45 53 0a 20 20 20 20 2f 2a 20 54 68 65  ORIES.    /* The
27d0: 20 68 65 61 70 20 73 75 62 73 79 73 74 65 6d 20   heap subsystem 
27e0: 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 73 68 75  has now been shu
27f0: 74 64 6f 77 6e 20 61 6e 64 20 74 68 65 73 65 20  tdown and these 
2800: 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f  values are suppo
2810: 73 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  sed.    ** to be
2820: 20 4e 55 4c 4c 20 6f 72 20 70 6f 69 6e 74 20 74   NULL or point t
2830: 6f 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61  o memory that wa
2840: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
2850: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
2860: 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77  ,.    ** which w
2870: 6f 75 6c 64 20 72 65 6c 79 20 6f 6e 20 74 68 61  ould rely on tha
2880: 74 20 68 65 61 70 20 73 75 62 73 79 73 74 65 6d  t heap subsystem
2890: 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6d 61 6b  ; therefore, mak
28a0: 65 20 73 75 72 65 20 74 68 65 73 65 0a 20 20 20  e sure these.   
28b0: 20 2a 2a 20 76 61 6c 75 65 73 20 63 61 6e 6e 6f   ** values canno
28c0: 74 20 72 65 66 65 72 20 74 6f 20 68 65 61 70 20  t refer to heap 
28d0: 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20  memory that was 
28e0: 6a 75 73 74 20 69 6e 76 61 6c 69 64 61 74 65 64  just invalidated
28f0: 20 77 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   when the.    **
2900: 20 68 65 61 70 20 73 75 62 73 79 73 74 65 6d 20   heap subsystem 
2910: 77 61 73 20 73 68 75 74 64 6f 77 6e 2e 20 20 54  was shutdown.  T
2920: 68 69 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65  his is only done
2930: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
2940: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 74  call to.    ** t
2950: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73  his function res
2960: 75 6c 74 65 64 20 69 6e 20 74 68 65 20 68 65 61  ulted in the hea
2970: 70 20 73 75 62 73 79 73 74 65 6d 20 61 63 74 75  p subsystem actu
2980: 61 6c 6c 79 20 62 65 69 6e 67 20 73 68 75 74 64  ally being shutd
2990: 6f 77 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  own..    */.    
29a0: 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
29b0: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20  ectory = 0;.    
29c0: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
29d0: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 65 6e 64  ectory = 0;.#end
29e0: 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  if.  }.  if( sql
29f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2a00: 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 29 7b 0a  .isMutexInit ){.
2a10: 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78      sqlite3Mutex
2a20: 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  End();.    sqlit
2a30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2a40: 73 4d 75 74 65 78 49 6e 69 74 20 3d 20 30 3b 0a  sMutexInit = 0;.
2a50: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
2a60: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2a70: 2a 20 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77  * This API allow
2a80: 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74  s applications t
2a90: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f  o modify the glo
2aa0: 62 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  bal configuratio
2ab0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69  n of.** the SQLi
2ac0: 74 65 20 6c 69 62 72 61 72 79 20 61 74 20 72 75  te library at ru
2ad0: 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-time..**.** Th
2ae0: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
2af0: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
2b00: 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
2b10: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a  no outstanding.*
2b20: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
2b30: 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79  ctions or memory
2b40: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54   allocations.  T
2b50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
2b60: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65  ot.** threadsafe
2b70: 2e 20 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65  .  Failure to he
2b80: 65 64 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67  ed these warning
2b90: 73 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e  s can lead to un
2ba0: 70 72 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62  predictable.** b
2bb0: 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  ehavior..*/.int 
2bc0: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69  sqlite3_config(i
2bd0: 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76  nt op, ...){.  v
2be0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74  a_list ap;.  int
2bf0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c00: 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63  ..  /* sqlite3_c
2c10: 6f 6e 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65  onfig() shall re
2c20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
2c30: 53 45 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f  SE if it is invo
2c40: 6b 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74  ked while.  ** t
2c50: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
2c60: 79 20 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a  y is in use. */.
2c70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2c80: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
2c90: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2ca0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20  _MISUSE_BKPT;.. 
2cb0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70   va_start(ap, op
2cc0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  );.  switch( op 
2cd0: 29 7b 0a 0a 20 20 20 20 2f 2a 20 4d 75 74 65 78  ){..    /* Mutex
2ce0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   configuration o
2cf0: 70 74 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20  ptions are only 
2d00: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 20 74  available in a t
2d10: 68 72 65 61 64 73 61 66 65 0a 20 20 20 20 2a 2a  hreadsafe.    **
2d20: 20 63 6f 6d 70 69 6c 65 2e 20 0a 20 20 20 20 2a   compile. .    *
2d30: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
2d40: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 29  LITE_THREADSAFE)
2d50: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
2d60: 44 53 41 46 45 3e 30 0a 20 20 20 20 63 61 73 65  DSAFE>0.    case
2d70: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
2d80: 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20  INGLETHREAD: {. 
2d90: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
2da0: 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a  all mutexing */.
2db0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2dc0: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
2dd0: 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  utex = 0;.      
2de0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2df0: 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d  fig.bFullMutex =
2e00: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
2e10: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2e20: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55  SQLITE_CONFIG_MU
2e30: 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a 20 20 20  LTITHREAD: {.   
2e40: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75     /* Disable mu
2e50: 74 65 78 69 6e 67 20 6f 66 20 64 61 74 61 62 61  texing of databa
2e60: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  se connections *
2e70: 2f 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c  /.      /* Enabl
2e80: 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20 63 6f  e mutexing of co
2e90: 72 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  re data structur
2ea0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  es */.      sqli
2eb0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2ec0: 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 0a  bCoreMutex = 1;.
2ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2ee0: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
2ef0: 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  utex = 0;.      
2f00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2f10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2f20: 46 49 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20  FIG_SERIALIZED: 
2f30: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c  {.      /* Enabl
2f40: 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a  e all mutexing *
2f50: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
2f60: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
2f70: 65 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20  eMutex = 1;.    
2f80: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2f90: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
2fa0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
2fb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
2fc0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
2fd0: 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f  MUTEX: {.      /
2fe0: 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74  * Specify an alt
2ff0: 65 72 6e 61 74 69 76 65 20 6d 75 74 65 78 20 69  ernative mutex i
3000: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  mplementation */
3010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3020: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78  obalConfig.mutex
3030: 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73   = *va_arg(ap, s
3040: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74  qlite3_mutex_met
3050: 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72  hods*);.      br
3060: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
3070: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3080: 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a 20 20  G_GETMUTEX: {.  
3090: 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20      /* Retrieve 
30a0: 74 68 65 20 63 75 72 72 65 6e 74 20 6d 75 74 65  the current mute
30b0: 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  x implementation
30c0: 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72   */.      *va_ar
30d0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75  g(ap, sqlite3_mu
30e0: 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20  tex_methods*) = 
30f0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3100: 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20 20 20  fig.mutex;.     
3110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3120: 6e 64 69 66 0a 0a 0a 20 20 20 20 63 61 73 65 20  ndif...    case 
3130: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41  SQLITE_CONFIG_MA
3140: 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LLOC: {.      /*
3150: 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65   Specify an alte
3160: 72 6e 61 74 69 76 65 20 6d 61 6c 6c 6f 63 20 69  rnative malloc i
3170: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  mplementation */
3180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3190: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a  obalConfig.m = *
31a0: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
31b0: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29  e3_mem_methods*)
31c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
31d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
31e0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d  LITE_CONFIG_GETM
31f0: 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f  ALLOC: {.      /
3200: 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63  * Retrieve the c
3210: 75 72 72 65 6e 74 20 6d 61 6c 6c 6f 63 28 29 20  urrent malloc() 
3220: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
3230: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
3240: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3250: 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73  m.xMalloc==0 ) s
3260: 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61  qlite3MemSetDefa
3270: 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 2a 76 61  ult();.      *va
3280: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3290: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d  _mem_methods*) =
32a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
32b0: 6e 66 69 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72  nfig.m;.      br
32c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
32d0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
32e0: 47 5f 4d 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20  G_MEMSTATUS: {. 
32f0: 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6f       /* Enable o
3300: 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 6d 61  r disable the ma
3310: 6c 6c 6f 63 20 73 74 61 74 75 73 20 63 6f 6c 6c  lloc status coll
3320: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ection */.      
3330: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3340: 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20 76  fig.bMemstat = v
3350: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
3360: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3370: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3380: 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43  TE_CONFIG_SCRATC
3390: 48 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65  H: {.      /* De
33a0: 73 69 67 6e 61 74 65 20 61 20 62 75 66 66 65 72  signate a buffer
33b0: 20 66 6f 72 20 73 63 72 61 74 63 68 20 6d 65 6d   for scratch mem
33c0: 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ory space */.   
33d0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
33e0: 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68 20  Config.pScratch 
33f0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3400: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
3410: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
3420: 7a 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72  zScratch = va_ar
3430: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3440: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3450: 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 20 3d  onfig.nScratch =
3460: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
3470: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3480: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3490: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45  LITE_CONFIG_PAGE
34a0: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
34b0: 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20 62 75  * Designate a bu
34c0: 66 66 65 72 20 66 6f 72 20 70 61 67 65 20 63 61  ffer for page ca
34d0: 63 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  che memory space
34e0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
34f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50  3GlobalConfig.pP
3500: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
3510: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73   void*);.      s
3520: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3530: 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f 61  ig.szPage = va_a
3540: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
3550: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3560: 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76  Config.nPage = v
3570: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
3580: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3590: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
35a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
35b0: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  E: {.      /* no
35c0: 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  -op */.      bre
35d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
35e0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
35f0: 5f 47 45 54 50 43 41 43 48 45 3a 20 7b 0a 20 20  _GETPCACHE: {.  
3600: 20 20 20 20 2f 2a 20 6e 6f 77 20 61 6e 20 65 72      /* now an er
3610: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ror */.      rc 
3620: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
3630: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3640: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
3650: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
3660: 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53  E2: {.      /* S
3670: 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e  pecify an altern
3680: 61 74 69 76 65 20 70 61 67 65 20 63 61 63 68 65  ative page cache
3690: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
36a0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61  GlobalConfig.pca
36c0: 63 68 65 32 20 3d 20 2a 76 61 5f 61 72 67 28 61  che2 = *va_arg(a
36d0: 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  p, sqlite3_pcach
36e0: 65 5f 6d 65 74 68 6f 64 73 32 2a 29 3b 0a 20 20  e_methods2*);.  
36f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3700: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3710: 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48  _CONFIG_GETPCACH
3720: 45 32 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  E2: {.      if( 
3730: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3740: 66 69 67 2e 70 63 61 63 68 65 32 2e 78 49 6e 69  fig.pcache2.xIni
3750: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
3760: 73 71 6c 69 74 65 33 50 43 61 63 68 65 53 65 74  sqlite3PCacheSet
3770: 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20  Default();.     
3780: 20 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67   }.      *va_arg
3790: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61  (ap, sqlite3_pca
37a0: 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 20 3d  che_methods2*) =
37b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
37c0: 6e 66 69 67 2e 70 63 61 63 68 65 32 3b 0a 20 20  nfig.pcache2;.  
37d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
37e0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
37f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
3800: 59 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  YS3) || defined(
3810: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
3820: 4d 53 59 53 35 29 0a 20 20 20 20 63 61 73 65 20  MSYS5).    case 
3830: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45  SQLITE_CONFIG_HE
3840: 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  AP: {.      /* D
3850: 65 73 69 67 6e 61 74 65 20 61 20 62 75 66 66 65  esignate a buffe
3860: 72 20 66 6f 72 20 68 65 61 70 20 6d 65 6d 6f 72  r for heap memor
3870: 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20  y space */.     
3880: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3890: 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 76 61 5f  nfig.pHeap = va_
38a0: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
38b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
38c0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20  balConfig.nHeap 
38d0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
38e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
38f0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
3900: 65 71 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  eq = va_arg(ap, 
3910: 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  int);..      if(
3920: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3930: 6e 66 69 67 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a  nfig.mnReq<1 ){.
3940: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
3950: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65  lobalConfig.mnRe
3960: 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  q = 1;.      }el
3970: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  se if( sqlite3Gl
3980: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71  obalConfig.mnReq
3990: 3e 28 31 3c 3c 31 32 29 20 29 7b 0a 20 20 20 20  >(1<<12) ){.    
39a0: 20 20 20 20 2f 2a 20 63 61 70 20 6d 69 6e 20 72      /* cap min r
39b0: 65 71 75 65 73 74 20 73 69 7a 65 20 61 74 20 32  equest size at 2
39c0: 5e 31 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  ^12 */.        s
39d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
39e0: 69 67 2e 6d 6e 52 65 71 20 3d 20 28 31 3c 3c 31  ig.mnReq = (1<<1
39f0: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  2);.      }..   
3a00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
3a10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70  obalConfig.pHeap
3a20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
3a30: 2a 20 49 66 20 74 68 65 20 68 65 61 70 20 70 6f  * If the heap po
3a40: 69 6e 74 65 72 20 69 73 20 4e 55 4c 4c 2c 20 74  inter is NULL, t
3a50: 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
3a60: 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74  malloc implement
3a70: 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ation.        **
3a80: 20 62 61 63 6b 20 74 6f 20 4e 55 4c 4c 20 70 6f   back to NULL po
3a90: 69 6e 74 65 72 73 20 74 6f 6f 2e 20 20 54 68 69  inters too.  Thi
3aa0: 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  s will cause the
3ab0: 20 6d 61 6c 6c 6f 63 20 74 6f 20 67 6f 0a 20 20   malloc to go.  
3ac0: 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f        ** back to
3ad0: 20 69 74 73 20 64 65 66 61 75 6c 74 20 69 6d 70   its default imp
3ae0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e  lementation when
3af0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
3b00: 69 7a 65 28 29 20 69 73 0a 20 20 20 20 20 20 20  ize() is.       
3b10: 20 2a 2a 20 72 75 6e 2e 0a 20 20 20 20 20 20 20   ** run..       
3b20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   */.        mems
3b30: 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62 61  et(&sqlite3Globa
3b40: 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69  lConfig.m, 0, si
3b50: 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f 62  zeof(sqlite3Glob
3b60: 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20  alConfig.m));.  
3b70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3b80: 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70 20 70     /* The heap p
3b90: 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55  ointer is not NU
3ba0: 4c 4c 2c 20 74 68 65 6e 20 69 6e 73 74 61 6c 6c  LL, then install
3bb0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 20 20 20 20   one of the.    
3bc0: 20 20 20 20 2a 2a 20 6d 65 6d 35 2e 63 2f 6d 65      ** mem5.c/me
3bd0: 6d 33 2e 63 20 6d 65 74 68 6f 64 73 2e 20 49 66  m3.c methods. If
3be0: 20 6e 65 69 74 68 65 72 20 45 4e 41 42 4c 45 5f   neither ENABLE_
3bf0: 4d 45 4d 53 59 53 33 20 6e 6f 72 0a 20 20 20 20  MEMSYS3 nor.    
3c00: 20 20 20 20 2a 2a 20 45 4e 41 42 4c 45 5f 4d 45      ** ENABLE_ME
3c10: 4d 53 59 53 35 20 69 73 20 64 65 66 69 6e 65 64  MSYS5 is defined
3c20: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
3c30: 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  r..        */.#i
3c40: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3c50: 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20  LE_MEMSYS3.     
3c60: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3c70: 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69  Config.m = *sqli
3c80: 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33  te3MemGetMemsys3
3c90: 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ();.#endif.#ifde
3ca0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
3cb0: 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20  MEMSYS5.        
3cc0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3cd0: 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33  fig.m = *sqlite3
3ce0: 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b  MemGetMemsys5();
3cf0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
3d00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3d10: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63   }.#endif..    c
3d20: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3d30: 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20  G_LOOKASIDE: {. 
3d40: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3d50: 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61  alConfig.szLooka
3d60: 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70  side = va_arg(ap
3d70: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
3d80: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3d90: 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76  g.nLookaside = v
3da0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
3db0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3dc0: 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 52   }.    .    /* R
3dd0: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
3de0: 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75  to the logger fu
3df0: 6e 63 63 74 69 6f 6e 20 61 6e 64 20 69 74 73 20  ncction and its 
3e00: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
3e10: 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75      ** The defau
3e20: 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67  lt is NULL.  Log
3e30: 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64  ging is disabled
3e40: 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   if the function
3e50: 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20 20   pointer is.    
3e60: 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  ** NULL..    */.
3e70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3e80: 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20  CONFIG_LOG: {.  
3e90: 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70      /* MSVC is p
3ea0: 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69  icky about pulli
3eb0: 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f  ng func ptrs fro
3ec0: 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20  m va lists..    
3ed0: 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70    ** http://supp
3ee0: 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f  ort.microsoft.co
3ef0: 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20  m/kb/47961.     
3f00: 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   ** sqlite3Globa
3f10: 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76  lConfig.xLog = v
3f20: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28 2a  a_arg(ap, void(*
3f30: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
3f40: 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20  t char*));.     
3f50: 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65   */.      typede
3f60: 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f  f void(*LOGFUNC_
3f70: 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  t)(void*,int,con
3f80: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
3f90: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3fa0: 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61  nfig.xLog = va_a
3fb0: 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74  rg(ap, LOGFUNC_t
3fc0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3fd0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f  GlobalConfig.pLo
3fe0: 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  gArg = va_arg(ap
3ff0: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
4000: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4010: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
4020: 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20  NFIG_URI: {.    
4030: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4040: 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 20 3d  onfig.bOpenUri =
4050: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4060: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4070: 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
4080: 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t: {.      rc = 
4090: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
40a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
40b0: 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
40c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
40d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
40e0: 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75  the lookaside bu
40f0: 66 66 65 72 73 20 66 6f 72 20 61 20 64 61 74 61  ffers for a data
4100: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
4110: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
4120: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
4130: 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69    .** If lookasi
4140: 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  de is already ac
4150: 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  tive, return SQL
4160: 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20  ITE_BUSY..**.** 
4170: 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74 65 72  The sz parameter
4180: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
4190: 66 20 62 79 74 65 73 20 69 6e 20 65 61 63 68 20  f bytes in each 
41a0: 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a  lookaside slot..
41b0: 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72 61 6d  ** The cnt param
41c0: 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62  eter is the numb
41d0: 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66  er of slots.  If
41e0: 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c 4c 20   pStart is NULL 
41f0: 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72  the.** space for
4200: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d   the lookaside m
4210: 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69 6e 65  emory is obtaine
4220: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
4230: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70  alloc()..** If p
4240: 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c  Start is not NUL
4250: 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73 7a 2a  L then it is sz*
4260: 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d 65 6d  cnt bytes of mem
4270: 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a  ory to use for.*
4280: 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  * the lookaside 
4290: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
42a0: 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61  c int setupLooka
42b0: 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  side(sqlite3 *db
42c0: 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
42d0: 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  t sz, int cnt){.
42e0: 20 20 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a    void *pStart;.
42f0: 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73    if( db->lookas
4300: 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20 20 20 20  ide.nOut ){.    
4310: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
4320: 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 72 65  SY;.  }.  /* Fre
4330: 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6c  e any existing l
4340: 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 20  ookaside buffer 
4350: 66 6f 72 20 74 68 69 73 20 68 61 6e 64 6c 65 20  for this handle 
4360: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f  before.  ** allo
4370: 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65  cating a new one
4380: 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 68 61 76   so we don't hav
4390: 65 20 74 6f 20 68 61 76 65 20 73 70 61 63 65 20  e to have space 
43a0: 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74 68 20 61  for .  ** both a
43b0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
43c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
43d0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
43e0: 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ced ){.    sqlit
43f0: 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b  e3_free(db->look
4400: 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20  aside.pStart);. 
4410: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 69 7a 65   }.  /* The size
4420: 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20   of a lookaside 
4430: 73 6c 6f 74 20 61 66 74 65 72 20 52 4f 55 4e 44  slot after ROUND
4440: 44 4f 57 4e 38 20 6e 65 65 64 73 20 74 6f 20 62  DOWN8 needs to b
4450: 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a 20 74 68  e larger.  ** th
4460: 61 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  an a pointer to 
4470: 62 65 20 75 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a  be useful..  */.
4480: 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e    sz = ROUNDDOWN
4490: 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d 50 3a 20  8(sz);  /* IMP: 
44a0: 52 2d 33 33 30 33 38 2d 30 39 33 38 32 20 2a 2f  R-33038-09382 */
44b0: 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69 6e 74 29  .  if( sz<=(int)
44c0: 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65  sizeof(Lookaside
44d0: 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d 20 30 3b  Slot*) ) sz = 0;
44e0: 0a 20 20 69 66 28 20 63 6e 74 3c 30 20 29 20 63  .  if( cnt<0 ) c
44f0: 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 7a  nt = 0;.  if( sz
4500: 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b  ==0 || cnt==0 ){
4510: 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20  .    sz = 0;.   
4520: 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 7d   pStart = 0;.  }
4530: 65 6c 73 65 20 69 66 28 20 70 42 75 66 3d 3d 30  else if( pBuf==0
4540: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
4550: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
4560: 28 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d  ();.    pStart =
4570: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
4580: 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a 20 49 4d  sz*cnt );  /* IM
4590: 50 3a 20 52 2d 36 31 39 34 39 2d 33 35 37 32 37  P: R-61949-35727
45a0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
45b0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
45c0: 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  ;.    if( pStart
45d0: 20 29 20 63 6e 74 20 3d 20 73 71 6c 69 74 65 33   ) cnt = sqlite3
45e0: 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53 74 61 72  MallocSize(pStar
45f0: 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t)/sz;.  }else{.
4600: 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 42 75      pStart = pBu
4610: 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f  f;.  }.  db->loo
4620: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20 3d 20  kaside.pStart = 
4630: 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f  pStart;.  db->lo
4640: 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20  okaside.pFree = 
4650: 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  0;.  db->lookasi
4660: 64 65 2e 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b  de.sz = (u16)sz;
4670: 0a 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b  .  if( pStart ){
4680: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
4690: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70  LookasideSlot *p
46a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
46b0: 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c   > (int)sizeof(L
46c0: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29  ookasideSlot*) )
46d0: 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61  ;.    p = (Looka
46e0: 73 69 64 65 53 6c 6f 74 2a 29 70 53 74 61 72 74  sideSlot*)pStart
46f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d  ;.    for(i=cnt-
4700: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
4710: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
4720: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46  db->lookaside.pF
4730: 72 65 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c  ree;.      db->l
4740: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d  ookaside.pFree =
4750: 20 70 3b 0a 20 20 20 20 20 20 70 20 3d 20 28 4c   p;.      p = (L
4760: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 26 28  ookasideSlot*)&(
4770: 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20  (u8*)p)[sz];.   
4780: 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61   }.    db->looka
4790: 73 69 64 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20  side.pEnd = p;. 
47a0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
47b0: 2e 62 45 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 20  .bEnabled = 1;. 
47c0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
47d0: 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75  .bMalloced = pBu
47e0: 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c  f==0 ?1:0;.  }el
47f0: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  se{.    db->look
4800: 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 30 3b 0a  aside.pEnd = 0;.
4810: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4820: 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a  e.bEnabled = 0;.
4830: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4840: 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b  e.bMalloced = 0;
4850: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
4860: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
4870: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 75 74  * Return the mut
4880: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
4890: 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
48a0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c  nnection..*/.sql
48b0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69  ite3_mutex *sqli
48c0: 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c  te3_db_mutex(sql
48d0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74  ite3 *db){.  ret
48e0: 75 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d  urn db->mutex;.}
48f0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20  ../*.** Free up 
4900: 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
4910: 73 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68  s we can from th
4920: 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65  e given database
4930: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  .** connection..
4940: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
4950: 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  b_release_memory
4960: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
4970: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
4980: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
4990: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69  ->mutex);.  sqli
49a0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
49b0: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
49c0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
49d0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
49e0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
49f0: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 29  t;.    if( pBt )
4a00: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
4a10: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
4a20: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
4a30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
4a40: 65 72 53 68 72 69 6e 6b 28 70 50 61 67 65 72 29  erShrink(pPager)
4a50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
4a60: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
4a70: 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  ll(db);.  sqlite
4a80: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
4a90: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
4aa0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
4ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61  ./*.** Configura
4ac0: 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20 66 6f  tion settings fo
4ad0: 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20  r an individual 
4ae0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
4af0: 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ion.*/.int sqlit
4b00: 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c  e3_db_config(sql
4b10: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70  ite3 *db, int op
4b20: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
4b30: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  t ap;.  int rc;.
4b40: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f    va_start(ap, o
4b50: 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p);.  switch( op
4b60: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
4b70: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f  ITE_DBCONFIG_LOO
4b80: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
4b90: 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f  void *pBuf = va_
4ba0: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20  arg(ap, void*); 
4bb0: 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d  /* IMP: R-26835-
4bc0: 31 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69  10964 */.      i
4bd0: 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
4be0: 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f  p, int);       /
4bf0: 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32  * IMP: R-47871-2
4c00: 35 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e  5994 */.      in
4c10: 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61  t cnt = va_arg(a
4c20: 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a  p, int);      /*
4c30: 20 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33   IMP: R-04460-53
4c40: 33 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  386 */.      rc 
4c50: 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65  = setupLookaside
4c60: 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63  (db, pBuf, sz, c
4c70: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
4c80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
4c90: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61  ult: {.      sta
4ca0: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
4cb0: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f   {.        int o
4cc0: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  p;      /* The o
4cd0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20  pcode */.       
4ce0: 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a   u32 mask;    /*
4cf0: 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74   Mask of the bit
4d00: 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67   in sqlite3.flag
4d10: 73 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a  s to set/clear *
4d20: 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f  /.      } aFlagO
4d30: 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  p[] = {.        
4d40: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
4d50: 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20  G_ENABLE_FKEY,  
4d60: 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e    SQLITE_Foreign
4d70: 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20 20 20  Keys    },.     
4d80: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
4d90: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47  NFIG_ENABLE_TRIG
4da0: 47 45 52 2c 20 53 51 4c 49 54 45 5f 45 6e 61 62  GER, SQLITE_Enab
4db0: 6c 65 54 72 69 67 67 65 72 20 20 7d 2c 0a 20 20  leTrigger  },.  
4dc0: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73      };.      uns
4dd0: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20  igned int i;.   
4de0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
4df0: 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  RROR; /* IMP: R-
4e00: 34 32 37 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20  42790-23372 */. 
4e10: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
4e20: 41 72 72 61 79 53 69 7a 65 28 61 46 6c 61 67 4f  ArraySize(aFlagO
4e30: 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  p); i++){.      
4e40: 20 20 69 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d    if( aFlagOp[i]
4e50: 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20  .op==op ){.     
4e60: 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d       int onoff =
4e70: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4e80: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
4e90: 2a 70 52 65 73 20 3d 20 76 61 5f 61 72 67 28 61  *pRes = va_arg(a
4ea0: 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
4eb0: 20 20 20 20 69 6e 74 20 6f 6c 64 46 6c 61 67 73      int oldFlags
4ec0: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
4ed0: 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e 6f 66          if( onof
4ee0: 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  f>0 ){.         
4ef0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
4f00: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b  aFlagOp[i].mask;
4f10: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
4f20: 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b   if( onoff==0 ){
4f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
4f40: 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46 6c 61 67  >flags &= ~aFlag
4f50: 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  Op[i].mask;.    
4f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4f70: 20 20 69 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d    if( oldFlags!=
4f80: 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20  db->flags ){.   
4f90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4fa0: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
4fb0: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
4fc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4fd0: 20 20 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a      if( pRes ){.
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
4ff0: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
5000: 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b   aFlagOp[i].mask
5010: 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )!=0;.          
5020: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
5030: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5040: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5060: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5070: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
5080: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
5090: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
50a0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 62 75  n true if the bu
50b0: 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63  ffer z[0..n-1] c
50c0: 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70 61 63  ontains all spac
50d0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
50e0: 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73  t allSpaces(cons
50f0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
5100: 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  ){.  while( n>0 
5110: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29  && z[n-1]==' ' )
5120: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72  { n--; }.  retur
5130: 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n n==0;.}../*.**
5140: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
5150: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66  ault collating f
5160: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42  unction named "B
5170: 49 4e 41 52 59 22 20 77 68 69 63 68 20 69 73 20  INARY" which is 
5180: 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61  always.** availa
5190: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
51a0: 65 20 70 61 64 46 6c 61 67 20 61 72 67 75 6d 65  e padFlag argume
51b0: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  nt is not NULL t
51c0: 68 65 6e 20 73 70 61 63 65 20 70 61 64 64 69 6e  hen space paddin
51d0: 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20  g at the end.** 
51e0: 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20 69 67  of strings is ig
51f0: 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 6d 70  nored.  This imp
5200: 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54 52 49  lements the RTRI
5210: 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  M collation..*/.
5220: 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f  static int binCo
5230: 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  llFunc(.  void *
5240: 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e  padFlag,.  int n
5250: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
5260: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
5270: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
5280: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
5290: 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b   rc, n;.  n = nK
52a0: 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79  ey1<nKey2 ? nKey
52b0: 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 72 63 20  1 : nKey2;.  rc 
52c0: 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20  = memcmp(pKey1, 
52d0: 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28  pKey2, n);.  if(
52e0: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
52f0: 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20 20 26  ( padFlag.     &
5300: 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68  & allSpaces(((ch
5310: 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b  ar*)pKey1)+n, nK
5320: 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26 20 61  ey1-n).     && a
5330: 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a  llSpaces(((char*
5340: 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32  )pKey2)+n, nKey2
5350: 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  -n).    ){.     
5360: 20 2f 2a 20 4c 65 61 76 65 20 72 63 20 75 6e 63   /* Leave rc unc
5370: 68 61 6e 67 65 64 20 61 74 20 30 20 2a 2f 0a 20  hanged at 0 */. 
5380: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5390: 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65  rc = nKey1 - nKe
53a0: 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  y2;.    }.  }.  
53b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
53c0: 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75 69 6c  .** Another buil
53d0: 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73  t-in collating s
53e0: 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e  equence: NOCASE.
53f0: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c   .**.** This col
5400: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
5410: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
5420: 65 20 75 73 65 64 20 66 6f 72 20 22 63 61 73 65  e used for "case
5430: 20 69 6e 64 65 70 65 6e 64 61 6e 74 0a 2a 2a 20   independant.** 
5440: 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c  comparison". SQL
5450: 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20  ite's knowledge 
5460: 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77  of upper and low
5470: 65 72 20 63 61 73 65 20 65 71 75 69 76 61 6c 65  er case equivale
5480: 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f  nts.** extends o
5490: 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20 63 68  nly to the 26 ch
54a0: 61 72 61 63 74 65 72 73 20 75 73 65 64 20 69 6e  aracters used in
54b0: 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e   the English lan
54c0: 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20  guage..**.** At 
54d0: 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65  the moment there
54e0: 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38   is only a UTF-8
54f0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
5500: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
5510: 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75  ocaseCollatingFu
5520: 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nc(.  void *NotU
5530: 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  sed,.  int nKey1
5540: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
5550: 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32  ey1,.  int nKey2
5560: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
5570: 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d  ey2.){.  int r =
5580: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
5590: 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63  (.      (const c
55a0: 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f  har *)pKey1, (co
55b0: 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 32  nst char *)pKey2
55c0: 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f  , (nKey1<nKey2)?
55d0: 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20  nKey1:nKey2);.  
55e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
55f0: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  (NotUsed);.  if(
5600: 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d   0==r ){.    r =
5610: 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20   nKey1-nKey2;.  
5620: 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
5630: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5640: 65 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d  e ROWID of the m
5650: 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72  ost recent inser
5660: 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36  t.*/.sqlite_int6
5670: 34 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  4 sqlite3_last_i
5680: 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69  nsert_rowid(sqli
5690: 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
56a0: 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  rn db->lastRowid
56b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
56c0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
56d0: 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d  changes in the m
56e0: 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20  ost recent call 
56f0: 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
5700: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
5710: 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  3_changes(sqlite
5720: 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  3 *db){.  return
5730: 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a   db->nChange;.}.
5740: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5750: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
5760: 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 64 61  ges since the da
5770: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61  tabase handle wa
5780: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  s opened..*/.int
5790: 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63   sqlite3_total_c
57a0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
57b0: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
57c0: 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a  ->nTotalChange;.
57d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
57e0: 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
57f0: 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ts. This functio
5800: 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74  n only manipulat
5810: 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  es fields of the
5820: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
5830: 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74 20 64  dle object, it d
5840: 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e  oes not close an
5850: 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61  y savepoints tha
5860: 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a  t may be open.**
5870: 20 61 74 20 74 68 65 20 62 2d 74 72 65 65 2f 70   at the b-tree/p
5880: 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76  ager level..*/.v
5890: 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  oid sqlite3Close
58a0: 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c 69 74  Savepoints(sqlit
58b0: 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65  e3 *db){.  while
58c0: 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  ( db->pSavepoint
58d0: 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f 69 6e   ){.    Savepoin
58e0: 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53  t *pTmp = db->pS
58f0: 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62  avepoint;.    db
5900: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  ->pSavepoint = p
5910: 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Tmp->pNext;.    
5920: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5930: 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64  , pTmp);.  }.  d
5940: 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  b->nSavepoint = 
5950: 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0;.  db->nStatem
5960: 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69  ent = 0;.  db->i
5970: 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65  sTransactionSave
5980: 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  point = 0;.}../*
5990: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 64  .** Invoke the d
59a0: 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69  estructor functi
59b0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
59c0: 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20 69 66  th FuncDef p, if
59d0: 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a   any. Except,.**
59e0: 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
59f0: 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20 6f 66  the last copy of
5a00: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64   the function, d
5a10: 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e  o not invoke it.
5a20: 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70   Multiple.** cop
5a30: 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ies of a single 
5a40: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63 72 65  function are cre
5a50: 61 74 65 64 20 77 68 65 6e 20 63 72 65 61 74 65  ated when create
5a60: 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 63  _function() is c
5a70: 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51  alled.** with SQ
5a80: 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68 65 20  LITE_ANY as the 
5a90: 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61  encoding..*/.sta
5aa0: 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74 69 6f  tic void functio
5ab0: 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33  nDestroy(sqlite3
5ac0: 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70   *db, FuncDef *p
5ad0: 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63  ){.  FuncDestruc
5ae0: 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72  tor *pDestructor
5af0: 20 3d 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f   = p->pDestructo
5b00: 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74 72 75  r;.  if( pDestru
5b10: 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73  ctor ){.    pDes
5b20: 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b  tructor->nRef--;
5b30: 0a 20 20 20 20 69 66 28 20 70 44 65 73 74 72 75  .    if( pDestru
5b40: 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  ctor->nRef==0 ){
5b50: 0a 20 20 20 20 20 20 70 44 65 73 74 72 75 63 74  .      pDestruct
5b60: 6f 72 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65  or->xDestroy(pDe
5b70: 73 74 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44  structor->pUserD
5b80: 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ata);.      sqli
5b90: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
5ba0: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
5bb0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
5bc0: 69 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71  isconnect all sq
5bd0: 6c 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63  lite3_vtab objec
5be0: 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ts that belong t
5bf0: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  o database conne
5c00: 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69  ction.** db. Thi
5c10: 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  s is called when
5c20: 20 64 62 20 69 73 20 62 65 69 6e 67 20 63 6c 6f   db is being clo
5c30: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sed..*/.static v
5c40: 6f 69 64 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  oid disconnectAl
5c50: 6c 56 74 61 62 28 73 71 6c 69 74 65 33 20 2a 64  lVtab(sqlite3 *d
5c60: 62 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  b){.#ifndef SQLI
5c70: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
5c80: 41 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ABLE.  int i;.  
5c90: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
5ca0: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
5cb0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
5cc0: 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d 61  i++){.    Schema
5cd0: 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e   *pSchema = db->
5ce0: 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a  aDb[i].pSchema;.
5cf0: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
5d00: 69 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  i].pSchema ){.  
5d10: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
5d20: 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  .      for(p=sql
5d30: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53  iteHashFirst(&pS
5d40: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
5d50: 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68   p; p=sqliteHash
5d60: 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20  Next(p)){.      
5d70: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
5d80: 28 54 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48  (Table *)sqliteH
5d90: 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20  ashData(p);.    
5da0: 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
5db0: 6c 28 70 54 61 62 29 20 29 20 73 71 6c 69 74 65  l(pTab) ) sqlite
5dc0: 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28  3VtabDisconnect(
5dd0: 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
5de0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
5df0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
5e00: 41 6c 6c 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20  All(db);.#else. 
5e10: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
5e20: 52 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  R(db);.#endif.}.
5e30: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
5e40: 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20  existing SQLite 
5e50: 64 61 74 61 62 61 73 65 0a 2a 2f 0a 69 6e 74 20  database.*/.int 
5e60: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 71  sqlite3_close(sq
5e70: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61  lite3 *db){.  Ha
5e80: 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20  shElem *i;      
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ea0: 20 48 61 73 68 20 74 61 62 6c 65 20 69 74 65 72   Hash table iter
5eb0: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ator */.  int j;
5ec0: 0a 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  ..  if( !db ){. 
5ed0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5ee0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
5ef0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
5f00: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
5f10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
5f20: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
5f30: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
5f40: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
5f50: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72  utex);..  /* For
5f60: 63 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63  ce xDisconnect c
5f70: 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74  alls on all virt
5f80: 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ual tables */.  
5f90: 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61  disconnectAllVta
5fa0: 62 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  b(db);..  /* If 
5fb0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
5fc0: 20 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f   open, the disco
5fd0: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63  nnectAllVtab() c
5fe0: 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77  all above.  ** w
5ff0: 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c  ill not have cal
6000: 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e  led the xDisconn
6010: 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20  ect() method on 
6020: 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a  any virtual.  **
6030: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64   tables in the d
6040: 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72  b->aVTrans[] arr
6050: 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ay. The followin
6060: 67 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c  g sqlite3VtabRol
6070: 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c  lback().  ** cal
6080: 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65  l will do so. We
6090: 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73   need to do this
60a0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63   before the chec
60b0: 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a  k for active.  *
60c0: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
60d0: 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76   below, as the v
60e0: 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  -table implement
60f0: 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f  ation may be sto
6100: 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70  ring.  ** some p
6110: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
6120: 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ts internally.. 
6130: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61   */.  sqlite3Vta
6140: 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a  bRollback(db);..
6150: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
6160: 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e  e any outstandin
6170: 67 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 53 51  g VMs, return SQ
6180: 4c 49 54 45 5f 42 55 53 59 2e 20 2a 2f 0a 20 20  LITE_BUSY. */.  
6190: 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b  if( db->pVdbe ){
61a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
61b0: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  r(db, SQLITE_BUS
61c0: 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61  Y, .        "una
61d0: 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65  ble to close due
61e0: 20 74 6f 20 75 6e 66 69 6e 61 6c 69 73 65 64 20   to unfinalised 
61f0: 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20  statements");.  
6200: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6210: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
6220: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
6230: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20  ITE_BUSY;.  }.  
6240: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
6250: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
6260: 4f 6b 28 64 62 29 20 29 3b 0a 0a 20 20 66 6f 72  Ok(db) );..  for
6270: 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b  (j=0; j<db->nDb;
6280: 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   j++){.    Btree
6290: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
62a0: 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  j].pBt;.    if( 
62b0: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
62c0: 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42  reeIsInBackup(pB
62d0: 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
62e0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
62f0: 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20  ITE_BUSY, .     
6300: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
6310: 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66  close due to unf
6320: 69 6e 69 73 68 65 64 20 62 61 63 6b 75 70 20 6f  inished backup o
6330: 70 65 72 61 74 69 6f 6e 22 29 3b 0a 20 20 20 20  peration");.    
6340: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6350: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
6360: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
6370: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
6380: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  }.  }..  /* Free
6390: 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   any outstanding
63a0: 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63   Savepoint struc
63b0: 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  tures. */.  sqli
63c0: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
63d0: 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c  ts(db);..  /* Cl
63e0: 6f 73 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ose all database
63f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
6400: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d    for(j=0; j<db-
6410: 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nDb; j++){.    
6420: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
6430: 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20   &db->aDb[j];.  
6440: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
6450: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
6460: 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70  treeClose(pDb->p
6470: 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  Bt);.      pDb->
6480: 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  pBt = 0;.      i
6490: 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20  f( j!=1 ){.     
64a0: 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20     pDb->pSchema 
64b0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
64c0: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61   }.  }.  /* Clea
64d0: 72 20 74 68 65 20 54 45 4d 50 20 73 63 68 65 6d  r the TEMP schem
64e0: 61 20 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64  a separately and
64f0: 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28 20 64   last */.  if( d
6500: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
6510: 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  a ){.    sqlite3
6520: 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e  SchemaClear(db->
6530: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
6540: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
6550: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
6560: 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 75 70 20  ;..  /* Free up 
6570: 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 75 78  the array of aux
6580: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
6590: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   */.  sqlite3Col
65a0: 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72  lapseDatabaseArr
65b0: 61 79 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  ay(db);.  assert
65c0: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a  ( db->nDb<=2 );.
65d0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
65e0: 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63  b==db->aDbStatic
65f0: 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74   );..  /* Tell t
6600: 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66  he code in notif
6610: 79 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e  y.c that the con
6620: 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65  nection no longe
6630: 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a  r holds any.  **
6640: 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20   locks and does 
6650: 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20  not require any 
6660: 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e  further unlock-n
6670: 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e  otify callbacks.
6680: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  .  */.  sqlite3C
6690: 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28  onnectionClosed(
66a0: 64 62 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  db);..  for(j=0;
66b0: 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 64 62 2d   j<ArraySize(db-
66c0: 3e 61 46 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b  >aFunc.a); j++){
66d0: 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 4e  .    FuncDef *pN
66e0: 65 78 74 2c 20 2a 70 48 61 73 68 2c 20 2a 70 3b  ext, *pHash, *p;
66f0: 0a 20 20 20 20 66 6f 72 28 70 3d 64 62 2d 3e 61  .    for(p=db->a
6700: 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d  Func.a[j]; p; p=
6710: 70 48 61 73 68 29 7b 0a 20 20 20 20 20 20 70 48  pHash){.      pH
6720: 61 73 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a  ash = p->pHash;.
6730: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 29        while( p )
6740: 7b 0a 20 20 20 20 20 20 20 20 66 75 6e 63 74 69  {.        functi
6750: 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29  onDestroy(db, p)
6760: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20  ;.        pNext 
6770: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
6780: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6790: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
67a0: 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20    p = pNext;.   
67b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
67c0: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
67d0: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c  hFirst(&db->aCol
67e0: 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69  lSeq); i; i=sqli
67f0: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
6800: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
6810: 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29  ll = (CollSeq *)
6820: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
6830: 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65  );.    /* Invoke
6840: 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72 73   any destructors
6850: 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20   registered for 
6860: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
6870: 63 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a 2f  ce user data. */
6880: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
6890: 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  3; j++){.      i
68a0: 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c  f( pColl[j].xDel
68b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
68c0: 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b  l[j].xDel(pColl[
68d0: 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  j].pUser);.     
68e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
68f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
6900: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Coll);.  }.  sql
6910: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
6920: 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
6930: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6940: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
6950: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
6960: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64  hFirst(&db->aMod
6970: 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ule); i; i=sqlit
6980: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
6990: 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20     Module *pMod 
69a0: 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69  = (Module *)sqli
69b0: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
69c0: 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65     if( pMod->xDe
69d0: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 70  stroy ){.      p
69e0: 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d  Mod->xDestroy(pM
69f0: 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d  od->pAux);.    }
6a00: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
6a10: 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20  ee(db, pMod);.  
6a20: 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
6a30: 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  lear(&db->aModul
6a40: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  e);.#endif..  sq
6a50: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
6a60: 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 20 2f 2a  QLITE_OK, 0); /*
6a70: 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79   Deallocates any
6a80: 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73 74   cached error st
6a90: 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 69 66 28 20  rings. */.  if( 
6aa0: 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20 20 20 20  db->pErr ){.    
6ab0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
6ac0: 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 7d 0a  (db->pErr);.  }.
6ad0: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78    sqlite3CloseEx
6ae0: 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 0a 20  tensions(db);.. 
6af0: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
6b00: 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b  ITE_MAGIC_ERROR;
6b10: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d  ..  /* The temp-
6b20: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
6b30: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66  is allocated dif
6b40: 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68  ferently from th
6b50: 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20  e other schema. 
6b60: 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69   ** objects (usi
6b70: 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  ng sqliteMalloc(
6b80: 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  ) directly, inst
6b90: 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74  ead of sqlite3Bt
6ba0: 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20  reeSchema())..  
6bb0: 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74  ** So it needs t
6bc0: 6f 20 62 65 20 66 72 65 65 64 20 68 65 72 65 2e  o be freed here.
6bd0: 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72   Todo: Why not r
6be0: 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68  oll the temp sch
6bf0: 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ema into.  ** th
6c00: 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c  e same sqliteMal
6c10: 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65  loc() as the one
6c20: 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20   that allocates 
6c30: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
6c40: 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20  ** structure?.  
6c50: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
6c60: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31  ee(db, db->aDb[1
6c70: 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ].pSchema);.  sq
6c80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
6c90: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
6ca0: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
6cb0: 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b  TE_MAGIC_CLOSED;
6cc0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6cd0: 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29  _free(db->mutex)
6ce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
6cf0: 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d  lookaside.nOut==
6d00: 30 20 29 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f  0 );  /* Fails o
6d10: 6e 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  n a lookaside me
6d20: 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69  mory leak */.  i
6d30: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
6d40: 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  .bMalloced ){.  
6d50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
6d60: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
6d70: 61 72 74 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  art);.  }.#ifdef
6d80: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
6d90: 51 4c 52 52 0a 20 20 53 52 52 65 63 43 6c 6f 73  QLRR.  SRRecClos
6da0: 65 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20  e(db);.#endif.  
6db0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
6dc0: 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  db);.  return SQ
6dd0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6de0: 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64  * Rollback all d
6df0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20  atabase files.  
6e00: 49 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e  If tripCode is n
6e10: 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68  ot SQLITE_OK, th
6e20: 65 6e 0a 2a 2a 20 61 6e 79 20 6f 70 65 6e 20 63  en.** any open c
6e30: 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c  ursors are inval
6e40: 69 64 61 74 65 64 20 28 22 74 72 69 70 70 65 64  idated ("tripped
6e50: 22 20 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70  " - as in "tripp
6e60: 69 6e 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a  ing a circuit.**
6e70: 20 62 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d   breaker") and m
6e80: 61 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72  ade to return tr
6e90: 69 70 43 6f 64 65 20 69 66 20 74 68 65 72 65 20  ipCode if there 
6ea0: 61 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a  are any further.
6eb0: 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75  ** attempts to u
6ec0: 73 65 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a  se that cursor..
6ed0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
6ee0: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74  ollbackAll(sqlit
6ef0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 74 72 69 70  e3 *db, int trip
6f00: 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Code){.  int i;.
6f10: 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20    int inTrans = 
6f20: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  0;.  assert( sql
6f30: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
6f40: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
6f50: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
6f60: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f  gnMalloc();.  fo
6f70: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
6f80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65  ; i++){.    Btre
6f90: 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69  e *p = db->aDb[i
6fa0: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
6fb0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
6fc0: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
6fd0: 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20  ans(p) ){.      
6fe0: 20 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20    inTrans = 1;. 
6ff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
7000: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
7010: 6b 28 70 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a  k(p, tripCode);.
7020: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d        db->aDb[i]
7030: 2e 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20  .inTrans = 0;.  
7040: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
7050: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
7060: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42  );.  sqlite3EndB
7070: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
7080: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 26    if( db->flags&
7090: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
70a0: 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  nges ){.    sqli
70b0: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
70c0: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
70d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
70e0: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
70f0: 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d  nection(db);.  }
7100: 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72  ..  /* Any defer
7110: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  red constraint v
7120: 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e  iolations have n
7130: 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  ow been resolved
7140: 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65  . */.  db->nDefe
7150: 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 0a 20  rredCons = 0;.. 
7160: 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62   /* If one has b
7170: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  een configured, 
7180: 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62  invoke the rollb
7190: 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  ack-hook callbac
71a0: 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78  k */.  if( db->x
71b0: 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
71c0: 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20   && (inTrans || 
71d0: 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29  !db->autoCommit)
71e0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c   ){.    db->xRol
71f0: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62  lbackCallback(db
7200: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b  ->pRollbackArg);
7210: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
7220: 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74  turn a static st
7230: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
7240: 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20  bes the kind of 
7250: 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20  error specified 
7260: 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65  in the.** argume
7270: 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  nt..*/.const cha
7280: 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72  r *sqlite3ErrStr
7290: 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74  (int rc){.  stat
72a0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63  ic const char* c
72b0: 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a  onst aMsg[] = {.
72c0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b      /* SQLITE_OK
72d0: 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f            */ "no
72e0: 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20  t an error",.   
72f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52   /* SQLITE_ERROR
7300: 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c         */ "SQL l
7310: 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69  ogic error or mi
7320: 73 73 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c  ssing database",
7330: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
7340: 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c  NTERNAL    */ 0,
7350: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50  .    /* SQLITE_P
7360: 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61  ERM        */ "a
7370: 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
7380: 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a   denied",.    /*
7390: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20   SQLITE_ABORT   
73a0: 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b      */ "callback
73b0: 20 72 65 71 75 65 73 74 65 64 20 71 75 65 72 79   requested query
73c0: 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20   abort",.    /* 
73d0: 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20  SQLITE_BUSY     
73e0: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
73f0: 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20  is locked",.    
7400: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  /* SQLITE_LOCKED
7410: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
7420: 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
7430: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
7440: 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a  TE_NOMEM       *
7450: 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  / "out of memory
7460: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
7470: 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20  _READONLY    */ 
7480: 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74  "attempt to writ
7490: 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74  e a readonly dat
74a0: 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53  abase",.    /* S
74b0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
74c0: 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65    */ "interrupte
74d0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
74e0: 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f  E_IOERR       */
74f0: 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72   "disk I/O error
7500: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
7510: 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20  _CORRUPT     */ 
7520: 22 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  "database disk i
7530: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
7540: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
7550: 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f  E_NOTFOUND    */
7560: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74   "unknown operat
7570: 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ion",.    /* SQL
7580: 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20  ITE_FULL        
7590: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72 20  */ "database or 
75a0: 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20  disk is full",. 
75b0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e     /* SQLITE_CAN
75c0: 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61  TOPEN    */ "una
75d0: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
75e0: 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20  base file",.    
75f0: 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  /* SQLITE_PROTOC
7600: 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e  OL    */ "lockin
7610: 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20  g protocol",.   
7620: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59   /* SQLITE_EMPTY
7630: 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62 6c 65         */ "table
7640: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
7650: 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  a",.    /* SQLIT
7660: 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20 2a 2f  E_SCHEMA      */
7670: 20 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d   "database schem
7680: 61 20 68 61 73 20 63 68 61 6e 67 65 64 22 2c 0a  a has changed",.
7690: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f      /* SQLITE_TO
76a0: 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22 73 74  OBIG      */ "st
76b0: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f  ring or blob too
76c0: 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51   big",.    /* SQ
76d0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
76e0: 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74 20   */ "constraint 
76f0: 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20  failed",.    /* 
7700: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20  SQLITE_MISMATCH 
7710: 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70 65 20     */ "datatype 
7720: 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f  mismatch",.    /
7730: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  * SQLITE_MISUSE 
7740: 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61 72 79       */ "library
7750: 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20   routine called 
7760: 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65 22  out of sequence"
7770: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
7780: 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22  NOLFS       */ "
7790: 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f  large file suppo
77a0: 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c  rt is disabled",
77b0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41  .    /* SQLITE_A
77c0: 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61  UTH        */ "a
77d0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e  uthorization den
77e0: 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ied",.    /* SQL
77f0: 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20  ITE_FORMAT      
7800: 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20 64 61  */ "auxiliary da
7810: 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72  tabase format er
7820: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
7830: 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20  ITE_RANGE       
7840: 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75  */ "bind or colu
7850: 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20  mn index out of 
7860: 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53  range",.    /* S
7870: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20  QLITE_NOTADB    
7880: 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 65 6e    */ "file is en
7890: 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f  crypted or is no
78a0: 74 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20  t a database",. 
78b0: 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   };.  const char
78c0: 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77   *zErr = "unknow
78d0: 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77 69 74  n error";.  swit
78e0: 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61  ch( rc ){.    ca
78f0: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  se SQLITE_ABORT_
7900: 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20  ROLLBACK: {.    
7910: 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72 74 20    zErr = "abort 
7920: 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22  due to ROLLBACK"
7930: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7940: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
7950: 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26 3d 20  : {.      rc &= 
7960: 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20  0xff;.      if( 
7970: 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26  ALWAYS(rc>=0) &&
7980: 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28 61 4d   rc<ArraySize(aM
7990: 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21  sg) && aMsg[rc]!
79a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45  =0 ){.        zE
79b0: 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20  rr = aMsg[rc];. 
79c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
79d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
79e0: 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a  return zErr;.}..
79f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7a00: 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20  ne implements a 
7a10: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68  busy callback th
7a20: 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72  at sleeps and tr
7a30: 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74  ies.** again unt
7a40: 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c  il a timeout val
7a50: 75 65 20 69 73 20 72 65 61 63 68 65 64 2e 20 20  ue is reached.  
7a60: 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75  The timeout valu
7a70: 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67  e is.** an integ
7a80: 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  er number of mil
7a90: 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64  liseconds passed
7aa0: 20 69 6e 20 61 73 20 74 68 65 20 66 69 72 73 74   in as the first
7ab0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
7ac0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
7ad0: 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c  teDefaultBusyCal
7ae0: 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74  lback(. void *pt
7af0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
7b00: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
7b10: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20  nection */. int 
7b20: 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20 20  count           
7b30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7b40: 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61  f times table ha
7b50: 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29  s been busy */.)
7b60: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
7b70: 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e 65 64 28  WIN || (defined(
7b80: 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20  HAVE_USLEEP) && 
7b90: 48 41 56 45 5f 55 53 4c 45 45 50 29 0a 20 20 73  HAVE_USLEEP).  s
7ba0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 64  tatic const u8 d
7bb0: 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  elays[] =.     {
7bc0: 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35   1, 2, 5, 10, 15
7bd0: 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32  , 20, 25, 25,  2
7be0: 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30 30  5,  50,  50, 100
7bf0: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
7c00: 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d  st u8 totals[] =
7c10: 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c  .     { 0, 1, 3,
7c20: 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c    8, 18, 33, 53,
7c30: 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20 31   78, 103, 128, 1
7c40: 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65 66  78, 228 };.# def
7c50: 69 6e 65 20 4e 44 45 4c 41 59 20 41 72 72 61 79  ine NDELAY Array
7c60: 53 69 7a 65 28 64 65 6c 61 79 73 29 0a 20 20 73  Size(delays).  s
7c70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
7c80: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
7c90: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d  nt timeout = db-
7ca0: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
7cb0: 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72  int delay, prior
7cc0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  ;..  assert( cou
7cd0: 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63  nt>=0 );.  if( c
7ce0: 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b  ount < NDELAY ){
7cf0: 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c  .    delay = del
7d00: 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20  ays[count];.    
7d10: 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63  prior = totals[c
7d20: 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ount];.  }else{.
7d30: 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61      delay = dela
7d40: 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20  ys[NDELAY-1];.  
7d50: 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73    prior = totals
7d60: 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c  [NDELAY-1] + del
7d70: 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41  ay*(count-(NDELA
7d80: 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Y-1));.  }.  if(
7d90: 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e   prior + delay >
7da0: 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20   timeout ){.    
7db0: 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74 20  delay = timeout 
7dc0: 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28  - prior;.    if(
7dd0: 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75   delay<=0 ) retu
7de0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
7df0: 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70  te3OsSleep(db->p
7e00: 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29  Vfs, delay*1000)
7e10: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
7e20: 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  lse.  sqlite3 *d
7e30: 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70  b = (sqlite3 *)p
7e40: 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75  tr;.  int timeou
7e50: 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29  t = ((sqlite3 *)
7e60: 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75  ptr)->busyTimeou
7e70: 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b  t;.  if( (count+
7e80: 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f 75  1)*1000 > timeou
7e90: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
7ea0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
7eb0: 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73  OsSleep(db->pVfs
7ec0: 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72 65  , 1000000);.  re
7ed0: 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
7ee0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
7ef0: 68 65 20 67 69 76 65 6e 20 62 75 73 79 20 68 61  he given busy ha
7f00: 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ndler..**.** Thi
7f10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7f20: 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65 72  led when an oper
7f30: 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77 69 74  ation failed wit
7f40: 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20  h a lock..** If 
7f50: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
7f60: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
7f70: 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69  he lock is retri
7f80: 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65  ed.  If it.** re
7f90: 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65  turns 0, the ope
7fa0: 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69  ration aborts wi
7fb0: 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53  th an SQLITE_BUS
7fc0: 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  Y error..*/.int 
7fd0: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
7fe0: 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e  yHandler(BusyHan
7ff0: 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  dler *p){.  int 
8000: 72 63 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  rc;.  if( NEVER(
8010: 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e  p==0) || p->xFun
8020: 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79  c==0 || p->nBusy
8030: 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <0 ) return 0;. 
8040: 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70   rc = p->xFunc(p
8050: 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79  ->pArg, p->nBusy
8060: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
8070: 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d  {.    p->nBusy =
8080: 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
8090: 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20    p->nBusy++;.  
80a0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a  }.  return rc; .
80b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
80c0: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 62  utine sets the b
80d0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  usy callback for
80e0: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
80f0: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
8100: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
8110: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
8120: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  iven argument..*
8130: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75  /.int sqlite3_bu
8140: 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  sy_handler(.  sq
8150: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
8160: 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c   (*xBusy)(void*,
8170: 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  int),.  void *pA
8180: 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  rg.){.  sqlite3_
8190: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
81a0: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75  mutex);.  db->bu
81b0: 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20  syHandler.xFunc 
81c0: 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62  = xBusy;.  db->b
81d0: 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72 67 20  usyHandler.pArg 
81e0: 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75  = pArg;.  db->bu
81f0: 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
8200: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
8210: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
8220: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
8230: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
8240: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8250: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
8260: 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACK./*.** This r
8270: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
8280: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
8290: 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20  k for an Sqlite 
82a0: 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a  database to the.
82b0: 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  ** given callbac
82c0: 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  k function with 
82d0: 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65  the given argume
82e0: 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73  nt. The progress
82f0: 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a   callback will.*
8300: 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65  * be invoked eve
8310: 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e  ry nOps opcodes.
8320: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8330: 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
8340: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
8350: 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20  , .  int nOps,. 
8360: 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73   int (*xProgress
8370: 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69  )(void*), .  voi
8380: 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c  d *pArg.){.  sql
8390: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
83a0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
83b0: 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20  f( nOps>0 ){.   
83c0: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
83d0: 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20   xProgress;.    
83e0: 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73  db->nProgressOps
83f0: 20 3d 20 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d   = nOps;.    db-
8400: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
8410: 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pArg;.  }else{. 
8420: 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73     db->xProgress
8430: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50   = 0;.    db->nP
8440: 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a  rogressOps = 0;.
8450: 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73      db->pProgres
8460: 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  sArg = 0;.  }.  
8470: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
8480: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
8490: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
84a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   This routine in
84b0: 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74  stalls a default
84c0: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68   busy handler th
84d0: 61 74 20 77 61 69 74 73 20 66 6f 72 20 74 68 65  at waits for the
84e0: 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75  .** specified nu
84f0: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
8500: 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74 75  onds before retu
8510: 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rning 0..*/.int 
8520: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
8530: 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eout(sqlite3 *db
8540: 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20 69 66 28  , int ms){.  if(
8550: 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d   ms>0 ){.    db-
8560: 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d  >busyTimeout = m
8570: 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  s;.    sqlite3_b
8580: 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20  usy_handler(db, 
8590: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
85a0: 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  yCallback, (void
85b0: 2a 29 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  *)db);.  }else{.
85c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
85d0: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20  _handler(db, 0, 
85e0: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
85f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8600: 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70  *.** Cause any p
8610: 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ending operation
8620: 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20   to stop at its 
8630: 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75  earliest opportu
8640: 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nity..*/.void sq
8650: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
8660: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
8670: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
8680: 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  pted = 1;.}.../*
8690: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
86a0: 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74 68 65  n is exactly the
86b0: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
86c0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
86d0: 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68  (), except.** th
86e0: 61 74 20 69 74 20 69 73 20 64 65 73 69 67 6e 65  at it is designe
86f0: 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62  d to be called b
8700: 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e  y internal code.
8710: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
8720: 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20  is.** that if a 
8730: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69  malloc() fails i
8740: 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  n sqlite3_create
8750: 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20  _function(), an 
8760: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
8770: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
8780: 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  e mallocFailed f
8790: 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f  lag cleared. .*/
87a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61  .int sqlite3Crea
87b0: 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  teFunc(.  sqlite
87c0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
87d0: 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61  har *zFunctionNa
87e0: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  me,.  int nArg,.
87f0: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
8800: 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20  d *pUserData,.  
8810: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
8820: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
8830: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
8840: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
8850: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
8860: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
8870: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
8880: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
8890: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
88a0: 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  ,.  FuncDestruct
88b0: 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a  or *pDestructor.
88c0: 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b  ){.  FuncDef *p;
88d0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20  .  int nName;.. 
88e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
88f0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
8900: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
8910: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30  zFunctionName==0
8920: 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63   ||.      (xFunc
8930: 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78   && (xFinal || x
8940: 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20  Step)) || .     
8950: 20 28 21 78 46 75 6e 63 20 26 26 20 28 78 46 69   (!xFunc && (xFi
8960: 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29 29 20  nal && !xStep)) 
8970: 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63  ||.      (!xFunc
8980: 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20   && (!xFinal && 
8990: 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20  xStep)) ||.     
89a0: 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72   (nArg<-1 || nAr
89b0: 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  g>SQLITE_MAX_FUN
89c0: 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20  CTION_ARG) ||.  
89d0: 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20      (255<(nName 
89e0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
89f0: 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  0( zFunctionName
8a00: 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ))) ){.    retur
8a10: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
8a20: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 0a 23 69 66  BKPT;.  }.  .#if
8a30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8a40: 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53  _UTF16.  /* If S
8a50: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73  QLITE_UTF16 is s
8a60: 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20  pecified as the 
8a70: 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74  encoding type, t
8a80: 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20  ransform this.  
8a90: 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c  ** to one of SQL
8aa0: 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
8ab0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73  QLITE_UTF16BE us
8ac0: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  ing the.  ** SQL
8ad0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
8ae0: 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54  macro. SQLITE_UT
8af0: 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20  F16 is not used 
8b00: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a  internally..  **
8b10: 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  ** If SQLITE_
8b20: 41 4e 59 20 69 73 20 73 70 65 63 69 66 69 65 64  ANY is specified
8b30: 2c 20 61 64 64 20 74 68 72 65 65 20 76 65 72 73  , add three vers
8b40: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63  ions of the func
8b50: 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tion.  ** to the
8b60: 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a   hash table..  *
8b70: 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c  /.  if( enc==SQL
8b80: 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20  ITE_UTF16 ){.   
8b90: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
8ba0: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c  F16NATIVE;.  }el
8bb0: 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49  se if( enc==SQLI
8bc0: 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e  TE_ANY ){.    in
8bd0: 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  t rc;.    rc = s
8be0: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
8bf0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
8c00: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
8c10: 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20  _UTF8,.         
8c20: 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63  pUserData, xFunc
8c30: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
8c40: 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20   pDestructor);. 
8c50: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8c60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
8c70: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
8c80: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69  Func(db, zFuncti
8c90: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51  onName, nArg, SQ
8ca0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 0a 20 20  LITE_UTF16LE,.  
8cb0: 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74          pUserDat
8cc0: 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  a, xFunc, xStep,
8cd0: 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75   xFinal, pDestru
8ce0: 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ctor);.    }.   
8cf0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8d00: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
8d10: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
8d20: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
8d30: 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65  F16BE;.  }.#else
8d40: 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  .  enc = SQLITE_
8d50: 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a  UTF8;.#endif.  .
8d60: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e    /* Check if an
8d70: 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69   existing functi
8d80: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72  on is being over
8d90: 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65  ridden or delete
8da0: 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61  d. If so,.  ** a
8db0: 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74  nd there are act
8dc0: 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65  ive VMs, then re
8dd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
8de0: 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a  . If a function.
8df0: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76    ** is being ov
8e00: 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64  erridden/deleted
8e10: 20 62 75 74 20 74 68 65 72 65 20 61 72 65 20 6e   but there are n
8e20: 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c  o active VMs, al
8e30: 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  low the.  ** ope
8e40: 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e  ration to contin
8e50: 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74  ue but invalidat
8e60: 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65  e all precompile
8e70: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
8e80: 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
8e90: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
8ea0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
8eb0: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38  nName, nArg, (u8
8ec0: 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  )enc, 0);.  if( 
8ed0: 70 20 26 26 20 70 2d 3e 69 50 72 65 66 45 6e 63  p && p->iPrefEnc
8ee0: 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67  ==enc && p->nArg
8ef0: 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66  ==nArg ){.    if
8f00: 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ( db->activeVdbe
8f10: 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Cnt ){.      sql
8f20: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
8f30: 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
8f40: 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64      "unable to d
8f50: 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65  elete/modify use
8f60: 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74  r-function due t
8f70: 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
8f80: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73  nts");.      ass
8f90: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
8fa0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
8fb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
8fc0: 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SY;.    }else{. 
8fd0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69       sqlite3Expi
8fe0: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
8ff0: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a  ents(db);.    }.
9000: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
9010: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
9020: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
9030: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  , nName, nArg, (
9040: 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73  u8)enc, 1);.  as
9050: 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61  sert(p || db->ma
9060: 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69  llocFailed);.  i
9070: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
9080: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9090: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
90a0: 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20  n older version 
90b0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
90c0: 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65  with a configure
90d0: 64 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a  d destructor is.
90e0: 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61    ** being repla
90f0: 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64  ced invoke the d
9100: 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69  estructor functi
9110: 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75  on here. */.  fu
9120: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
9130: 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65  , p);..  if( pDe
9140: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
9150: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
9160: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 44  f++;.  }.  p->pD
9170: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73  estructor = pDes
9180: 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 6c  tructor;.  p->fl
9190: 61 67 73 20 3d 20 30 3b 0a 20 20 70 2d 3e 78 46  ags = 0;.  p->xF
91a0: 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70  unc = xFunc;.  p
91b0: 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b  ->xStep = xStep;
91c0: 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20  .  p->xFinalize 
91d0: 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70  = xFinal;.  p->p
91e0: 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65 72  UserData = pUser
91f0: 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20  Data;.  p->nArg 
9200: 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72  = (u16)nArg;.  r
9210: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
9230: 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74 69   new user functi
9240: 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
9250: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
9260: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
9270: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
9280: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
9290: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
92a0: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
92b0: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
92c0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
92d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
92e0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
92f0: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
9300: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
9310: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
9320: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
9330: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
9340: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
9350: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
9360: 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20  n_v2(db, zFunc, 
9370: 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46  nArg, enc, p, xF
9380: 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20  unc, xStep,.    
9390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93b0: 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69  xFinal, 0);.}..i
93c0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
93d0: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20  e_function_v2(. 
93e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
93f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
9400: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
9410: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
9420: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
9430: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
9440: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
9450: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
9460: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
9470: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
9480: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
9490: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
94a0: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
94b0: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
94c0: 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64  (*xDestroy)(void
94d0: 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   *).){.  int rc 
94e0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
94f0: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
9500: 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20 73 71   *pArg = 0;.  sq
9510: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
9520: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
9530: 69 66 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a  if( xDestroy ){.
9540: 20 20 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63      pArg = (Func
9550: 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c  Destructor *)sql
9560: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
9570: 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63  (db, sizeof(Func
9580: 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20  Destructor));.  
9590: 20 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20    if( !pArg ){. 
95a0: 20 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29       xDestroy(p)
95b0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74  ;.      goto out
95c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67  ;.    }.    pArg
95d0: 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65  ->xDestroy = xDe
95e0: 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d  stroy;.    pArg-
95f0: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a  >pUserData = p;.
9600: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
9610: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
9620: 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e   zFunc, nArg, en
9630: 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74  c, p, xFunc, xSt
9640: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72 67  ep, xFinal, pArg
9650: 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20 26 26  );.  if( pArg &&
9660: 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29   pArg->nRef==0 )
9670: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
9680: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
9690: 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a     xDestroy(p);.
96a0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
96b0: 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d  e(db, pArg);.  }
96c0: 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73  .. out:.  rc = s
96d0: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
96e0: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
96f0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
9700: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
9710: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
9720: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
9730: 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  16.int sqlite3_c
9740: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
9750: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
9760: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
9770: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
9780: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
9790: 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64  eTextRep,.  void
97a0: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
97b0: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
97c0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
97d0: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
97e0: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
97f0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
9800: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
9810: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
9820: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
9830: 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  ext*).){.  int r
9840: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63  c;.  char *zFunc
9850: 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  8;.  sqlite3_mut
9860: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
9870: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
9880: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9890: 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73   );.  zFunc8 = s
98a0: 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
98b0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
98c0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
98d0: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20  16NATIVE);.  rc 
98e0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
98f0: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20  unc(db, zFunc8, 
9900: 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20  nArg, eTextRep, 
9910: 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  p, xFunc, xStep,
9920: 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71   xFinal,0);.  sq
9930: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9940: 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20  zFunc8);.  rc = 
9950: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
9960: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
9970: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
9980: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
9990: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
99a0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
99b0: 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  that a function 
99c0: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61  has been overloa
99d0: 64 65 64 20 62 79 20 61 20 76 69 72 74 75 61 6c  ded by a virtual
99e0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
99f0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c   the function al
9a00: 72 65 61 64 79 20 65 78 69 73 74 73 20 61 73 20  ready exists as 
9a10: 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c  a regular global
9a20: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a   function, then.
9a30: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
9a40: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20  is a no-op.  If 
9a50: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
9a60: 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
9a70: 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65  n create.** a ne
9a80: 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79  w one that alway
9a90: 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74  s throws a run-t
9aa0: 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a  ime error.  .**.
9ab0: 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20  ** When virtual 
9ac0: 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f  tables intend to
9ad0: 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72   provide an over
9ae0: 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c  loaded function,
9af0: 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20   they.** should 
9b00: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
9b10: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
9b20: 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  he global functi
9b30: 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20  on exists..** A 
9b40: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
9b50: 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72  must exist in or
9b60: 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73  der for name res
9b70: 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a  olution to work.
9b80: 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a  ** properly..*/.
9b90: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72  int sqlite3_over
9ba0: 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  load_function(. 
9bb0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
9bc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
9bd0: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b  e,.  int nArg.){
9be0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
9bf0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
9c00: 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 20  Name);.  int rc 
9c10: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
9c20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
9c30: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
9c40: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
9c50: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  Function(db, zNa
9c60: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
9c70: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
9c80: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
9c90: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
9ca0: 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  c(db, zName, nAr
9cb0: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cd0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71             0, sq
9ce0: 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63  lite3InvalidFunc
9cf0: 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tion, 0, 0, 0);.
9d00: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
9d10: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
9d20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
9d30: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
9d40: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
9d50: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
9d60: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
9d70: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
9d80: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20  trace function. 
9d90: 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74   The pArg from t
9da0: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  he previously re
9db0: 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a  gistered trace.*
9dc0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  * is returned.  
9dd0: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72  .**.** A NULL tr
9de0: 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61  ace function mea
9df0: 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69  ns that no traci
9e00: 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20  ng is executes. 
9e10: 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74   A non-NULL.** t
9e20: 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65  race is a pointe
9e30: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
9e40: 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  that is invoked 
9e50: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
9e60: 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74  each.** SQL stat
9e70: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ement..*/.void *
9e80: 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71  sqlite3_trace(sq
9e90: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
9ea0: 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c  (*xTrace)(void*,
9eb0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f  const char*), vo
9ec0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69  id *pArg){.  voi
9ed0: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
9ee0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
9ef0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
9f00: 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72  d = db->pTraceAr
9f10: 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20  g;.  db->xTrace 
9f20: 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e  = xTrace;.  db->
9f30: 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67  pTraceArg = pArg
9f40: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
9f50: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
9f60: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
9f70: 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  d;.}./*.** Regis
9f80: 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75  ter a profile fu
9f90: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72  nction.  The pAr
9fa0: 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  g from the previ
9fb0: 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
9fc0: 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e   .** profile fun
9fd0: 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65  ction is returne
9fe0: 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  d.  .**.** A NUL
9ff0: 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  L profile functi
a000: 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  on means that no
a010: 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78   profiling is ex
a020: 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e  ecutes.  A non-N
a030: 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69  ULL.** profile i
a040: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
a050: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
a060: 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
a070: 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a   conclusion of.*
a080: 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  * each SQL state
a090: 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e  ment that is run
a0a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
a0b0: 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71  e3_profile(.  sq
a0c0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
a0d0: 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f  d (*xProfile)(vo
a0e0: 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  id*,const char*,
a0f0: 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a  sqlite_uint64),.
a100: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
a110: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20    void *pOld;.  
a120: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
a130: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
a140: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72    pOld = db->pPr
a150: 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e  ofileArg;.  db->
a160: 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66  xProfile = xProf
a170: 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66  ile;.  db->pProf
a180: 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ileArg = pArg;. 
a190: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
a1a0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
a1b0: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
a1c0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
a1d0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f  TE_OMIT_TRACE */
a1e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
a1f0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62   a function to b
a200: 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61  e invoked when a
a210: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
a220: 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20  mits..** If the 
a230: 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e  invoked function
a240: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
a250: 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d  o, then the comm
a260: 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20  it becomes a.** 
a270: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  rollback..*/.voi
a280: 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69  d *sqlite3_commi
a290: 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  t_hook(.  sqlite
a2a0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
a2b0: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
a2c0: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
a2d0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
a2e0: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
a2f0: 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69  id*),  /* Functi
a300: 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20  on to invoke on 
a310: 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  each commit */. 
a320: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
a330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
a340: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
a350: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
a360: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c  oid *pOld;.  sql
a370: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
a380: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
a390: 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69  Old = db->pCommi
a3a0: 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d  tArg;.  db->xCom
a3b0: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  mitCallback = xC
a3c0: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
a3d0: 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67  CommitArg = pArg
a3e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
a3f0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
a400: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
a410: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  d;.}../*.** Regi
a420: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
a430: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
a440: 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73  ch time a row is
a450: 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73   updated,.** ins
a460: 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64  erted or deleted
a470: 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61   using this data
a480: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
a490: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
a4a0: 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20  3_update_hook(. 
a4b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
a4c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
a4d0: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
a4e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
a4f0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
a500: 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  back)(void*,int,
a510: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61  char const *,cha
a520: 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65  r const *,sqlite
a530: 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  _int64),.  void 
a540: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
a550: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
a560: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
a570: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
a580: 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Ret;.  sqlite3_m
a590: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
a5a0: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
a5b0: 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a  db->pUpdateArg;.
a5c0: 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c    db->xUpdateCal
a5d0: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
a5e0: 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65  k;.  db->pUpdate
a5f0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
a600: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
a610: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
a620: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
a630: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
a640: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
a650: 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
a660: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
a670: 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  is rolled.** bac
a680: 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  k by this databa
a690: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
a6a0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
a6b0: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20  rollback_hook(. 
a6c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
a6d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
a6e0: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
a6f0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
a700: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
a710: 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a  back)(void*), /*
a720: 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   Callback functi
a730: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  on */.  void *pA
a740: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
a750: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
a760: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
a770: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
a780: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
a790: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
a7a0: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
a7b0: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20  >pRollbackArg;. 
a7c0: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
a7d0: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
a7e0: 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62  ck;.  db->pRollb
a7f0: 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ackArg = pArg;. 
a800: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
a810: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
a820: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
a830: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
a840: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
a850: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c   The sqlite3_wal
a860: 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b  _hook() callback
a870: 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 73   registered by s
a880: 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
a890: 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20  heckpoint()..** 
a8a0: 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77  Invoke sqlite3_w
a8b0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  al_checkpoint if
a8c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
a8d0: 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
a8e0: 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
a8f0: 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33  ter than sqlite3
a900: 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f  .pWalArg cast to
a910: 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65   an integer (the
a920: 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
a930: 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f  d by.** wal_auto
a940: 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a  checkpoint())..*
a950: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61  / .int sqlite3Wa
a960: 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20  lDefaultHook(.  
a970: 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74  void *pClientDat
a980: 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  a,     /* Argume
a990: 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  nt */.  sqlite3 
a9a0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f  *db,           /
a9b0: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  * Connection */.
a9c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
a9d0: 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
a9e0: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  base */.  int nF
a9f0: 72 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  rame            
aa00: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20   /* Size of WAL 
aa10: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61  */.){.  if( nFra
aa20: 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54  me>=SQLITE_PTR_T
aa30: 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74  O_INT(pClientDat
aa40: 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  a) ){.    sqlite
aa50: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
aa60: 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oc();.    sqlite
aa70: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
aa80: 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73  (db, zDb);.    s
aa90: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
aaa0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72  alloc();.  }.  r
aab0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
aac0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
aad0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
aae0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65  ./*.** Configure
aaf0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   an sqlite3_wal_
ab00: 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20  hook() callback 
ab10: 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
ab20: 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61   checkpoint.** a
ab30: 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
ab40: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
ab50: 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
ab60: 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a  e are nFrame or.
ab70: 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69  ** more frames i
ab80: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
ab90: 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20  Passing zero or 
aba0: 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  a negative value
abb0: 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d   as the.** nFram
abc0: 65 20 70 61 72 61 6d 65 74 65 72 20 64 69 73 61  e parameter disa
abd0: 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63  bles automatic c
abe0: 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72  heckpoints entir
abf0: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ely..**.** The c
ac00: 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72  allback register
ac10: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
ac20: 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79  ion replaces any
ac30: 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61   existing callba
ac40: 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64  ck.** registered
ac50: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77   using sqlite3_w
ac60: 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77  al_hook(). Likew
ac70: 69 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67  ise, registering
ac80: 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75   a callback.** u
ac90: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c  sing sqlite3_wal
aca0: 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73  _hook() disables
acb0: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63   the automatic c
acc0: 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e  heckpoint mechan
acd0: 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65  ism.** configure
ace0: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
acf0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
ad00: 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
ad10: 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
ad20: 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a  b, int nFrame){.
ad30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
ad40: 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f  IT_WAL.  UNUSED_
ad50: 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
ad60: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
ad70: 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65  R(nFrame);.#else
ad80: 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20  .  if( nFrame>0 
ad90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  ){.    sqlite3_w
ada0: 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69  al_hook(db, sqli
adb0: 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
adc0: 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  k, SQLITE_INT_TO
add0: 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20  _PTR(nFrame));. 
ade0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
adf0: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c  te3_wal_hook(db,
ae00: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
ae10: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
ae20: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
ae30: 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
ae40: 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
ae50: 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72  d each time a tr
ae60: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69  ansaction is wri
ae70: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  tten.** into the
ae80: 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67   write-ahead-log
ae90: 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
aea0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
aeb0: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77  .void *sqlite3_w
aec0: 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  al_hook(.  sqlit
aed0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
aee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
aef0: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
af00: 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20   this db handle 
af10: 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62  */.  int(*xCallb
af20: 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c  ack)(void *, sql
af30: 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61  ite3*, const cha
af40: 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64  r*, int),.  void
af50: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
af60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
af70: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
af80: 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63  ssed to xCallbac
af90: 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  k() */.){.#ifnde
afa0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
afb0: 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  L.  void *pRet;.
afc0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
afd0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
afe0: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
aff0: 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57  WalArg;.  db->xW
b000: 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  alCallback = xCa
b010: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57  llback;.  db->pW
b020: 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  alArg = pArg;.  
b030: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
b040: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
b050: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23    return pRet;.#
b060: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b  else.  return 0;
b070: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
b080: 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61   Checkpoint data
b090: 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74  base zDb..*/.int
b0a0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
b0b0: 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71  ckpoint_v2(.  sq
b0c0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b0e0: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
b0f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
b100: 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20   *zDb,          
b110: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
b120: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
b130: 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  se (or NULL) */.
b140: 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20    int eMode,    
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b160: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
b170: 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a  KPOINT_* value *
b180: 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20  /.  int *pnLog, 
b190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1a0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
b1b0: 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66   of WAL log in f
b1c0: 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  rames */.  int *
b1d0: 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20 20  pnCkpt          
b1e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
b1f0: 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  T: Total number 
b200: 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70  of frames checkp
b210: 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66  ointed */.){.#if
b220: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b230: 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  WAL.  return SQL
b240: 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
b250: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
b260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b270: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
b280: 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51  /.  int iDb = SQ
b290: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
b2a0: 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61  D;  /* sqlite3.a
b2b0: 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62  Db[] index of db
b2c0: 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a   to checkpoint *
b2d0: 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  /..  /* Initiali
b2e0: 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  ze the output va
b2f0: 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e  riables to -1 in
b300: 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
b310: 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20  ccurs. */.  if( 
b320: 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d  pnLog ) *pnLog =
b330: 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70   -1;.  if( pnCkp
b340: 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31  t ) *pnCkpt = -1
b350: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  ;..  assert( SQL
b360: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
b370: 55 4c 4c 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b  ULL>SQLITE_CHECK
b380: 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 29 3b  POINT_PASSIVE );
b390: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
b3a0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
b3b0: 4c 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  L<SQLITE_CHECKPO
b3c0: 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20  INT_RESTART );. 
b3d0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
b3e0: 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
b3f0: 56 45 2b 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45  VE+2==SQLITE_CHE
b400: 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20  CKPOINT_RESTART 
b410: 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53  );.  if( eMode<S
b420: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
b430: 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64  _PASSIVE || eMod
b440: 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  e>SQLITE_CHECKPO
b450: 49 4e 54 5f 52 45 53 54 41 52 54 20 29 7b 0a 20  INT_RESTART ){. 
b460: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b470: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20  _MISUSE;.  }..  
b480: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
b490: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
b4a0: 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62    if( zDb && zDb
b4b0: 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d  [0] ){.    iDb =
b4c0: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
b4d0: 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d  me(db, zDb);.  }
b4e0: 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a  .  if( iDb<0 ){.
b4f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b500: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
b510: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
b520: 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f  TE_ERROR, "unkno
b530: 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22  wn database: %s"
b540: 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  , zDb);.  }else{
b550: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b560: 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  3Checkpoint(db, 
b570: 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  iDb, eMode, pnLo
b580: 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
b590: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
b5a0: 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72   rc, 0);.  }.  r
b5b0: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
b5c0: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
b5d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
b5e0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
b5f0: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
b600: 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  f.}.../*.** Chec
b610: 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
b620: 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e  zDb. If zDb is N
b630: 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62  ULL, or if the b
b640: 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73  uffer zDb points
b650: 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20  .** to contains 
b660: 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74  a zero-length st
b670: 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68  ring, all attach
b680: 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ed databases are
b690: 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65   .** checkpointe
b6a0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
b6b0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
b6c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
b6d0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
b6e0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b6f0: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
b700: 76 32 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49  v2(db, zDb, SQLI
b710: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
b720: 53 53 49 56 45 2c 20 30 2c 20 30 29 3b 0a 7d 0a  SSIVE, 0, 0);.}.
b730: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b740: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52  OMIT_WAL./*.** R
b750: 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  un a checkpoint 
b760: 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  on database iDb.
b770: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
b780: 20 69 66 20 64 61 74 61 62 61 73 65 20 69 44 62   if database iDb
b790: 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65   is.** not curre
b7a0: 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c  ntly open in WAL
b7b0: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   mode..**.** If 
b7c0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
b7d0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
b7e0: 61 62 61 73 65 20 62 65 69 6e 67 20 63 68 65 63  abase being chec
b7f0: 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a  kpointed, this .
b800: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
b810: 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rns SQLITE_LOCKE
b820: 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69  D and a checkpoi
b830: 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  nt is not attemp
b840: 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ted. If .** an e
b850: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
b860: 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68  e running the ch
b870: 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c  eckpoint, an SQL
b880: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
b890: 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28  s .** returned (
b8a0: 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  i.e. SQLITE_IOER
b8b0: 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  R). Otherwise, S
b8c0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
b8d0: 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74  The mutex on dat
b8e0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20  abase handle db 
b8f0: 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62  should be held b
b900: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68  y the caller. Th
b910: 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63  e mutex.** assoc
b920: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73  iated with the s
b930: 70 65 63 69 66 69 63 20 62 2d 74 72 65 65 20 62  pecific b-tree b
b940: 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65  eing checkpointe
b950: 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a  d is taken by.**
b960: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
b970: 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f  hile the checkpo
b980: 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a  int is running..
b990: 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20  **.** If iDb is 
b9a0: 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41  passed SQLITE_MA
b9b0: 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e  X_ATTACHED, then
b9c0: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
b9d0: 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63  tabases are.** c
b9e0: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20  heckpointed. If 
b9f0: 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
ba00: 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 72 65  untered it is re
ba10: 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  turned immediate
ba20: 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d  ly -.** no attem
ba30: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68  pt is made to ch
ba40: 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d  eckpoint any rem
ba50: 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73  aining databases
ba60: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
ba70: 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f  r eMode is one o
ba80: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  f SQLITE_CHECKPO
ba90: 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c  INT_PASSIVE, FUL
baa0: 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f  L or RESTART..*/
bab0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
bac0: 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
bad0: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  db, int iDb, int
bae0: 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c   eMode, int *pnL
baf0: 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29  og, int *pnCkpt)
bb00: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
bb10: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
bb20: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
bb30: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  de */.  int i;  
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb50: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
bb60: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
bb70: 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73 20  gh attached dbs 
bb80: 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d  */.  int bBusy =
bb90: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
bba0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
bbb0: 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20  SQLITE_BUSY has 
bbc0: 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
bbd0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
bbe0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
bbf0: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
bc00: 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67    assert( !pnLog
bc10: 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29   || *pnLog==-1 )
bc20: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 43  ;.  assert( !pnC
bc30: 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d  kpt || *pnCkpt==
bc40: 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  -1 );..  for(i=0
bc50: 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72  ; i<db->nDb && r
bc60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
bc70: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69  +){.    if( i==i
bc80: 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54  Db || iDb==SQLIT
bc90: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29  E_MAX_ATTACHED )
bca0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
bcb0: 69 74 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f  ite3BtreeCheckpo
bcc0: 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  int(db->aDb[i].p
bcd0: 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67  Bt, eMode, pnLog
bce0: 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20  , pnCkpt);.     
bcf0: 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20   pnLog = 0;.    
bd00: 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20    pnCkpt = 0;.  
bd10: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
bd20: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
bd30: 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20     bBusy = 1;.  
bd40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
bd50: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
bd60: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
bd70: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
bd80: 20 26 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c   && bBusy) ? SQL
bd90: 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d  ITE_BUSY : rc;.}
bda0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
bdb0: 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
bdc0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
bdd0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20  on returns true 
bde0: 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73  if main-memory s
bdf0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e  hould be used in
be00: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65  stead of.** a te
be10: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72  mporary file for
be20: 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72   transient pager
be30: 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65   files and state
be40: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a  ment journals..*
be50: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
be60: 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  rned depends on 
be70: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d  the value of db-
be80: 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e  >temp_store (run
be90: 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  time.** paramete
bea0: 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  r) and the compi
beb0: 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66  le time value of
bec0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
bed0: 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  RE. The.** follo
bee0: 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
bef0: 69 62 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f  ibes the relatio
bf00: 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 74 68  nship between th
bf10: 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  ese two values.*
bf20: 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  * and this funct
bf30: 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75  ions return valu
bf40: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54  e..**.**   SQLIT
bf50: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20  E_TEMP_STORE    
bf60: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
bf70: 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20      Location of 
bf80: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
bf90: 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  se.**   --------
bfa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
bfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
bfc0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
bfd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
bfe0: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
bff0: 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20             any  
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
c010: 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
c020: 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  0).**   1       
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
c060: 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
c090: 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
c0a0: 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20  eturn 1).**   1 
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0c0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
c0d0: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
c0e0: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
c0f0: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
c100: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
c110: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
c120: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
c130: 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
c140: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
c160: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
c170: 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
c1b0: 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20  n 1).**   3     
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1d0: 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
c1e0: 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
c1f0: 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73  turn 1).*/.int s
c200: 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
c210: 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ry(const sqlite3
c220: 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54   *db){.#if SQLIT
c230: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a  E_TEMP_STORE==1.
c240: 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
c250: 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a  emp_store==2 );.
c260: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
c270: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a  E_TEMP_STORE==2.
c280: 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
c290: 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a  emp_store!=1 );.
c2a0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
c2b0: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a  E_TEMP_STORE==3.
c2c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
c2d0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
c2e0: 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51  MP_STORE<1 || SQ
c2f0: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e  LITE_TEMP_STORE>
c300: 33 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  3.  return 0;.#e
c310: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
c320: 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64  turn UTF-8 encod
c330: 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  ed English langu
c340: 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  age explanation 
c350: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
c360: 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a  nt.** error..*/.
c370: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
c380: 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74  te3_errmsg(sqlit
c390: 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74  e3 *db){.  const
c3a0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
c3b0: 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
c3c0: 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
c3d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
c3e0: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
c3f0: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
c400: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
c410: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
c420: 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55  rStr(SQLITE_MISU
c430: 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20  SE_BKPT);.  }.  
c440: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
c450: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
c460: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
c470: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
c480: 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  = sqlite3ErrStr(
c490: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
c4a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20   }else{.    z = 
c4b0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
c4c0: 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45  alue_text(db->pE
c4d0: 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rr);.    assert(
c4e0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
c4f0: 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  ed );.    if( z=
c500: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  =0 ){.      z = 
c510: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
c520: 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20  ->errCode);.    
c530: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
c540: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
c550: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
c560: 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   z;.}..#ifndef S
c570: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
c580: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
c590: 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67  F-16 encoded Eng
c5a0: 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
c5b0: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  planation of the
c5c0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
c5d0: 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  error..*/.const 
c5e0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72  void *sqlite3_er
c5f0: 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a  rmsg16(sqlite3 *
c600: 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  db){.  static co
c610: 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d  nst u16 outOfMem
c620: 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20  [] = {.    'o', 
c630: 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27  'u', 't', ' ', '
c640: 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d  o', 'f', ' ', 'm
c650: 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27  ', 'e', 'm', 'o'
c660: 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20  , 'r', 'y', 0.  
c670: 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
c680: 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d  t u16 misuse[] =
c690: 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27 2c   {.    'l', 'i',
c6a0: 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c 20   'b', 'r', 'a', 
c6b0: 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a  'r', 'y', ' ', .
c6c0: 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27 75      'r', 'o', 'u
c6d0: 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e 27  ', 't', 'i', 'n'
c6e0: 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'e', ' ', .   
c6f0: 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20   'c', 'a', 'l', 
c700: 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20 27  'l', 'e', 'd', '
c710: 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 75   ', .    'o', 'u
c720: 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20 20  ', 't', ' ', .  
c730: 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c    'o', 'f', ' ',
c740: 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c 20   .    's', 'e', 
c750: 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20 27  'q', 'u', 'e', '
c760: 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30 0a  n', 'c', 'e', 0.
c770: 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f    };..  const vo
c780: 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62  id *z;.  if( !db
c790: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
c7a0: 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b  void *)outOfMem;
c7b0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
c7c0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
c7d0: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
c7e0: 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a    return (void *
c7f0: 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73  )misuse;.  }.  s
c800: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
c810: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
c820: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
c830: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d  ailed ){.    z =
c840: 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65   (void *)outOfMe
c850: 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  m;.  }else{.    
c860: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
c870: 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72  e_text16(db->pEr
c880: 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  r);.    if( z==0
c890: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c8a0: 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
c8b0: 3e 70 45 72 72 2c 20 2d 31 2c 20 73 71 6c 69 74  >pErr, -1, sqlit
c8c0: 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72  e3ErrStr(db->err
c8d0: 43 6f 64 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Code),.         
c8e0: 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53    SQLITE_UTF8, S
c8f0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
c900: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
c910: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
c920: 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20  ->pErr);.    }. 
c930: 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29     /* A malloc()
c940: 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65 64   may have failed
c950: 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
c960: 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   to sqlite3_valu
c970: 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a  e_text16().    *
c980: 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73  * above. If this
c990: 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
c9a0: 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  en the db->mallo
c9b0: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65  cFailed flag nee
c9c0: 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
c9d0: 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 72  cleared before r
c9e0: 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69  eturning. Do thi
c9f0: 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  s directly, inst
ca00: 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a  ead of via.    *
ca10: 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  * sqlite3ApiExit
ca20: 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74  (), to avoid set
ca30: 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
ca40: 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d  e handle error m
ca50: 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  essage..    */. 
ca60: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
ca70: 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  led = 0;.  }.  s
ca80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
ca90: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
caa0: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e   return z;.}.#en
cab0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
cac0: 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
cad0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** Return the mo
cae0: 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20  st recent error 
caf0: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
cb00: 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74  y an SQLite rout
cb10: 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a  ine. If NULL is.
cb20: 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ** passed to thi
cb30: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61  s function, we a
cb40: 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29  ssume a malloc()
cb50: 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73   failed during s
cb60: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a  qlite3_open()..*
cb70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72  /.int sqlite3_er
cb80: 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
cb90: 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
cba0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
cbb0: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
cbc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
cbd0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
cbe0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20  ;.  }.  if( !db 
cbf0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
cc00: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
cc10: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
cc20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d    }.  return db-
cc30: 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65  >errCode & db->e
cc40: 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71  rrMask;.}.int sq
cc50: 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
cc60: 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a  rrcode(sqlite3 *
cc70: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26  db){.  if( db &&
cc80: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
cc90: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
cca0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ccb0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
ccc0: 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62  T;.  }.  if( !db
ccd0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
cce0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
ccf0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
cd00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62  .  }.  return db
cd10: 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  ->errCode;.}../*
cd20: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
cd30: 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
cd40: 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65  ion for database
cd50: 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65   "db".  The name
cd60: 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64   is zName.** and
cd70: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73   the encoding is
cd80: 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   enc..*/.static 
cd90: 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  int createCollat
cda0: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  ion(.  sqlite3* 
cdb0: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
cdc0: 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65   *zName, .  u8 e
cdd0: 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  nc,.  void* pCtx
cde0: 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
cdf0: 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
ce00: 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
ce10: 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
ce20: 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
ce30: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
ce40: 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b  oll;.  int enc2;
ce50: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
ce60: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
ce70: 4e 61 6d 65 29 3b 0a 20 20 0a 20 20 61 73 73 65  Name);.  .  asse
ce80: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ce90: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
cea0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51  ) );..  /* If SQ
ceb0: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70  LITE_UTF16 is sp
cec0: 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65  ecified as the e
ced0: 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72  ncoding type, tr
cee0: 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a  ansform this.  *
cef0: 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49  * to one of SQLI
cf00: 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51  TE_UTF16LE or SQ
cf10: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69  LITE_UTF16BE usi
cf20: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ng the.  ** SQLI
cf30: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d  TE_UTF16NATIVE m
cf40: 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46  acro. SQLITE_UTF
cf50: 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  16 is not used i
cf60: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
cf70: 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20    enc2 = enc;.  
cf80: 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
cf90: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a  SQLITE_UTF16 );.
cfa0: 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
cfb0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  ==SQLITE_UTF16_A
cfc0: 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20  LIGNED );.  if( 
cfd0: 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
cfe0: 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49  16 || enc2==SQLI
cff0: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
d000: 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53   ){.    enc2 = S
d010: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
d020: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63  E;.  }.  if( enc
d030: 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  2<SQLITE_UTF8 ||
d040: 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46   enc2>SQLITE_UTF
d050: 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75  16BE ){.    retu
d060: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
d070: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
d080: 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63   Check if this c
d090: 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20  all is removing 
d0a0: 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20  or replacing an 
d0b0: 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69  existing collati
d0c0: 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  on .  ** sequenc
d0d0: 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68  e. If so, and th
d0e0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
d0f0: 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e  Ms, return busy.
d100: 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61   If there.  ** a
d110: 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
d120: 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  , invalidate any
d130: 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
d140: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
d150: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
d160: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
d170: 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
d180: 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   0);.  if( pColl
d190: 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   && pColl->xCmp 
d1a0: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  ){.    if( db->a
d1b0: 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a  ctiveVdbeCnt ){.
d1c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
d1d0: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
d1e0: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
d1f0: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
d200: 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  odify collation 
d210: 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20  sequence due to 
d220: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
d230: 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
d240: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
d250: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d260: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
d270: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20  atements(db);.. 
d280: 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69     /* If collati
d290: 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
d2a0: 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69  l was created di
d2b0: 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c  rectly by a call
d2c0: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
d2d0: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
d2e0: 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e  ion, and not gen
d2f0: 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43  erated by synthC
d300: 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a  ollSeq(),.    **
d310: 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73   then any copies
d320: 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f   made by synthCo
d330: 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20  llSeq() need to 
d340: 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  be invalidated..
d350: 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c      ** Also, col
d360: 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f  lation destructo
d370: 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c  r - CollSeq.xDel
d380: 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61  () - function ma
d390: 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  y need.    ** to
d3a0: 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20   be called..    
d3b0: 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f  */ .    if( (pCo
d3c0: 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54  ll->enc & ~SQLIT
d3d0: 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
d3e0: 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20  ==enc2 ){.      
d3f0: 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d  CollSeq *aColl =
d400: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
d410: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
d420: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
d430: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
d440: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
d450: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
d460: 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c  llSeq *p = &aCol
d470: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
d480: 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  ( p->enc==pColl-
d490: 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  >enc ){.        
d4a0: 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b    if( p->xDel ){
d4b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
d4c0: 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a  xDel(p->pUser);.
d4d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d4e0: 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20        p->xCmp = 
d4f0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
d500: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
d510: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
d520: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
d530: 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
d540: 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 1);.  if( pCol
d550: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
d560: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 43  LITE_NOMEM;.  pC
d570: 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d  oll->xCmp = xCom
d580: 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70  pare;.  pColl->p
d590: 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70  User = pCtx;.  p
d5a0: 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65  Coll->xDel = xDe
d5b0: 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20  l;.  pColl->enc 
d5c0: 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65  = (u8)(enc2 | (e
d5d0: 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31  nc & SQLITE_UTF1
d5e0: 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73  6_ALIGNED));.  s
d5f0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
d600: 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
d610: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d620: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  K;.}.../*.** Thi
d630: 73 20 61 72 72 61 79 20 64 65 66 69 6e 65 73 20  s array defines 
d640: 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64  hard upper bound
d650: 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65  s on limit value
d660: 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69  s.  The.** initi
d670: 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20 6b  alizer must be k
d680: 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74 68  ept in sync with
d690: 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49   the SQLITE_LIMI
d6a0: 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20  T_*.** #defines 
d6b0: 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f  in sqlite3.h..*/
d6c0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e  .static const in
d6d0: 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d  t aHardLimit[] =
d6e0: 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f   {.  SQLITE_MAX_
d6f0: 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
d700: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c  _MAX_SQL_LENGTH,
d710: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
d720: 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LUMN,.  SQLITE_M
d730: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a 20  AX_EXPR_DEPTH,. 
d740: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
d750: 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53  OUND_SELECT,.  S
d760: 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
d770: 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  P,.  SQLITE_MAX_
d780: 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20  FUNCTION_ARG,.  
d790: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
d7a0: 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  HED,.  SQLITE_MA
d7b0: 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
d7c0: 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
d7d0: 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
d7e0: 42 45 52 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  BER,.  SQLITE_MA
d7f0: 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c  X_TRIGGER_DEPTH,
d800: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  .};../*.** Make 
d810: 73 75 72 65 20 74 68 65 20 68 61 72 64 20 6c 69  sure the hard li
d820: 6d 69 74 73 20 61 72 65 20 73 65 74 20 74 6f 20  mits are set to 
d830: 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65  reasonable value
d840: 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  s.*/.#if SQLITE_
d850: 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23  MAX_LENGTH<100.#
d860: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
d870: 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  X_LENGTH must be
d880: 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65   at least 100.#e
d890: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
d8a0: 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31  MAX_SQL_LENGTH<1
d8b0: 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
d8c0: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
d8d0: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
d8e0: 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66  t 100.#endif.#if
d8f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
d900: 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41  LENGTH>SQLITE_MA
d910: 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72  X_LENGTH.# error
d920: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
d930: 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20  LENGTH must not 
d940: 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
d950: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
d960: 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  H.#endif.#if SQL
d970: 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
d980: 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f  _SELECT<2.# erro
d990: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  r SQLITE_MAX_COM
d9a0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73  POUND_SELECT mus
d9b0: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a  t be at least 2.
d9c0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
d9d0: 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30  E_MAX_VDBE_OP<40
d9e0: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
d9f0: 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74  MAX_VDBE_OP must
da00: 20 62 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a   be at least 40.
da10: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
da20: 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
da30: 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  RG<0 || SQLITE_M
da40: 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e  AX_FUNCTION_ARG>
da50: 31 30 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  1000.# error SQL
da60: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
da70: 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62 65 74  _ARG must be bet
da80: 77 65 65 6e 20 30 20 61 6e 64 20 31 30 30 30 0a  ween 0 and 1000.
da90: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
daa0: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30  E_MAX_ATTACHED<0
dab0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41   || SQLITE_MAX_A
dac0: 54 54 41 43 48 45 44 3e 36 32 0a 23 20 65 72 72  TTACHED>62.# err
dad0: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  or SQLITE_MAX_AT
dae0: 54 41 43 48 45 44 20 6d 75 73 74 20 62 65 20 62  TACHED must be b
daf0: 65 74 77 65 65 6e 20 30 20 61 6e 64 20 36 32 0a  etween 0 and 62.
db00: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
db10: 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
db20: 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72  RN_LENGTH<1.# er
db30: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
db40: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
db50: 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
db60: 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  ast 1.#endif.#if
db70: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
db80: 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72  MN>32767.# error
db90: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
dba0: 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65  MN must not exce
dbb0: 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a  ed 32767.#endif.
dbc0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  #if SQLITE_MAX_T
dbd0: 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23  RIGGER_DEPTH<1.#
dbe0: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
dbf0: 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
dc00: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
dc10: 20 31 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   1.#endif.../*.*
dc20: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
dc30: 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20  ue of a limit.  
dc40: 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  Report the old v
dc50: 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69  alue..** If an i
dc60: 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64  nvalid limit ind
dc70: 65 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20  ex is supplied, 
dc80: 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61  report -1..** Ma
dc90: 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75  ke no changes bu
dca0: 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74  t still report t
dcb0: 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20  he old value if 
dcc0: 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74  the.** new limit
dcd0: 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   is negative..**
dce0: 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20  .** A new lower 
dcf0: 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73  limit does not s
dd00: 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63  hrink existing c
dd10: 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74  onstructs..** It
dd20: 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73   merely prevents
dd30: 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20   new constructs 
dd40: 74 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20  that exceed the 
dd50: 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f  limit.** from fo
dd60: 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rming..*/.int sq
dd70: 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69  lite3_limit(sqli
dd80: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d  te3 *db, int lim
dd90: 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d  itId, int newLim
dda0: 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69  it){.  int oldLi
ddb0: 6d 69 74 3b 0a 0a 0a 20 20 2f 2a 20 45 56 49 44  mit;...  /* EVID
ddc0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39  ENCE-OF: R-30189
ddd0: 2d 35 34 30 39 37 20 46 6f 72 20 65 61 63 68 20  -54097 For each 
dde0: 6c 69 6d 69 74 20 63 61 74 65 67 6f 72 79 20 53  limit category S
ddf0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45  QLITE_LIMIT_NAME
de00: 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61  .  ** there is a
de10: 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e   hard upper boun
de20: 64 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  d set at compile
de30: 2d 74 69 6d 65 20 62 79 20 61 20 43 20 70 72 65  -time by a C pre
de40: 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d  processor.  ** m
de50: 61 63 72 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49  acro called SQLI
de60: 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68  TE_MAX_NAME. (Th
de70: 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74  e "_LIMIT_" in t
de80: 68 65 20 6e 61 6d 65 20 69 73 20 63 68 61 6e 67  he name is chang
de90: 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58  ed to.  ** "_MAX
dea0: 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65  _".).  */.  asse
deb0: 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
dec0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
ded0: 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
dee0: 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65  LENGTH );.  asse
def0: 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
df00: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f  QLITE_LIMIT_SQL_
df10: 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  LENGTH]==SQLITE_
df20: 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29  MAX_SQL_LENGTH )
df30: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
df40: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
df50: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c  MIT_COLUMN]==SQL
df60: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29  ITE_MAX_COLUMN )
df70: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
df80: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
df90: 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d  MIT_EXPR_DEPTH]=
dfa0: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  =SQLITE_MAX_EXPR
dfb0: 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
dfc0: 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
dfd0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
dfe0: 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51  OUND_SELECT]==SQ
dff0: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
e000: 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61 73 73  D_SELECT);.  ass
e010: 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
e020: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42  SQLITE_LIMIT_VDB
e030: 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  E_OP]==SQLITE_MA
e040: 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61  X_VDBE_OP );.  a
e050: 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
e060: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46  t[SQLITE_LIMIT_F
e070: 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51  UNCTION_ARG]==SQ
e080: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
e090: 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73 73 65 72  N_ARG );.  asser
e0a0: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
e0b0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43  LITE_LIMIT_ATTAC
e0c0: 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  HED]==SQLITE_MAX
e0d0: 5f 41 54 54 41 43 48 45 44 20 29 3b 0a 20 20 61  _ATTACHED );.  a
e0e0: 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
e0f0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
e100: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
e110: 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20 20 20  TH]==.          
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f       SQLITE_MAX_
e150: 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
e160: 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  GTH );.  assert(
e170: 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
e180: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
e190: 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54  E_NUMBER]==SQLIT
e1a0: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
e1b0: 55 4d 42 45 52 29 3b 0a 20 20 61 73 73 65 72 74  UMBER);.  assert
e1c0: 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
e1d0: 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
e1e0: 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
e1f0: 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
e200: 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
e210: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
e220: 47 47 45 52 5f 44 45 50 54 48 3d 3d 28 53 51 4c  GGER_DEPTH==(SQL
e230: 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29  ITE_N_LIMIT-1) )
e240: 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69 74 49  ;...  if( limitI
e250: 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d  d<0 || limitId>=
e260: 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29  SQLITE_N_LIMIT )
e270: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
e280: 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20  .  }.  oldLimit 
e290: 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d  = db->aLimit[lim
e2a0: 69 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77  itId];.  if( new
e2b0: 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20 20 20  Limit>=0 ){     
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e2d0: 20 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d 32 38   IMP: R-52476-28
e2e0: 37 33 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  732 */.    if( n
e2f0: 65 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d  ewLimit>aHardLim
e300: 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20  it[limitId] ){. 
e310: 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
e320: 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74  aHardLimit[limit
e330: 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  Id];  /* IMP: R-
e340: 35 31 34 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20  51463-25634 */. 
e350: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69     }.    db->aLi
e360: 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e  mit[limitId] = n
e370: 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72  ewLimit;.  }.  r
e380: 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20  eturn oldLimit; 
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33      /* IMP: R-53
e3b0: 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 23  341-35419 */.}.#
e3c0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
e3d0: 45 5f 45 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52  E_ENABLE_AUTO_PR
e3e0: 4f 46 49 4c 45 29 0a 2f 2a 20 73 74 64 65 72 72  OFILE)./* stderr
e3f0: 20 6c 6f 67 67 69 6e 67 20 2a 2f 0a 76 6f 69 64   logging */.void
e400: 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 70 72   _sqlite_auto_pr
e410: 6f 66 69 6c 65 28 76 6f 69 64 20 2a 61 75 78 2c  ofile(void *aux,
e420: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
e430: 2c 20 75 36 34 20 6e 73 29 3b 0a 76 6f 69 64 20  , u64 ns);.void 
e440: 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61  _sqlite_auto_tra
e450: 63 65 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f  ce(void *aux, co
e460: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 29 3b 0a  nst char *sql);.
e470: 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74  void _sqlite_aut
e480: 6f 5f 70 72 6f 66 69 6c 65 28 76 6f 69 64 20 2a  o_profile(void *
e490: 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  aux, const char 
e4a0: 2a 73 71 6c 2c 20 75 36 34 20 6e 73 29 20 7b 0a  *sql, u64 ns) {.
e4b0: 23 70 72 61 67 6d 61 20 75 6e 75 73 65 64 28 61  #pragma unused(a
e4c0: 75 78 29 0a 09 66 70 72 69 6e 74 66 28 73 74 64  ux)..fprintf(std
e4d0: 65 72 72 2c 20 22 51 75 65 72 79 3a 20 25 73 5c  err, "Query: %s\
e4e0: 6e 20 45 78 65 63 75 74 69 6f 6e 20 54 69 6d 65  n Execution Time
e4f0: 3a 20 25 6c 6c 75 20 6d 73 5c 6e 22 2c 20 73 71  : %llu ms\n", sq
e500: 6c 2c 20 6e 73 20 2f 20 31 30 30 30 30 30 30 29  l, ns / 1000000)
e510: 3b 0a 7d 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65  ;.}.void _sqlite
e520: 5f 61 75 74 6f 5f 74 72 61 63 65 28 76 6f 69 64  _auto_trace(void
e530: 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61   *aux, const cha
e540: 72 20 2a 73 71 6c 29 20 7b 0a 09 66 70 72 69 6e  r *sql) {..fprin
e550: 74 66 28 73 74 64 65 72 72 2c 20 22 54 72 61 63  tf(stderr, "Trac
e560: 65 53 51 4c 28 25 70 29 3a 20 25 73 5c 6e 22 2c  eSQL(%p): %s\n",
e570: 20 61 75 78 2c 20 73 71 6c 29 3b 0a 7d 0a 0a 2f   aux, sql);.}../
e580: 2a 20 73 79 73 6c 6f 67 20 6c 6f 67 67 69 6e 67  * syslog logging
e590: 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73   */.#include <as
e5a0: 6c 2e 68 3e 0a 73 74 61 74 69 63 20 61 73 6c 63  l.h>.static aslc
e5b0: 6c 69 65 6e 74 20 61 75 74 6f 6c 6f 67 5f 63 6c  lient autolog_cl
e5c0: 69 65 6e 74 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61  ient = NULL;.sta
e5d0: 74 69 63 20 76 6f 69 64 20 5f 63 6c 6f 73 65 5f  tic void _close_
e5e0: 61 73 6c 5f 6c 6f 67 28 29 20 7b 0a 20 20 69 66  asl_log() {.  if
e5f0: 28 20 4e 55 4c 4c 21 3d 61 75 74 6f 6c 6f 67 5f  ( NULL!=autolog_
e600: 63 6c 69 65 6e 74 20 29 7b 0a 20 20 20 20 61 73  client ){.    as
e610: 6c 5f 63 6c 6f 73 65 28 61 75 74 6f 6c 6f 67 5f  l_close(autolog_
e620: 63 6c 69 65 6e 74 29 3b 0a 20 20 20 20 61 75 74  client);.    aut
e630: 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 3d 20 4e 55  olog_client = NU
e640: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  LL;.  }.}.static
e650: 20 76 6f 69 64 20 5f 6f 70 65 6e 5f 61 73 6c 5f   void _open_asl_
e660: 6c 6f 67 28 29 20 7b 0a 20 20 69 66 28 20 4e 55  log() {.  if( NU
e670: 4c 4c 3d 3d 61 75 74 6f 6c 6f 67 5f 63 6c 69 65  LL==autolog_clie
e680: 6e 74 20 29 7b 0a 20 20 20 20 61 75 74 6f 6c 6f  nt ){.    autolo
e690: 67 5f 63 6c 69 65 6e 74 20 3d 20 61 73 6c 5f 6f  g_client = asl_o
e6a0: 70 65 6e 28 22 53 51 4c 69 74 65 22 2c 20 4e 55  pen("SQLite", NU
e6b0: 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 61 74 65 78  LL, 0);.    atex
e6c0: 69 74 28 5f 63 6c 6f 73 65 5f 61 73 6c 5f 6c 6f  it(_close_asl_lo
e6d0: 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20  g);.  }.}..void 
e6e0: 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f  _sqlite_auto_pro
e6f0: 66 69 6c 65 5f 73 79 73 6c 6f 67 28 76 6f 69 64  file_syslog(void
e700: 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61   *aux, const cha
e710: 72 20 2a 73 71 6c 2c 20 75 36 34 20 6e 73 29 3b  r *sql, u64 ns);
e720: 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75  .void _sqlite_au
e730: 74 6f 5f 74 72 61 63 65 5f 73 79 73 6c 6f 67 28  to_trace_syslog(
e740: 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74  void *aux, const
e750: 20 63 68 61 72 20 2a 73 71 6c 29 3b 0a 76 6f 69   char *sql);.voi
e760: 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 70  d _sqlite_auto_p
e770: 72 6f 66 69 6c 65 5f 73 79 73 6c 6f 67 28 76 6f  rofile_syslog(vo
e780: 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63  id *aux, const c
e790: 68 61 72 20 2a 73 71 6c 2c 20 75 36 34 20 6e 73  har *sql, u64 ns
e7a0: 29 20 7b 0a 23 70 72 61 67 6d 61 20 75 6e 75 73  ) {.#pragma unus
e7b0: 65 64 28 61 75 78 29 0a 09 61 73 6c 5f 6c 6f 67  ed(aux)..asl_log
e7c0: 28 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 2c  (autolog_client,
e7d0: 20 4e 55 4c 4c 2c 20 41 53 4c 5f 4c 45 56 45 4c   NULL, ASL_LEVEL
e7e0: 5f 4e 4f 54 49 43 45 2c 20 22 51 75 65 72 79 3a  _NOTICE, "Query:
e7f0: 20 25 73 5c 6e 20 45 78 65 63 75 74 69 6f 6e 20   %s\n Execution 
e800: 54 69 6d 65 3a 20 25 6c 6c 75 20 6d 73 5c 6e 22  Time: %llu ms\n"
e810: 2c 20 73 71 6c 2c 20 6e 73 20 2f 20 31 30 30 30  , sql, ns / 1000
e820: 30 30 30 29 3b 0a 7d 0a 76 6f 69 64 20 5f 73 71  000);.}.void _sq
e830: 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 5f  lite_auto_trace_
e840: 73 79 73 6c 6f 67 28 76 6f 69 64 20 2a 61 75 78  syslog(void *aux
e850: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  , const char *sq
e860: 6c 29 20 7b 0a 09 61 73 6c 5f 6c 6f 67 28 61 75  l) {..asl_log(au
e870: 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 2c 20 4e 55  tolog_client, NU
e880: 4c 4c 2c 20 41 53 4c 5f 4c 45 56 45 4c 5f 4e 4f  LL, ASL_LEVEL_NO
e890: 54 49 43 45 2c 20 22 54 72 61 63 65 53 51 4c 28  TICE, "TraceSQL(
e8a0: 25 70 29 3a 20 25 73 5c 6e 22 2c 20 61 75 78 2c  %p): %s\n", aux,
e8b0: 20 73 71 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a   sql);.}.#endif.
e8c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
e8d0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
e8e0: 70 61 72 73 65 20 62 6f 74 68 20 55 52 49 73 20  parse both URIs 
e8f0: 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65  and non-URI file
e900: 6e 61 6d 65 73 20 70 61 73 73 65 64 20 62 79 20  names passed by 
e910: 74 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41  the.** user to A
e920: 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c  PI functions sql
e930: 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73  ite3_open() or s
e940: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
e950: 2c 20 61 6e 64 20 66 6f 72 20 64 61 74 61 62 61  , and for databa
e960: 73 65 0a 2a 2a 20 55 52 49 73 20 73 70 65 63 69  se.** URIs speci
e970: 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  fied as part of 
e980: 41 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74  ATTACH statement
e990: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  s..**.** The fir
e9a0: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  st argument to t
e9b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
e9c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
e9d0: 56 46 53 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a  VFS to use (or.*
e9e0: 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e  * a NULL to sign
e9f0: 69 66 79 20 74 68 65 20 64 65 66 61 75 6c 74 20  ify the default 
ea00: 56 46 53 29 20 69 66 20 74 68 65 20 55 52 49 20  VFS) if the URI 
ea10: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
ea20: 20 61 20 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20   a "vfs=xxx".** 
ea30: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
ea40: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
ea50: 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  ment contains th
ea60: 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52  e URI (or non-UR
ea70: 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69  I filename).** i
ea80: 74 73 65 6c 66 2e 20 57 68 65 6e 20 74 68 69 73  tself. When this
ea90: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
eaa0: 6c 65 64 20 74 68 65 20 2a 70 46 6c 61 67 73 20  led the *pFlags 
eab0: 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20  variable should 
eac0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64  contain.** the d
ead0: 65 66 61 75 6c 74 20 66 6c 61 67 73 20 74 6f 20  efault flags to 
eae0: 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  open the databas
eaf0: 65 20 68 61 6e 64 6c 65 20 77 69 74 68 2e 20 54  e handle with. T
eb00: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
eb10: 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61  in.** *pFlags ma
eb20: 79 20 62 65 20 75 70 64 61 74 65 64 20 62 65 66  y be updated bef
eb30: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 66  ore returning if
eb40: 20 74 68 65 20 55 52 49 20 66 69 6c 65 6e 61 6d   the URI filenam
eb50: 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22  e contains .** "
eb60: 63 61 63 68 65 3d 78 78 78 22 20 6f 72 20 22 6d  cache=xxx" or "m
eb70: 6f 64 65 3d 78 78 78 22 20 71 75 65 72 79 20 70  ode=xxx" query p
eb80: 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  arameters..**.**
eb90: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
eba0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
ebb0: 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  urned. In this c
ebc0: 61 73 65 20 2a 70 70 56 66 73 20 69 73 20 73 65  ase *ppVfs is se
ebd0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a  t to point to.**
ebe0: 20 74 68 65 20 56 46 53 20 74 68 61 74 20 73 68   the VFS that sh
ebf0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20  ould be used to 
ec00: 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  open the databas
ec10: 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20  e file. *pzFile 
ec20: 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69  is set to.** poi
ec30: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
ec40: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61  ontaining the na
ec50: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  me of the file t
ec60: 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73 20 74 68  o open. It is th
ec70: 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
ec80: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
ec90: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
eca0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72   call sqlite3_fr
ecb0: 65 65 28 29 20 74 6f 20 72 65 6c 65 61 73 65 0a  ee() to release.
ecc0: 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 2e 0a  ** this buffer..
ecd0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
ece0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 61  r occurs, then a
ecf0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
ed00: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
ed10: 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a  and *pzErrMsg.**
ed20: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70   may be set to p
ed30: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
ed40: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45   containing an E
ed50: 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
ed60: 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67  error .** messag
ed70: 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
ed80: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
ed90: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
eda0: 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a  ntually release.
edb0: 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62  ** this buffer b
edc0: 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
edd0: 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74  3_free()..*/.int
ede0: 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
edf0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
ee00: 7a 44 65 66 61 75 6c 74 56 66 73 2c 20 20 20 20  zDefaultVfs,    
ee10: 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
ee20: 65 20 69 66 20 6e 6f 20 22 76 66 73 3d 78 78 78  e if no "vfs=xxx
ee30: 22 20 71 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a  " query option *
ee40: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
ee50: 7a 55 72 69 2c 20 20 20 20 20 20 20 20 20 20 20  zUri,           
ee60: 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69      /* Nul-termi
ee70: 6e 61 74 65 64 20 55 52 49 20 74 6f 20 70 61 72  nated URI to par
ee80: 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  se */.  unsigned
ee90: 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20   int *pFlags,   
eea0: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
eeb0: 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58  T: SQLITE_OPEN_X
eec0: 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71  XX flags */.  sq
eed0: 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70 70 56 66  lite3_vfs **ppVf
eee0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
eef0: 20 4f 55 54 3a 20 56 46 53 20 74 6f 20 75 73 65   OUT: VFS to use
ef00: 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a   */ .  char **pz
ef10: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
ef20: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46         /* OUT: F
ef30: 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e  ilename componen
ef40: 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63 68  t of URI */.  ch
ef50: 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20  ar **pzErrMsg   
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef70: 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73   OUT: Error mess
ef80: 61 67 65 20 28 69 66 20 72 63 21 3d 53 51 4c 49  age (if rc!=SQLI
ef90: 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69  TE_OK) */.){.  i
efa0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
efb0: 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  K;.  unsigned in
efc0: 74 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67  t flags = *pFlag
efd0: 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  s;.  const char 
efe0: 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61 75 6c 74  *zVfs = zDefault
eff0: 56 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  Vfs;.  char *zFi
f000: 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20  le;.  char c;.  
f010: 69 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c 69 74  int nUri = sqlit
f020: 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 72 69 29  e3Strlen30(zUri)
f030: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 7a  ;..  assert( *pz
f040: 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20  ErrMsg==0 );..  
f050: 69 66 28 20 28 28 66 6c 61 67 73 20 26 20 53 51  if( ((flags & SQ
f060: 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c  LITE_OPEN_URI) |
f070: 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  | sqlite3GlobalC
f080: 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 29 20  onfig.bOpenUri) 
f090: 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35 20 26  .   && nUri>=5 &
f0a0: 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20 22  & memcmp(zUri, "
f0b0: 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 0a 20  file:", 5)==0 . 
f0c0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   ){.    char *zO
f0d0: 70 74 3b 0a 20 20 20 20 69 6e 74 20 65 53 74 61  pt;.    int eSta
f0e0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
f0f0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
f100: 73 74 61 74 65 20 77 68 65 6e 20 70 61 72 73 69  state when parsi
f110: 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e  ng URI */.    in
f120: 74 20 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20  t iIn;          
f130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
f140: 6e 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69  nput character i
f150: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
f160: 69 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  iOut = 0;       
f170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
f180: 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e  put character in
f190: 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  dex */.    int n
f1a0: 42 79 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20  Byte = nUri+2;  
f1b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
f1c0: 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c  s of space to al
f1d0: 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f  locate */..    /
f1e0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
f1f0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20  SQLITE_OPEN_URI 
f200: 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 69  flag is set to i
f210: 6e 64 69 63 61 74 65 20 74 6f 20 74 68 65 20 56  ndicate to the V
f220: 46 53 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a  FS xOpen .    **
f230: 20 6d 65 74 68 6f 64 20 74 68 61 74 20 74 68 65   method that the
f240: 72 65 20 6d 61 79 20 62 65 20 65 78 74 72 61 20  re may be extra 
f250: 70 61 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f  parameters follo
f260: 77 69 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e 61  wing the file-na
f270: 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67  me.  */.    flag
f280: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
f290: 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69  _URI;..    for(i
f2a0: 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20  In=0; iIn<nUri; 
f2b0: 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20  iIn++) nByte += 
f2c0: 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29  (zUri[iIn]=='&')
f2d0: 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71  ;.    zFile = sq
f2e0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79  lite3_malloc(nBy
f2f0: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46  te);.    if( !zF
f300: 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ile ) return SQL
f310: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20  ITE_NOMEM;..    
f320: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 73  /* Discard the s
f330: 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72  cheme and author
f340: 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20  ity segments of 
f350: 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20  the URI. */.    
f360: 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27  if( zUri[5]=='/'
f370: 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27   && zUri[6]=='/'
f380: 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20   ){.      iIn = 
f390: 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  7;.      while( 
f3a0: 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72  zUri[iIn] && zUr
f3b0: 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49  i[iIn]!='/' ) iI
f3c0: 6e 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  n++;..      if( 
f3d0: 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d  iIn!=7 && (iIn!=
f3e0: 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f  16 || memcmp("lo
f3f0: 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b  calhost", &zUri[
f400: 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20  7], 9)) ){.     
f410: 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
f420: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
f430: 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74 68  invalid uri auth
f440: 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20  ority: %.*s", . 
f450: 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37             iIn-7
f460: 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20  , &zUri[7]);.   
f470: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f480: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
f490: 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
f4a0: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
f4b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 49 6e  }else{.      iIn
f4c0: 20 3d 20 35 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 5;.    }..   
f4d0: 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c   /* Copy the fil
f4e0: 65 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75  ename and any qu
f4f0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 69  ery parameters i
f500: 6e 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75  nto the zFile bu
f510: 66 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65  ffer. .    ** De
f520: 63 6f 64 65 20 25 48 48 20 65 73 63 61 70 65 20  code %HH escape 
f530: 63 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20  codes along the 
f540: 77 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  way. .    **.   
f550: 20 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20   ** Within this 
f560: 6c 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65  loop, variable e
f570: 53 74 61 74 65 20 6d 61 79 20 62 65 20 73 65 74  State may be set
f580: 20 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64   to 0, 1 or 2, d
f590: 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20  epending.    ** 
f5a0: 6f 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20 63  on the parsing c
f5b0: 6f 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f  ontext. As follo
f5c0: 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ws:.    **.    *
f5d0: 2a 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66  *   0: Parsing f
f5e0: 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a  ile-name..    **
f5f0: 20 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61     1: Parsing na
f600: 6d 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20  me section of a 
f610: 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79  name=value query
f620: 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20   parameter..    
f630: 2a 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20  **   2: Parsing 
f640: 76 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66  value section of
f650: 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75   a name=value qu
f660: 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20  ery parameter.. 
f670: 20 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65     */.    eState
f680: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
f690: 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29   (c = zUri[iIn])
f6a0: 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b  !=0 && c!='#' ){
f6b0: 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20  .      iIn++;.  
f6c0: 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a      if( c=='%' .
f6d0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
f6e0: 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69  3Isxdigit(zUri[i
f6f0: 49 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20  In]) .       && 
f700: 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
f710: 7a 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20  zUri[iIn+1]) .  
f720: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
f730: 6e 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69  nt octet = (sqli
f740: 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69  te3HexToInt(zUri
f750: 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a  [iIn++]) << 4);.
f760: 20 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d          octet +=
f770: 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74   sqlite3HexToInt
f780: 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a  (zUri[iIn++]);..
f790: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f7a0: 6f 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65  octet>=0 && octe
f7b0: 74 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20  t<256 );.       
f7c0: 20 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b   if( octet==0 ){
f7d0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
f7e0: 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
f7f0: 65 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61 70  en when "%00" ap
f800: 70 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65  pears within the
f810: 20 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20   URI. In this.  
f820: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
f830: 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65  we ignore all te
f840: 78 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e  xt in the remain
f850: 64 65 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c  der of the path,
f860: 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20   name or.       
f870: 20 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72     ** value curr
f880: 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73  ently being pars
f890: 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68  ed. So ignore th
f8a0: 65 20 63 75 72 72 65 6e 74 20 63 68 61 72 61 63  e current charac
f8b0: 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ter.          **
f8c0: 20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65   and skip to the
f8d0: 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f   next "?", "=" o
f8e0: 72 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70  r "&", as approp
f8f0: 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20  riate. */.      
f900: 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
f910: 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26  zUri[iIn])!=0 &&
f920: 20 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20   c!='#' .       
f930: 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
f940: 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a  e!=0 || c!='?').
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
f960: 20 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28   (eState!=1 || (
f970: 63 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27  c!='=' && c!='&'
f980: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
f990: 20 26 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c   && (eState!=2 |
f9a0: 7c 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20  | c!='&').      
f9b0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
f9c0: 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20     iIn++;.      
f9d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f9e0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
f9f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20    }.        c = 
fa00: 6f 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c  octet;.      }el
fa10: 73 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31  se if( eState==1
fa20: 20 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63   && (c=='&' || c
fa30: 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20  =='=') ){.      
fa40: 20 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74    if( zFile[iOut
fa50: 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1]==0 ){.      
fa60: 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20      /* An empty 
fa70: 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e  option name. Ign
fa80: 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20  ore this option 
fa90: 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20  altogether. */. 
faa0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
fab0: 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72  zUri[iIn] && zUr
fac0: 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a  i[iIn]!='#' && z
fad0: 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20  Uri[iIn-1]!='&' 
fae0: 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  ) iIn++;.       
faf0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
fb00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
fb10: 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20  f( c=='&' ){.   
fb20: 20 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75         zFile[iOu
fb30: 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  t++] = '\0';.   
fb40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fb50: 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 32        eState = 2
fb60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fb70: 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
fb80: 20 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74 61   }else if( (eSta
fb90: 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29  te==0 && c=='?')
fba0: 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20 26   || (eState==2 &
fbb0: 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20  & c=='&') ){.   
fbc0: 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
fbd0: 20 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b 0a      eState = 1;.
fbe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46        }.      zF
fbf0: 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b  ile[iOut++] = c;
fc00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
fc10: 53 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65  State==1 ) zFile
fc20: 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
fc30: 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  .    zFile[iOut+
fc40: 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  +] = '\0';.    z
fc50: 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
fc60: 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  \0';..    /* Che
fc70: 63 6b 20 69 66 20 74 68 65 72 65 20 77 65 72 65  ck if there were
fc80: 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70 65   any options spe
fc90: 63 69 66 69 65 64 20 74 68 61 74 20 73 68 6f 75  cified that shou
fca0: 6c 64 20 62 65 20 69 6e 74 65 72 70 72 65 74 65  ld be interprete
fcb0: 64 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e 20  d .    ** here. 
fcc0: 4f 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65  Options that are
fcd0: 20 69 6e 74 65 72 70 72 65 74 65 64 20 68 65 72   interpreted her
fce0: 65 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22 20  e include "vfs" 
fcf0: 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a 20  and those that. 
fd00: 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64     ** correspond
fd10: 20 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20 6d   to flags that m
fd20: 61 79 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  ay be passed to 
fd30: 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  the sqlite3_open
fd40: 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74  _v2().    ** met
fd50: 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74  hod. */.    zOpt
fd60: 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65   = &zFile[sqlite
fd70: 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
fd80: 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  +1];.    while( 
fd90: 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  zOpt[0] ){.     
fda0: 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69   int nOpt = sqli
fdb0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74  te3Strlen30(zOpt
fdc0: 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  );.      char *z
fdd0: 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74  Val = &zOpt[nOpt
fde0: 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  +1];.      int n
fdf0: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Val = sqlite3Str
fe00: 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20  len30(zVal);..  
fe10: 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20      if( nOpt==3 
fe20: 26 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c  && memcmp("vfs",
fe30: 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a   zOpt, 3)==0 ){.
fe40: 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 7a          zVfs = z
fe50: 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Val;.      }else
fe60: 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
fe70: 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20   OpenMode {.    
fe80: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
fe90: 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 69   *z;.          i
fea0: 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  nt mode;.       
feb0: 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20   } *aMode = 0;. 
fec0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f         char *zMo
fed0: 64 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  deType = 0;.    
fee0: 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30      int mask = 0
fef0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 69  ;.        int li
ff00: 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  mit = 0;..      
ff10: 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26    if( nOpt==5 &&
ff20: 20 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22 2c   memcmp("cache",
ff30: 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a   zOpt, 5)==0 ){.
ff40: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
ff50: 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
ff60: 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20   aCacheMode[] = 
ff70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  {.            { 
ff80: 22 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49 54  "shared",  SQLIT
ff90: 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
ffa0: 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  HE },.          
ffb0: 20 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20 53    { "private", S
ffc0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
ffd0: 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20  TECACHE },.     
ffe0: 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a         { 0, 0 }.
fff0: 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20            };..  
10000 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53          mask = S
10010 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
10020 44 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50  DCACHE|SQLITE_OP
10030 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 3b  EN_PRIVATECACHE;
10040 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65  .          aMode
10050 20 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20   = aCacheMode;. 
10060 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d           limit =
10070 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20   mask;.         
10080 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63 61   zModeType = "ca
10090 63 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  che";.        }.
100a0 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74          if( nOpt
100b0 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d  ==4 && memcmp("m
100c0 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d  ode", zOpt, 4)==
100d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
100e0 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65  tatic struct Ope
100f0 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b  nMode aOpenMode[
10100 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
10110 20 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49 54    { "ro",  SQLIT
10120 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
10130 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
10140 20 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f   "rw",  SQLITE_O
10150 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c  PEN_READWRITE },
10160 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20   .            { 
10170 22 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50  "rwc", SQLITE_OP
10180 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
10190 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
101a0 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
101b0 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c   { "memory", SQL
101c0 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20  ITE_OPEN_MEMORY 
101d0 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
101e0 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20   0, 0 }.        
101f0 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20    };..          
10200 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50  mask = SQLITE_OP
10210 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51  EN_READONLY | SQ
10220 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
10230 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  ITE.            
10240 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
10250 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51  OPEN_CREATE | SQ
10260 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
10270 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64  ;.          aMod
10280 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20  e = aOpenMode;. 
10290 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d           limit =
102a0 20 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20   mask & flags;. 
102b0 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79           zModeTy
102c0 70 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20  pe = "access";. 
102d0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
102e0 20 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20    if( aMode ){. 
102f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
10300 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f            int mo
10310 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
10320 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65    for(i=0; aMode
10330 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20  [i].z; i++){.   
10340 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
10350 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69  har *z = aMode[i
10360 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ].z;.           
10370 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74   if( nVal==sqlit
10380 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26  e3Strlen30(z) &&
10390 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c   0==memcmp(zVal,
103a0 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20   z, nVal) ){.   
103b0 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20             mode 
103c0 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b  = aMode[i].mode;
103d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
103e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
103f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
10400 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f            if( mo
10410 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  de==0 ){.       
10420 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
10430 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
10440 28 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64  ("no such %s mod
10450 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70  e: %s", zModeTyp
10460 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  e, zVal);.      
10470 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10480 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
10490 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f       goto parse_
104a0 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  uri_out;.       
104b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
104c0 66 28 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49  f( (mode & ~SQLI
104d0 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e  TE_OPEN_MEMORY)>
104e0 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  limit ){.       
104f0 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
10500 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
10510 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c  ("%s mode not al
10520 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20 20 20  lowed: %s",.    
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10550 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a      zModeType, z
10560 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Val);.          
10570 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 45    rc = SQLITE_PE
10580 52 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  RM;.            
10590 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
105a0 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ut;.          }.
105b0 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
105c0 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b  = (flags & ~mask
105d0 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20  ) | mode;.      
105e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
105f0 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b     zOpt = &zVal[
10600 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a  nVal+1];.    }..
10610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69    }else{.    zFi
10620 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  le = sqlite3_mal
10630 6c 6f 63 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20  loc(nUri+2);.   
10640 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65   if( !zFile ) re
10650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
10660 4d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 46  M;.    memcpy(zF
10670 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29  ile, zUri, nUri)
10680 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69  ;.    zFile[nUri
10690 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
106a0 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c  ile[nUri+1] = '\
106b0 30 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d  0';.    flags &=
106c0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52   ~SQLITE_OPEN_UR
106d0 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73  I;.  }..  *ppVfs
106e0 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
106f0 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28  ind(zVfs);.  if(
10700 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20   *ppVfs==0 ){.  
10710 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
10720 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e  lite3_mprintf("n
10730 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c  o such vfs: %s",
10740 20 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d   zVfs);.    rc =
10750 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
10760 20 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75   }. parse_uri_ou
10770 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
10780 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
10790 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
107a0 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30  );.    zFile = 0
107b0 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20  ;.  }.  *pFlags 
107c0 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69  = flags;.  *pzFi
107d0 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65  le = zFile;.  re
107e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
107f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
10800 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49  NABLE_AUTO_PROFI
10810 4c 45 29 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  LE).#define SQLI
10820 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
10830 54 44 45 52 52 20 31 0a 23 64 65 66 69 6e 65 20  TDERR 1.#define 
10840 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
10850 4e 47 5f 53 59 53 4c 4f 47 20 32 0a 73 74 61 74  NG_SYSLOG 2.stat
10860 69 63 20 76 6f 69 64 20 65 6e 61 62 6c 65 41 75  ic void enableAu
10870 74 6f 4c 6f 67 67 69 6e 67 28 0a 20 20 73 71 6c  toLogging(.  sql
10880 69 74 65 33 20 2a 64 62 0a 29 7b 0a 20 20 63 68  ite3 *db.){.  ch
10890 61 72 20 2a 65 6e 76 70 72 6f 66 69 6c 65 20 3d  ar *envprofile =
108a0 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
108b0 41 55 54 4f 5f 50 52 4f 46 49 4c 45 22 29 3b 0a  AUTO_PROFILE");.
108c0 20 20 0a 20 20 69 66 28 20 65 6e 76 70 72 6f 66    .  if( envprof
108d0 69 6c 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  ile!=NULL ){.   
108e0 20 69 6e 74 20 77 68 65 72 65 20 3d 20 30 3b 0a   int where = 0;.
108f0 20 20 20 20 69 66 28 20 21 73 74 72 6e 63 61 73      if( !strncas
10900 65 63 6d 70 28 22 31 22 2c 20 65 6e 76 70 72 6f  ecmp("1", envpro
10910 66 69 6c 65 2c 20 31 29 20 29 7b 0a 20 20 20 20  file, 1) ){.    
10920 20 20 69 66 28 20 69 73 61 74 74 79 28 53 54 44    if( isatty(STD
10930 45 52 52 5f 46 49 4c 45 4e 4f 29 20 29 7b 0a 20  ERR_FILENO) ){. 
10940 20 20 20 20 20 20 20 77 68 65 72 65 20 3d 20 53         where = S
10950 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e  QLITE_AUTOLOGGIN
10960 47 5f 53 54 44 45 52 52 3b 0a 20 20 20 20 20 20  G_STDERR;.      
10970 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77  }else{.        w
10980 68 65 72 65 20 3d 20 53 51 4c 49 54 45 5f 41 55  here = SQLITE_AU
10990 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47  TOLOGGING_SYSLOG
109a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
109b0 65 6c 73 65 20 69 66 28 20 21 73 74 72 6e 63 61  else if( !strnca
109c0 73 65 63 6d 70 28 22 73 74 64 65 72 72 22 2c 20  secmp("stderr", 
109d0 65 6e 76 70 72 6f 66 69 6c 65 2c 20 36 29 20 29  envprofile, 6) )
109e0 7b 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d 20  {.      where = 
109f0 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
10a00 4e 47 5f 53 54 44 45 52 52 3b 0a 20 20 20 20 7d  NG_STDERR;.    }
10a10 20 65 6c 73 65 20 69 66 28 20 21 73 74 72 6e 63   else if( !strnc
10a20 61 73 65 63 6d 70 28 22 73 79 73 6c 6f 67 22 2c  asecmp("syslog",
10a30 20 65 6e 76 70 72 6f 66 69 6c 65 2c 20 36 29 20   envprofile, 6) 
10a40 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d  ){.      where =
10a50 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47   SQLITE_AUTOLOGG
10a60 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20 20 20 20  ING_SYSLOG;.    
10a70 7d 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 3d  }.    if( where=
10a80 3d 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47  =SQLITE_AUTOLOGG
10a90 49 4e 47 5f 53 54 44 45 52 52 20 29 7b 0a 20 20  ING_STDERR ){.  
10aa0 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66      sqlite3_prof
10ab0 69 6c 65 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f  ile(db, _sqlite_
10ac0 61 75 74 6f 5f 70 72 6f 66 69 6c 65 2c 20 64 62  auto_profile, db
10ad0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
10ae0 20 77 68 65 72 65 3d 3d 53 51 4c 49 54 45 5f 41   where==SQLITE_A
10af0 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f  UTOLOGGING_SYSLO
10b00 47 20 29 7b 0a 20 20 20 20 20 20 5f 6f 70 65 6e  G ){.      _open
10b10 5f 61 73 6c 5f 6c 6f 67 28 29 3b 0a 20 20 20 20  _asl_log();.    
10b20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c    sqlite3_profil
10b30 65 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75  e(db, _sqlite_au
10b40 74 6f 5f 70 72 6f 66 69 6c 65 5f 73 79 73 6c 6f  to_profile_syslo
10b50 67 2c 20 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  g, db);.    }.  
10b60 7d 0a 20 20 63 68 61 72 20 2a 65 6e 76 74 72 61  }.  char *envtra
10b70 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  ce = getenv("SQL
10b80 49 54 45 5f 41 55 54 4f 5f 54 52 41 43 45 22 29  ITE_AUTO_TRACE")
10b90 3b 0a 20 20 69 66 28 20 65 6e 76 74 72 61 63 65  ;.  if( envtrace
10ba0 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 6e  !=NULL ){.    in
10bb0 74 20 77 68 65 72 65 20 3d 20 30 3b 0a 20 20 20  t where = 0;.   
10bc0 20 69 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d   if( !strncasecm
10bd0 70 28 22 31 22 2c 20 65 6e 76 74 72 61 63 65 2c  p("1", envtrace,
10be0 20 31 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28   1) ){.      if(
10bf0 20 69 73 61 74 74 79 28 53 54 44 45 52 52 5f 46   isatty(STDERR_F
10c00 49 4c 45 4e 4f 29 20 29 7b 0a 20 20 20 20 20 20  ILENO) ){.      
10c10 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45    where = SQLITE
10c20 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44  _AUTOLOGGING_STD
10c30 45 52 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ERR;.      }else
10c40 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 20  {.        where 
10c50 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47  = SQLITE_AUTOLOG
10c60 47 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20 20 20  GING_SYSLOG;.   
10c70 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
10c80 69 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70  if( !strncasecmp
10c90 28 22 73 74 64 65 72 72 22 2c 20 65 6e 76 74 72  ("stderr", envtr
10ca0 61 63 65 2c 20 36 29 20 29 7b 0a 20 20 20 20 20  ace, 6) ){.     
10cb0 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45 5f   where = SQLITE_
10cc0 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44 45  AUTOLOGGING_STDE
10cd0 52 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  RR;.    } else i
10ce0 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70 28  f( !strncasecmp(
10cf0 22 73 79 73 6c 6f 67 22 2c 20 65 6e 76 74 72 61  "syslog", envtra
10d00 63 65 2c 20 36 29 20 29 7b 0a 20 20 20 20 20 20  ce, 6) ){.      
10d10 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45 5f 41  where = SQLITE_A
10d20 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f  UTOLOGGING_SYSLO
10d30 47 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  G;.    }.    if(
10d40 20 77 68 65 72 65 3d 3d 53 51 4c 49 54 45 5f 41   where==SQLITE_A
10d50 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44 45 52  UTOLOGGING_STDER
10d60 52 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R ){.      sqlit
10d70 65 33 5f 74 72 61 63 65 28 64 62 2c 20 5f 73 71  e3_trace(db, _sq
10d80 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 2c  lite_auto_trace,
10d90 20 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20   db);.    }else 
10da0 69 66 28 20 77 68 65 72 65 3d 3d 53 51 4c 49 54  if( where==SQLIT
10db0 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59  E_AUTOLOGGING_SY
10dc0 53 4c 4f 47 20 29 7b 0a 20 20 20 20 20 20 5f 6f  SLOG ){.      _o
10dd0 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28 29 3b 0a 20  pen_asl_log();. 
10de0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
10df0 63 65 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61  ce(db, _sqlite_a
10e00 75 74 6f 5f 74 72 61 63 65 5f 73 79 73 6c 6f 67  uto_trace_syslog
10e10 2c 20 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , db);.    }.  }
10e20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
10e30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
10e40 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f  es the work of o
10e50 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73  pening a databas
10e60 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a  e on behalf of.*
10e70 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
10e80 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65   and sqlite3_ope
10e90 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74 61 62  n16(). The datab
10ea0 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46  ase filename "zF
10eb0 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73  ilename"  .** is
10ec0 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a   UTF-8 encoded..
10ed0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
10ee0 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f  enDatabase(.  co
10ef0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
10f00 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65  ame, /* Database
10f10 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20   filename UTF-8 
10f20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c  encoded */.  sql
10f30 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20  ite3 **ppDb,    
10f40 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
10f50 72 6e 65 64 20 64 61 74 61 62 61 73 65 20 68 61  rned database ha
10f60 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ndle */.  unsign
10f70 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  ed int flags,   
10f80 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20   /* Operational 
10f90 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  flags */.  const
10fa0 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20   char *zVfs     
10fb0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
10fc0 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29   VFS to use */.)
10fd0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
10fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ff0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c      /* Store all
11000 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65  ocated handle he
11010 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  re */.  int rc; 
11020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11030 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
11040 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
11050 69 73 54 68 72 65 61 64 73 61 66 65 3b 20 20 20  isThreadsafe;   
11060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11070 72 75 65 20 66 6f 72 20 74 68 72 65 61 64 73 61  rue for threadsa
11080 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  fe connections *
11090 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20  /.  char *zOpen 
110a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
110b0 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
110c0 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  argument to pass
110d0 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20   to BtreeOpen() 
110e0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  */.  char *zErrM
110f0 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sg = 0;         
11100 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65       /* Error me
11110 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74  ssage from sqlit
11120 65 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a  e3ParseUri() */.
11130 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
11140 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11150 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
11160 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
11170 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
11180 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
11190 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20  ndif..  /* Only 
111a0 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63  allow sensible c
111b0 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62  ombinations of b
111c0 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73  its in the flags
111d0 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a   argument.  .  *
111e0 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  * Throw an error
111f0 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73   if any non-sens
11200 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73  e combination is
11210 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20   used.  If we.  
11220 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20  ** do not block 
11230 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74  illegal combinat
11240 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f  ions here, it co
11250 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  uld trigger.  **
11260 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
11270 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c  ents in deeper l
11280 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65  ayers.  Sensible
11290 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20   combinations.  
112a0 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a  ** are:.  **.  *
112b0 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  1:  SQLITE_OP
112c0 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  EN_READONLY.  **
112d0 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    2:  SQLITE_OPE
112e0 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a  N_READWRITE.  **
112f0 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    6:  SQLITE_OPE
11300 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
11310 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
11320 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
11330 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11340 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b  ONLY  == 0x01 );
11350 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
11360 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
11370 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73   == 0x02 );.  as
11380 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
11390 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30  N_CREATE    == 0
113a0 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73  x04 );.  testcas
113b0 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
113c0 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45  )==0x02 ); /* RE
113d0 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74  ADONLY */.  test
113e0 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
113f0 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a  &7))==0x04 ); /*
11400 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20   READWRITE */.  
11410 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
11420 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29  lags&7))==0x40 )
11430 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c  ; /* READWRITE |
11440 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28   CREATE */.  if(
11450 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29   ((1<<(flags&7))
11460 20 26 20 30 78 34 36 29 3d 3d 30 20 29 20 72 65   & 0x46)==0 ) re
11470 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
11480 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 69 66 28 20  SE_BKPT;..  if( 
11490 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
114a0 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d  fig.bCoreMutex==
114b0 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  0 ){.    isThrea
114c0 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
114d0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
114e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
114f0 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  EX ){.    isThre
11500 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65  adsafe = 0;.  }e
11510 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
11520 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
11530 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54  MUTEX ){.    isT
11540 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20  hreadsafe = 1;. 
11550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68   }else{.    isTh
11560 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74  readsafe = sqlit
11570 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
11580 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20  FullMutex;.  }. 
11590 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
115a0 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
115b0 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61  CACHE ){.    fla
115c0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
115d0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  EN_SHAREDCACHE;.
115e0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
115f0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
11600 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
11610 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  ed ){.    flags 
11620 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  |= SQLITE_OPEN_S
11630 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
11640 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72  .  /* Remove har
11650 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74  mful bits from t
11660 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
11670 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  er.  **.  ** The
11680 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
11690 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f  UTEX and SQLITE_
116a0 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66  OPEN_FULLMUTEX f
116b0 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64  lags were.  ** d
116c0 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65  ealt with in the
116d0 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62   previous code b
116e0 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74  lock.  Besides t
116f0 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20  hese, the only. 
11700 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20   ** valid input 
11710 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  flags for sqlite
11720 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20  3_open_v2() are 
11730 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11740 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  ONLY,.  ** SQLIT
11750 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
11760 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  , SQLITE_OPEN_CR
11770 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45  EATE, SQLITE_OPE
11780 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20  N_SHAREDCACHE,. 
11790 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
117a0 50 52 49 56 41 54 45 43 41 43 48 45 2c 20 61 6e  PRIVATECACHE, an
117b0 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20  d some reserved 
117c0 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20  bits.  Silently 
117d0 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c  mask.  ** off al
117e0 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20  l other flags.. 
117f0 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20   */.  flags &=  
11800 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  ~( SQLITE_OPEN_D
11810 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
11830 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
11840 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
11850 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
11860 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20  _MAIN_DB |.     
11870 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
11880 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20  _OPEN_TEMP_DB | 
11890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
118a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
118b0 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20  SIENT_DB | .    
118c0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
118d0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
118e0 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
118f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
11900 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c  N_TEMP_JOURNAL |
11910 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11920 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
11930 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
11940 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
11950 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
11960 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20  RNAL |.         
11970 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
11980 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20  N_NOMUTEX |.    
11990 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
119a0 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
119b0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
119c0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41    SQLITE_OPEN_WA
119d0 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 29  L.             )
119e0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
119f0 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61   the sqlite data
11a00 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
11a10 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  db = sqlite3Mall
11a20 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73  ocZero( sizeof(s
11a30 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28  qlite3) );.  if(
11a40 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70   db==0 ) goto op
11a50 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20  endb_out;.  if( 
11a60 69 73 54 68 72 65 61 64 73 61 66 65 20 29 7b 0a  isThreadsafe ){.
11a70 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20      db->mutex = 
11a80 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
11a90 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52  c(SQLITE_MUTEX_R
11aa0 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69  ECURSIVE);.    i
11ab0 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20  f( db->mutex==0 
11ac0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11ad0 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20  _free(db);.     
11ae0 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67   db = 0;.      g
11af0 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
11b00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
11b10 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11b20 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
11b30 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66  ->errMask = 0xff
11b40 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b  ;.  db->nDb = 2;
11b50 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
11b60 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
11b70 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62  ;.  db->aDb = db
11b80 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20 20  ->aDbStatic;..  
11b90 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64  assert( sizeof(d
11ba0 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65  b->aLimit)==size
11bb0 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29  of(aHardLimit) )
11bc0 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61  ;.  memcpy(db->a
11bd0 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69  Limit, aHardLimi
11be0 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c  t, sizeof(db->aL
11bf0 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 75  imit));.  db->au
11c00 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
11c10 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20  db->nextAutovac 
11c20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74  = -1;.  db->next
11c30 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20  Pagesize = 0;.  
11c40 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
11c50 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
11c60 73 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49  s | SQLITE_AutoI
11c70 6e 64 65 78 20 7c 20 53 51 4c 49 54 45 5f 45 6e  ndex | SQLITE_En
11c80 61 62 6c 65 54 72 69 67 67 65 72 0a 23 69 66 20  ableTrigger.#if 
11c90 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
11ca0 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20  KPTFULLFSYNC.   
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
11cc0 53 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46  SQLITE_CkptFullF
11cd0 53 79 6e 63 0a 23 65 6e 64 69 66 0a 23 69 66 20  Sync.#endif.#if 
11ce0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
11cf0 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20  ILE_FORMAT<4.   
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
11d10 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
11d20 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64  eFmt.#endif.#ifd
11d30 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
11d40 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d60 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78   | SQLITE_LoadEx
11d70 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23  tension.#endif.#
11d80 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
11d90 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49 47  T_RECURSIVE_TRIG
11da0 47 45 52 53 0a 20 20 20 20 20 20 20 20 20 20 20  GERS.           
11db0 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52        | SQLITE_R
11dc0 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69  ecTriggers.#endi
11dd0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
11de0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52  LITE_DEFAULT_FOR
11df0 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51  EIGN_KEYS) && SQ
11e00 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52  LITE_DEFAULT_FOR
11e10 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20  EIGN_KEYS.      
11e20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
11e30 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a  ITE_ForeignKeys.
11e40 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20  #endif.      ;. 
11e50 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
11e60 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
11e70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11e80 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
11e90 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  E.  sqlite3HashI
11ea0 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  nit(&db->aModule
11eb0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
11ec0 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20  Add the default 
11ed0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
11ee0 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52  ce BINARY. BINAR
11ef0 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68  Y works for both
11f00 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20   UTF-8.  ** and 
11f10 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61  UTF-16, so add a
11f20 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63   version for eac
11f30 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75  h to avoid any u
11f40 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20  nnecessary.  ** 
11f50 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65  conversions. The
11f60 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74   only error that
11f70 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20   can occur here 
11f80 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  is a malloc() fa
11f90 69 6c 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63 72  ilure..  */.  cr
11fa0 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
11fb0 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
11fc0 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43  TE_UTF8, 0, binC
11fd0 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
11fe0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
11ff0 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c  b, "BINARY", SQL
12000 49 54 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20  ITE_UTF16BE, 0, 
12010 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
12020 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
12030 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c  on(db, "BINARY",
12040 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
12050 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
12060 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
12070 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49  lation(db, "RTRI
12080 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  M", SQLITE_UTF8,
12090 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f   (void*)1, binCo
120a0 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66  llFunc, 0);.  if
120b0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
120c0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f  ed ){.    goto o
120d0 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20  pendb_out;.  }. 
120e0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d   db->pDfltColl =
120f0 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
12100 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55  Seq(db, SQLITE_U
12110 54 46 38 2c 20 22 42 49 4e 41 52 59 22 2c 20 30  TF8, "BINARY", 0
12120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
12130 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b  >pDfltColl!=0 );
12140 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20  ..  /* Also add 
12150 61 20 55 54 46 2d 38 20 63 61 73 65 2d 69 6e 73  a UTF-8 case-ins
12160 65 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61 74 69  ensitive collati
12170 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a  on sequence. */.
12180 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
12190 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20  n(db, "NOCASE", 
121a0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
121b0 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46  nocaseCollatingF
121c0 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 50  unc, 0);..  /* P
121d0 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d  arse the filenam
121e0 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20  e/URI argument. 
121f0 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61  */.  db->openFla
12200 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63  gs = flags;.  rc
12210 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55   = sqlite3ParseU
12220 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61  ri(zVfs, zFilena
12230 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d  me, &flags, &db-
12240 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26  >pVfs, &zOpen, &
12250 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
12260 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12270 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
12280 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e  ITE_NOMEM ) db->
12290 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
122a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
122b0 6f 72 28 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d  or(db, rc, zErrM
122c0 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a  sg ? "%s" : 0, z
122d0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  ErrMsg);.    sql
122e0 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
122f0 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65  g);.    goto ope
12300 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ndb_out;.  }..  
12310 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b  /* Open the back
12320 65 6e 64 20 64 61 74 61 62 61 73 65 20 64 72 69  end database dri
12330 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ver */.  rc = sq
12340 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64  lite3BtreeOpen(d
12350 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20  b->pVfs, zOpen, 
12360 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e  db, &db->aDb[0].
12370 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  pBt, 0,.        
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12390 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f  flags | SQLITE_O
123a0 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20  PEN_MAIN_DB);.  
123b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
123c0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
123d0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
123e0 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  MEM ){.      rc 
123f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
12400 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
12410 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30  3Error(db, rc, 0
12420 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  );.    goto open
12430 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62  db_out;.  }.  db
12440 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61  ->aDb[0].pSchema
12450 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
12460 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b  Get(db, db->aDb[
12470 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61  0].pBt);.  db->a
12480 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20  Db[1].pSchema = 
12490 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74  sqlite3SchemaGet
124a0 28 64 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20  (db, 0);...  /* 
124b0 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65  The default safe
124c0 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65  ty_level for the
124d0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
124e0 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68  s 'full'; for th
124f0 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61  e temp.  ** data
12500 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45  base it is 'NONE
12510 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  '. This matches 
12520 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
12530 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f  defaults.  .  */
12540 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e  .  db->aDb[0].zN
12550 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  ame = "main";.  
12560 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74  db->aDb[0].safet
12570 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64  y_level = 3;.  d
12580 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20  b->aDb[1].zName 
12590 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e  = "temp";.  db->
125a0 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[1].safety_le
125b0 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e  vel = 1;..  db->
125c0 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
125d0 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28  AGIC_OPEN;.  if(
125e0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
125f0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
12600 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
12610 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c   /* Register all
12620 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69   built-in functi
12630 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  ons, but do not 
12640 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20  attempt to read 
12650 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
12660 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68  e schema yet. Th
12670 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e  is is delayed un
12680 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69  til the first ti
12690 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  me the database.
126a0 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64    ** is accessed
126b0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
126c0 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
126d0 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  _OK, 0);.  sqlit
126e0 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69  e3RegisterBuilti
126f0 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a  nFunctions(db);.
12700 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d  .  /* Load autom
12710 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20  atic extensions 
12720 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61  - extensions tha
12730 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69  t have been regi
12740 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e  stered.  ** usin
12750 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75  g the sqlite3_au
12760 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f  tomatic_extensio
12770 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20  n() API..  */.  
12780 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
12790 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20  code(db);.  if( 
127a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
127b0 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f  .    sqlite3Auto
127c0 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64  LoadExtensions(d
127d0 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  b);.    rc = sql
127e0 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
127f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12800 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12810 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
12820 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
12830 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
12840 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62  E_FTS1.  if( !db
12850 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
12860 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
12870 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
12880 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
12890 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31  rc = sqlite3Fts1
128a0 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
128b0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
128c0 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a  ITE_ENABLE_FTS2.
128d0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
128e0 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
128f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12900 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
12910 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74  e3Fts2Init(sqlit
12920 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  e3*);.    rc = s
12930 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64  qlite3Fts2Init(d
12940 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
12950 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
12960 41 42 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20  ABLE_FTS3.  if( 
12970 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
12980 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
12990 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
129a0 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28 64  qlite3Fts3Init(d
129b0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
129c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
129d0 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21  ABLE_ICU.  if( !
129e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
129f0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
12a00 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
12a10 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62 29  lite3IcuInit(db)
12a20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
12a30 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
12a40 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21  LE_RTREE.  if( !
12a50 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12a60 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
12a70 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
12a80 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64 62  ite3RtreeInit(db
12a90 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
12aa0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
12ab0 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  , rc, 0);..  /* 
12ac0 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
12ad0 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20  _LOCKING_MODE=1 
12ae0 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20  makes EXCLUSIVE 
12af0 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  the default lock
12b00 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20  ing.  ** mode.  
12b10 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
12b20 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20  _LOCKING_MODE=0 
12b30 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20  make NORMAL the 
12b40 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a  default locking.
12b50 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e    ** mode.  Doin
12b60 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c  g nothing at all
12b70 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d   also makes NORM
12b80 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a  AL the default..
12b90 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
12ba0 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
12bb0 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66  NG_MODE.  db->df
12bc0 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c  ltLockMode = SQL
12bd0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
12be0 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69  ING_MODE;.  sqli
12bf0 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
12c00 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65  ode(sqlite3Btree
12c10 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d  Pager(db->aDb[0]
12c20 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20  .pBt),.         
12c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c40 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
12c50 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23  LOCKING_MODE);.#
12c60 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 61 62  endif..  /* Enab
12c70 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  le the lookaside
12c80 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65  -malloc subsyste
12c90 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b  m */.  setupLook
12ca0 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c  aside(db, 0, sql
12cb0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
12cc0 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20  .szLookaside,.  
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
12cf0 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61  balConfig.nLooka
12d00 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65  side);..  sqlite
12d10 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
12d20 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f  oint(db, SQLITE_
12d30 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f  DEFAULT_WAL_AUTO
12d40 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70  CHECKPOINT);..op
12d50 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  endb_out:.  sqli
12d60 74 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b  te3_free(zOpen);
12d70 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20  .  if( db ){.   
12d80 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74   assert( db->mut
12d90 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61  ex!=0 || isThrea
12da0 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  dsafe==0 || sqli
12db0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
12dc0 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b  bFullMutex==0 );
12dd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
12de0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
12df0 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ex);.  }.  rc = 
12e00 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
12e10 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  db);.  assert( d
12e20 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  b!=0 || rc==SQLI
12e30 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66  TE_NOMEM );.  if
12e40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
12e50 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EM ){.    sqlite
12e60 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20  3_close(db);.   
12e70 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65   db = 0;.  }else
12e80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12e90 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  OK ){.    db->ma
12ea0 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
12eb0 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 23 69 66  IC_SICK;.  }.#if
12ec0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
12ed0 5f 5f 29 20 26 26 20 45 4e 41 42 4c 45 5f 46 4f  __) && ENABLE_FO
12ee0 52 43 45 5f 57 41 4c 0a 20 20 69 66 28 20 64 62  RCE_WAL.  if( db
12ef0 20 26 26 20 21 72 63 20 29 7b 0a 20 20 20 20 69   && !rc ){.    i
12f00 66 20 28 28 30 20 3d 3d 20 61 63 63 65 73 73 28  f ((0 == access(
12f10 22 2f 76 61 72 2f 64 62 2f 65 6e 61 62 6c 65 46  "/var/db/enableF
12f20 6f 72 63 65 57 41 4c 22 2c 20 52 5f 4f 4b 29 29  orceWAL", R_OK))
12f30 29 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ) {.#ifdef SQLIT
12f40 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 66 70  E_DEBUG.      fp
12f50 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
12f60 51 4c 69 74 65 20 57 41 4c 20 6a 6f 75 72 6e 61  QLite WAL journa
12f70 6c 5f 6d 6f 64 65 20 45 4e 41 42 4c 45 44 20 62  l_mode ENABLED b
12f80 79 20 64 65 66 61 75 6c 74 2e 5c 6e 22 29 3b 0a  y default.\n");.
12f90 23 65 6e 64 69 66 0a 20 20 20 20 20 20 0a 20 20  #endif.      .  
12fa0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
12fb0 28 64 62 2c 20 22 70 72 61 67 6d 61 20 6a 6f 75  (db, "pragma jou
12fc0 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 2c 20  rnal_mode=wal", 
12fd0 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
12fe0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
12ff0 5f 44 45 42 55 47 0a 2f 2f 20 20 20 20 7d 20 65  _DEBUG.//    } e
13000 6c 73 65 20 7b 0a 2f 2f 20 20 20 20 20 20 66 70  lse {.//      fp
13010 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
13020 51 4c 69 74 65 20 57 41 4c 20 6a 6f 75 72 6e 61  QLite WAL journa
13030 6c 5f 6d 6f 64 65 20 4e 4f 54 20 45 4e 41 42 4c  l_mode NOT ENABL
13040 45 44 20 62 79 20 64 65 66 61 75 6c 74 2e 5c 6e  ED by default.\n
13050 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  ");.#endif.    }
13060 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20  .  }.#endif.#if 
13070 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
13080 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49  NABLE_AUTO_PROFI
13090 4c 45 29 0a 20 20 69 66 28 20 64 62 20 26 26 20  LE).  if( db && 
130a0 21 72 63 20 29 7b 0a 20 20 20 20 65 6e 61 62 6c  !rc ){.    enabl
130b0 65 41 75 74 6f 4c 6f 67 67 69 6e 67 28 64 62 29  eAutoLogging(db)
130c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  ;.  }.#endif.  *
130d0 70 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65  ppDb = db;.#ifde
130e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
130f0 53 51 4c 52 52 0a 20 20 53 52 52 65 63 4f 70 65  SQLRR.  SRRecOpe
13100 6e 28 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  n(db, zFilename,
13110 20 66 6c 61 67 73 29 3b 0a 23 65 6e 64 69 66 0a   flags);.#endif.
13120 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
13130 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a  ApiExit(0, rc);.
13140 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
13150 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e  new database han
13160 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
13170 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73  te3_open(.  cons
13180 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
13190 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a  e, .  sqlite3 **
131a0 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72  ppDb .){.  retur
131b0 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  n openDatabase(z
131c0 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a  Filename, ppDb,.
131d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131e0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
131f0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
13200 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
13210 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
13220 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63  te3_open_v2(.  c
13230 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
13240 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61  ame,   /* Databa
13250 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46  se filename (UTF
13260 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -8) */.  sqlite3
13270 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20   **ppDb,        
13280 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20   /* OUT: SQLite 
13290 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
132a0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
132b0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
132c0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
132d0 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20  *zVfs        /* 
132e0 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75  Name of VFS modu
132f0 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  le to use */.){.
13300 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
13310 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20  abase(filename, 
13320 70 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20  ppDb, (unsigned 
13330 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29  int)flags, zVfs)
13340 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
13350 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
13360 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
13370 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
13380 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
13390 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20  open16(.  const 
133a0 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  void *zFilename,
133b0 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
133c0 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  Db.){.  char con
133d0 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20  st *zFilename8; 
133e0 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65    /* zFilename e
133f0 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20  ncoded in UTF-8 
13400 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31  instead of UTF-1
13410 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  6 */.  sqlite3_v
13420 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
13430 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
13440 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20   zFilename );.  
13450 61 73 73 65 72 74 28 20 70 70 44 62 20 29 3b 0a  assert( ppDb );.
13460 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
13470 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13480 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
13490 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
134a0 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
134b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
134c0 64 69 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  dif.  pVal = sql
134d0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
134e0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
134f0 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
13500 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54  zFilename, SQLIT
13510 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53  E_UTF16NATIVE, S
13520 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
13530 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71   zFilename8 = sq
13540 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70  lite3ValueText(p
13550 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Val, SQLITE_UTF8
13560 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
13570 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
13580 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
13590 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20  lename8, ppDb,. 
135a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135b0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
135c0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
135d0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
135e0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
135f0 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51   *ppDb || rc==SQ
13600 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
13610 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13620 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f  _OK && !DbHasPro
13630 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20  perty(*ppDb, 0, 
13640 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
13650 20 29 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a 70   ){.      ENC(*p
13660 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54  pDb) = SQLITE_UT
13670 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d  F16NATIVE;.    }
13680 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
13690 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
136a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61  .  }.  sqlite3Va
136b0 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a  lueFree(pVal);..
136c0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
136d0 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a  ApiExit(0, rc);.
136e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
136f0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
13700 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
13710 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
13720 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
13730 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
13740 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
13750 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
13760 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
13770 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
13780 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
13790 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
137a0 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
137b0 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
137c0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
137d0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  nt,const void*).
137e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
137f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
13800 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
13810 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
13820 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
13830 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
13840 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
13850 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78  (u8)enc, pCtx, x
13860 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 72  Compare, 0);.  r
13870 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
13880 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
13890 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
138a0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
138b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
138c0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
138d0 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
138e0 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
138f0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
13900 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
13910 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
13920 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
13930 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
13940 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
13950 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
13960 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
13970 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
13980 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
13990 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
139a0 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
139b0 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
139c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
139d0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
139e0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
139f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13a00 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65  );.  rc = create
13a10 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
13a20 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  ame, (u8)enc, pC
13a30 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44  tx, xCompare, xD
13a40 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  el);.  rc = sqli
13a50 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
13a60 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
13a70 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
13a80 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
13a90 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
13aa0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
13ab0 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
13ac0 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
13ad0 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
13ae0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
13af0 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
13b00 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
13b10 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65  tion16(.  sqlite
13b20 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
13b30 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  void *zName,.  i
13b40 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
13b50 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
13b60 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
13b70 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
13b80 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
13b90 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
13ba0 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
13bb0 7a 4e 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65  zName8;.  sqlite
13bc0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
13bd0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
13be0 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
13bf0 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65  ailed );.  zName
13c00 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36  8 = sqlite3Utf16
13c10 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d  to8(db, zName, -
13c20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  1, SQLITE_UTF16N
13c30 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e  ATIVE);.  if( zN
13c40 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  ame8 ){.    rc =
13c50 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
13c60 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38  (db, zName8, (u8
13c70 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d  )enc, pCtx, xCom
13c80 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  pare, 0);.    sq
13c90 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
13ca0 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72  zName8);.  }.  r
13cb0 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
13cc0 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
13cd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
13ce0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
13cf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
13d00 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
13d10 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
13d20 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
13d30 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
13d40 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
13d50 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
13d60 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
13d70 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
13d80 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
13d90 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
13da0 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
13db0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
13dc0 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a  llation_needed(.
13dd0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
13de0 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65    void *pCollNee
13df0 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28  dedArg, .  void(
13e00 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f  *xCollNeeded)(vo
13e10 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
13e20 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20   eTextRep,const 
13e30 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69  char*).){.  sqli
13e40 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
13e50 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
13e60 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20  ->xCollNeeded = 
13e70 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64  xCollNeeded;.  d
13e80 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
13e90 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c   = 0;.  db->pCol
13ea0 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f  lNeededArg = pCo
13eb0 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73  llNeededArg;.  s
13ec0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
13ed0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
13ee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13ef0 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
13f00 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
13f10 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
13f20 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
13f30 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c  nce factory call
13f40 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61  back with the da
13f50 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
13f60 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79   db. Replace any
13f70 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74   previously inst
13f80 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  alled collation 
13f90 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
13fa0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13fb0 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
13fc0 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  d16(.  sqlite3 *
13fd0 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  db, .  void *pCo
13fe0 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20  llNeededArg, .  
13ff0 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65  void(*xCollNeede
14000 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  d16)(void*,sqlit
14010 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
14020 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
14030 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
14040 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
14050 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
14060 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  eded = 0;.  db->
14070 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
14080 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20  xCollNeeded16;. 
14090 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
140a0 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
140b0 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
140c0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
140d0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
140e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
140f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
14100 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69  MIT_UTF16 */..#i
14110 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14120 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
14130 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
14140 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68   is now an anach
14150 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20  ronism. It used 
14160 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  to be used to re
14170 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20  cover from a.** 
14180 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
14190 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77  , but SQLite now
141a0 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d   does this autom
141b0 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  atically..*/.int
141c0 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f   sqlite3_global_
141d0 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20  recover(void){. 
141e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
141f0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
14200 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77  ** Test to see w
14210 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
14220 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
14230 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f  ction is in auto
14240 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20  commit.** mode. 
14250 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
14260 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20  it is and FALSE 
14270 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d  if not.  Autocom
14280 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a  mit mode is on.*
14290 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41  * by default.  A
142a0 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73  utocommit is dis
142b0 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e  abled by a BEGIN
142c0 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
142d0 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74  eenabled.** by t
142e0 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f  he next COMMIT o
142f0 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a  r ROLLBACK..**.*
14300 2a 2a 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20 41  ****** THIS IS A
14310 4e 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 41  N EXPERIMENTAL A
14320 50 49 20 41 4e 44 20 49 53 20 53 55 42 4a 45 43  PI AND IS SUBJEC
14330 54 20 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a 2a  T TO CHANGE ****
14340 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
14350 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
14360 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
14370 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f   return db->auto
14380 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Commit;.}../*.**
14390 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
143a0 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75 62 74  outines are subt
143b0 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74  itutes for const
143c0 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  ants SQLITE_CORR
143d0 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  UPT,.** SQLITE_M
143e0 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41  ISUSE, SQLITE_CA
143f0 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49  NTOPEN, SQLITE_I
14400 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c  OERR and possibl
14410 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a  y other error.**
14420 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65   constants.  The
14430 79 20 73 65 72 76 65 72 20 74 77 6f 20 70 75 72  y server two pur
14440 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  poses:.**.**   1
14450 2e 20 20 53 65 72 76 65 20 61 73 20 61 20 63 6f  .  Serve as a co
14460 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74  nvenient place t
14470 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
14480 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67 65 72  nt in a debugger
14490 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74  .**       to det
144a0 65 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e  ect when version
144b0 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
144c0 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  s occurs..**.** 
144d0 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c    2.  Invoke sql
144e0 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72  ite3_log() to pr
144f0 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72 63 65  ovide the source
14500 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77   code location w
14510 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20  here.**       a 
14520 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20  low-level error 
14530 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74 65  is first detecte
14540 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
14550 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e  3CorruptError(in
14560 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
14570 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
14580 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
14590 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
145a0 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  log(SQLITE_CORRU
145b0 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT,.            
145c0 20 20 22 64 61 74 61 62 61 73 65 20 63 6f 72 72    "database corr
145d0 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25  uption at line %
145e0 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20  d of [%.10s]",. 
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e               lin
14600 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f  eno, 20+sqlite3_
14610 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72  sourceid());.  r
14620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
14630 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  RUPT;.}.int sqli
14640 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69  te3MisuseError(i
14650 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
14660 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
14670 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
14680 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
14690 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55  _log(SQLITE_MISU
146a0 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  SE, .           
146b0 20 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69     "misuse at li
146c0 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d  ne %d of [%.10s]
146d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
146e0 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69   lineno, 20+sqli
146f0 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b  te3_sourceid());
14700 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14710 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73  _MISUSE;.}.int s
14720 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72  qlite3CantopenEr
14730 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
14740 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
14750 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
14760 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
14770 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
14780 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20  _CANTOPEN, .    
14790 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
147a0 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c  t open file at l
147b0 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
147c0 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
147d0 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
147e0 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
147f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14800 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a  E_CANTOPEN;.}...
14810 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14820 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
14830 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63  *.** This is a c
14840 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69  onvenience routi
14850 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ne that makes su
14860 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65  re that all thre
14870 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64  ad-specific.** d
14880 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72  ata for this thr
14890 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61  ead has been dea
148a0 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
148b0 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72  SQLite no longer
148c0 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65   uses thread-spe
148d0 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68  cific data so th
148e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
148f0 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49  w a.** no-op.  I
14900 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f  t is retained fo
14910 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d  r historical com
14920 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76  patibility..*/.v
14930 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65  oid sqlite3_thre
14940 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29  ad_cleanup(void)
14950 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  {.}.#endif../*.*
14960 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e  * Return meta in
14970 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
14980 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d  a specific colum
14990 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  n of a database 
149a0 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  table..** See co
149b0 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33  mment in sqlite3
149c0 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29  .h (sqlite.h.in)
149d0 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
149e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
149f0 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
14a00 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65  ADATA.int sqlite
14a10 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
14a20 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74  etadata(.  sqlit
14a30 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
14a40 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
14a50 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  tion handle */. 
14a60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
14a70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
14a80 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72  Database name or
14a90 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
14aa0 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d   char *zTableNam
14ab0 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  e,     /* Table 
14ac0 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  name */.  const 
14ad0 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d  char *zColumnNam
14ae0 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  e,    /* Column 
14af0 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  name */.  char c
14b00 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70  onst **pzDataTyp
14b10 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  e,    /* OUTPUT:
14b20 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20 74   Declared data t
14b30 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ype */.  char co
14b40 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c  nst **pzCollSeq,
14b50 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
14b60 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
14b70 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  ce name */.  int
14b80 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20   *pNotNull,     
14b90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
14ba0 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20  UT: True if NOT 
14bb0 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20  NULL constraint 
14bc0 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20  exists */.  int 
14bd0 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20  *pPrimaryKey,   
14be0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
14bf0 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
14c00 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a  n part of PK */.
14c10 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20    int *pAutoinc 
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14c30 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
14c40 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d   column is auto-
14c50 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  increment */.){.
14c60 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
14c70 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
14c80 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
14c90 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
14ca0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
14cb0 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ;..  char const 
14cc0 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a  *zDataType = 0;.
14cd0 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43    char const *zC
14ce0 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e  ollSeq = 0;.  in
14cf0 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20  t notnull = 0;. 
14d00 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20   int primarykey 
14d10 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69  = 0;.  int autoi
14d20 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e  nc = 0;..  /* En
14d30 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
14d40 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65 65  e schema has bee
14d50 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71  n loaded */.  sq
14d60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
14d70 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
14d80 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
14d90 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d  rAll(db);.  rc =
14da0 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c   sqlite3Init(db,
14db0 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66   &zErrMsg);.  if
14dc0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
14dd0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  ){.    goto erro
14de0 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
14df0 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
14e00 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f  e in question */
14e10 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
14e20 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
14e30 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61  TableName, zDbNa
14e40 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62  me);.  if( !pTab
14e50 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
14e60 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20  t ){.    pTab = 
14e70 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  0;.    goto erro
14e80 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
14e90 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e   Find the column
14ea0 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20   for which info 
14eb0 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  is requested */.
14ec0 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52    if( sqlite3IsR
14ed0 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  owid(zColumnName
14ee0 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  ) ){.    iCol = 
14ef0 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
14f00 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
14f10 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
14f20 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
14f30 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
14f40 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
14f50 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
14f60 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70  iCol++){.      p
14f70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
14f80 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69  l[iCol];.      i
14f90 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
14fa0 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
14fb0 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29  , zColumnName) )
14fc0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
14fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14fe0 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61     if( iCol==pTa
14ff0 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
15000 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20   pTab = 0;.     
15010 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
15020 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
15030 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
15040 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20  lock stores the 
15050 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
15060 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
15070 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74  turned.  ** to t
15080 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63  he caller in loc
15090 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61  al variables zDa
150a0 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71  taType, zCollSeq
150b0 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61  , notnull, prima
150c0 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61  rykey.  ** and a
150d0 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20  utoinc. At this 
150e0 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65 20  point there are 
150f0 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65  two possibilitie
15100 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20  s:.  ** .  **   
15110 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66 69    1. The specifi
15120 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77  ed column name w
15130 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22  as rowid", "oid"
15140 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20   or "_rowid_" . 
15150 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74   **        and t
15160 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69  here is no expli
15170 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49  citly declared I
15180 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a  PK column. .  **
15190 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65  .  **     2. The
151a0 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20   table is not a 
151b0 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c  view and the col
151c0 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66  umn name identif
151d0 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20  ied an .  **    
151e0 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64      explicitly d
151f0 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20  eclared column. 
15200 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d  Copy meta inform
15210 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c  ation from *pCol
15220 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43  ..  */ .  if( pC
15230 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54  ol ){.    zDataT
15240 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70  ype = pCol->zTyp
15250 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  e;.    zCollSeq 
15260 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20  = pCol->zColl;. 
15270 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f     notnull = pCo
15280 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20  l->notNull!=0;. 
15290 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d     primarykey  =
152a0 20 70 43 6f 6c 2d 3e 69 73 50 72 69 6d 4b 65 79   pCol->isPrimKey
152b0 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63  !=0;.    autoinc
152c0 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d   = pTab->iPKey==
152d0 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e 74  iCol && (pTab->t
152e0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
152f0 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a  oincrement)!=0;.
15300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61    }else{.    zDa
15310 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45  taType = "INTEGE
15320 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b  R";.    primaryk
15330 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  ey = 1;.  }.  if
15340 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20  ( !zCollSeq ){. 
15350 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22 42     zCollSeq = "B
15360 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72 72  INARY";.  }..err
15370 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  or_out:.  sqlite
15380 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
15390 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65  b);..  /* Whethe
153a0 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63  r the function c
153b0 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72  all succeeded or
153c0 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65   failed, set the
153d0 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
153e0 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65  rs.  ** to whate
153f0 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20  ver their local 
15400 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e  counterparts con
15410 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tain. If an erro
15420 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a  r did occur,.  *
15430 2a 20 74 68 69 73 20 68 61 73 20 74 68 65 20 65  * this has the e
15440 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67  ffect of zeroing
15450 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61   all output para
15460 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69  meters..  */.  i
15470 66 28 20 70 7a 44 61 74 61 54 79 70 65 20 29 20  f( pzDataType ) 
15480 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44  *pzDataType = zD
15490 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70  ataType;.  if( p
154a0 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f  zCollSeq ) *pzCo
154b0 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71  llSeq = zCollSeq
154c0 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c  ;.  if( pNotNull
154d0 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e   ) *pNotNull = n
154e0 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50  otnull;.  if( pP
154f0 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72  rimaryKey ) *pPr
15500 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61  imaryKey = prima
15510 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75  rykey;.  if( pAu
15520 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e  toinc ) *pAutoin
15530 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20  c = autoinc;..  
15540 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72  if( SQLITE_OK==r
15550 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  c && !pTab ){.  
15560 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15570 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
15580 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69    zErrMsg = sqli
15590 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
155a0 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f  no such table co
155b0 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54  lumn: %s.%s", zT
155c0 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20  ableName,.      
155d0 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a    zColumnName);.
155e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
155f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c  ERROR;.  }.  sql
15600 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
15610 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a  , (zErrMsg?"%s":
15620 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0), zErrMsg);.  
15630 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
15640 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63  , zErrMsg);.  rc
15650 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
15660 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
15670 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15680 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
15690 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
156a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  if../*.** Sleep 
156b0 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
156c0 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
156d0 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
156e0 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lept..*/.int sql
156f0 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d  ite3_sleep(int m
15700 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
15710 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  s *pVfs;.  int r
15720 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69  c;.  pVfs = sqli
15730 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
15740 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29  .  if( pVfs==0 )
15750 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
15760 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
15770 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63  orks in millisec
15780 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e  onds, but the un
15790 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70  derlying OsSleep
157a0 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65  () .  ** API use
157b0 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20  s microseconds. 
157c0 48 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73  Hence the 1000's
157d0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73  ..  */.  rc = (s
157e0 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56  qlite3OsSleep(pV
157f0 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30  fs, 1000*ms)/100
15800 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  0);.  return rc;
15810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  .}../*.** Enable
15820 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
15830 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20  extended result 
15840 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  codes..*/.int sq
15850 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
15860 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69  esult_codes(sqli
15870 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f  te3 *db, int ono
15880 66 66 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ff){.  sqlite3_m
15890 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
158a0 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72  utex);.  db->err
158b0 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30  Mask = onoff ? 0
158c0 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66 66  xffffffff : 0xff
158d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
158e0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
158f0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
15900 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
15910 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c   Invoke the xFil
15920 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20  eControl method 
15930 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
15940 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
15950 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
15960 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64  ntrol(sqlite3 *d
15970 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
15980 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20  DbName, int op, 
15990 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69  void *pArg){.  i
159a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
159b0 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70  RROR;.  Btree *p
159c0 42 74 72 65 65 3b 0a 0a 20 20 73 71 6c 69 74 65  Btree;..  sqlite
159d0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
159e0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74 72  ->mutex);.  pBtr
159f0 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61  ee = sqlite3DbNa
15a00 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44  meToBtree(db, zD
15a10 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 42  bName);.  if( pB
15a20 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65  tree ){.    Page
15a30 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 73  r *pPager;.    s
15a40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
15a50 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
15a60 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
15a70 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
15a80 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
15a90 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65  Btree);.    asse
15aa0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
15ab0 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65  .    fd = sqlite
15ac0 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65  3PagerFile(pPage
15ad0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
15ae0 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  fd!=0 );.    if(
15af0 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54   op==SQLITE_FCNT
15b00 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29  L_FILE_POINTER )
15b10 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65  {.      *(sqlite
15b20 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20  3_file**)pArg = 
15b30 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  fd;.      rc = S
15b40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
15b50 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65 74  lse if( fd->pMet
15b60 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72 63  hods ){.      rc
15b70 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
15b80 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20  Control(fd, op, 
15b90 70 41 72 67 29 3b 0a 23 69 66 6e 64 65 66 20 53  pArg);.#ifndef S
15ba0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
15bb0 20 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51       if( (rc==SQ
15bc0 4c 49 54 45 5f 4f 4b 29 26 26 28 6f 70 3d 3d 53  LITE_OK)&&(op==S
15bd0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54  QLITE_FCNTL_LAST
15be0 5f 45 52 52 4e 4f 29 26 26 28 2a 28 69 6e 74 20  _ERRNO)&&(*(int 
15bf0 2a 29 70 41 72 67 3d 3d 30 29 20 29 7b 0a 20 20  *)pArg==0) ){.  
15c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
15c10 6c 65 20 2a 70 57 61 6c 46 64 20 3d 20 73 71 6c  le *pWalFd = sql
15c20 69 74 65 33 50 61 67 65 72 57 61 6c 46 69 6c 65  ite3PagerWalFile
15c30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
15c40 20 20 69 66 28 20 70 57 61 6c 46 64 26 26 28 70    if( pWalFd&&(p
15c50 57 61 6c 46 64 2d 3e 70 4d 65 74 68 6f 64 73 29  WalFd->pMethods)
15c60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
15c70 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
15c80 43 6f 6e 74 72 6f 6c 28 70 57 61 6c 46 64 2c 20  Control(pWalFd, 
15c90 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20  op, pArg);.     
15ca0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
15cb0 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
15cc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15cd0 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d  _NOTFOUND;.    }
15ce0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
15cf0 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
15d00 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
15d10 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20  or(db, rc, 0);. 
15d20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
15d30 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
15d40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15d50 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
15d60 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20   to the testing 
15d70 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71  logic..*/.int sq
15d80 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
15d90 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  ol(int op, ...){
15da0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23  .  int rc = 0;.#
15db0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15dc0 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a  IT_BUILTIN_TEST.
15dd0 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
15de0 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29  va_start(ap, op)
15df0 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
15e00 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  {..    /*.    **
15e10 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
15e20 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  t state of the P
15e30 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  RNG..    */.    
15e40 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
15e50 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20  CTRL_PRNG_SAVE: 
15e60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
15e70 72 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a  rngSaveState();.
15e80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15e90 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
15ea0 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 73 74  * Restore the st
15eb0 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20  ate of the PRNG 
15ec0 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61 74  to the last stat
15ed0 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20  e saved using.  
15ee0 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20    ** PRNG_SAVE. 
15ef0 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61   If PRNG_SAVE ha
15f00 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62  s never before b
15f10 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  een called, then
15f20 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72  .    ** this ver
15f30 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47  b acts like PRNG
15f40 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20  _RESET..    */. 
15f50 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
15f60 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
15f70 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  TORE: {.      sq
15f80 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65  lite3PrngRestore
15f90 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
15fa0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
15fb0 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74   /*.    ** Reset
15fc0 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74   the PRNG back t
15fd0 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69  o its uninitiali
15fe0 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68 65 20  zed state.  The 
15ff0 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  next call.    **
16000 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   to sqlite3_rand
16010 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65  omness() will re
16020 73 65 65 64 20 74 68 65 20 50 52 4e 47 20 75 73  seed the PRNG us
16030 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c  ing a single cal
16040 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  l.    ** to the 
16050 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68  xRandomness meth
16060 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  od of the defaul
16070 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20  t VFS..    */.  
16080 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
16090 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45  STCTRL_PRNG_RESE
160a0 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
160b0 65 33 50 72 6e 67 52 65 73 65 74 53 74 61 74 65  e3PrngResetState
160c0 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
160d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
160e0 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
160f0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56  est_control(BITV
16100 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70  EC_TEST, size, p
16110 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20  rogram).    **. 
16120 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74     ** Run a test
16130 20 61 67 61 69 6e 73 74 20 61 20 42 69 74 76 65   against a Bitve
16140 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65  c object of size
16150 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61  .  The program a
16160 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69  rgument.    ** i
16170 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e  s an array of in
16180 74 65 67 65 72 73 20 74 68 61 74 20 64 65 66 69  tegers that defi
16190 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20 20 52  nes the test.  R
161a0 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20  eturn -1 on a.  
161b0 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f    ** memory allo
161c0 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20  cation error, 0 
161d0 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e  on success, or n
161e0 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65  on-zero for an e
161f0 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65  rror..    ** See
16200 20 74 68 65 20 73 71 6c 69 74 65 33 42 69 74 76   the sqlite3Bitv
16210 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20  ecBuiltinTest() 
16220 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
16230 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20  nformation..    
16240 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
16250 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56  TE_TESTCTRL_BITV
16260 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20  EC_TEST: {.     
16270 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67   int sz = va_arg
16280 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
16290 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61   int *aProg = va
162a0 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a  _arg(ap, int*);.
162b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
162c0 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
162d0 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a  est(sz, aProg);.
162e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
162f0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
16300 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
16310 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d  control(BENIGN_M
16320 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65  ALLOC_HOOKS, xBe
16330 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a  gin, xEnd).    *
16340 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65  *.    ** Registe
16350 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20  r hooks to call 
16360 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63  to indicate whic
16370 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  h malloc() failu
16380 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20  res .    ** are 
16390 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20  benign..    */. 
163a0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
163b0 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d  ESTCTRL_BENIGN_M
163c0 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20  ALLOC_HOOKS: {. 
163d0 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
163e0 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f  d (*void_functio
163f0 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20  n)(void);.      
16400 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
16410 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20  enignBegin;.    
16420 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
16430 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20  xBenignEnd;.    
16440 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d    xBenignBegin =
16450 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
16460 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
16470 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76    xBenignEnd = v
16480 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
16490 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
164a0 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c  sqlite3BenignMal
164b0 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e  locHooks(xBenign
164c0 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e  Begin, xBenignEn
164d0 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
164e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
164f0 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
16500 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
16510 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
16520 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e  ING_BYTE, unsign
16530 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  ed int X).    **
16540 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
16550 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20  PENDING byte to 
16560 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
16570 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e   argument, if X>
16580 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e  0..    ** Make n
16590 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d  o changes if X==
165a0 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76  0.  Return the v
165b0 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64  alue of the pend
165c0 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  ing byte.    ** 
165d0 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62  as it existing b
165e0 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
165f0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  ne was called.. 
16600 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50     **.    ** IMP
16610 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e  ORTANT:  Changin
16620 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  g the PENDING by
16630 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30  te from 0x400000
16640 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20  00 results in.  
16650 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74    ** an incompat
16660 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69  ible database fi
16670 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e  le format.  Chan
16680 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47  ging the PENDING
16690 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69   byte.    ** whi
166a0 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  le any database 
166b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70  connection is op
166c0 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e  en results in un
166d0 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20  defined and.    
166e0 2a 2a 20 64 69 6c 65 74 65 72 69 6f 75 73 20 62  ** dileterious b
166f0 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a  ehavior..    */.
16700 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
16710 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
16720 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72  _BYTE: {.      r
16730 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  c = PENDING_BYTE
16740 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
16750 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20  _OMIT_WSD.      
16760 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  {.        unsign
16770 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20  ed int newVal = 
16780 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
16790 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
167a0 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73    if( newVal ) s
167b0 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74  qlite3PendingByt
167c0 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20  e = newVal;.    
167d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
167e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
167f0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
16800 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
16810 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
16820 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58  RL_ASSERT, int X
16830 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
16840 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
16850 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
16860 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74  test to see whet
16870 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a  her or not.    *
16880 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65  * assert() was e
16890 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
168a0 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73  e-time.  If X is
168b0 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74   true and assert
168c0 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61  ().    ** is ena
168d0 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  bled, then the r
168e0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
168f0 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72  rue.  If X is tr
16900 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73  ue and.    ** as
16910 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
16920 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  ed, then the ret
16930 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72  urn value is zer
16940 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20  o.  If X is.    
16950 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  ** false and ass
16960 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
16970 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72  , then the asser
16980 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74  tion fires and t
16990 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
169a0 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20  s aborts.  If X 
169b0 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  is false and ass
169c0 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
169d0 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  d, then the.    
169e0 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
169f0 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a  is zero..    */.
16a00 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
16a10 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a  TESTCTRL_ASSERT:
16a20 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c   {.      volatil
16a30 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20  e int x = 0;.   
16a40 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d 20     assert( (x = 
16a50 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21  va_arg(ap,int))!
16a60 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
16a70 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   x;.      break;
16a80 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a  .    }...    /*.
16a90 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
16aa0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
16ab0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
16ac0 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  AYS, int X).    
16ad0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
16ae0 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
16af0 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
16b00 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c  o see how the AL
16b10 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20  WAYS and.    ** 
16b20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72  NEVER macros wer
16b30 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  e defined at com
16b40 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a  pile-time..    *
16b50 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74  *.    ** The ret
16b60 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57  urn value is ALW
16b70 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a  AYS(X).  .    **
16b80 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
16b90 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20  mmended test is 
16ba0 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65  X==2.  If the re
16bb0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c  turn value is 2,
16bc0 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20   that means.    
16bd0 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20  ** ALWAYS() and 
16be0 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68  NEVER() are both
16bf0 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
16c00 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63  ugh macros, whic
16c10 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  h is the.    ** 
16c20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e  default setting.
16c30 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
16c40 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e  value is 1, then
16c50 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74   ALWAYS() is eit
16c60 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d  her.    ** hard-
16c70 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72  coded to true or
16c80 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73   else it asserts
16c90 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74   if its argument
16ca0 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a   is false..    *
16cb0 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61  * The first beha
16cc0 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64  vior (hard-coded
16cd0 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65   to true) is the
16ce0 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
16cf0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
16d00 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
16d10 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  t assert() is di
16d20 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73  sabled and the s
16d30 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68  econd.    ** beh
16d40 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66  avior (assert if
16d50 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
16d60 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c   ALWAYS() is fal
16d70 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20  se) is the case 
16d80 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
16d90 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
16da0 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65   shows that asse
16db0 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e  rt() is enabled.
16dc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
16dd0 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74  he run-time test
16de0 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74   procedure might
16df0 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20   look something 
16e00 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
16e10 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20  *.    **    if( 
16e20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
16e30 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
16e40 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d  CTRL_ALWAYS, 2)=
16e50 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20  =2 ){.    **    
16e60 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e    // ALWAYS() an
16e70 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f  d NEVER() are no
16e80 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
16e90 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20   macros.    **  
16ea0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
16eb0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
16ec0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
16ed0 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20  _ASSERT, 1) ){. 
16ee0 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
16ef0 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20  WAYS(x) asserts 
16f00 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20  that x is true. 
16f10 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73  NEVER(x) asserts
16f20 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20   x is false..   
16f30 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   **    }else{.  
16f40 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
16f50 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73  AYS(x) is a cons
16f60 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78  tant 1.  NEVER(x
16f70 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
16f80 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20  0..    **    }. 
16f90 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
16fa0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
16fb0 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69  LWAYS: {.      i
16fc0 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
16fd0 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20  ,int);.      rc 
16fe0 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20 20  = ALWAYS(x);.   
16ff0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17000 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
17010 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
17020 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52  QLITE_TESTCTRL_R
17030 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20  ESERVE, sqlite3 
17040 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
17050 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
17060 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20  e nReserve size 
17070 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69  to N for the mai
17080 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68  n database on th
17090 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
170a0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  * connection db.
170b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
170c0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
170d0 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20  _RESERVE: {.    
170e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
170f0 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
17100 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  e3*);.      int 
17110 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
17120 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
17130 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
17140 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
17150 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
17160 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b  ageSize(db->aDb[
17170 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29  0].pBt, 0, x, 0)
17180 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
17190 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
171a0 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72  mutex);.      br
171b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
171c0 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  /*  sqlite3_test
171d0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
171e0 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
171f0 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20  ATIONS, sqlite3 
17200 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
17210 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65  **.    ** Enable
17220 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69   or disable vari
17230 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
17240 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  s for testing pu
17250 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20  rposes.  The .  
17260 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20    ** argument N 
17270 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
17280 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f  optimizations to
17290 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46   be disabled.  F
172a0 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a  or normal.    **
172b0 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f   operation N sho
172c0 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69  uld be 0.  The i
172d0 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65  dea is that a te
172e0 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65  st program (like
172f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20   the.    ** SQL 
17300 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c  Logic Test or SL
17310 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63  T test module) c
17320 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20  an run the same 
17330 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  SQL multiple tim
17340 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76  es.    ** with v
17350 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
17360 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f  ions disabled to
17370 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
17380 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20   same answer.   
17390 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20   ** is obtained 
173a0 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20  in every case.. 
173b0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
173c0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
173d0 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a  PTIMIZATIONS: {.
173e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
173f0 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
17400 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
17410 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
17420 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 64 62  p,int);.      db
17430 2d 3e 66 6c 61 67 73 20 3d 20 28 78 20 26 20 53  ->flags = (x & S
17440 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29 20 7c  QLITE_OptMask) |
17450 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 7e 53   (db->flags & ~S
17460 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29 3b 0a  QLITE_OptMask);.
17470 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17480 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
17490 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20  E_N_KEYWORD.    
174a0 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
174b0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
174c0 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52  ESTCTRL_ISKEYWOR
174d0 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  D, const char *z
174e0 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20  Word).    **.   
174f0 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73 20   ** If zWord is 
17500 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67 6e  a keyword recogn
17510 69 7a 65 64 20 62 79 20 74 68 65 20 70 61 72 73  ized by the pars
17520 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  er, then return 
17530 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  the.    ** numbe
17540 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20 20  r of keywords.  
17550 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e  Or if zWord is n
17560 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72 65  ot a keyword, re
17570 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a  turn 0..    ** .
17580 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74      ** This test
17590 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c 79   feature is only
175a0 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
175b0 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73  e amalgamation s
175c0 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ince.    ** the 
175d0 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44  SQLITE_N_KEYWORD
175e0 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65   macro is not de
175f0 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69  fined in this fi
17600 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20 20  le if SQLite.   
17610 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73 69   ** is built usi
17620 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f 75 72  ng separate sour
17630 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f  ce files..    */
17640 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
17650 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57  _TESTCTRL_ISKEYW
17660 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  ORD: {.      con
17670 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d  st char *zWord =
17680 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73   va_arg(ap, cons
17690 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  t char*);.      
176a0 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
176b0 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a  trlen30(zWord);.
176c0 20 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c 69        rc = (sqli
176d0 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 28  te3KeywordCode((
176e0 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54  u8*)zWord, n)!=T
176f0 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e  K_ID) ? SQLITE_N
17700 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20  _KEYWORD : 0;.  
17710 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17720 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a  .#endif ..    /*
17730 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
17740 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
17750 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c  TCTRL_SCRATCHMAL
17760 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20  LOC, sz, &pNew, 
17770 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20  pFree);.    **. 
17780 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65     ** Pass pFree
17790 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72   into sqlite3Scr
177a0 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20  atchFree(). .   
177b0 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e   ** If sz>0 then
177c0 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61   allocate a scra
177d0 74 63 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20  tch buffer into 
177e0 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20  pNew.  .    */. 
177f0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
17800 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d  ESTCTRL_SCRATCHM
17810 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76  ALLOC: {.      v
17820 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70  oid *pFree, **pp
17830 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  New;.      int s
17840 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61  z;.      sz = va
17850 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
17860 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f       ppNew = va_
17870 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b  arg(ap, void**);
17880 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 76  .      pFree = v
17890 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
178a0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 20 29  ;.      if( sz )
178b0 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65   *ppNew = sqlite
178c0 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73  3ScratchMalloc(s
178d0 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
178e0 33 53 63 72 61 74 63 68 46 72 65 65 28 70 46 72  3ScratchFree(pFr
178f0 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ee);.      break
17900 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17910 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
17920 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
17930 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
17940 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66  _FAULT, int onof
17950 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  f);.    **.    *
17960 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f  * If parameter o
17970 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  noff is non-zero
17980 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20  , configure the 
17990 77 72 61 70 70 65 72 73 20 73 6f 20 74 68 61 74  wrappers so that
179a0 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73   all.    ** subs
179b0 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
179c0 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20  localtime() and 
179d0 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49  variants fail. I
179e0 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c  f onoff is zero,
179f0 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69  .    ** undo thi
17a00 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a  s setting..    *
17a10 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
17a20 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c  E_TESTCTRL_LOCAL
17a30 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20  TIME_FAULT: {.  
17a40 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
17a50 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69  lConfig.bLocalti
17a60 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67  meFault = va_arg
17a70 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
17a80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
17a90 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
17aa0 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
17ab0 50 4c 41 49 4e 29 0a 20 20 20 20 2f 2a 20 20 20  PLAIN).    /*   
17ac0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
17ad0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
17ae0 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d  CTRL_EXPLAIN_STM
17af0 54 2c 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  T,.    **       
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b10 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 63   sqlite3_stmt*,c
17b20 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20  onst char**);.  
17b30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 63    **.    ** If c
17b40 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
17b50 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
17b60 45 58 50 4c 41 49 4e 2c 20 65 61 63 68 20 73 71  EXPLAIN, each sq
17b70 6c 69 74 65 33 5f 73 74 6d 74 20 68 6f 6c 64 73  lite3_stmt holds
17b80 0a 20 20 20 20 2a 2a 20 61 20 73 74 72 69 6e 67  .    ** a string
17b90 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
17ba0 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 70 61  the optimized pa
17bb0 72 73 65 20 74 72 65 65 2e 20 20 54 68 69 73 20  rse tree.  This 
17bc0 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 0a 20 20 20  test-control.   
17bd0 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f   ** returns a po
17be0 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 73 74  inter to that st
17bf0 72 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ring..    */.   
17c00 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
17c10 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54  TCTRL_EXPLAIN_ST
17c20 4d 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  MT: {.      sqli
17c30 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
17c40 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
17c50 69 74 65 33 5f 73 74 6d 74 2a 29 3b 0a 20 20 20  ite3_stmt*);.   
17c60 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a     const char **
17c70 70 7a 52 65 74 20 3d 20 76 61 5f 61 72 67 28 61  pzRet = va_arg(a
17c80 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  p, const char**)
17c90 3b 0a 20 20 20 20 20 20 2a 70 7a 52 65 74 20 3d  ;.      *pzRet =
17ca0 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c   sqlite3VdbeExpl
17cb0 61 6e 61 74 69 6f 6e 28 28 56 64 62 65 2a 29 70  anation((Vdbe*)p
17cc0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 62 72 65  Stmt);.      bre
17cd0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
17ce0 0a 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  ..  }.  va_end(a
17cf0 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  p);.#endif /* SQ
17d00 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49  LITE_OMIT_BUILTI
17d10 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74 75  N_TEST */.  retu
17d20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17d30 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74  This is a utilit
17d40 79 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75  y routine, usefu
17d50 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65  l to VFS impleme
17d60 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63  ntations, that c
17d70 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20  hecks.** to see 
17d80 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  if a database fi
17d90 6c 65 20 77 61 73 20 61 20 55 52 49 20 74 68 61  le was a URI tha
17da0 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70  t contained a sp
17db0 65 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a  ecific query .**
17dc0 20 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20   parameter, and 
17dd0 69 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68  if so obtains th
17de0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71  e value of the q
17df0 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
17e00 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e  **.** The zFilen
17e10 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
17e20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69  the filename poi
17e30 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f  nter passed into
17e40 20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20   the xOpen().** 
17e50 6d 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20  method of a VFS 
17e60 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
17e70 20 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75   The zParam argu
17e80 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
17e90 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79   of the.** query
17ea0 20 70 61 72 61 6d 65 74 65 72 20 77 65 20 73 65   parameter we se
17eb0 65 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ek.  This routin
17ec0 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61  e returns the va
17ed0 6c 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61  lue of the zPara
17ee0 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  m.** parameter i
17ef0 66 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66  f it exists.  If
17f00 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 64   the parameter d
17f10 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
17f20 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
17f30 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f  eturns a NULL po
17f40 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  inter..*/.const 
17f50 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72  char *sqlite3_ur
17f60 69 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73  i_parameter(cons
17f70 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
17f80 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
17f90 50 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46  Param){.  if( zF
17fa0 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ilename==0 ) ret
17fb0 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61  urn 0;.  zFilena
17fc0 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  me += sqlite3Str
17fd0 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
17fe0 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a   + 1;.  while( z
17ff0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
18000 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63 6d     int x = strcm
18010 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  p(zFilename, zPa
18020 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  ram);.    zFilen
18030 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  ame += sqlite3St
18040 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
18050 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 78  ) + 1;.    if( x
18060 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46 69  ==0 ) return zFi
18070 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c  lename;.    zFil
18080 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33  ename += sqlite3
18090 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
180a0 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72  me) + 1;.  }.  r
180b0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
180c0 2a 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65  * Return a boole
180d0 61 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71  an value for a q
180e0 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
180f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 75  */.int sqlite3_u
18100 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74  ri_boolean(const
18110 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
18120 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
18130 61 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29  aram, int bDflt)
18140 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
18150 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  z = sqlite3_uri_
18160 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e  parameter(zFilen
18170 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20  ame, zParam);.  
18180 62 44 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30  bDflt = bDflt!=0
18190 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f 20 73  ;.  return z ? s
181a0 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e  qlite3GetBoolean
181b0 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62 44 66  (z, bDflt) : bDf
181c0 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  lt;.}../*.** Ret
181d0 75 72 6e 20 61 20 36 34 2d 62 69 74 20 69 6e 74  urn a 64-bit int
181e0 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 61  eger value for a
181f0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
18200 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
18210 36 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 69  64 sqlite3_uri_i
18220 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74 20 63 68  nt64(.  const ch
18230 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
18240 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73    /* Filename as
18250 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e   passed to xOpen
18260 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
18270 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 20   *zParam,       
18280 2f 2a 20 55 52 49 20 70 61 72 61 6d 65 74 65 72  /* URI parameter
18290 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c   sought */.  sql
182a0 69 74 65 33 5f 69 6e 74 36 34 20 62 44 66 6c 74  ite3_int64 bDflt
182b0 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e         /* return
182c0 20 69 66 20 70 61 72 61 6d 65 74 65 72 20 69 73   if parameter is
182d0 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20   missing */.){. 
182e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
182f0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
18300 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65  ameter(zFilename
18310 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c  , zParam);.  sql
18320 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20  ite3_int64 v;.  
18330 69 66 28 20 7a 20 26 26 20 73 71 6c 69 74 65 33  if( z && sqlite3
18340 41 74 6f 69 36 34 28 7a 2c 20 26 76 2c 20 73 71  Atoi64(z, &v, sq
18350 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
18360 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3d 3d  , SQLITE_UTF8)==
18370 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18380 20 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a   bDflt = v;.  }.
18390 20 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a    return bDflt;.
183a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
183b0 74 68 65 20 42 74 72 65 65 20 70 6f 69 6e 74 65  the Btree pointe
183c0 72 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  r identified by 
183d0 7a 44 62 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e  zDbName.  Return
183e0 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
183f0 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71  nd..*/.Btree *sq
18400 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72  lite3DbNameToBtr
18410 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ee(sqlite3 *db, 
18420 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
18430 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
18440 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
18450 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
18460 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  f( db->aDb[i].pB
18470 74 0a 20 20 20 20 20 26 26 20 28 7a 44 62 4e 61  t.     && (zDbNa
18480 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  me==0 || sqlite3
18490 53 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c  StrICmp(zDbName,
184a0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d   db->aDb[i].zNam
184b0 65 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  e)==0).    ){.  
184c0 20 20 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61      return db->a
184d0 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 7d  Db[i].pBt;.    }
184e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
184f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
18500 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66   the filename of
18510 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
18520 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
18530 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e  database.** conn
18540 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74  ection..*/.const
18550 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64   char *sqlite3_d
18560 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74  b_filename(sqlit
18570 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
18580 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20  ar *zDbName){.  
18590 42 74 72 65 65 20 2a 70 42 74 20 3d 20 73 71 6c  Btree *pBt = sql
185a0 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
185b0 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  e(db, zDbName);.
185c0 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73    return pBt ? s
185d0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
185e0 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20 30 3b  lename(pBt) : 0;
185f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
18600 20 31 20 69 66 20 64 61 74 61 62 61 73 65 20 69   1 if database i
18610 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30  s read-only or 0
18620 20 69 66 20 72 65 61 64 2f 77 72 69 74 65 2e 20   if read/write. 
18630 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a   Return -1 if.**
18640 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61 73   no such databas
18650 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74  e exists..*/.int
18660 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64   sqlite3_db_read
18670 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a 64 62  only(sqlite3 *db
18680 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
18690 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20  bName){.  Btree 
186a0 2a 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62  *pBt = sqlite3Db
186b0 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20  NameToBtree(db, 
186c0 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  zDbName);.  retu
186d0 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33  rn pBt ? sqlite3
186e0 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
186f0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
18700 72 28 70 42 74 29 29 20 3a 20 2d 31 3b 0a 7d 0a  r(pBt)) : -1;.}.
18710 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41  .#if (SQLITE_ENA
18720 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29  BLE_APPLE_SPI>0)
18730 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
18740 50 4c 45 5f 5f 29 0a 0a 23 69 6e 63 6c 75 64 65  PLE__)..#include
18750 20 22 73 71 6c 69 74 65 33 5f 70 72 69 76 61 74   "sqlite3_privat
18760 65 2e 68 22 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 73  e.h"../* .** Tes
18770 74 69 6e 67 20 61 20 66 69 6c 65 20 70 61 74 68  ting a file path
18780 20 66 6f 72 20 73 71 6c 69 74 65 20 6c 6f 63 6b   for sqlite lock
18790 73 20 68 65 6c 64 20 62 79 20 61 20 70 72 6f 63  s held by a proc
187a0 65 73 73 20 49 44 2e 20 0a 2a 2a 20 52 65 74 75  ess ID. .** Retu
187b0 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53  rns SQLITE_LOCKS
187c0 54 41 54 45 5f 4f 4e 20 69 66 20 6c 6f 63 6b 73  TATE_ON if locks
187d0 20 61 72 65 20 70 72 65 73 65 6e 74 20 6f 6e 20   are present on 
187e0 70 61 74 68 0a 2a 2a 20 74 68 61 74 20 77 6f 75  path.** that wou
187f0 6c 64 20 70 72 65 76 65 6e 74 20 77 72 69 74 69  ld prevent writi
18800 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
18810 73 65 2e 0a 2a 2f 0a 69 6e 74 20 5f 73 71 6c 69  se..*/.int _sqli
18820 74 65 33 5f 6c 6f 63 6b 73 74 61 74 65 28 63 6f  te3_lockstate(co
18830 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20  nst char *path, 
18840 70 69 64 5f 74 20 70 69 64 29 7b 0a 20 20 73 71  pid_t pid){.  sq
18850 6c 69 74 65 33 20 2a 64 62 20 3d 20 4e 55 4c 4c  lite3 *db = NULL
18860 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74  ;.  .  if( sqlit
18870 65 33 5f 6f 70 65 6e 5f 76 32 28 70 61 74 68 2c  e3_open_v2(path,
18880 20 26 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45   &db, SQLITE_OPE
18890 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 4e 55 4c 4c  N_READONLY, NULL
188a0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  ) == SQLITE_OK )
188b0 7b 0a 20 20 20 20 4c 6f 63 6b 73 74 61 74 65 50  {.    LockstateP
188c0 49 44 20 6c 6f 63 6b 73 74 61 74 65 20 3d 20 7b  ID lockstate = {
188d0 70 69 64 2c 20 2d 31 7d 3b 0a 20 20 20 20 73 71  pid, -1};.    sq
188e0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
188f0 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c  ol(db, NULL, SQL
18900 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
18910 41 54 45 5f 50 49 44 2c 20 26 6c 6f 63 6b 73 74  ATE_PID, &lockst
18920 61 74 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ate);.    sqlite
18930 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20  3_close(db);.   
18940 20 69 6e 74 20 73 74 61 74 65 20 3d 20 6c 6f 63   int state = loc
18950 6b 73 74 61 74 65 2e 73 74 61 74 65 3b 0a 20 20  kstate.state;.  
18960 20 20 72 65 74 75 72 6e 20 73 74 61 74 65 3b 0a    return state;.
18970 20 20 7d 0a 20 20 69 66 28 20 4e 55 4c 4c 21 3d    }.  if( NULL!=
18980 64 62 20 29 7b 20 0a 20 20 20 20 73 71 6c 69 74  db ){ .    sqlit
18990 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 20 2f 2a  e3_close(db); /*
189a0 20 6e 65 65 64 20 74 6f 20 63 6c 6f 73 65 20 65   need to close e
189b0 76 65 6e 20 69 66 20 6f 70 65 6e 20 72 65 74 75  ven if open retu
189c0 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  rns an error */.
189d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
189e0 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 45 52  ITE_LOCKSTATE_ER
189f0 52 4f 52 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  ROR;.}..#endif /
18a00 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
18a10 41 50 50 4c 45 5f 53 50 49 20 2a 2f 0a           APPLE_SPI */.