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

Artifact b3d19f5a1a7341fac59fcdd5ddcdb0619fe98107:


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 23 69 66 64 65  lt code */.#ifde
1140: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  f SQLITE_EXTRA_I
1150: 4e 49 54 0a 20 20 69 6e 74 20 62 52 75 6e 45 78  NIT.  int bRunEx
1160: 74 72 61 49 6e 69 74 20 3d 20 30 3b 20 20 20 20  traInit = 0;    
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1180: 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 69 74     /* Extra init
1190: 69 61 6c 69 7a 61 74 69 6f 6e 20 6e 65 65 64 65  ialization neede
11a0: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66  d */.#endif..#if
11b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11c0: 57 53 44 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  WSD.  rc = sqlit
11d0: 65 33 5f 77 73 64 5f 69 6e 69 74 28 34 30 39 36  e3_wsd_init(4096
11e0: 2c 20 32 34 29 3b 0a 20 20 69 66 28 20 72 63 21  , 24);.  if( rc!
11f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1200: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1210: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1220: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
1230: 64 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 6e  dy completely in
1240: 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20  itialized, then 
1250: 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74  this call.  ** t
1260: 6f 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  o sqlite3_initia
1270: 6c 69 7a 65 28 29 20 73 68 6f 75 6c 64 20 62 65  lize() should be
1280: 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 74   a no-op.  But t
1290: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
12a0: 6e 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 63  n.  ** must be c
12b0: 6f 6d 70 6c 65 74 65 2e 20 20 53 6f 20 69 73 49  omplete.  So isI
12c0: 6e 69 74 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  nit must not be 
12d0: 73 65 74 20 75 6e 74 69 6c 20 74 68 65 20 76 65  set until the ve
12e0: 72 79 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74  ry end.  ** of t
12f0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a  his routine..  *
1300: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  /.  if( sqlite3G
1310: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
1320: 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  it ) return SQLI
1330: 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  TE_OK;..  /* Mak
1340: 65 20 73 75 72 65 20 74 68 65 20 6d 75 74 65 78  e sure the mutex
1350: 20 73 75 62 73 79 73 74 65 6d 20 69 73 20 69 6e   subsystem is in
1360: 69 74 69 61 6c 69 7a 65 64 2e 20 20 49 66 20 75  itialized.  If u
1370: 6e 61 62 6c 65 20 74 6f 20 0a 20 20 2a 2a 20 69  nable to .  ** i
1380: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 75  nitialize the mu
1390: 74 65 78 20 73 75 62 73 79 73 74 65 6d 2c 20 72  tex subsystem, r
13a0: 65 74 75 72 6e 20 65 61 72 6c 79 20 77 69 74 68  eturn early with
13b0: 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 2a 2a   the error..  **
13c0: 20 49 66 20 74 68 65 20 73 79 73 74 65 6d 20 69   If the system i
13d0: 73 20 73 6f 20 73 69 63 6b 20 74 68 61 74 20 77  s so sick that w
13e0: 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
13f0: 61 6c 6c 6f 63 61 74 65 20 61 20 6d 75 74 65 78  allocate a mutex
1400: 2c 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  ,.  ** there is 
1410: 6e 6f 74 20 6d 75 63 68 20 53 51 4c 69 74 65 20  not much SQLite 
1420: 69 73 20 67 6f 69 6e 67 20 74 6f 20 62 65 20 61  is going to be a
1430: 62 6c 65 20 74 6f 20 64 6f 2e 0a 20 20 2a 2a 0a  ble to do..  **.
1440: 20 20 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 73    ** The mutex s
1450: 75 62 73 79 73 74 65 6d 20 6d 75 73 74 20 74 61  ubsystem must ta
1460: 6b 65 20 63 61 72 65 20 6f 66 20 73 65 72 69 61  ke care of seria
1470: 6c 69 7a 69 6e 67 20 69 74 73 20 6f 77 6e 0a 20  lizing its own. 
1480: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69   ** initializati
1490: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
14a0: 73 71 6c 69 74 65 33 4d 75 74 65 78 49 6e 69 74  sqlite3MutexInit
14b0: 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
14c0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
14d0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  Initialize the m
14e0: 61 6c 6c 6f 63 28 29 20 73 79 73 74 65 6d 20 61  alloc() system a
14f0: 6e 64 20 74 68 65 20 72 65 63 75 72 73 69 76 65  nd the recursive
1500: 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65   pInitMutex mute
1510: 78 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 70 65  x..  ** This ope
1520: 72 61 74 69 6f 6e 20 69 73 20 70 72 6f 74 65 63  ration is protec
1530: 74 65 64 20 62 79 20 74 68 65 20 53 54 41 54 49  ted by the STATI
1540: 43 5f 4d 41 53 54 45 52 20 6d 75 74 65 78 2e 20  C_MASTER mutex. 
1550: 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20   Note that.  ** 
1560: 4d 75 74 65 78 41 6c 6c 6f 63 28 29 20 69 73 20  MutexAlloc() is 
1570: 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 73 74 61  called for a sta
1580: 74 69 63 20 6d 75 74 65 78 20 70 72 69 6f 72 20  tic mutex prior 
1590: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  to initializing 
15a0: 74 68 65 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20  the.  ** malloc 
15b0: 73 75 62 73 79 73 74 65 6d 20 2d 20 74 68 69 73  subsystem - this
15c0: 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
15d0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  e allocation of 
15e0: 61 20 73 74 61 74 69 63 0a 20 20 2a 2a 20 6d 75  a static.  ** mu
15f0: 74 65 78 20 6d 75 73 74 20 6e 6f 74 20 72 65 71  tex must not req
1600: 75 69 72 65 20 73 75 70 70 6f 72 74 20 66 72 6f  uire support fro
1610: 6d 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 75 62  m the malloc sub
1620: 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 4d  system..  */.  M
1630: 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73  UTEX_LOGIC( pMas
1640: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  ter = sqlite3Mut
1650: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
1660: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
1670: 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33  ER); ).  sqlite3
1680: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
1690: 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ster);.  sqlite3
16a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
16b0: 75 74 65 78 49 6e 69 74 20 3d 20 31 3b 0a 20 20  utexInit = 1;.  
16c0: 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f 62  if( !sqlite3Glob
16d0: 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f  alConfig.isMallo
16e0: 63 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63 20  cInit ){.    rc 
16f0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 49  = sqlite3MallocI
1700: 6e 69 74 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28  nit();.  }.  if(
1710: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1720: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  {.    sqlite3Glo
1730: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c  balConfig.isMall
1740: 6f 63 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  ocInit = 1;.    
1750: 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f 62  if( !sqlite3Glob
1760: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
1770: 74 65 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  tex ){.      sql
1780: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1790: 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 0a 20 20  .pInitMutex =.  
17a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17b0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
17c0: 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56  E_MUTEX_RECURSIV
17d0: 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  E);.      if( sq
17e0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
17f0: 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 26 26 20  g.bCoreMutex && 
1800: 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  !sqlite3GlobalCo
1810: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20  nfig.pInitMutex 
1820: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1830: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1840: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1850: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1860: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
1870: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
1880: 52 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a  RefInitMutex++;.
1890: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
18a0: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
18b0: 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20  r);..  /* If rc 
18c0: 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
18d0: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
18e0: 74 68 65 6e 20 65 69 74 68 65 72 20 74 68 65 20  then either the 
18f0: 6d 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73  malloc.  ** subs
1900: 79 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20  ystem could not 
1910: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f  be initialized o
1920: 72 20 74 68 65 20 73 79 73 74 65 6d 20 66 61 69  r the system fai
1930: 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  led to allocate.
1940: 20 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d 75    ** the pInitMu
1950: 74 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75 72  tex mutex. Retur
1960: 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65 69  n an error in ei
1970: 74 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20  ther case.  */. 
1980: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1990: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
19a0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44   rc;.  }..  /* D
19b0: 6f 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  o the rest of th
19c0: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
19d0: 20 75 6e 64 65 72 20 74 68 65 20 72 65 63 75 72   under the recur
19e0: 73 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20 20  sive mutex so.  
19f0: 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  ** that we will 
1a00: 62 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c  be able to handl
1a10: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1a20: 73 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69  s into.  ** sqli
1a30: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1a40: 2e 20 20 54 68 65 20 72 65 63 75 72 73 69 76 65  .  The recursive
1a50: 20 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20   calls normally 
1a60: 63 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 2a  come through.  *
1a70: 2a 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69  * sqlite3_os_ini
1a80: 74 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76 6f  t() when it invo
1a90: 6b 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  kes sqlite3_vfs_
1aa0: 72 65 67 69 73 74 65 72 28 29 2c 20 62 75 74 20  register(), but 
1ab0: 6f 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75 72  other.  ** recur
1ac0: 73 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68 74  sive calls might
1ad0: 20 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62 6c   also be possibl
1ae0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50  e..  **.  ** IMP
1af0: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
1b00: 52 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53 51  R-00140-37445 SQ
1b10: 4c 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  Lite automatical
1b20: 6c 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63 61  ly serializes ca
1b30: 6c 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  lls.  ** to the 
1b40: 78 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f  xInit method, so
1b50: 20 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f   the xInit metho
1b60: 64 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68  d need not be th
1b70: 72 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20  readsafe..  **. 
1b80: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
1b90: 67 20 6d 75 74 65 78 20 69 73 20 77 68 61 74 20  g mutex is what 
1ba0: 73 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65 73  serializes acces
1bb0: 73 20 74 6f 20 74 68 65 20 61 70 70 64 65 66 20  s to the appdef 
1bc0: 70 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20 2a  pcache xInit.  *
1bd0: 2a 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20  * methods.  The 
1be0: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
1bf0: 65 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20 61  ethods.xInit() a
1c00: 6c 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20 69  ll is embedded i
1c10: 6e 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20  n the.  ** call 
1c20: 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  to sqlite3Pcache
1c30: 49 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20  Initialize()..  
1c40: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
1c50: 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
1c60: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1c70: 69 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  itMutex);.  if( 
1c80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1c90: 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26  fig.isInit==0 &&
1ca0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1cb0: 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d  nfig.inProgress=
1cc0: 3d 30 20 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  =0 ){.    FuncDe
1cd0: 66 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26  fHash *pHash = &
1ce0: 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66 48 61  GLOBAL(FuncDefHa
1cf0: 73 68 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  sh, sqlite3Globa
1d00: 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20 20  lFunctions);.   
1d10: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1d20: 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20  nfig.inProgress 
1d30: 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  = 1;.    memset(
1d40: 70 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  pHash, 0, sizeof
1d50: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75  (sqlite3GlobalFu
1d60: 6e 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20 73  nctions));.    s
1d70: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 47 6c  qlite3RegisterGl
1d80: 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 28 29 3b  obalFunctions();
1d90: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1da0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50  GlobalConfig.isP
1db0: 43 61 63 68 65 49 6e 69 74 3d 3d 30 20 29 7b 0a  CacheInit==0 ){.
1dc0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1dd0: 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69  e3PcacheInitiali
1de0: 7a 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ze();.    }.    
1df0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e00: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1e10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1e20: 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 31 3b  sPCacheInit = 1;
1e30: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1e40: 74 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20 20 20  te3OsInit();.   
1e50: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
1e60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e70: 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 42    sqlite3PCacheB
1e80: 75 66 66 65 72 53 65 74 75 70 28 20 73 71 6c 69  ufferSetup( sqli
1e90: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1ea0: 70 50 61 67 65 2c 20 0a 20 20 20 20 20 20 20 20  pPage, .        
1eb0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1ec0: 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20 73 71  onfig.szPage, sq
1ed0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1ee0: 67 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  g.nPage);.      
1ef0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1f00: 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  fig.isInit = 1;.
1f10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58  #ifdef SQLITE_EX
1f20: 54 52 41 5f 49 4e 49 54 0a 20 20 20 20 20 20 62  TRA_INIT.      b
1f30: 52 75 6e 45 78 74 72 61 49 6e 69 74 20 3d 20 31  RunExtraInit = 1
1f40: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
1f50: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1f60: 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73  Config.inProgres
1f70: 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  s = 0;.  }.  sql
1f80: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1f90: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
1fa0: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29  nfig.pInitMutex)
1fb0: 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63 6b 20  ;..  /* Go back 
1fc0: 75 6e 64 65 72 20 74 68 65 20 73 74 61 74 69 63  under the static
1fd0: 20 6d 75 74 65 78 20 61 6e 64 20 63 6c 65 61 6e   mutex and clean
1fe0: 20 75 70 20 74 68 65 20 72 65 63 75 72 73 69 76   up the recursiv
1ff0: 65 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74 6f 20  e.  ** mutex to 
2000: 70 72 65 76 65 6e 74 20 61 20 72 65 73 6f 75 72  prevent a resour
2010: 63 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20  ce leak..  */.  
2020: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
2030: 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
2040: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2050: 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65  fig.nRefInitMute
2060: 78 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  x--;.  if( sqlit
2070: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2080: 52 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d 30 20  RefInitMutex<=0 
2090: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
20a0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
20b0: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
20c0: 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
20d0: 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73 71  e3_mutex_free(sq
20e0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
20f0: 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20  g.pInitMutex);. 
2100: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2110: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
2120: 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  x = 0;.  }.  sql
2130: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
2140: 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a  (pMaster);..  /*
2150: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
2160: 73 20 6a 75 73 74 20 61 20 73 61 6e 69 74 79 20  s just a sanity 
2170: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  check to make su
2180: 72 65 20 53 51 4c 69 74 65 20 68 61 73 0a 20 20  re SQLite has.  
2190: 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64  ** been compiled
21a0: 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 74 20   correctly.  It 
21b0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
21c0: 72 75 6e 20 74 68 69 73 20 63 6f 64 65 2c 20 62  run this code, b
21d0: 75 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74  ut.  ** we don't
21e0: 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 69 74 20   want to run it 
21f0: 74 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20 73 6f  too often and so
2200: 61 6b 20 75 70 20 43 50 55 20 63 79 63 6c 65 73  ak up CPU cycles
2210: 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72 65 61   for no.  ** rea
2220: 73 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75 6e 20  son.  So we run 
2230: 69 74 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 69  it once during i
2240: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20  nitialization.. 
2250: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
2260: 55 47 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  UG.#ifndef SQLIT
2270: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
2280: 50 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69 73 20  POINT.  /* This 
2290: 73 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64 65 27  section of code'
22a0: 73 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74 22 20  s only "output" 
22b0: 69 73 20 76 69 61 20 61 73 73 65 72 74 28 29 20  is via assert() 
22c0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20  statements. */. 
22d0: 20 69 66 20 28 20 72 63 3d 3d 53 51 4c 49 54 45   if ( rc==SQLITE
22e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34 20 78  _OK ){.    u64 x
22f0: 20 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 36 33   = (((u64)1)<<63
2300: 29 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  )-1;.    double 
2310: 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69  y;.    assert(si
2320: 7a 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20 20 20  zeof(x)==8);.   
2330: 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78   assert(sizeof(x
2340: 29 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b 0a 20  )==sizeof(y));. 
2350: 20 20 20 6d 65 6d 63 70 79 28 26 79 2c 20 26 78     memcpy(&y, &x
2360: 2c 20 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 8);.    assert
2370: 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 79  ( sqlite3IsNaN(y
2380: 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ) );.  }.#endif.
2390: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20  #endif..  /* Do 
23a0: 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61  extra initializa
23b0: 74 69 6f 6e 20 73 74 65 70 73 20 72 65 71 75 65  tion steps reque
23c0: 73 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  sted by the SQLI
23d0: 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20  TE_EXTRA_INIT.  
23e0: 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** compile-time 
23f0: 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  option..  */.#if
2400: 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41  def SQLITE_EXTRA
2410: 5f 49 4e 49 54 0a 20 20 69 66 28 20 62 52 75 6e  _INIT.  if( bRun
2420: 45 78 74 72 61 49 6e 69 74 20 29 7b 0a 20 20 20  ExtraInit ){.   
2430: 20 69 6e 74 20 53 51 4c 49 54 45 5f 45 58 54 52   int SQLITE_EXTR
2440: 41 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63 68 61  A_INIT(const cha
2450: 72 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  r*);.    rc = SQ
2460: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28  LITE_EXTRA_INIT(
2470: 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
2480: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2490: 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65  /*.** Undo the e
24a0: 66 66 65 63 74 73 20 6f 66 20 73 71 6c 69 74 65  ffects of sqlite
24b0: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20  3_initialize(). 
24c0: 20 4d 75 73 74 20 6e 6f 74 20 62 65 20 63 61 6c   Must not be cal
24d0: 6c 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65  led while.** the
24e0: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
24f0: 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ng database conn
2500: 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72  ections or memor
2510: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72  y allocations or
2520: 0a 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 70 61  .** while any pa
2530: 72 74 20 6f 66 20 53 51 4c 69 74 65 20 69 73 20  rt of SQLite is 
2540: 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65  otherwise in use
2550: 20 69 6e 20 61 6e 79 20 74 68 72 65 61 64 2e 20   in any thread. 
2560: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
2570: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61   is not threadsa
2580: 66 65 2e 20 20 42 75 74 20 69 74 20 69 73 20 73  fe.  But it is s
2590: 61 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  afe to invoke th
25a0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e  is routine.** on
25b0: 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20   when SQLite is 
25c0: 61 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77  already shut dow
25d0: 6e 2e 20 20 49 66 20 53 51 4c 69 74 65 20 69 73  n.  If SQLite is
25e0: 20 61 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f   already shut do
25f0: 77 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  wn.** when this 
2600: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
2610: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ed, then this ro
2620: 75 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c  utine is a harml
2630: 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e  ess no-op..*/.in
2640: 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  t sqlite3_shutdo
2650: 77 6e 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  wn(void){.  if( 
2660: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2670: 66 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a 23 69  fig.isInit ){.#i
2680: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52  fdef SQLITE_EXTR
2690: 41 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20 20 76  A_SHUTDOWN.    v
26a0: 6f 69 64 20 53 51 4c 49 54 45 5f 45 58 54 52 41  oid SQLITE_EXTRA
26b0: 5f 53 48 55 54 44 4f 57 4e 28 76 6f 69 64 29 3b  _SHUTDOWN(void);
26c0: 0a 20 20 20 20 53 51 4c 49 54 45 5f 45 58 54 52  .    SQLITE_EXTR
26d0: 41 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a 23 65  A_SHUTDOWN();.#e
26e0: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
26f0: 5f 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73  _os_end();.    s
2700: 71 6c 69 74 65 33 5f 72 65 73 65 74 5f 61 75 74  qlite3_reset_aut
2710: 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20  o_extension();. 
2720: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2730: 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20  Config.isInit = 
2740: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2750: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2760: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 29 7b  .isPCacheInit ){
2770: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
2780: 68 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20  heShutdown();.  
2790: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
27a0: 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e  onfig.isPCacheIn
27b0: 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  it = 0;.  }.  if
27c0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
27d0: 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e  onfig.isMallocIn
27e0: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
27f0: 33 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20  3MallocEnd();.  
2800: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2810: 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e  onfig.isMallocIn
2820: 69 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66  it = 0;..#ifndef
2830: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 55   SQLITE_OMIT_SHU
2840: 54 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52 49 45  TDOWN_DIRECTORIE
2850: 53 0a 20 20 20 20 2f 2a 20 54 68 65 20 68 65 61  S.    /* The hea
2860: 70 20 73 75 62 73 79 73 74 65 6d 20 68 61 73 20  p subsystem has 
2870: 6e 6f 77 20 62 65 65 6e 20 73 68 75 74 64 6f 77  now been shutdow
2880: 6e 20 61 6e 64 20 74 68 65 73 65 20 76 61 6c 75  n and these valu
2890: 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 64 0a  es are supposed.
28a0: 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e 55 4c      ** to be NUL
28b0: 4c 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20 6d 65  L or point to me
28c0: 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20 6f 62  mory that was ob
28d0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
28e0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a 20 20  te3_malloc(),.  
28f0: 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64    ** which would
2900: 20 72 65 6c 79 20 6f 6e 20 74 68 61 74 20 68 65   rely on that he
2910: 61 70 20 73 75 62 73 79 73 74 65 6d 3b 20 74 68  ap subsystem; th
2920: 65 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20 73 75  erefore, make su
2930: 72 65 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20  re these.    ** 
2940: 76 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20 72 65  values cannot re
2950: 66 65 72 20 74 6f 20 68 65 61 70 20 6d 65 6d 6f  fer to heap memo
2960: 72 79 20 74 68 61 74 20 77 61 73 20 6a 75 73 74  ry that was just
2970: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 77 68 65   invalidated whe
2980: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 68 65 61  n the.    ** hea
2990: 70 20 73 75 62 73 79 73 74 65 6d 20 77 61 73 20  p subsystem was 
29a0: 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 20  shutdown.  This 
29b0: 69 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69 66 20  is only done if 
29c0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c  the current call
29d0: 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   to.    ** this 
29e0: 66 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c 74 65  function resulte
29f0: 64 20 69 6e 20 74 68 65 20 68 65 61 70 20 73 75  d in the heap su
2a00: 62 73 79 73 74 65 6d 20 61 63 74 75 61 6c 6c 79  bsystem actually
2a10: 20 62 65 69 6e 67 20 73 68 75 74 64 6f 77 6e 2e   being shutdown.
2a20: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
2a30: 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
2a40: 72 79 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ry = 0;.    sqli
2a50: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
2a60: 72 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ry = 0;.#endif. 
2a70: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
2a80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
2a90: 75 74 65 78 49 6e 69 74 20 29 7b 0a 20 20 20 20  utexInit ){.    
2aa0: 73 71 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28  sqlite3MutexEnd(
2ab0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
2ac0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74  obalConfig.isMut
2ad0: 65 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  exInit = 0;.  }.
2ae0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2af0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
2b00: 69 73 20 41 50 49 20 61 6c 6c 6f 77 73 20 61 70  is API allows ap
2b10: 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f  plications to mo
2b20: 64 69 66 79 20 74 68 65 20 67 6c 6f 62 61 6c 20  dify the global 
2b30: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66  configuration of
2b40: 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c  .** the SQLite l
2b50: 69 62 72 61 72 79 20 61 74 20 72 75 6e 2d 74 69  ibrary at run-ti
2b60: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  me..**.** This r
2b70: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
2b80: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ly be called whe
2b90: 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  n there are no o
2ba0: 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61  utstanding.** da
2bb0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2bc0: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2bd0: 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20  ocations.  This 
2be0: 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a  routine is not.*
2bf0: 2a 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 46  * threadsafe.  F
2c00: 61 69 6c 75 72 65 20 74 6f 20 68 65 65 64 20 74  ailure to heed t
2c10: 68 65 73 65 20 77 61 72 6e 69 6e 67 73 20 63 61  hese warnings ca
2c20: 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70 72 65 64  n lead to unpred
2c30: 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76  ictable.** behav
2c40: 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ior..*/.int sqli
2c50: 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f  te3_config(int o
2c60: 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  p, ...){.  va_li
2c70: 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20  st ap;.  int rc 
2c80: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2c90: 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  /* sqlite3_confi
2ca0: 67 28 29 20 73 68 61 6c 6c 20 72 65 74 75 72 6e  g() shall return
2cb0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69   SQLITE_MISUSE i
2cc0: 66 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  f it is invoked 
2cd0: 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53  while.  ** the S
2ce0: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 69 73  QLite library is
2cf0: 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66   in use. */.  if
2d00: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2d10: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72  onfig.isInit ) r
2d20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
2d30: 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f  USE_BKPT;..  va_
2d40: 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
2d50: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a   switch( op ){..
2d60: 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e      /* Mutex con
2d70: 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f  figuration optio
2d80: 6e 73 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69  ns are only avai
2d90: 6c 61 62 6c 65 20 69 6e 20 61 20 74 68 72 65 61  lable in a threa
2da0: 64 73 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d  dsafe.    ** com
2db0: 70 69 6c 65 2e 20 0a 20 20 20 20 2a 2f 0a 23 69  pile. .    */.#i
2dc0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2dd0: 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20  _THREADSAFE) && 
2de0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
2df0: 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c  E>0.    case SQL
2e00: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c  ITE_CONFIG_SINGL
2e10: 45 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20  ETHREAD: {.     
2e20: 20 2f 2a 20 44 69 73 61 62 6c 65 20 61 6c 6c 20   /* Disable all 
2e30: 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20  mutexing */.    
2e40: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2e50: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
2e60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
2e70: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2e80: 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a  bFullMutex = 0;.
2e90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2ea0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
2eb0: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54  TE_CONFIG_MULTIT
2ec0: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
2ed0: 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 69  * Disable mutexi
2ee0: 6e 67 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ng of database c
2ef0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
2f00: 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75      /* Enable mu
2f10: 74 65 78 69 6e 67 20 6f 66 20 63 6f 72 65 20 64  texing of core d
2f20: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a  ata structures *
2f30: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
2f40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
2f50: 65 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20  eMutex = 1;.    
2f60: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2f70: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
2f80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
2f90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
2fa0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
2fb0: 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20  SERIALIZED: {.  
2fc0: 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c      /* Enable al
2fd0: 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20  l mutexing */.  
2fe0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2ff0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
3000: 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  ex = 1;.      sq
3010: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3020: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31  g.bFullMutex = 1
3030: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3040: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3050: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45  LITE_CONFIG_MUTE
3060: 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70  X: {.      /* Sp
3070: 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61  ecify an alterna
3080: 74 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65  tive mutex imple
3090: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  mentation */.   
30a0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
30b0: 43 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a  Config.mutex = *
30c0: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
30d0: 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73  e3_mutex_methods
30e0: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
30f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3100: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
3110: 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  TMUTEX: {.      
3120: 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20  /* Retrieve the 
3130: 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d  current mutex im
3140: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
3150: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
3160: 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  , sqlite3_mutex_
3170: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
3180: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3190: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65  mutex;.      bre
31a0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
31b0: 0a 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ...    case SQLI
31c0: 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43  TE_CONFIG_MALLOC
31d0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65  : {.      /* Spe
31e0: 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74  cify an alternat
31f0: 69 76 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65  ive malloc imple
3200: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  mentation */.   
3210: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3220: 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61  Config.m = *va_a
3230: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d  rg(ap, sqlite3_m
3240: 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20  em_methods*);.  
3250: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3260: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3270: 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f  _CONFIG_GETMALLO
3280: 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65  C: {.      /* Re
3290: 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65  trieve the curre
32a0: 6e 74 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c  nt malloc() impl
32b0: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
32c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
32d0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d  lobalConfig.m.xM
32e0: 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74  alloc==0 ) sqlit
32f0: 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28  e3MemSetDefault(
3300: 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67  );.      *va_arg
3310: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d  (ap, sqlite3_mem
3320: 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c  _methods*) = sql
3330: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3340: 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  .m;.      break;
3350: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3360: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45  SQLITE_CONFIG_ME
3370: 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20  MSTATUS: {.     
3380: 20 2f 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69   /* Enable or di
3390: 73 61 62 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63  sable the malloc
33a0: 20 73 74 61 74 75 73 20 63 6f 6c 6c 65 63 74 69   status collecti
33b0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
33c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
33d0: 62 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72  bMemstat = va_ar
33e0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
33f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3400: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3410: 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b  ONFIG_SCRATCH: {
3420: 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e  .      /* Design
3430: 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72  ate a buffer for
3440: 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20   scratch memory 
3450: 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73  space */.      s
3460: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3470: 69 67 2e 70 53 63 72 61 74 63 68 20 3d 20 76 61  ig.pScratch = va
3480: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
3490: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
34a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72  obalConfig.szScr
34b0: 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70  atch = va_arg(ap
34c0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
34d0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
34e0: 67 2e 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f  g.nScratch = va_
34f0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3510: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3520: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
3530: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65  E: {.      /* De
3540: 73 69 67 6e 61 74 65 20 61 20 62 75 66 66 65 72  signate a buffer
3550: 20 66 6f 72 20 70 61 67 65 20 63 61 63 68 65 20   for page cache 
3560: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a  memory space */.
3570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3580: 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 20  balConfig.pPage 
3590: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
35a0: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
35b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
35c0: 7a 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  zPage = va_arg(a
35d0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  p, int);.      s
35e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
35f0: 69 67 2e 6e 50 61 67 65 20 3d 20 76 61 5f 61 72  ig.nPage = va_ar
3600: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3610: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
3620: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3630: 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b  CONFIG_PCACHE: {
3640: 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20  .      /* no-op 
3650: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
3660: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
3670: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3680: 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20  PCACHE: {.      
3690: 2f 2a 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20  /* now an error 
36a0: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
36b0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
36c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
36d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
36e0: 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 3a 20  CONFIG_PCACHE2: 
36f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69  {.      /* Speci
3700: 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  fy an alternativ
3710: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6d 70  e page cache imp
3720: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  lementation */. 
3730: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3740: 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32  alConfig.pcache2
3750: 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73   = *va_arg(ap, s
3760: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
3770: 74 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20 20  thods2*);.      
3780: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3790: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
37a0: 46 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a 20  FIG_GETPCACHE2: 
37b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
37c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
37d0: 70 63 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30  pcache2.xInit==0
37e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
37f0: 74 65 33 50 43 61 63 68 65 53 65 74 44 65 66 61  te3PCacheSetDefa
3800: 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ult();.      }. 
3810: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
3820: 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
3830: 6d 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c  methods2*) = sql
3840: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3850: 2e 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20 20  .pcache2;.      
3860: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
3870: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3880: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29  _ENABLE_MEMSYS3)
3890: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
38a0: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
38b0: 35 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  5).    case SQLI
38c0: 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20  TE_CONFIG_HEAP: 
38d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67  {.      /* Desig
38e0: 6e 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f  nate a buffer fo
38f0: 72 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 73 70  r heap memory sp
3900: 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ace */.      sql
3910: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3920: 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .pHeap = va_arg(
3930: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
3940: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3950: 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61  onfig.nHeap = va
3960: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3970: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3980: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d  alConfig.mnReq =
3990: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
39a0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ;..      if( sql
39b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
39c0: 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20  .mnReq<1 ){.    
39d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
39e0: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
39f0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
3a00: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
3a10: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c  Config.mnReq>(1<
3a20: 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  <12) ){.        
3a30: 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65  /* cap min reque
3a40: 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20  st size at 2^12 
3a50: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
3a60: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3a70: 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a  nReq = (1<<12);.
3a80: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
3a90: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
3aa0: 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20  Config.pHeap==0 
3ab0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
3ac0: 20 74 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65   the heap pointe
3ad0: 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  r is NULL, then 
3ae0: 72 65 73 74 6f 72 65 20 74 68 65 20 6d 61 6c 6c  restore the mall
3af0: 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  oc implementatio
3b00: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63  n.        ** bac
3b10: 6b 20 74 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  k to NULL pointe
3b20: 72 73 20 74 6f 6f 2e 20 20 54 68 69 73 20 77 69  rs too.  This wi
3b30: 6c 6c 20 63 61 75 73 65 20 74 68 65 20 6d 61 6c  ll cause the mal
3b40: 6c 6f 63 20 74 6f 20 67 6f 0a 20 20 20 20 20 20  loc to go.      
3b50: 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73    ** back to its
3b60: 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65   default impleme
3b70: 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c  ntation when sql
3b80: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
3b90: 29 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ) is.        ** 
3ba0: 72 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  run..        */.
3bb0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
3bc0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3bd0: 66 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  fig.m, 0, sizeof
3be0: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
3bf0: 6e 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20  nfig.m));.      
3c00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
3c10: 2a 20 54 68 65 20 68 65 61 70 20 70 6f 69 6e 74  * The heap point
3c20: 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  er is not NULL, 
3c30: 74 68 65 6e 20 69 6e 73 74 61 6c 6c 20 6f 6e 65  then install one
3c40: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
3c50: 2a 2a 20 6d 65 6d 35 2e 63 2f 6d 65 6d 33 2e 63  ** mem5.c/mem3.c
3c60: 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 65   methods.  The e
3c70: 6e 63 6c 6f 73 69 6e 67 20 23 69 66 20 67 75 61  nclosing #if gua
3c80: 72 61 6e 74 65 65 73 20 61 74 0a 20 20 20 20 20  rantees at.     
3c90: 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f 6e 65 20     ** least one 
3ca0: 6f 66 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73  of these methods
3cb0: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6e   is currently en
3cc0: 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  abled..        *
3cd0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3ce0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20  ENABLE_MEMSYS3. 
3cf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
3d00: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a  obalConfig.m = *
3d10: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d  sqlite3MemGetMem
3d20: 73 79 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23  sys3();.#endif.#
3d30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
3d40: 42 4c 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20  BLE_MEMSYS5.    
3d50: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3d60: 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c  lConfig.m = *sql
3d70: 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73  ite3MemGetMemsys
3d80: 35 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  5();.#endif.    
3d90: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
3da0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
3db0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3dc0: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
3dd0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
3de0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c  GlobalConfig.szL
3df0: 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72  ookaside = va_ar
3e00: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3e10: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3e20: 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65  onfig.nLookaside
3e30: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3e40: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
3e50: 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20  .    }.    .    
3e60: 2f 2a 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e  /* Record a poin
3e70: 74 65 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65  ter to the logge
3e80: 72 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69  r function and i
3e90: 74 73 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ts first argumen
3ea0: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65  t..    ** The de
3eb0: 66 61 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20  fault is NULL.  
3ec0: 4c 6f 67 67 69 6e 67 20 69 73 20 64 69 73 61 62  Logging is disab
3ed0: 6c 65 64 20 69 66 20 74 68 65 20 66 75 6e 63 74  led if the funct
3ee0: 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20  ion pointer is. 
3ef0: 20 20 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20     ** NULL..    
3f00: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3f10: 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b  TE_CONFIG_LOG: {
3f20: 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69  .      /* MSVC i
3f30: 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75  s picky about pu
3f40: 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20  lling func ptrs 
3f50: 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20  from va lists.. 
3f60: 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73       ** http://s
3f70: 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74  upport.microsoft
3f80: 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20  .com/kb/47961.  
3f90: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c      ** sqlite3Gl
3fa0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20  obalConfig.xLog 
3fb0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3fc0: 64 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  d(*)(void*,int,c
3fd0: 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20  onst char*));.  
3fe0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70      */.      typ
3ff0: 65 64 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55  edef void(*LOGFU
4000: 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  NC_t)(void*,int,
4010: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20  const char*);.  
4020: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4030: 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76  lConfig.xLog = v
4040: 61 5f 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e  a_arg(ap, LOGFUN
4050: 43 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  C_t);.      sqli
4060: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4070: 70 4c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67  pLogArg = va_arg
4080: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
4090: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
40a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
40b0: 5f 43 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20  _CONFIG_URI: {. 
40c0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
40d0: 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72  alConfig.bOpenUr
40e0: 69 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  i = va_arg(ap, i
40f0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
4100: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
4110: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4120: 43 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f 53  COVERING_INDEX_S
4130: 43 41 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  CAN: {.      sql
4140: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4150: 2e 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72  .bUseCis = va_ar
4160: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
4170: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4180: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4190: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20  ABLE_SQLLOG.    
41a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
41b0: 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20  IG_SQLLOG: {.   
41c0: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
41d0: 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76  *SQLLOGFUNC_t)(v
41e0: 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  oid*, sqlite3*, 
41f0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
4200: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4210: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
4220: 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  llog = va_arg(ap
4230: 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b  , SQLLOGFUNC_t);
4240: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4250: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
4260: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
4270: 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20  p, void *);.    
4280: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4290: 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20  endif..    case 
42a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
42b0: 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
42c0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
42d0: 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61  zMmap = va_arg(a
42e0: 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
42f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4300: 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70 20 3d 20  _int64 mxMmap = 
4310: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
4320: 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20 20  e3_int64);.     
4330: 20 69 66 28 20 6d 78 4d 6d 61 70 3c 30 20 7c 7c   if( mxMmap<0 ||
4340: 20 6d 78 4d 6d 61 70 3e 53 51 4c 49 54 45 5f 4d   mxMmap>SQLITE_M
4350: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 20 29 7b 0a  AX_MMAP_SIZE ){.
4360: 20 20 20 20 20 20 20 20 6d 78 4d 6d 61 70 20 3d          mxMmap =
4370: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
4380: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _SIZE;.      }. 
4390: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
43a0: 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20  alConfig.mxMmap 
43b0: 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20  = mxMmap;.      
43c0: 69 66 28 20 73 7a 4d 6d 61 70 3c 30 20 29 20 73  if( szMmap<0 ) s
43d0: 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44  zMmap = SQLITE_D
43e0: 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45  EFAULT_MMAP_SIZE
43f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d  ;.      if( szMm
4400: 61 70 3e 6d 78 4d 6d 61 70 29 20 73 7a 4d 6d 61  ap>mxMmap) szMma
4410: 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  p = mxMmap;.    
4420: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4430: 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 20 3d 20 73  onfig.szMmap = s
4440: 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 62 72 65  zMmap;.      bre
4450: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 53  ak;.    }..#if S
4460: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 26 26 20  QLITE_OS_WIN && 
4470: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4480: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29 0a 20 20 20  IN32_MALLOC).   
4490: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
44a0: 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53 49  FIG_WIN32_HEAPSI
44b0: 5a 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ZE: {.      sqli
44c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
44d0: 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61  nHeap = va_arg(a
44e0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
44f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
4500: 69 66 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  if..    default:
4510: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   {.      rc = SQ
4520: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
4530: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4540: 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b   }.  va_end(ap);
4550: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4560: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68  ./*.** Set up th
4570: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66  e lookaside buff
4580: 65 72 73 20 66 6f 72 20 61 20 64 61 74 61 62 61  ers for a databa
4590: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
45a0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
45b0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
45c0: 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65  .** If lookaside
45d0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69   is already acti
45e0: 76 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ve, return SQLIT
45f0: 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68  E_BUSY..**.** Th
4600: 65 20 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69  e sz parameter i
4610: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
4620: 62 79 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f  bytes in each lo
4630: 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a  okaside slot..**
4640: 20 54 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74   The cnt paramet
4650: 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  er is the number
4660: 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70   of slots.  If p
4670: 53 74 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68  Start is NULL th
4680: 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74  e.** space for t
4690: 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  he lookaside mem
46a0: 6f 72 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ory is obtained 
46b0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
46c0: 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74  loc()..** If pSt
46d0: 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  art is not NULL 
46e0: 74 68 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e  then it is sz*cn
46f0: 74 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  t bytes of memor
4700: 79 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20  y to use for.** 
4710: 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  the lookaside me
4720: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
4730: 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69  int setupLookasi
4740: 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  de(sqlite3 *db, 
4750: 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
4760: 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  sz, int cnt){.  
4770: 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a 20 20  void *pStart;.  
4780: 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  if( db->lookasid
4790: 65 2e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 72 65  e.nOut ){.    re
47a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
47b0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20  ;.  }.  /* Free 
47c0: 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f  any existing loo
47d0: 6b 61 73 69 64 65 20 62 75 66 66 65 72 20 66 6f  kaside buffer fo
47e0: 72 20 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65  r this handle be
47f0: 66 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  fore.  ** alloca
4800: 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73  ting a new one s
4810: 6f 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20  o we don't have 
4820: 74 6f 20 68 61 76 65 20 73 70 61 63 65 20 66 6f  to have space fo
4830: 72 20 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20  r .  ** both at 
4840: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20  the same time.. 
4850: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f   */.  if( db->lo
4860: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
4870: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
4880: 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73  _free(db->lookas
4890: 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d  ide.pStart);.  }
48a0: 0a 20 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f  .  /* The size o
48b0: 66 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c  f a lookaside sl
48c0: 6f 74 20 61 66 74 65 72 20 52 4f 55 4e 44 44 4f  ot after ROUNDDO
48d0: 57 4e 38 20 6e 65 65 64 73 20 74 6f 20 62 65 20  WN8 needs to be 
48e0: 6c 61 72 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e  larger.  ** than
48f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65   a pointer to be
4900: 20 75 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20   useful..  */.  
4910: 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28  sz = ROUNDDOWN8(
4920: 73 7a 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  sz);  /* IMP: R-
4930: 33 33 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20  33038-09382 */. 
4940: 20 69 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69   if( sz<=(int)si
4950: 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  zeof(LookasideSl
4960: 6f 74 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20  ot*) ) sz = 0;. 
4970: 20 69 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74   if( cnt<0 ) cnt
4980: 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d   = 0;.  if( sz==
4990: 30 20 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20  0 || cnt==0 ){. 
49a0: 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70     sz = 0;.    p
49b0: 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  Start = 0;.  }el
49c0: 73 65 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29  se if( pBuf==0 )
49d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
49e0: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
49f0: 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 73  ;.    pStart = s
4a00: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a  qlite3Malloc( sz
4a10: 2a 63 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a  *cnt );  /* IMP:
4a20: 20 52 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a   R-61949-35727 *
4a30: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  /.    sqlite3End
4a40: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
4a50: 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
4a60: 20 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 4d 61   cnt = sqlite3Ma
4a70: 6c 6c 6f 63 53 69 7a 65 28 70 53 74 61 72 74 29  llocSize(pStart)
4a80: 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  /sz;.  }else{.  
4a90: 20 20 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b    pStart = pBuf;
4aa0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  .  }.  db->looka
4ab0: 73 69 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53  side.pStart = pS
4ac0: 74 61 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b  tart;.  db->look
4ad0: 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b  aside.pFree = 0;
4ae0: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
4af0: 2e 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20  .sz = (u16)sz;. 
4b00: 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
4b10: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f     int i;.    Lo
4b20: 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a  okasideSlot *p;.
4b30: 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e      assert( sz >
4b40: 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f   (int)sizeof(Loo
4b50: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a  kasideSlot*) );.
4b60: 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69      p = (Lookasi
4b70: 64 65 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a  deSlot*)pStart;.
4b80: 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b      for(i=cnt-1;
4b90: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
4ba0: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62     p->pNext = db
4bb0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
4bc0: 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f  e;.      db->loo
4bd0: 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 70  kaside.pFree = p
4be0: 3b 0a 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f  ;.      p = (Loo
4bf0: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75  kasideSlot*)&((u
4c00: 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d  8*)p)[sz];.    }
4c10: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
4c20: 64 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20  de.pEnd = p;.   
4c30: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
4c40: 45 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20  Enabled = 1;.   
4c50: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
4c60: 4d 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d  Malloced = pBuf=
4c70: 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65  =0 ?1:0;.  }else
4c80: 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  {.    db->lookas
4c90: 69 64 65 2e 70 53 74 61 72 74 20 3d 20 64 62 3b  ide.pStart = db;
4ca0: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
4cb0: 64 65 2e 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20  de.pEnd = db;.  
4cc0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4cd0: 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20  bEnabled = 0;.  
4ce0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4cf0: 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20  bMalloced = 0;. 
4d00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
4d10: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4d20: 52 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78  Return the mutex
4d30: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4d40: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
4d50: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74  ection..*/.sqlit
4d60: 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65  e3_mutex *sqlite
4d70: 33 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74  3_db_mutex(sqlit
4d80: 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72  e3 *db){.  retur
4d90: 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a  n db->mutex;.}..
4da0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61 73  /*.** Free up as
4db0: 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
4dc0: 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65 20  we can from the 
4dd0: 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a 2a  given database.*
4de0: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  * connection..*/
4df0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f  .int sqlite3_db_
4e00: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73  release_memory(s
4e10: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
4e20: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt i;.  sqlite3_
4e30: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
4e40: 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65  mutex);.  sqlite
4e50: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
4e60: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  b);.  for(i=0; i
4e70: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
4e80: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
4e90: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
4ea0: 0a 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a  .    if( pBt ){.
4eb0: 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61        Pager *pPa
4ec0: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
4ed0: 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20  eePager(pBt);.  
4ee0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
4ef0: 53 68 72 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a  Shrink(pPager);.
4f00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
4f10: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
4f20: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (db);.  sqlite3_
4f30: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
4f40: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
4f50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4f60: 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69  *.** Configurati
4f70: 6f 6e 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20  on settings for 
4f80: 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20 64 61  an individual da
4f90: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
4fa0: 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  n.*/.int sqlite3
4fb0: 5f 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74  _db_config(sqlit
4fc0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20  e3 *db, int op, 
4fd0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
4fe0: 61 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ap;.  int rc;.  
4ff0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29  va_start(ap, op)
5000: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
5010: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
5020: 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41  E_DBCONFIG_LOOKA
5030: 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f  SIDE: {.      vo
5040: 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f 61 72  id *pBuf = va_ar
5050: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a  g(ap, void*); /*
5060: 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d 31 30   IMP: R-26835-10
5070: 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  964 */.      int
5080: 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   sz = va_arg(ap,
5090: 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f 2a 20   int);       /* 
50a0: 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32 35 39  IMP: R-47871-259
50b0: 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  94 */.      int 
50c0: 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  cnt = va_arg(ap,
50d0: 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a 20 49   int);      /* I
50e0: 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33 33 38  MP: R-04460-5338
50f0: 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  6 */.      rc = 
5100: 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64  setupLookaside(d
5110: 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74  b, pBuf, sz, cnt
5120: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5130: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
5140: 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69  t: {.      stati
5150: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
5160: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 3b  .        int op;
5170: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63        /* The opc
5180: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  ode */.        u
5190: 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d  32 mask;    /* M
51a0: 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74 20 69  ask of the bit i
51b0: 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 20  n sqlite3.flags 
51c0: 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a  to set/clear */.
51d0: 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b        } aFlagOp[
51e0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
51f0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
5200: 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20  ENABLE_FKEY,    
5210: 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65  SQLITE_ForeignKe
5220: 79 73 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20  ys    },.       
5230: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
5240: 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45  IG_ENABLE_TRIGGE
5250: 52 2c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65  R, SQLITE_Enable
5260: 54 72 69 67 67 65 72 20 20 7d 2c 0a 20 20 20 20  Trigger  },.    
5270: 20 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73 69 67    };.      unsig
5280: 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 20  ned int i;.     
5290: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
52a0: 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 32  OR; /* IMP: R-42
52b0: 37 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20 20 20  790-23372 */.   
52c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
52d0: 72 61 79 53 69 7a 65 28 61 46 6c 61 67 4f 70 29  raySize(aFlagOp)
52e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
52f0: 69 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f  if( aFlagOp[i].o
5300: 70 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  p==op ){.       
5310: 20 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d 20 76     int onoff = v
5320: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
5330: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 2a 70            int *p
5340: 52 65 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Res = va_arg(ap,
5350: 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 20 20   int*);.        
5360: 20 20 69 6e 74 20 6f 6c 64 46 6c 61 67 73 20 3d    int oldFlags =
5370: 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20   db->flags;.    
5380: 20 20 20 20 20 20 69 66 28 20 6f 6e 6f 66 66 3e        if( onoff>
5390: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
53a0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 61 46   db->flags |= aF
53b0: 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20  lagOp[i].mask;. 
53c0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
53d0: 66 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20  f( onoff==0 ){. 
53e0: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66             db->f
53f0: 6c 61 67 73 20 26 3d 20 7e 61 46 6c 61 67 4f 70  lags &= ~aFlagOp
5400: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
5410: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5420: 69 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d 64 62  if( oldFlags!=db
5430: 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  ->flags ){.     
5440: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5450: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
5460: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
5470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5480: 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20    if( pRes ){.  
5490: 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
54a0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 61  = (db->flags & a
54b0: 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21  FlagOp[i].mask)!
54c0: 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  =0;.          }.
54d0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
54e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
54f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5500: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5510: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5520: 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29    }.  va_end(ap)
5530: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
5540: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
5550: 74 72 75 65 20 69 66 20 74 68 65 20 62 75 66 66  true if the buff
5560: 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e  er z[0..n-1] con
5570: 74 61 69 6e 73 20 61 6c 6c 20 73 70 61 63 65 73  tains all spaces
5580: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5590: 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73 74 20  allSpaces(const 
55a0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
55b0: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
55c0: 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20   z[n-1]==' ' ){ 
55d0: 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20  n--; }.  return 
55e0: 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n==0;.}../*.** T
55f0: 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
5600: 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  lt collating fun
5610: 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e  ction named "BIN
5620: 41 52 59 22 20 77 68 69 63 68 20 69 73 20 61 6c  ARY" which is al
5630: 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  ways.** availabl
5640: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
5650: 70 61 64 46 6c 61 67 20 61 72 67 75 6d 65 6e 74  padFlag argument
5660: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
5670: 6e 20 73 70 61 63 65 20 70 61 64 64 69 6e 67 20  n space padding 
5680: 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66  at the end.** of
5690: 20 73 74 72 69 6e 67 73 20 69 73 20 69 67 6e 6f   strings is igno
56a0: 72 65 64 2e 20 20 54 68 69 73 20 69 6d 70 6c 65  red.  This imple
56b0: 6d 65 6e 74 73 20 74 68 65 20 52 54 52 49 4d 20  ments the RTRIM 
56c0: 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  collation..*/.st
56d0: 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c  atic int binColl
56e0: 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 61  Func(.  void *pa
56f0: 64 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65  dFlag,.  int nKe
5700: 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
5710: 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65  pKey1,.  int nKe
5720: 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y2, const void *
5730: 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72  pKey2.){.  int r
5740: 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79  c, n;.  n = nKey
5750: 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20  1<nKey2 ? nKey1 
5760: 3a 20 6e 4b 65 79 32 3b 0a 20 20 72 63 20 3d 20  : nKey2;.  rc = 
5770: 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b  memcmp(pKey1, pK
5780: 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72  ey2, n);.  if( r
5790: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
57a0: 70 61 64 46 6c 61 67 0a 20 20 20 20 20 26 26 20  padFlag.     && 
57b0: 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72  allSpaces(((char
57c0: 2a 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79  *)pKey1)+n, nKey
57d0: 31 2d 6e 29 0a 20 20 20 20 20 26 26 20 61 6c 6c  1-n).     && all
57e0: 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70  Spaces(((char*)p
57f0: 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e  Key2)+n, nKey2-n
5800: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
5810: 2a 20 4c 65 61 76 65 20 72 63 20 75 6e 63 68 61  * Leave rc uncha
5820: 6e 67 65 64 20 61 74 20 30 20 2a 2f 0a 20 20 20  nged at 0 */.   
5830: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
5840: 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32   = nKey1 - nKey2
5850: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5860: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5870: 2a 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d  * Another built-
5880: 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  in collating seq
5890: 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a  uence: NOCASE. .
58a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61  **.** This colla
58b0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  ting sequence is
58c0: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
58d0: 75 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69  used for "case i
58e0: 6e 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f  ndependent.** co
58f0: 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74  mparison". SQLit
5900: 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66  e's knowledge of
5910: 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72   upper and lower
5920: 20 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74   case equivalent
5930: 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c  s.** extends onl
5940: 79 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72  y to the 26 char
5950: 61 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74  acters used in t
5960: 68 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  he English langu
5970: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68  age..**.** At th
5980: 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69  e moment there i
5990: 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69  s only a UTF-8 i
59a0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
59b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63  /.static int noc
59c0: 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63  aseCollatingFunc
59d0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
59e0: 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  d,.  int nKey1, 
59f0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
5a00: 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  1,.  int nKey2, 
5a10: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
5a20: 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73  2.){.  int r = s
5a30: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a  qlite3StrNICmp(.
5a40: 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61        (const cha
5a50: 72 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73  r *)pKey1, (cons
5a60: 74 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20  t char *)pKey2, 
5a70: 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b  (nKey1<nKey2)?nK
5a80: 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e  ey1:nKey2);.  UN
5a90: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
5aa0: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30  otUsed);.  if( 0
5ab0: 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e  ==r ){.    r = n
5ac0: 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a  Key1-nKey2;.  }.
5ad0: 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f    return r;.}../
5ae0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5af0: 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73  ROWID of the mos
5b00: 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a  t recent insert.
5b10: 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  */.sqlite_int64 
5b20: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
5b30: 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65  ert_rowid(sqlite
5b40: 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  3 *db){.  return
5b50: 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a   db->lastRowid;.
5b60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5b70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
5b80: 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73  anges in the mos
5b90: 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f  t recent call to
5ba0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e   sqlite3_exec().
5bb0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
5bc0: 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  changes(sqlite3 
5bd0: 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  *db){.  return d
5be0: 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  b->nChange;.}../
5bf0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5c00: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65  number of change
5c10: 73 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61  s since the data
5c20: 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20  base handle was 
5c30: 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  opened..*/.int s
5c40: 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61  qlite3_total_cha
5c50: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
5c60: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
5c70: 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a  nTotalChange;.}.
5c80: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
5c90: 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
5ca0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
5cb0: 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 73  only manipulates
5cc0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a   fields of the.*
5cd0: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
5ce0: 65 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f 65  e object, it doe
5cf0: 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20  s not close any 
5d00: 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20  savepoints that 
5d10: 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61  may be open.** a
5d20: 74 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61 67  t the b-tree/pag
5d30: 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69  er level..*/.voi
5d40: 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61  d sqlite3CloseSa
5d50: 76 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65 33  vepoints(sqlite3
5d60: 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28 20   *db){.  while( 
5d70: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29  db->pSavepoint )
5d80: 7b 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74 20  {.    Savepoint 
5d90: 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76  *pTmp = db->pSav
5da0: 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e  epoint;.    db->
5db0: 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d  pSavepoint = pTm
5dc0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  p->pNext;.    sq
5dd0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5de0: 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  pTmp);.  }.  db-
5df0: 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >nSavepoint = 0;
5e00: 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  .  db->nStatemen
5e10: 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54  t = 0;.  db->isT
5e20: 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f  ransactionSavepo
5e30: 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  int = 0;.}../*.*
5e40: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  * Invoke the des
5e50: 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e  tructor function
5e60: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
5e70: 20 46 75 6e 63 44 65 66 20 70 2c 20 69 66 20 61   FuncDef p, if a
5e80: 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69  ny. Except,.** i
5e90: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
5ea0: 65 20 6c 61 73 74 20 63 6f 70 79 20 6f 66 20 74  e last copy of t
5eb0: 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20  he function, do 
5ec0: 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d  not invoke it. M
5ed0: 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65  ultiple.** copie
5ee0: 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 66 75  s of a single fu
5ef0: 6e 63 74 69 6f 6e 20 61 72 65 20 63 72 65 61 74  nction are creat
5f00: 65 64 20 77 68 65 6e 20 63 72 65 61 74 65 5f 66  ed when create_f
5f10: 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  unction() is cal
5f20: 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49  led.** with SQLI
5f30: 54 45 5f 41 4e 59 20 61 73 20 74 68 65 20 65 6e  TE_ANY as the en
5f40: 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  coding..*/.stati
5f50: 63 20 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44  c void functionD
5f60: 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 20 2a  estroy(sqlite3 *
5f70: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 29 7b  db, FuncDef *p){
5f80: 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f  .  FuncDestructo
5f90: 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 20 3d  r *pDestructor =
5fa0: 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72 3b   p->pDestructor;
5fb0: 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74  .  if( pDestruct
5fc0: 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72  or ){.    pDestr
5fd0: 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  uctor->nRef--;. 
5fe0: 20 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74     if( pDestruct
5ff0: 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  or->nRef==0 ){. 
6000: 20 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72       pDestructor
6010: 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73 74  ->xDestroy(pDest
6020: 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61 74  ructor->pUserDat
6030: 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
6040: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 73  3DbFree(db, pDes
6050: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a  tructor);.    }.
6060: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73    }.}../*.** Dis
6070: 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c 69  connect all sqli
6080: 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 73  te3_vtab objects
6090: 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
60a0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
60b0: 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73 20  ion.** db. This 
60c0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 64  is called when d
60d0: 62 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73 65  b is being close
60e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
60f0: 64 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56  d disconnectAllV
6100: 74 61 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29  tab(sqlite3 *db)
6110: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
6120: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6130: 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  LE.  int i;.  sq
6140: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
6150: 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d  ll(db);.  for(i=
6160: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
6170: 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a  +){.    Schema *
6180: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
6190: 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  b[i].pSchema;.  
61a0: 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
61b0: 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
61c0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20    HashElem *p;. 
61d0: 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74       for(p=sqlit
61e0: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
61f0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70  ema->tblHash); p
6200: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
6210: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 20 20  xt(p)){.        
6220: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54  Table *pTab = (T
6230: 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  able *)sqliteHas
6240: 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20  hData(p);.      
6250: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
6260: 70 54 61 62 29 20 29 20 73 71 6c 69 74 65 33 56  pTab) ) sqlite3V
6270: 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62  tabDisconnect(db
6280: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  , pTab);.      }
6290: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
62a0: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
62b0: 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  st(db);.  sqlite
62c0: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
62d0: 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  b);.#else.  UNUS
62e0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
62f0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
6300: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
6310: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
6320: 74 69 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69  tion db has unfi
6330: 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64  nalized prepared
6340: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  .** statements o
6350: 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c  r unfinished sql
6360: 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65  ite3_backup obje
6370: 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  cts.  .*/.static
6380: 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49   int connectionI
6390: 73 42 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64  sBusy(sqlite3 *d
63a0: 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61  b){.  int j;.  a
63b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
63c0: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
63d0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62  tex) );.  if( db
63e0: 2d 3e 70 56 64 62 65 20 29 20 72 65 74 75 72 6e  ->pVdbe ) return
63f0: 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   1;.  for(j=0; j
6400: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
6410: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
6420: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b   db->aDb[j].pBt;
6430: 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
6440: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
6450: 42 61 63 6b 75 70 28 70 42 74 29 20 29 20 72 65  Backup(pBt) ) re
6460: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
6470: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
6480: 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69   Close an existi
6490: 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ng SQLite databa
64a0: 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  se.*/.static int
64b0: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71   sqlite3Close(sq
64c0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66  lite3 *db, int f
64d0: 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69  orceZombie){.  i
64e0: 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 2f 2a  f( !db ){.    /*
64f0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
6500: 36 33 32 35 37 2d 31 31 37 34 30 20 43 61 6c 6c  63257-11740 Call
6510: 69 6e 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  ing sqlite3_clos
6520: 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  e() or.    ** sq
6530: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
6540: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69   with a NULL poi
6550: 6e 74 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73  nter argument is
6560: 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f   a harmless no-o
6570: 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  p. */.    return
6580: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
6590: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
65a0: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
65b0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
65c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
65d0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  E_BKPT;.  }.  sq
65e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
65f0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  r(db->mutex);.. 
6600: 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73 63 6f   /* Force xDisco
6610: 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e 20 61  nnect calls on a
6620: 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ll virtual table
6630: 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e 65 63  s */.  disconnec
6640: 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a 0a 20  tAllVtab(db);.. 
6650: 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63   /* If a transac
6660: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68  tion is open, th
6670: 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56  e disconnectAllV
6680: 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f 76 65  tab() call above
6690: 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68  .  ** will not h
66a0: 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20 78  ave called the x
66b0: 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74  Disconnect() met
66c0: 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74 75  hod on any virtu
66d0: 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 69  al.  ** tables i
66e0: 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e  n the db->aVTran
66f0: 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66  s[] array. The f
6700: 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
6710: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20  VtabRollback(). 
6720: 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f   ** call will do
6730: 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f 20   so. We need to 
6740: 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 74  do this before t
6750: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63 74  he check for act
6760: 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ive.  ** SQL sta
6770: 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61  tements below, a
6780: 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69 6d  s the v-table im
6790: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79  plementation may
67a0: 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a   be storing.  **
67b0: 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20 73   some prepared s
67c0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e  tatements intern
67d0: 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ally..  */.  sql
67e0: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
67f0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67 61  (db);..  /* Lega
6800: 63 79 20 62 65 68 61 76 69 6f 72 20 28 73 71 6c  cy behavior (sql
6810: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62 65 68  ite3_close() beh
6820: 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72 65 74  avior) is to ret
6830: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
6840: 42 55 53 59 20 69 66 20 74 68 65 20 63 6f 6e 6e  BUSY if the conn
6850: 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74 20 62  ection can not b
6860: 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61  e closed immedia
6870: 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
6880: 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20 26 26   !forceZombie &&
6890: 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73   connectionIsBus
68a0: 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  y(db) ){.    sql
68b0: 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
68c0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
68d0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f  , "unable to clo
68e0: 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61  se due to unfina
68f0: 6c 69 7a 65 64 20 22 0a 20 20 20 20 20 20 20 22  lized ".       "
6900: 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e  statements or un
6910: 66 69 6e 69 73 68 65 64 20 62 61 63 6b 75 70 73  finished backups
6920: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ");.    sqlite3_
6930: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
6940: 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75  mutex);.    retu
6950: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
6960: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
6970: 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
6980: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
6990: 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
69a0: 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f  og ){.    /* Clo
69b0: 73 69 6e 67 20 74 68 65 20 68 61 6e 64 6c 65 2e  sing the handle.
69c0: 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65   Fourth paramete
69d0: 72 20 69 73 20 70 61 73 73 65 64 20 74 68 65 20  r is passed the 
69e0: 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20 20 20 20  value 2. */.    
69f0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
6a00: 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73 71 6c 69  fig.xSqllog(sqli
6a10: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
6a20: 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64 62 2c 20  pSqllogArg, db, 
6a30: 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 2);.  }.#endi
6a40: 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  f..  /* Convert 
6a50: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
6a60: 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20 61 6e 64  nto a zombie and
6a70: 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 2e 0a   then close it..
6a80: 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67 69 63    */.  db->magic
6a90: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
6aa0: 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c 69 74 65  ZOMBIE;.  sqlite
6ab0: 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c  3LeaveMutexAndCl
6ac0: 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29 3b 0a 20  oseZombie(db);. 
6ad0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6ae0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20  K;.}../*.** Two 
6af0: 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 74 68  variations on th
6b00: 65 20 70 75 62 6c 69 63 20 69 6e 74 65 72 66 61  e public interfa
6b10: 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 61  ce for closing a
6b20: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
6b30: 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 73 71 6c  nection. The sql
6b40: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 76 65 72  ite3_close() ver
6b50: 73 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  sion returns SQL
6b60: 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20  ITE_BUSY and.** 
6b70: 6c 65 61 76 65 73 20 74 68 65 20 63 6f 6e 6e 65  leaves the conne
6b80: 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 66 20  ction option if 
6b90: 74 68 65 72 65 20 61 72 65 20 75 6e 66 69 6e 61  there are unfina
6ba0: 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a  lized prepared.*
6bb0: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20  * statements or 
6bc0: 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74  unfinished sqlit
6bd0: 65 33 5f 62 61 63 6b 75 70 73 2e 20 20 54 68 65  e3_backups.  The
6be0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
6bf0: 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 66  2().** version f
6c00: 6f 72 63 65 73 20 74 68 65 20 63 6f 6e 6e 65 63  orces the connec
6c10: 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d 65 20 61  tion to become a
6c20: 20 7a 6f 6d 62 69 65 20 69 66 20 74 68 65 72 65   zombie if there
6c30: 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64   are.** unclosed
6c40: 20 72 65 73 6f 75 72 63 65 73 2c 20 61 6e 64 20   resources, and 
6c50: 61 72 72 61 6e 67 65 73 20 66 6f 72 20 64 65 61  arranges for dea
6c60: 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65 6e 20 74  llocation when t
6c70: 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72 65 70 61  he last.** prepa
6c80: 72 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20  re statement or 
6c90: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 63  sqlite3_backup c
6ca0: 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  loses..*/.int sq
6cb0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69  lite3_close(sqli
6cc0: 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e  te3 *db){ return
6cd0: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62   sqlite3Close(db
6ce0: 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74  ,0); }.int sqlit
6cf0: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73 71 6c 69  e3_close_v2(sqli
6d00: 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e  te3 *db){ return
6d10: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62   sqlite3Close(db
6d20: 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ,1); }.../*.** C
6d30: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 6f  lose the mutex o
6d40: 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  n database conne
6d50: 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20  ction db..**.** 
6d60: 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20  Furthermore, if 
6d70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
6d80: 69 6f 6e 20 64 62 20 69 73 20 61 20 7a 6f 6d 62  ion db is a zomb
6d90: 69 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74  ie (meaning that
6da0: 20 74 68 65 72 65 0a 2a 2a 20 68 61 73 20 62 65   there.** has be
6db0: 65 6e 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  en a prior call 
6dc0: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  to sqlite3_close
6dd0: 28 64 62 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  (db) or sqlite3_
6de0: 63 6c 6f 73 65 5f 76 32 28 64 62 29 29 20 61 6e  close_v2(db)) an
6df0: 64 0a 2a 2a 20 65 76 65 72 79 20 73 71 6c 69 74  d.** every sqlit
6e00: 65 33 5f 73 74 6d 74 20 68 61 73 20 6e 6f 77 20  e3_stmt has now 
6e10: 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61  been finalized a
6e20: 6e 64 20 65 76 65 72 79 20 73 71 6c 69 74 65 33  nd every sqlite3
6e30: 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a 2a 20 66  _backup has.** f
6e40: 69 6e 69 73 68 65 64 2c 20 74 68 65 6e 20 66 72  inished, then fr
6e50: 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73  ee all resources
6e60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6e70: 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c  3LeaveMutexAndCl
6e80: 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c 69 74 65  oseZombie(sqlite
6e90: 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c  3 *db){.  HashEl
6ea0: 65 6d 20 2a 69 3b 20 20 20 20 20 20 20 20 20 20  em *i;          
6eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
6ec0: 68 20 74 61 62 6c 65 20 69 74 65 72 61 74 6f 72  h table iterator
6ed0: 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20   */.  int j;..  
6ee0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
6ef0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 73 71 6c 69  outstanding sqli
6f00: 74 65 33 5f 73 74 6d 74 20 6f 72 20 73 71 6c 69  te3_stmt or sqli
6f10: 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63  te3_backup objec
6f20: 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  ts.  ** or if th
6f30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  e connection has
6f40: 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6c   not yet been cl
6f50: 6f 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  osed by sqlite3_
6f60: 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20 20 2a 2a  close_v2(),.  **
6f70: 20 74 68 65 6e 20 6a 75 73 74 20 6c 65 61 76 65   then just leave
6f80: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 72   the mutex and r
6f90: 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  eturn..  */.  if
6fa0: 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c  ( db->magic!=SQL
6fb0: 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45  ITE_MAGIC_ZOMBIE
6fc0: 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73   || connectionIs
6fd0: 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20  Busy(db) ){.    
6fe0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
6ff0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
7000: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7010: 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
7020: 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
7030: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
7040: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
7050: 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20 63 6c 6f  ion has.  ** clo
7060: 73 65 64 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f  sed all sqlite3_
7070: 73 74 6d 74 20 61 6e 64 20 73 71 6c 69 74 65 33  stmt and sqlite3
7080: 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20  _backup objects 
7090: 61 6e 64 20 68 61 73 20 62 65 65 6e 0a 20 20 2a  and has been.  *
70a0: 2a 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  * passed to sqli
70b0: 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65 61 6e 69  te3_close (meani
70c0: 6e 67 20 74 68 61 74 20 69 74 20 69 73 20 61 20  ng that it is a 
70d0: 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65 72 65 66  zombie).  Theref
70e0: 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20 61 68 65  ore,.  ** go ahe
70f0: 61 64 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20  ad and free all 
7100: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 2a 2f 0a  resources..  */.
7110: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
7120: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
7130: 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 54 68  roll it back. Th
7140: 69 73 20 61 6c 73 6f 20 65 6e 73 75 72 65 73 20  is also ensures 
7150: 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 61 6e 79  that if.  ** any
7160: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
7170: 73 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  s have been modi
7180: 66 69 65 64 20 62 79 20 61 6e 20 75 6e 63 6f 6d  fied by an uncom
7190: 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69  mitted transacti
71a0: 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20 61 72 65  on.  ** they are
71b0: 20 72 65 73 65 74 2e 20 41 6e 64 20 74 68 61 74   reset. And that
71c0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 62 2d   the required b-
71d0: 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65  tree mutex is he
71e0: 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  ld to make.  ** 
71f0: 74 68 65 20 70 61 67 65 72 20 72 6f 6c 6c 62 61  the pager rollba
7200: 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65  ck and schema re
7210: 73 65 74 20 61 6e 20 61 74 6f 6d 69 63 20 6f 70  set an atomic op
7220: 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71  eration. */.  sq
7230: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
7240: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
7250: 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
7260: 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65  outstanding Save
7270: 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 73  point structures
7280: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c  . */.  sqlite3Cl
7290: 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
72a0: 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  );..  /* Close a
72b0: 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ll database conn
72c0: 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72  ections */.  for
72d0: 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b  (j=0; j<db->nDb;
72e0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   j++){.    struc
72f0: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
7300: 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  >aDb[j];.    if(
7310: 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20   pDb->pBt ){.   
7320: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
7330: 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a  lose(pDb->pBt);.
7340: 20 20 20 20 20 20 70 44 62 2d 3e 70 42 74 20 3d        pDb->pBt =
7350: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 21   0;.      if( j!
7360: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  =1 ){.        pD
7370: 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a  b->pSchema = 0;.
7380: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7390: 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65  }.  /* Clear the
73a0: 20 54 45 4d 50 20 73 63 68 65 6d 61 20 73 65 70   TEMP schema sep
73b0: 61 72 61 74 65 6c 79 20 61 6e 64 20 6c 61 73 74  arately and last
73c0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 44   */.  if( db->aD
73d0: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
73e0: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
73f0: 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b 31  aClear(db->aDb[1
7400: 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ].pSchema);.  }.
7410: 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c    sqlite3VtabUnl
7420: 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20  ockList(db);..  
7430: 2f 2a 20 46 72 65 65 20 75 70 20 74 68 65 20 61  /* Free up the a
7440: 72 72 61 79 20 6f 66 20 61 75 78 69 6c 69 61 72  rray of auxiliar
7450: 79 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  y databases */. 
7460: 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65   sqlite3Collapse
7470: 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62  DatabaseArray(db
7480: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
7490: 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73  >nDb<=2 );.  ass
74a0: 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62  ert( db->aDb==db
74b0: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a 0a  ->aDbStatic );..
74c0: 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f    /* Tell the co
74d0: 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74  de in notify.c t
74e0: 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  hat the connecti
74f0: 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c  on no longer hol
7500: 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b  ds any.  ** lock
7510: 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72  s and does not r
7520: 65 71 75 69 72 65 20 61 6e 79 20 66 75 72 74 68  equire any furth
7530: 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  er unlock-notify
7540: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
7550: 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  .  sqlite3Connec
7560: 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a  tionClosed(db);.
7570: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72  .  for(j=0; j<Ar
7580: 72 61 79 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e  raySize(db->aFun
7590: 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  c.a); j++){.    
75a0: 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20  FuncDef *pNext, 
75b0: 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20  *pHash, *p;.    
75c0: 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e  for(p=db->aFunc.
75d0: 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68  a[j]; p; p=pHash
75e0: 29 7b 0a 20 20 20 20 20 20 70 48 61 73 68 20 3d  ){.      pHash =
75f0: 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 20   p->pHash;.     
7600: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
7610: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73       functionDes
7620: 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20  troy(db, p);.   
7630: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e       pNext = p->
7640: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73  pNext;.        s
7650: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7660: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d   p);.        p =
7670: 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a   pNext;.      }.
7680: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
7690: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
76a0: 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
76b0: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
76c0: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43  hNext(i)){.    C
76d0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
76e0: 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74  (CollSeq *)sqlit
76f0: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
7700: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20    /* Invoke any 
7710: 64 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69  destructors regi
7720: 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61  stered for colla
7730: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
7740: 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  er data. */.    
7750: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b  for(j=0; j<3; j+
7760: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  +){.      if( pC
7770: 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20  oll[j].xDel ){. 
7780: 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e         pColl[j].
7790: 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55  xDel(pColl[j].pU
77a0: 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ser);.      }.  
77b0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
77c0: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29  bFree(db, pColl)
77d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
77e0: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43  ashClear(&db->aC
77f0: 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66  ollSeq);.#ifndef
7800: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7810: 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28  TUALTABLE.  for(
7820: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
7830: 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
7840: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
7850: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f  Next(i)){.    Mo
7860: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
7870: 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  dule *)sqliteHas
7880: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
7890: 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79  ( pMod->xDestroy
78a0: 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e   ){.      pMod->
78b0: 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70  xDestroy(pMod->p
78c0: 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Aux);.    }.    
78d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
78e0: 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73  , pMod);.  }.  s
78f0: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
7900: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23  &db->aModule);.#
7910: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
7920: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
7930: 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63  _OK); /* Dealloc
7940: 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64 20  ates any cached 
7950: 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a  error strings. *
7960: 2f 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  /.  sqlite3Value
7970: 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a  Free(db->pErr);.
7980: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78    sqlite3CloseEx
7990: 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 0a 20  tensions(db);.. 
79a0: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
79b0: 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b  ITE_MAGIC_ERROR;
79c0: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d  ..  /* The temp-
79d0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
79e0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66  is allocated dif
79f0: 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68  ferently from th
7a00: 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20  e other schema. 
7a10: 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69   ** objects (usi
7a20: 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  ng sqliteMalloc(
7a30: 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  ) directly, inst
7a40: 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74  ead of sqlite3Bt
7a50: 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20  reeSchema())..  
7a60: 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74  ** So it needs t
7a70: 6f 20 62 65 20 66 72 65 65 64 20 68 65 72 65 2e  o be freed here.
7a80: 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72   Todo: Why not r
7a90: 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68  oll the temp sch
7aa0: 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ema into.  ** th
7ab0: 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c  e same sqliteMal
7ac0: 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65  loc() as the one
7ad0: 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20   that allocates 
7ae0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
7af0: 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20  ** structure?.  
7b00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
7b10: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31  ee(db, db->aDb[1
7b20: 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ].pSchema);.  sq
7b30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
7b40: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
7b50: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
7b60: 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b  TE_MAGIC_CLOSED;
7b70: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
7b80: 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29  _free(db->mutex)
7b90: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
7ba0: 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d  lookaside.nOut==
7bb0: 30 20 29 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f  0 );  /* Fails o
7bc0: 6e 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  n a lookaside me
7bd0: 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69  mory leak */.  i
7be0: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
7bf0: 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  .bMalloced ){.  
7c00: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
7c10: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
7c20: 61 72 74 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  art);.  }.#ifdef
7c30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
7c40: 51 4c 52 52 0a 20 20 53 52 52 65 63 43 6c 6f 73  QLRR.  SRRecClos
7c50: 65 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20  e(db);.#endif.  
7c60: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
7c70: 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  db);.}../*.** Ro
7c80: 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62  llback all datab
7c90: 61 73 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74  ase files.  If t
7ca0: 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53  ripCode is not S
7cb0: 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a  QLITE_OK, then.*
7cc0: 2a 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  * any open curso
7cd0: 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  rs are invalidat
7ce0: 65 64 20 28 22 74 72 69 70 70 65 64 22 20 2d 20  ed ("tripped" - 
7cf0: 61 73 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20  as in "tripping 
7d00: 61 20 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65  a circuit.** bre
7d10: 61 6b 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20  aker") and made 
7d20: 74 6f 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f  to return tripCo
7d30: 64 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  de if there are 
7d40: 61 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61  any further.** a
7d50: 74 74 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74  ttempts to use t
7d60: 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76  hat cursor..*/.v
7d70: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
7d80: 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  ackAll(sqlite3 *
7d90: 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  db, int tripCode
7da0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
7db0: 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20  t inTrans = 0;. 
7dc0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7dd0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
7de0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
7df0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
7e00: 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62  lloc();..  /* Ob
7e10: 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20  tain all b-tree 
7e20: 6d 75 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d  mutexes before m
7e30: 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20  aking any calls 
7e40: 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  to BtreeRollback
7e50: 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69  (). .  ** This i
7e60: 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63  s important in c
7e70: 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ase the transact
7e80: 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64  ion being rolled
7e90: 20 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d   back has.  ** m
7ea0: 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61  odified the data
7eb0: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
7ec0: 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78  the b-tree mutex
7ed0: 65 73 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e  es are not taken
7ee0: 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e  .  ** here, then
7ef0: 20 61 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d   another shared-
7f00: 63 61 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  cache connection
7f10: 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20   might sneak in 
7f20: 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65  between.  ** the
7f30: 20 64 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61   database rollba
7f40: 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65  ck and schema re
7f50: 73 65 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63  set, which can c
7f60: 61 75 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20  ause false.  ** 
7f70: 63 6f 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72  corruption repor
7f80: 74 73 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73  ts in some cases
7f90: 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
7fa0: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
7fb0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
7fc0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
7fd0: 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62     Btree *p = db
7fe0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
7ff0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
8000: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
8010: 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b  eIsInTrans(p) ){
8020: 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73  .        inTrans
8030: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
8040: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
8050: 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70  Rollback(p, trip
8060: 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Code);.    }.  }
8070: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
8080: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71  llback(db);.  sq
8090: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
80a0: 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 28  lloc();..  if( (
80b0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
80c0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21  _InternChanges)!
80d0: 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62  =0 && db->init.b
80e0: 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  usy==0 ){.    sq
80f0: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
8100: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
8110: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
8120: 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43  setAllSchemasOfC
8130: 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20  onnection(db);. 
8140: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
8150: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a  eLeaveAll(db);..
8160: 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65    /* Any deferre
8170: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  d constraint vio
8180: 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77  lations have now
8190: 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
81a0: 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  */.  db->nDeferr
81b0: 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62  edCons = 0;.  db
81c0: 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
81d0: 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c  ns = 0;.  db->fl
81e0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44  ags &= ~SQLITE_D
81f0: 65 66 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49  eferFKs;..  /* I
8200: 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63  f one has been c
8210: 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b  onfigured, invok
8220: 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68  e the rollback-h
8230: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ook callback */.
8240: 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62    if( db->xRollb
8250: 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28  ackCallback && (
8260: 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e  inTrans || !db->
8270: 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20  autoCommit) ){. 
8280: 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b     db->xRollback
8290: 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f  Callback(db->pRo
82a0: 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a  llbackArg);.  }.
82b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
82c0: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
82d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
82e0: 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ame correspondin
82f0: 67 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 63  g to the error c
8300: 6f 64 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ode.** specified
8310: 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
8320: 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69 6e 65  ..*/.#if (define
8330: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
8340: 26 26 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  && SQLITE_OS_WIN
8350: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
8360: 49 54 45 5f 54 45 53 54 29 0a 63 6f 6e 73 74 20  ITE_TEST).const 
8370: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72  char *sqlite3Err
8380: 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20 20  Name(int rc){.  
8390: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
83a0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  e = 0;.  int i, 
83b0: 6f 72 69 67 52 63 20 3d 20 72 63 3b 0a 20 20 66  origRc = rc;.  f
83c0: 6f 72 28 69 3d 30 3b 20 69 3c 32 20 26 26 20 7a  or(i=0; i<2 && z
83d0: 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63  Name==0; i++, rc
83e0: 20 26 3d 20 30 78 66 66 29 7b 0a 20 20 20 20 73   &= 0xff){.    s
83f0: 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20  witch( rc ){.   
8400: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f     case SQLITE_O
8410: 4b 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K:              
8420: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8430: 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20  TE_OK";         
8440: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8450: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8460: 45 52 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20  ERROR:          
8470: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8480: 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20  ITE_ERROR";     
8490: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
84a0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
84b0: 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20 20  _INTERNAL:      
84c0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
84d0: 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b 20  LITE_INTERNAL"; 
84e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
84f0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8500: 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 20 20  E_PERM:         
8510: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8520: 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20 20  QLITE_PERM";    
8530: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
8540: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8550: 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 20  TE_ABORT:       
8560: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8570: 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20  SQLITE_ABORT";  
8580: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8590: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
85a0: 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
85b0: 43 4b 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  CK:     zName = 
85c0: 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f  "SQLITE_ABORT_RO
85d0: 4c 4c 42 41 43 4b 22 3b 20 20 20 20 62 72 65 61  LLBACK";    brea
85e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
85f0: 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20  LITE_BUSY:      
8600: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
8610: 20 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20   "SQLITE_BUSY"; 
8620: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
8630: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8640: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56  QLITE_BUSY_RECOV
8650: 45 52 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  ERY:      zName 
8660: 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  = "SQLITE_BUSY_R
8670: 45 43 4f 56 45 52 59 22 3b 20 20 20 20 20 62 72  ECOVERY";     br
8680: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8690: 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50  SQLITE_BUSY_SNAP
86a0: 53 48 4f 54 3a 20 20 20 20 20 20 7a 4e 61 6d 65  SHOT:      zName
86b0: 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f   = "SQLITE_BUSY_
86c0: 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20 20 62  SNAPSHOT";     b
86d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
86e0: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20   SQLITE_LOCKED: 
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
8700: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b  e = "SQLITE_LOCK
8710: 45 44 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ED";            
8720: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8730: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  e SQLITE_LOCKED_
8740: 53 48 41 52 45 44 43 41 43 48 45 3a 20 7a 4e 61  SHAREDCACHE: zNa
8750: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43  me = "SQLITE_LOC
8760: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 22  KED_SHAREDCACHE"
8770: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
8780: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  se SQLITE_NOMEM:
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
87a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
87b0: 4d 45 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20  MEM";           
87c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
87d0: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
87e0: 4e 4c 59 3a 20 20 20 20 20 20 20 20 20 20 20 7a  NLY:           z
87f0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
8800: 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20 20  EADONLY";       
8810: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8820: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
8830: 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20 20  ONLY_RECOVERY:  
8840: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8850: 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52  READONLY_RECOVER
8860: 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  Y"; break;.     
8870: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
8880: 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20  DONLY_CANTLOCK: 
8890: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
88a0: 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f  _READONLY_CANTLO
88b0: 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CK"; break;.    
88c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
88d0: 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a  ADONLY_ROLLBACK:
88e0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
88f0: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
8900: 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ACK"; break;.   
8910: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
8920: 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a  EADONLY_DBMOVED:
8930: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8940: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
8950: 56 45 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  VED";  break;.  
8960: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8970: 49 4e 54 45 52 52 55 50 54 3a 20 20 20 20 20 20  INTERRUPT:      
8980: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8990: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20  ITE_INTERRUPT"; 
89a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
89b0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
89c0: 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 20 20 20  _IOERR:         
89d0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
89e0: 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20  LITE_IOERR";    
89f0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8a00: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8a10: 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20 20 20  E_IOERR_READ:   
8a20: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8a30: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
8a40: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
8a50: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8a60: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
8a70: 45 41 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  EAD:   zName = "
8a80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
8a90: 52 54 5f 52 45 41 44 22 3b 20 20 62 72 65 61 6b  RT_READ";  break
8aa0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8ab0: 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3a  ITE_IOERR_WRITE:
8ac0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8ad0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52  "SQLITE_IOERR_WR
8ae0: 49 54 45 22 3b 20 20 20 20 20 20 20 62 72 65 61  ITE";       brea
8af0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8b00: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
8b10: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
8b20: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46   "SQLITE_IOERR_F
8b30: 53 59 4e 43 22 3b 20 20 20 20 20 20 20 62 72 65  SYNC";       bre
8b40: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8b50: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
8b60: 46 53 59 4e 43 3a 20 20 20 20 7a 4e 61 6d 65 20  FSYNC:    zName 
8b70: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8b80: 44 49 52 5f 46 53 59 4e 43 22 3b 20 20 20 62 72  DIR_FSYNC";   br
8b90: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8ba0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
8bb0: 4e 43 41 54 45 3a 20 20 20 20 20 7a 4e 61 6d 65  NCATE:     zName
8bc0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8bd0: 5f 54 52 55 4e 43 41 54 45 22 3b 20 20 20 20 62  _TRUNCATE";    b
8be0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8bf0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
8c00: 54 41 54 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  TAT:        zNam
8c10: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8c20: 52 5f 46 53 54 41 54 22 3b 20 20 20 20 20 20 20  R_FSTAT";       
8c30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8c40: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  e SQLITE_IOERR_U
8c50: 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61  NLOCK:       zNa
8c60: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8c70: 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20 20 20  RR_UNLOCK";     
8c80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8c90: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8ca0: 52 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e  RDLOCK:       zN
8cb0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8cc0: 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20 20 20  ERR_RDLOCK";    
8cd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8ce0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8cf0: 5f 44 45 4c 45 54 45 3a 20 20 20 20 20 20 20 7a  _DELETE:       z
8d00: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8d10: 4f 45 52 52 5f 44 45 4c 45 54 45 22 3b 20 20 20  OERR_DELETE";   
8d20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8d30: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8d40: 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20  R_NOMEM:        
8d50: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8d60: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20  IOERR_NOMEM";   
8d70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8d80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8d90: 52 52 5f 41 43 43 45 53 53 3a 20 20 20 20 20 20  RR_ACCESS:      
8da0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8db0: 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 22 3b 20  _IOERR_ACCESS"; 
8dc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8dd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8de0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
8df0: 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 20  DLOCK:.         
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e10: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8e20: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
8e30: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b  CKRESERVEDLOCK";
8e40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8e50: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8e60: 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e  LOCK:         zN
8e70: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8e80: 45 52 52 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20  ERR_LOCK";      
8e90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8ea0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8eb0: 5f 43 4c 4f 53 45 3a 20 20 20 20 20 20 20 20 7a  _CLOSE:        z
8ec0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8ed0: 4f 45 52 52 5f 43 4c 4f 53 45 22 3b 20 20 20 20  OERR_CLOSE";    
8ee0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8ef0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8f00: 52 5f 44 49 52 5f 43 4c 4f 53 45 3a 20 20 20 20  R_DIR_CLOSE:    
8f10: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8f20: 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 22  IOERR_DIR_CLOSE"
8f30: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
8f40: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8f50: 52 52 5f 53 48 4d 4f 50 45 4e 3a 20 20 20 20 20  RR_SHMOPEN:     
8f60: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8f70: 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 22 3b  _IOERR_SHMOPEN";
8f80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8f90: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8fa0: 45 52 52 5f 53 48 4d 53 49 5a 45 3a 20 20 20 20  ERR_SHMSIZE:    
8fb0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8fc0: 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 22  E_IOERR_SHMSIZE"
8fd0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
8fe0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8ff0: 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20  OERR_SHMLOCK:   
9000: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9010: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b  TE_IOERR_SHMLOCK
9020: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
9030: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9040: 49 4f 45 52 52 5f 53 48 4d 4d 41 50 3a 20 20 20  IOERR_SHMMAP:   
9050: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9060: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
9070: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
9080: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9090: 5f 49 4f 45 52 52 5f 53 45 45 4b 3a 20 20 20 20  _IOERR_SEEK:    
90a0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
90b0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 22  LITE_IOERR_SEEK"
90c0: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
90d0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
90e0: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
90f0: 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  OENT: zName = "S
9100: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
9110: 54 45 5f 4e 4f 45 4e 54 22 3b 62 72 65 61 6b 3b  TE_NOENT";break;
9120: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9130: 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a 20 20  TE_IOERR_MMAP:  
9140: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9150: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
9160: 50 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  P";        break
9170: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9180: 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
9190: 50 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20  PPATH:  zName = 
91a0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  "SQLITE_IOERR_GE
91b0: 54 54 45 4d 50 50 41 54 48 22 3b 20 62 72 65 61  TTEMPPATH"; brea
91c0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
91d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
91e0: 41 54 48 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ATH:     zName =
91f0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43   "SQLITE_IOERR_C
9200: 4f 4e 56 50 41 54 48 22 3b 20 20 20 20 62 72 65  ONVPATH";    bre
9210: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9220: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20  QLITE_CORRUPT:  
9230: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9240: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  = "SQLITE_CORRUP
9250: 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72  T";           br
9260: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9270: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
9280: 54 41 42 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  TAB:       zName
9290: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55   = "SQLITE_CORRU
92a0: 50 54 5f 56 54 41 42 22 3b 20 20 20 20 20 20 62  PT_VTAB";      b
92b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
92c0: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
92d0: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
92e0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46  e = "SQLITE_NOTF
92f0: 4f 55 4e 44 22 3b 20 20 20 20 20 20 20 20 20 20  OUND";          
9300: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9310: 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20  e SQLITE_FULL:  
9320: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
9330: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c  me = "SQLITE_FUL
9340: 4c 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  L";             
9350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9360: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
9370: 45 4e 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  EN:           zN
9380: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
9390: 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20 20 20 20  NTOPEN";        
93a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
93b0: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
93c0: 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a 20 7a  PEN_NOTEMPDIR: z
93d0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
93e0: 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49  ANTOPEN_NOTEMPDI
93f0: 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  R";break;.      
9400: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
9410: 4f 50 45 4e 5f 49 53 44 49 52 3a 20 20 20 20 20  OPEN_ISDIR:     
9420: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9430: 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 3b  CANTOPEN_ISDIR";
9440: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9450: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
9460: 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3a 20  TOPEN_FULLPATH: 
9470: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9480: 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
9490: 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TH"; break;.    
94a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
94b0: 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 3a  NTOPEN_CONVPATH:
94c0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
94d0: 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50  E_CANTOPEN_CONVP
94e0: 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATH"; break;.   
94f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50     case SQLITE_P
9500: 52 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20  ROTOCOL:        
9510: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9520: 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20  TE_PROTOCOL";   
9530: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9540: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9550: 45 4d 50 54 59 3a 20 20 20 20 20 20 20 20 20 20  EMPTY:          
9560: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9570: 49 54 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20  ITE_EMPTY";     
9580: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9590: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
95a0: 5f 53 43 48 45 4d 41 3a 20 20 20 20 20 20 20 20  _SCHEMA:        
95b0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
95c0: 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20  LITE_SCHEMA";   
95d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
95e0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
95f0: 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20 20 20  E_TOOBIG:       
9600: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9610: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20  QLITE_TOOBIG";  
9620: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9630: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9640: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 20  TE_CONSTRAINT:  
9650: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9660: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9670: 54 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  T";        break
9680: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9690: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55  ITE_CONSTRAINT_U
96a0: 4e 49 51 55 45 3a 20 20 7a 4e 61 6d 65 20 3d 20  NIQUE:  zName = 
96b0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
96c0: 4e 54 5f 55 4e 49 51 55 45 22 3b 20 62 72 65 61  NT_UNIQUE"; brea
96d0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
96e0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
96f0: 54 52 49 47 47 45 52 3a 20 7a 4e 61 6d 65 20 3d  TRIGGER: zName =
9700: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
9710: 49 4e 54 5f 54 52 49 47 47 45 52 22 3b 62 72 65  INT_TRIGGER";bre
9720: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9730: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9740: 5f 46 4f 52 45 49 47 4e 4b 45 59 3a 0a 20 20 20  _FOREIGNKEY:.   
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
9770: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
9780: 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
9790: 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  EY";   break;.  
97a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
97b0: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b  CONSTRAINT_CHECK
97c0: 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  :   zName = "SQL
97d0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
97e0: 48 45 43 4b 22 3b 20 20 62 72 65 61 6b 3b 0a 20  HECK";  break;. 
97f0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9800: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
9810: 41 52 59 4b 45 59 3a 0a 20 20 20 20 20 20 20 20  ARYKEY:.        
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9840: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
9850: 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 22 3b 20  NT_PRIMARYKEY"; 
9860: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9870: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
9880: 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a  RAINT_NOTNULL: z
9890: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
98a0: 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c  ONSTRAINT_NOTNUL
98b0: 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  L";break;.      
98c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
98d0: 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
98e0: 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K:.             
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9900: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9910: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f  TE_CONSTRAINT_CO
9920: 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20 20 62 72 65  MMITHOOK";   bre
9930: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9940: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9950: 5f 56 54 41 42 3a 20 20 20 20 7a 4e 61 6d 65 20  _VTAB:    zName 
9960: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
9970: 41 49 4e 54 5f 56 54 41 42 22 3b 20 20 20 62 72  AINT_VTAB";   br
9980: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9990: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
99a0: 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  T_FUNCTION:.    
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
99d0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
99e0: 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 22  TRAINT_FUNCTION"
99f0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
9a00: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
9a10: 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3a  ONSTRAINT_ROWID:
9a20: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9a30: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f  TE_CONSTRAINT_RO
9a40: 57 49 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  WID";  break;.  
9a50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9a60: 4d 49 53 4d 41 54 43 48 3a 20 20 20 20 20 20 20  MISMATCH:       
9a70: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9a80: 49 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20  ITE_MISMATCH";  
9a90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9aa0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9ab0: 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 20 20 20  _MISUSE:        
9ac0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9ad0: 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20 20 20  LITE_MISUSE";   
9ae0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9af0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9b00: 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20 20 20  E_NOLFS:        
9b10: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9b20: 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20  QLITE_NOLFS";   
9b30: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9b40: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9b50: 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20 20 20  TE_AUTH:        
9b60: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9b70: 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20 20 20  SQLITE_AUTH";   
9b80: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9b90: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9ba0: 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20  ITE_FORMAT:     
9bb0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9bc0: 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22 3b  "SQLITE_FORMAT";
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9be0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9bf0: 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20  LITE_RANGE:     
9c00: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9c10: 20 22 53 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b   "SQLITE_RANGE";
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
9c30: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9c40: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20  QLITE_NOTADB:   
9c50: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9c60: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  = "SQLITE_NOTADB
9c70: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
9c80: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9c90: 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20 20  SQLITE_ROW:     
9ca0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9cb0: 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b   = "SQLITE_ROW";
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
9cd0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9ce0: 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 3a 20   SQLITE_NOTICE: 
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9d00: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49  e = "SQLITE_NOTI
9d10: 43 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  CE";            
9d20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9d30: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f  e SQLITE_NOTICE_
9d40: 52 45 43 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e 61  RECOVER_WAL: zNa
9d50: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
9d60: 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 22  ICE_RECOVER_WAL"
9d70: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
9d80: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  se SQLITE_NOTICE
9d90: 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
9da0: 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K:.             
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9dd0: 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
9de0: 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65  R_ROLLBACK"; bre
9df0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9e00: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 3a 20 20  QLITE_WARNING:  
9e10: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9e20: 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  = "SQLITE_WARNIN
9e30: 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72  G";           br
9e40: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9e50: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
9e60: 55 54 4f 49 4e 44 45 58 3a 20 20 7a 4e 61 6d 65  UTOINDEX:  zName
9e70: 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49   = "SQLITE_WARNI
9e80: 4e 47 5f 41 55 54 4f 49 4e 44 45 58 22 3b 20 62  NG_AUTOINDEX"; b
9e90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9ea0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20   SQLITE_DONE:   
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9ec0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45  e = "SQLITE_DONE
9ed0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
9ee0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
9ef0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
9f00: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68  ){.    static ch
9f10: 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20  ar zBuf[50];.   
9f20: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9f30: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
9f40: 7a 42 75 66 2c 20 22 53 51 4c 49 54 45 5f 55 4e  zBuf, "SQLITE_UN
9f50: 4b 4e 4f 57 4e 28 25 64 29 22 2c 20 6f 72 69 67  KNOWN(%d)", orig
9f60: 52 63 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  Rc);.    zName =
9f70: 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20 72 65 74   zBuf;.  }.  ret
9f80: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e  urn zName;.}.#en
9f90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
9fa0: 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  n a static strin
9fb0: 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
9fc0: 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72   the kind of err
9fd0: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
9fe0: 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  the.** argument.
9ff0: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
a000: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e  sqlite3ErrStr(in
a010: 74 20 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20  t rc){.  static 
a020: 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73  const char* cons
a030: 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20  t aMsg[] = {.   
a040: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20   /* SQLITE_OK   
a050: 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61         */ "not a
a060: 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  n error",.    /*
a070: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20   SQLITE_ERROR   
a080: 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69      */ "SQL logi
a090: 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69  c error or missi
a0a0: 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20  ng database",.  
a0b0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45    /* SQLITE_INTE
a0c0: 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20  RNAL    */ 0,.  
a0d0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d    /* SQLITE_PERM
a0e0: 20 20 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65          */ "acce
a0f0: 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65  ss permission de
a100: 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  nied",.    /* SQ
a110: 4c 49 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20  LITE_ABORT      
a120: 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65   */ "callback re
a130: 71 75 65 73 74 65 64 20 71 75 65 72 79 20 61 62  quested query ab
a140: 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ort",.    /* SQL
a150: 49 54 45 5f 42 55 53 59 20 20 20 20 20 20 20 20  ITE_BUSY        
a160: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 69 73 20  */ "database is 
a170: 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20  locked",.    /* 
a180: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20  SQLITE_LOCKED   
a190: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
a1a0: 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22  table is locked"
a1b0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a1c0: 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22  NOMEM       */ "
a1d0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a  out of memory",.
a1e0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45      /* SQLITE_RE
a1f0: 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74  ADONLY    */ "at
a200: 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61  tempt to write a
a210: 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61   readonly databa
a220: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
a230: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a  TE_INTERRUPT   *
a240: 2f 20 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c  / "interrupted",
a250: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
a260: 4f 45 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64  OERR       */ "d
a270: 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a  isk I/O error",.
a280: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f      /* SQLITE_CO
a290: 52 52 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61  RRUPT     */ "da
a2a0: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
a2b0: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c  e is malformed",
a2c0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
a2d0: 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75  OTFOUND    */ "u
a2e0: 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e  nknown operation
a2f0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a300: 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20  _FULL        */ 
a310: 22 64 61 74 61 62 61 73 65 20 6f 72 20 64 69 73  "database or dis
a320: 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20  k is full",.    
a330: 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  /* SQLITE_CANTOP
a340: 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65  EN    */ "unable
a350: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
a360: 65 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20  e file",.    /* 
a370: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20  SQLITE_PROTOCOL 
a380: 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70     */ "locking p
a390: 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a  rotocol",.    /*
a3a0: 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20   SQLITE_EMPTY   
a3b0: 20 20 20 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f      */ "table co
a3c0: 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c  ntains no data",
a3d0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53  .    /* SQLITE_S
a3e0: 43 48 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64  CHEMA      */ "d
a3f0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68  atabase schema h
a400: 61 73 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20  as changed",.   
a410: 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49   /* SQLITE_TOOBI
a420: 47 20 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e  G      */ "strin
a430: 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69  g or blob too bi
a440: 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  g",.    /* SQLIT
a450: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f  E_CONSTRAINT  */
a460: 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69   "constraint fai
a470: 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  led",.    /* SQL
a480: 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20  ITE_MISMATCH    
a490: 2a 2f 20 22 64 61 74 61 74 79 70 65 20 6d 69 73  */ "datatype mis
a4a0: 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53  match",.    /* S
a4b0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20  QLITE_MISUSE    
a4c0: 20 20 2a 2f 20 22 6c 69 62 72 61 72 79 20 72 6f    */ "library ro
a4d0: 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74  utine called out
a4e0: 20 6f 66 20 73 65 71 75 65 6e 63 65 22 2c 0a 20   of sequence",. 
a4f0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c     /* SQLITE_NOL
a500: 46 53 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72  FS       */ "lar
a510: 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20  ge file support 
a520: 69 73 20 64 69 73 61 62 6c 65 64 22 2c 0a 20 20  is disabled",.  
a530: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48    /* SQLITE_AUTH
a540: 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68          */ "auth
a550: 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64  orization denied
a560: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a570: 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20  _FORMAT      */ 
a580: 22 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62  "auxiliary datab
a590: 61 73 65 20 66 6f 72 6d 61 74 20 65 72 72 6f 72  ase format error
a5a0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a5b0: 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20  _RANGE       */ 
a5c0: 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20  "bind or column 
a5d0: 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e  index out of ran
a5e0: 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ge",.    /* SQLI
a5f0: 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a  TE_NOTADB      *
a600: 2f 20 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79  / "file is encry
a610: 70 74 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61  pted or is not a
a620: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b   database",.  };
a630: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a640: 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65  Err = "unknown e
a650: 72 72 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28  rror";.  switch(
a660: 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20   rc ){.    case 
a670: 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
a680: 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a  LBACK: {.      z
a690: 45 72 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65  Err = "abort due
a6a0: 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20   to ROLLBACK";. 
a6b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a6c0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
a6d0: 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30 78 66  .      rc &= 0xf
a6e0: 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  f;.      if( ALW
a6f0: 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63  AYS(rc>=0) && rc
a700: 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29  <ArraySize(aMsg)
a710: 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20   && aMsg[rc]!=0 
a720: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
a730: 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20  = aMsg[rc];.    
a740: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
a750: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
a760: 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zErr;.}../*.
a770: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a780: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73  implements a bus
a790: 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20  y callback that 
a7a0: 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73  sleeps and tries
a7b0: 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20  .** again until 
a7c0: 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  a timeout value 
a7d0: 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65  is reached.  The
a7e0: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
a7f0: 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20  s.** an integer 
a800: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
a810: 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e  econds passed in
a820: 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   as the first.**
a830: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
a840: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44  atic int sqliteD
a850: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
a860: 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20  ck(. void *ptr, 
a870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a880: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
a890: 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75  tion */. int cou
a8a0: 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
a8b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
a8c0: 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20 62  imes table has b
a8d0: 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23  een busy */.){.#
a8e0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
a8f0: 20 7c 7c 20 28 64 65 66 69 6e 65 64 28 48 41 56   || (defined(HAV
a900: 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56  E_USLEEP) && HAV
a910: 45 5f 55 53 4c 45 45 50 29 0a 20 20 73 74 61 74  E_USLEEP).  stat
a920: 69 63 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61  ic const u8 dela
a930: 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c  ys[] =.     { 1,
a940: 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32   2, 5, 10, 15, 2
a950: 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20  0, 25, 25,  25, 
a960: 20 35 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b   50,  50, 100 };
a970: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
a980: 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20  u8 totals[] =.  
a990: 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38     { 0, 1, 3,  8
a9a0: 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38  , 18, 33, 53, 78
a9b0: 2c 20 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c  , 103, 128, 178,
a9c0: 20 32 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65   228 };.# define
a9d0: 20 4e 44 45 4c 41 59 20 41 72 72 61 79 53 69 7a   NDELAY ArraySiz
a9e0: 65 28 64 65 6c 61 79 73 29 0a 20 20 73 71 6c 69  e(delays).  sqli
a9f0: 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74  te3 *db = (sqlit
aa00: 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20  e3 *)ptr;.  int 
aa10: 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75  timeout = db->bu
aa20: 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74  syTimeout;.  int
aa30: 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a   delay, prior;..
aa40: 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e    assert( count>
aa50: 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e  =0 );.  if( coun
aa60: 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20  t < NDELAY ){.  
aa70: 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73    delay = delays
aa80: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69  [count];.    pri
aa90: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e  or = totals[coun
aaa0: 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
aab0: 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b   delay = delays[
aac0: 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70  NDELAY-1];.    p
aad0: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44  rior = totals[ND
aae0: 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a  ELAY-1] + delay*
aaf0: 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31  (count-(NDELAY-1
ab00: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72  ));.  }.  if( pr
ab10: 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69  ior + delay > ti
ab20: 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c  meout ){.    del
ab30: 61 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70  ay = timeout - p
ab40: 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65  rior;.    if( de
ab50: 6c 61 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20  lay<=0 ) return 
ab60: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
ab70: 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73  OsSleep(db->pVfs
ab80: 2c 20 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20  , delay*1000);. 
ab90: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65   return 1;.#else
aba0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
abb0: 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b   (sqlite3 *)ptr;
abc0: 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d  .  int timeout =
abd0: 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72   ((sqlite3 *)ptr
abe0: 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a  )->busyTimeout;.
abf0: 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a    if( (count+1)*
ac00: 31 30 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29  1000 > timeout )
ac10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
ac20: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
ac30: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31  leep(db->pVfs, 1
ac40: 30 30 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72  000000);.  retur
ac50: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
ac60: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
ac70: 67 69 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c  given busy handl
ac80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
ac90: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
aca0: 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69   when an operati
acb0: 6f 6e 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  on failed with a
acc0: 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69   lock..** If thi
acd0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
ace0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
acf0: 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e  lock is retried.
ad00: 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72    If it.** retur
ad10: 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74  ns 0, the operat
ad20: 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20  ion aborts with 
ad30: 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65  an SQLITE_BUSY e
ad40: 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rror..*/.int sql
ad50: 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
ad60: 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65  ndler(BusyHandle
ad70: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  r *p){.  int rc;
ad80: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
ad90: 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d  0) || p->xFunc==
ada0: 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20  0 || p->nBusy<0 
adb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63  ) return 0;.  rc
adc0: 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70   = p->xFunc(p->p
add0: 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a  Arg, p->nBusy);.
ade0: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
adf0: 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31     p->nBusy = -1
ae00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
ae10: 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20  ->nBusy++;.  }. 
ae20: 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a   return rc; .}..
ae30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
ae40: 6e 65 20 73 65 74 73 20 74 68 65 20 62 75 73 79  ne sets the busy
ae50: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
ae60: 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65   Sqlite database
ae70: 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e   to the.** given
ae80: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
ae90: 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65  on with the give
aea0: 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  n argument..*/.i
aeb0: 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  nt sqlite3_busy_
aec0: 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74  handler(.  sqlit
aed0: 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a  e3 *db,.  int (*
aee0: 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74  xBusy)(void*,int
aef0: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  ),.  void *pArg.
af00: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
af10: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
af20: 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  ex);.  db->busyH
af30: 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78  andler.xFunc = x
af40: 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79  Busy;.  db->busy
af50: 48 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70  Handler.pArg = p
af60: 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  Arg;.  db->busyH
af70: 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
af80: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  ;.  db->busyTime
af90: 6f 75 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  out = 0;.  sqlit
afa0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
afb0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
afc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
afd0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
afe0: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
aff0: 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68  ALLBACK./*.** Th
b000: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
b010: 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  the progress cal
b020: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
b030: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
b040: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
b050: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
b060: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
b070: 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67  gument. The prog
b080: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69  ress callback wi
b090: 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ll.** be invoked
b0a0: 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f   every nOps opco
b0b0: 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  des..*/.void sql
b0c0: 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
b0d0: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
b0e0: 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70   *db, .  int nOp
b0f0: 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67  s,.  int (*xProg
b100: 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20  ress)(void*), . 
b110: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
b120: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
b130: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
b140: 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b  .  if( nOps>0 ){
b150: 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65  .    db->xProgre
b160: 73 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a  ss = xProgress;.
b170: 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73      db->nProgres
b180: 73 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e 65 64  sOps = (unsigned
b190: 29 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70  )nOps;.    db->p
b1a0: 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41  ProgressArg = pA
b1b0: 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rg;.  }else{.   
b1c0: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
b1d0: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f   0;.    db->nPro
b1e0: 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20  gressOps = 0;.  
b1f0: 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41    db->pProgressA
b200: 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  rg = 0;.  }.  sq
b210: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
b220: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  e(db->mutex);.}.
b230: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
b240: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74  his routine inst
b250: 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62  alls a default b
b260: 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74  usy handler that
b270: 20 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a   waits for the.*
b280: 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62  * specified numb
b290: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
b2a0: 64 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ds before return
b2b0: 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ing 0..*/.int sq
b2c0: 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
b2d0: 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ut(sqlite3 *db, 
b2e0: 69 6e 74 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d  int ms){.  if( m
b2f0: 73 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  s>0 ){.    sqlit
b300: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
b310: 64 62 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c  db, sqliteDefaul
b320: 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28  tBusyCallback, (
b330: 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20 20 64  void*)db);.    d
b340: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d  b->busyTimeout =
b350: 20 6d 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   ms;.  }else{.  
b360: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
b370: 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29  andler(db, 0, 0)
b380: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
b390: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b3a0: 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e  ** Cause any pen
b3b0: 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74  ding operation t
b3c0: 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20 65 61  o stop at its ea
b3d0: 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69  rliest opportuni
b3e0: 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ty..*/.void sqli
b3f0: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71  te3_interrupt(sq
b400: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
b410: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
b420: 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ed = 1;.}.../*.*
b430: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b440: 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  is exactly the s
b450: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63  ame as sqlite3_c
b460: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
b470: 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74  , except.** that
b480: 20 69 74 20 69 73 20 64 65 73 69 67 6e 65 64 20   it is designed 
b490: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20  to be called by 
b4a0: 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54  internal code. T
b4b0: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73  he difference is
b4c0: 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61  .** that if a ma
b4d0: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20  lloc() fails in 
b4e0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
b4f0: 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72  unction(), an er
b500: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72  ror code.** is r
b510: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
b520: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
b530: 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69  g cleared. .*/.i
b540: 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  nt sqlite3Create
b550: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20  Func(.  sqlite3 
b560: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
b570: 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  r *zFunctionName
b580: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
b590: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
b5a0: 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f  *pUserData,.  vo
b5b0: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
b5c0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
b5d0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
b5e0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
b5f0: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
b600: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
b610: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
b620: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
b630: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a  ite3_context*),.
b640: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
b650: 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b   *pDestructor.){
b660: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20  .  FuncDef *p;. 
b670: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e   int nName;.  in
b680: 74 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20  t extraFlags;.. 
b690: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b6a0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
b6b0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
b6c0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30  zFunctionName==0
b6d0: 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63   ||.      (xFunc
b6e0: 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78   && (xFinal || x
b6f0: 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20  Step)) || .     
b700: 20 28 21 78 46 75 6e 63 20 26 26 20 28 78 46 69   (!xFunc && (xFi
b710: 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29 29 20  nal && !xStep)) 
b720: 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63  ||.      (!xFunc
b730: 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20   && (!xFinal && 
b740: 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20  xStep)) ||.     
b750: 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72   (nArg<-1 || nAr
b760: 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  g>SQLITE_MAX_FUN
b770: 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20  CTION_ARG) ||.  
b780: 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20      (255<(nName 
b790: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
b7a0: 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  0( zFunctionName
b7b0: 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ))) ){.    retur
b7c0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
b7d0: 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  BKPT;.  }..  ass
b7e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
b7f0: 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c 49 54  _CONSTANT==SQLIT
b800: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20  E_DETERMINISTIC 
b810: 29 3b 0a 20 20 65 78 74 72 61 46 6c 61 67 73 20  );.  extraFlags 
b820: 3d 20 65 6e 63 20 26 20 20 53 51 4c 49 54 45 5f  = enc &  SQLITE_
b830: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20  DETERMINISTIC;. 
b840: 20 65 6e 63 20 26 3d 20 28 53 51 4c 49 54 45 5f   enc &= (SQLITE_
b850: 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c  FUNC_ENCMASK|SQL
b860: 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a 23 69 66  ITE_ANY);.  .#if
b870: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b880: 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53  _UTF16.  /* If S
b890: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73  QLITE_UTF16 is s
b8a0: 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20  pecified as the 
b8b0: 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74  encoding type, t
b8c0: 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20  ransform this.  
b8d0: 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c  ** to one of SQL
b8e0: 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
b8f0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73  QLITE_UTF16BE us
b900: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  ing the.  ** SQL
b910: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
b920: 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54  macro. SQLITE_UT
b930: 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20  F16 is not used 
b940: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a  internally..  **
b950: 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  ** If SQLITE_
b960: 41 4e 59 20 69 73 20 73 70 65 63 69 66 69 65 64  ANY is specified
b970: 2c 20 61 64 64 20 74 68 72 65 65 20 76 65 72 73  , add three vers
b980: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63  ions of the func
b990: 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tion.  ** to the
b9a0: 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a   hash table..  *
b9b0: 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c  /.  if( enc==SQL
b9c0: 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20  ITE_UTF16 ){.   
b9d0: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
b9e0: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c  F16NATIVE;.  }el
b9f0: 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49  se if( enc==SQLI
ba00: 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e  TE_ANY ){.    in
ba10: 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  t rc;.    rc = s
ba20: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
ba30: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
ba40: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
ba50: 5f 55 54 46 38 7c 65 78 74 72 61 46 6c 61 67 73  _UTF8|extraFlags
ba60: 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73 65 72  ,.         pUser
ba70: 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74  Data, xFunc, xSt
ba80: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73  ep, xFinal, pDes
ba90: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66  tructor);.    if
baa0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
bab0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
bac0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
bad0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
bae0: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
baf0: 55 54 46 31 36 4c 45 7c 65 78 74 72 61 46 6c 61  UTF16LE|extraFla
bb00: 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55  gs,.          pU
bb10: 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20  serData, xFunc, 
bb20: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
bb30: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
bb40: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
bb50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bb60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
bb70: 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c   }.    enc = SQL
bb80: 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d  ITE_UTF16BE;.  }
bb90: 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53  .#else.  enc = S
bba0: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64  QLITE_UTF8;.#end
bbb0: 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  if.  .  /* Check
bbc0: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
bbd0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
bbe0: 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20  g overridden or 
bbf0: 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a  deleted. If so,.
bc00: 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61    ** and there a
bc10: 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74  re active VMs, t
bc20: 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
bc30: 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e  E_BUSY. If a fun
bc40: 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65  ction.  ** is be
bc50: 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64  ing overridden/d
bc60: 65 6c 65 74 65 64 20 62 75 74 20 74 68 65 72 65  eleted but there
bc70: 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
bc80: 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20  Ms, allow the.  
bc90: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
bca0: 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76  continue but inv
bcb0: 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63  alidate all prec
bcc0: 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
bcd0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73  ts..  */.  p = s
bce0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
bcf0: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
bd00: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
bd10: 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a  g, (u8)enc, 0);.
bd20: 20 20 69 66 28 20 70 20 26 26 20 28 70 2d 3e 66    if( p && (p->f
bd30: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
bd40: 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d  E_FUNC_ENCMASK)=
bd50: 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d  =enc && p->nArg=
bd60: 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28  =nArg ){.    if(
bd70: 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
bd80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
bd90: 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
bda0: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a  , SQLITE_BUSY, .
bdb0: 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20          "unable 
bdc0: 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79  to delete/modify
bdd0: 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64   user-function d
bde0: 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61  ue to active sta
bdf0: 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20  tements");.     
be00: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
be10: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
be20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
be30: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73  E_BUSY;.    }els
be40: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
be50: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
be60: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
be70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73    }.  }..  p = s
be80: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
be90: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
bea0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
beb0: 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a  g, (u8)enc, 1);.
bec0: 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62    assert(p || db
bed0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b  ->mallocFailed);
bee0: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
bef0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
bf00: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
bf10: 49 66 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73  If an older vers
bf20: 69 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ion of the funct
bf30: 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69  ion with a confi
bf40: 67 75 72 65 64 20 64 65 73 74 72 75 63 74 6f 72  gured destructor
bf50: 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72   is.  ** being r
bf60: 65 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74  eplaced invoke t
bf70: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75  he destructor fu
bf80: 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a  nction here. */.
bf90: 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f    functionDestro
bfa0: 79 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28  y(db, p);..  if(
bfb0: 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a   pDestructor ){.
bfc0: 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d      pDestructor-
bfd0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70  >nRef++;.  }.  p
bfe0: 2d 3e 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20  ->pDestructor = 
bff0: 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70  pDestructor;.  p
c000: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70  ->funcFlags = (p
c010: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
c020: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
c030: 4b 29 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b  K) | extraFlags;
c040: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e  .  testcase( p->
c050: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
c060: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
c070: 20 29 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d   );.  p->xFunc =
c080: 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74   xFunc;.  p->xSt
c090: 65 70 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d  ep = xStep;.  p-
c0a0: 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69  >xFinalize = xFi
c0b0: 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44  nal;.  p->pUserD
c0c0: 61 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b  ata = pUserData;
c0d0: 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31  .  p->nArg = (u1
c0e0: 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e  6)nArg;.  return
c0f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
c100: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20  *.** Create new 
c110: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  user functions..
c120: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
c130: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
c140: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
c150: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
c160: 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  nc,.  int nArg,.
c170: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
c180: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
c190: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
c1a0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
c1b0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
c1c0: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
c1d0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
c1e0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
c1f0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
c200: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
c210: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65  ontext*).){.  re
c220: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
c230: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
c240: 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c  db, zFunc, nArg,
c250: 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20   enc, p, xFunc, 
c260: 78 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20  xStep,.         
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c280: 20 20 20 20 20 20 20 20 20 20 20 78 46 69 6e 61             xFina
c290: 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71  l, 0);.}..int sq
c2a0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
c2b0: 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69  ction_v2(.  sqli
c2c0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
c2d0: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20   char *zFunc,.  
c2e0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
c2f0: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  enc,.  void *p,.
c300: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
c310: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
c320: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
c330: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
c340: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
c350: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
c360: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
c370: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
c380: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
c390: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  *),.  void (*xDe
c3a0: 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29  stroy)(void *).)
c3b0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c3c0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e  ITE_ERROR;.  Fun
c3d0: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72  cDestructor *pAr
c3e0: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
c3f0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
c400: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78  >mutex);.  if( x
c410: 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70  Destroy ){.    p
c420: 41 72 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72  Arg = (FuncDestr
c430: 75 63 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44  uctor *)sqlite3D
c440: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
c450: 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72  sizeof(FuncDestr
c460: 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28  uctor));.    if(
c470: 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20   !pArg ){.      
c480: 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20  xDestroy(p);.   
c490: 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20     goto out;.   
c4a0: 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65   }.    pArg->xDe
c4b0: 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79  stroy = xDestroy
c4c0: 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65  ;.    pArg->pUse
c4d0: 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20  rData = p;.  }. 
c4e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
c4f0: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
c500: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
c510: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
c520: 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20  Final, pArg);.  
c530: 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
c540: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
c550: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
c560: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44  ITE_OK );.    xD
c570: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73  estroy(p);.    s
c580: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
c590: 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75   pArg);.  }.. ou
c5a0: 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  t:.  rc = sqlite
c5b0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
c5c0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
c5d0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
c5e0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
c5f0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
c600: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e  TE_OMIT_UTF16.in
c610: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
c620: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73  _function16(.  s
c630: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
c640: 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74  nst void *zFunct
c650: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
c660: 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74  Arg,.  int eText
c670: 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  Rep,.  void *p,.
c680: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
c690: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
c6a0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
c6b0: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ue**),.  void (*
c6c0: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
c6d0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
c6e0: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
c6f0: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
c700: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
c710: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
c720: 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20  char *zFunc8;.  
c730: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
c740: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
c750: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
c760: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
c770: 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65   zFunc8 = sqlite
c780: 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46  3Utf16to8(db, zF
c790: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c  unctionName, -1,
c7a0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
c7b0: 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  IVE);.  rc = sql
c7c0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
c7d0: 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c  b, zFunc8, nArg,
c7e0: 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46   eTextRep, p, xF
c7f0: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
c800: 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  al,0);.  sqlite3
c810: 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63  DbFree(db, zFunc
c820: 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  8);.  rc = sqlit
c830: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
c840: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
c850: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
c860: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
c870: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
c880: 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20  ** Declare that 
c890: 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  a function has b
c8a0: 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62  een overloaded b
c8b0: 79 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  y a virtual tabl
c8c0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
c8d0: 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  function already
c8e0: 20 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67   exists as a reg
c8f0: 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ular global func
c900: 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tion, then.** th
c910: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
c920: 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66  no-op.  If the f
c930: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
c940: 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65   exist, then cre
c950: 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65  ate.** a new one
c960: 20 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72   that always thr
c970: 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65  ows a run-time e
c980: 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  rror.  .**.** Wh
c990: 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  en virtual table
c9a0: 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76  s intend to prov
c9b0: 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65  ide an overloade
c9c0: 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79  d function, they
c9d0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  .** should call 
c9e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
c9f0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c  make sure the gl
ca00: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78  obal function ex
ca10: 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61  ists..** A globa
ca20: 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  l function must 
ca30: 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66  exist in order f
ca40: 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  or name resoluti
ca50: 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72  on to work.** pr
ca60: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  operly..*/.int s
ca70: 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
ca80: 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
ca90: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
caa0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
cab0: 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e  int nArg.){.  in
cac0: 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t nName = sqlite
cad0: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
cae0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
caf0: 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
cb00: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
cb10: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
cb20: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
cb30: 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  ion(db, zName, n
cb40: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
cb50: 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29  TE_UTF8, 0)==0 )
cb60: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
cb70: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
cb80: 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51   zName, nArg, SQ
cb90: 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20  LITE_UTF8,.     
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbb0: 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33        0, sqlite3
cbc0: 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c  InvalidFunction,
cbd0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
cbe0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
cbf0: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
cc00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
cc10: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
cc20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
cc30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cc40: 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
cc50: 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65  Register a trace
cc60: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
cc70: 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
cc80: 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
cc90: 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20  red trace.** is 
cca0: 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
ccb0: 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66  * A NULL trace f
ccc0: 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
ccd0: 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73  at no tracing is
cce0: 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
ccf0: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20  n-NULL.** trace 
cd00: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
cd10: 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
cd20: 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
cd30: 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a  e start of each.
cd40: 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
cd50: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
cd60: 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33  e3_trace(sqlite3
cd70: 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72   *db, void (*xTr
cd80: 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ace)(void*,const
cd90: 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70   char*), void *p
cda0: 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  Arg){.  void *pO
cdb0: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
cdc0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
cdd0: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
cde0: 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20  b->pTraceArg;.  
cdf0: 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72  db->xTrace = xTr
ce00: 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63  ace;.  db->pTrac
ce10: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
ce20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
ce30: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
ce40: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
ce50: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
ce60: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
ce70: 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f  n.  The pArg fro
ce80: 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  m the previously
ce90: 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20   registered .** 
cea0: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
ceb0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
cec0: 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f  **.** A NULL pro
ced0: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65  file function me
cee0: 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66  ans that no prof
cef0: 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75 74 65  iling is execute
cf00: 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a  s.  A non-NULL.*
cf10: 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70  * profile is a p
cf20: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
cf30: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76  tion that is inv
cf40: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
cf50: 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63  lusion of.** eac
cf60: 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  h SQL statement 
cf70: 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a  that is run..*/.
cf80: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72  void *sqlite3_pr
cf90: 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  ofile(.  sqlite3
cfa0: 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78   *db,.  void (*x
cfb0: 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63  Profile)(void*,c
cfc0: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74  onst char*,sqlit
cfd0: 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  e_uint64),.  voi
cfe0: 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69  d *pArg.){.  voi
cff0: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
d000: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
d010: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
d020: 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  d = db->pProfile
d030: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66  Arg;.  db->xProf
d040: 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a  ile = xProfile;.
d050: 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72    db->pProfileAr
d060: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
d070: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
d080: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
d090: 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e  turn pOld;.}.#en
d0a0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
d0b0: 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  IT_TRACE */../*.
d0c0: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 66 75  ** Register a fu
d0d0: 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
d0e0: 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  oked when a tran
d0f0: 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e  saction commits.
d100: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b  .** If the invok
d110: 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ed function retu
d120: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
d130: 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65  en the commit be
d140: 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62  comes a.** rollb
d150: 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ack..*/.void *sq
d160: 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f  lite3_commit_hoo
d170: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
d180: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
d190: 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
d1a0: 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
d1b0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43  se */.  int (*xC
d1c0: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c  allback)(void*),
d1d0: 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f    /* Function to
d1e0: 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20   invoke on each 
d1f0: 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64  commit */.  void
d200: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
d210: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
d220: 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
d230: 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
d240: 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pOld;.  sqlite3_
d250: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
d260: 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d  mutex);.  pOld =
d270: 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b   db->pCommitArg;
d280: 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  .  db->xCommitCa
d290: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
d2a0: 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69  ck;.  db->pCommi
d2b0: 74 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  tArg = pArg;.  s
d2c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
d2d0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
d2e0: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
d2f0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
d300: 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
d310: 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
d320: 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70 64 61  me a row is upda
d330: 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64  ted,.** inserted
d340: 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e   or deleted usin
d350: 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  g this database 
d360: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
d370: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64  oid *sqlite3_upd
d380: 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  ate_hook(.  sqli
d390: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
d3a0: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
d3b0: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
d3c0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76   database */.  v
d3d0: 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  oid (*xCallback)
d3e0: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20  (void*,int,char 
d3f0: 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e  const *,char con
d400: 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36  st *,sqlite_int6
d410: 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  4),.  void *pArg
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
d440: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
d450: 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
d460: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d470: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
d480: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
d490: 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d  UpdateArg;.  db-
d4a0: 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  >xUpdateCallback
d4b0: 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
d4c0: 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d  db->pUpdateArg =
d4d0: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
d4e0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
d4f0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
d500: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
d510: 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
d520: 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
d530: 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74  ed each time a t
d540: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
d550: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20  lled.** back by 
d560: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
d570: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
d580: 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62  d *sqlite3_rollb
d590: 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  ack_hook(.  sqli
d5a0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
d5b0: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
d5c0: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
d5d0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76   database */.  v
d5e0: 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  oid (*xCallback)
d5f0: 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c  (void*), /* Call
d600: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  back function */
d610: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d630: 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
d640: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
d650: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73   void *pRet;.  s
d660: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
d670: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
d680: 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c   pRet = db->pRol
d690: 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e  lbackArg;.  db->
d6a0: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
d6b0: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
d6c0: 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72   db->pRollbackAr
d6d0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
d6e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
d6f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
d700: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
d710: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d720: 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20  T_WAL./*.** The 
d730: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
d740: 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69  () callback regi
d750: 73 74 65 72 65 64 20 62 79 20 73 71 6c 69 74 65  stered by sqlite
d760: 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
d770: 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b  oint()..** Invok
d780: 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  e sqlite3_wal_ch
d790: 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
d7a0: 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
d7b0: 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   in the log file
d7c0: 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
d7d0: 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c  han sqlite3.pWal
d7e0: 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69  Arg cast to an i
d7f0: 6e 74 65 67 65 72 20 28 74 68 65 20 76 61 6c 75  nteger (the valu
d800: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a  e configured by.
d810: 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  ** wal_autocheck
d820: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e  point())..*/ .in
d830: 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61  t sqlite3WalDefa
d840: 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20  ultHook(.  void 
d850: 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20  *pClientData,   
d860: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f    /* Argument */
d870: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
d880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
d890: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  nection */.  con
d8a0: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
d8b0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
d8c0: 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20  */.  int nFrame 
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
d8e0: 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b  ize of WAL */.){
d8f0: 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53  .  if( nFrame>=S
d900: 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
d910: 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b  (pClientData) ){
d920: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
d930: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
d940: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
d950: 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  _checkpoint(db, 
d960: 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  zDb);.    sqlite
d970: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
d980: 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
d990: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
d9a0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d9b0: 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
d9c0: 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73  * Configure an s
d9d0: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
d9e0: 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75  ) callback to au
d9f0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63  tomatically chec
da00: 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61  kpoint.** a data
da10: 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69  base after commi
da20: 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
da30: 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ion if there are
da40: 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f   nFrame or.** mo
da50: 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  re frames in the
da60: 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69   log file. Passi
da70: 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67  ng zero or a neg
da80: 61 74 69 76 65 20 76 61 6c 75 65 20 61 73 20 74  ative value as t
da90: 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72  he.** nFrame par
daa0: 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73 20  ameter disables 
dab0: 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70  automatic checkp
dac0: 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a  oints entirely..
dad0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  **.** The callba
dae0: 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79  ck registered by
daf0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
db00: 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73  eplaces any exis
db10: 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  ting callback.**
db20: 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69 6e   registered usin
db30: 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  g sqlite3_wal_ho
db40: 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20  ok(). Likewise, 
db50: 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 63 61  registering a ca
db60: 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  llback.** using 
db70: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
db80: 28 29 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  () disables the 
db90: 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70  automatic checkp
dba0: 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a  oint mechanism.*
dbb0: 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20  * configured by 
dbc0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
dbd0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  /.int sqlite3_wa
dbe0: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
dbf0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
dc00: 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65  t nFrame){.#ifde
dc10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
dc20: 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  L.  UNUSED_PARAM
dc30: 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53  ETER(db);.  UNUS
dc40: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72  ED_PARAMETER(nFr
dc50: 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  ame);.#else.  if
dc60: 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20  ( nFrame>0 ){.  
dc70: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f    sqlite3_wal_ho
dc80: 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61  ok(db, sqlite3Wa
dc90: 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51  lDefaultHook, SQ
dca0: 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
dcb0: 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73  nFrame));.  }els
dcc0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  e{.    sqlite3_w
dcd0: 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30  al_hook(db, 0, 0
dce0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
dcf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
dd00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
dd10: 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
dd20: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
dd30: 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63  h time a transac
dd40: 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a  tion is written.
dd50: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74  ** into the writ
dd60: 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74  e-ahead-log by t
dd70: 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
dd80: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
dd90: 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f   *sqlite3_wal_ho
dda0: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
ddb0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
ddc0: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
ddd0: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
dde0: 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20   db handle */.  
ddf0: 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  int(*xCallback)(
de00: 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a  void *, sqlite3*
de10: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  , const char*, i
de20: 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  nt),.  void *pAr
de30: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
de40: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
de50: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
de60: 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a  to xCallback() *
de70: 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
de80: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76  ITE_OMIT_WAL.  v
de90: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
dea0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
deb0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
dec0: 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72  Ret = db->pWalAr
ded0: 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c  g;.  db->xWalCal
dee0: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
def0: 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67  k;.  db->pWalArg
df00: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
df10: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
df20: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
df30: 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a  urn pRet;.#else.
df40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64    return 0;.#end
df50: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  if.}../*.** Chec
df60: 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
df70: 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  zDb..*/.int sqli
df80: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
df90: 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  nt_v2(.  sqlite3
dfa0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
dfb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
dfc0: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
dfd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
dfe0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dff0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61   /* Name of atta
e000: 63 68 65 64 20 64 61 74 61 62 61 73 65 20 28 6f  ched database (o
e010: 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74  r NULL) */.  int
e020: 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20   eMode,         
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e040: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
e050: 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  T_* value */.  i
e060: 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20  nt *pnLog,      
e070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e080: 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57  * OUT: Size of W
e090: 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73  AL log in frames
e0a0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70   */.  int *pnCkp
e0b0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
e0c0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f        /* OUT: To
e0d0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  tal number of fr
e0e0: 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65  ames checkpointe
e0f0: 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53  d */.){.#ifdef S
e100: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
e110: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e120: 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  K;.#else.  int r
e130: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
e140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
e150: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
e160: 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f  nt iDb = SQLITE_
e170: 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f  MAX_ATTACHED;  /
e180: 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20  * sqlite3.aDb[] 
e190: 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63  index of db to c
e1a0: 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20  heckpoint */..  
e1b0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
e1c0: 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
e1d0: 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65  es to -1 in case
e1e0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
e1f0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67  . */.  if( pnLog
e200: 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a   ) *pnLog = -1;.
e210: 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a    if( pnCkpt ) *
e220: 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20  pnCkpt = -1;..  
e230: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
e240: 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e 53  HECKPOINT_FULL>S
e250: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
e260: 5f 50 41 53 53 49 56 45 20 29 3b 0a 20 20 61 73  _PASSIVE );.  as
e270: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
e280: 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51 4c  CKPOINT_FULL<SQL
e290: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
e2a0: 45 53 54 41 52 54 20 29 3b 0a 20 20 61 73 73 65  ESTART );.  asse
e2b0: 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
e2c0: 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2b 32 3d  POINT_PASSIVE+2=
e2d0: 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  =SQLITE_CHECKPOI
e2e0: 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20  NT_RESTART );.  
e2f0: 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45  if( eMode<SQLITE
e300: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
e310: 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c  IVE || eMode>SQL
e320: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
e330: 45 53 54 41 52 54 20 29 7b 0a 20 20 20 20 72 65  ESTART ){.    re
e340: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
e350: 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
e360: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
e370: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
e380: 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29   zDb && zDb[0] )
e390: 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  {.    iDb = sqli
e3a0: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
e3b0: 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66  , zDb);.  }.  if
e3c0: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72  ( iDb<0 ){.    r
e3d0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
e3e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
e3f0: 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
e400: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b  LITE_ERROR, "unk
e410: 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25  nown database: %
e420: 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73  s", zDb);.  }els
e430: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
e440: 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62  te3Checkpoint(db
e450: 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e  , iDb, eMode, pn
e460: 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20  Log, pnCkpt);.  
e470: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
e480: 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63  b, rc);.  }.  rc
e490: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
e4a0: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
e4b0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
e4c0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
e4d0: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
e4e0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .}.../*.** Check
e4f0: 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a  point database z
e500: 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55  Db. If zDb is NU
e510: 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75  LL, or if the bu
e520: 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a  ffer zDb points.
e530: 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61  ** to contains a
e540: 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72   zero-length str
e550: 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65  ing, all attache
e560: 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  d databases are 
e570: 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  .** checkpointed
e580: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e590: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
e5a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
e5b0: 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
e5c0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
e5d0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
e5e0: 32 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54  2(db, zDb, SQLIT
e5f0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
e600: 53 49 56 45 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  SIVE, 0, 0);.}..
e610: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e620: 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75  MIT_WAL./*.** Ru
e630: 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f  n a checkpoint o
e640: 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20  n database iDb. 
e650: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
e660: 69 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20  if database iDb 
e670: 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e  is.** not curren
e680: 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20  tly open in WAL 
e690: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  mode..**.** If a
e6a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
e6b0: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
e6c0: 62 61 73 65 20 62 65 69 6e 67 20 63 68 65 63 6b  base being check
e6d0: 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a  pointed, this .*
e6e0: 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
e6f0: 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  ns SQLITE_LOCKED
e700: 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e   and a checkpoin
e710: 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  t is not attempt
e720: 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72  ed. If .** an er
e730: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
e740: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65   running the che
e750: 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69  ckpoint, an SQLi
e760: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
e770: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 69   .** returned (i
e780: 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .e. SQLITE_IOERR
e790: 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  ). Otherwise, SQ
e7a0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54  LITE_OK..**.** T
e7b0: 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61  he mutex on data
e7c0: 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73  base handle db s
e7d0: 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79  hould be held by
e7e0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65   the caller. The
e7f0: 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69   mutex.** associ
e800: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73 70  ated with the sp
e810: 65 63 69 66 69 63 20 62 2d 74 72 65 65 20 62 65  ecific b-tree be
e820: 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  ing checkpointed
e830: 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20   is taken by.** 
e840: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68  this function wh
e850: 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ile the checkpoi
e860: 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a  nt is running..*
e870: 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20 70  *.** If iDb is p
e880: 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41 58  assed SQLITE_MAX
e890: 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e 20  _ATTACHED, then 
e8a0: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
e8b0: 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63 68  abases are.** ch
e8c0: 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20 61  eckpointed. If a
e8d0: 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
e8e0: 6e 74 65 72 65 64 20 69 74 20 69 73 20 72 65 74  ntered it is ret
e8f0: 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  urned immediatel
e900: 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70  y -.** no attemp
e910: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65  t is made to che
e920: 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61  ckpoint any rema
e930: 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73 2e  ining databases.
e940: 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
e950: 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66   eMode is one of
e960: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
e970: 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c  NT_PASSIVE, FULL
e980: 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f 0a   or RESTART..*/.
e990: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
e9a0: 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
e9b0: 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
e9c0: 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f  eMode, int *pnLo
e9d0: 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b  g, int *pnCkpt){
e9e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e9f0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
ea00: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
ea10: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea30: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
ea40: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
ea50: 68 20 61 74 74 61 63 68 65 64 20 64 62 73 20 2a  h attached dbs *
ea60: 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d 20  /.  int bBusy = 
ea70: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
ea80: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 53      /* True if S
ea90: 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20 62  QLITE_BUSY has b
eaa0: 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  een encountered 
eab0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
eac0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
ead0: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
eae0: 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67 20   assert( !pnLog 
eaf0: 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b  || *pnLog==-1 );
eb00: 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 43 6b  .  assert( !pnCk
eb10: 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d  pt || *pnCkpt==-
eb20: 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  1 );..  for(i=0;
eb30: 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72 63   i<db->nDb && rc
eb40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
eb50: 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 44  ){.    if( i==iD
eb60: 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45  b || iDb==SQLITE
eb70: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 7b  _MAX_ATTACHED ){
eb80: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
eb90: 74 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f 69  te3BtreeCheckpoi
eba0: 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  nt(db->aDb[i].pB
ebb0: 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c  t, eMode, pnLog,
ebc0: 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20 20   pnCkpt);.      
ebd0: 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20  pnLog = 0;.     
ebe0: 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20   pnCkpt = 0;.   
ebf0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
ec00: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
ec10: 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20 20    bBusy = 1;.   
ec20: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ec30: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
ec40: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
ec50: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
ec60: 26 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c 49  && bBusy) ? SQLI
ec70: 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a  TE_BUSY : rc;.}.
ec80: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
ec90: 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
eca0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
ecb0: 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  n returns true i
ecc0: 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68  f main-memory sh
ecd0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e 73  ould be used ins
ece0: 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d  tead of.** a tem
ecf0: 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72 20  porary file for 
ed00: 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72 20  transient pager 
ed10: 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65 6d  files and statem
ed20: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a  ent journals..**
ed30: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
ed40: 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ned depends on t
ed50: 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e  he value of db->
ed60: 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e 74  temp_store (runt
ed70: 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ime.** parameter
ed80: 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  ) and the compil
ed90: 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20  e time value of 
eda0: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
edb0: 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  E. The.** follow
edc0: 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69  ing table descri
edd0: 62 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f 6e  bes the relation
ede0: 73 68 69 70 20 62 65 74 77 65 65 6e 20 74 68 65  ship between the
edf0: 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a  se two values.**
ee00: 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
ee10: 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75 65  ons return value
ee20: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  ..**.**   SQLITE
ee30: 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20  _TEMP_STORE     
ee40: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20  db->temp_store  
ee50: 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74     Location of t
ee60: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
ee70: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
ee80: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
ee90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
eea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eeb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
eec0: 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
eed0: 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20            any   
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
eef0: 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
ef00: 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
ef40: 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 0).**   1     
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef60: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
ef70: 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
ef80: 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20  turn 1).**   1  
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efa0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
efb0: 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
efc0: 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
efd0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
efe0: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
eff0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
f000: 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
f010: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
f020: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
f030: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
f040: 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
f050: 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
f060: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
f080: 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
f090: 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20 20   1).**   3      
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
f0b0: 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
f0c0: 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
f0d0: 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71  urn 1).*/.int sq
f0e0: 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
f0f0: 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20  y(const sqlite3 
f100: 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  *db){.#if SQLITE
f110: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20  _TEMP_STORE==1. 
f120: 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65   return ( db->te
f130: 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23  mp_store==2 );.#
f140: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
f150: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20  _TEMP_STORE==2. 
f160: 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65   return ( db->te
f170: 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23  mp_store!=1 );.#
f180: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
f190: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20  _TEMP_STORE==3. 
f1a0: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
f1b0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
f1c0: 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c  P_STORE<1 || SQL
f1d0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33  ITE_TEMP_STORE>3
f1e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
f1f0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
f200: 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  urn UTF-8 encode
f210: 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
f220: 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ge explanation o
f230: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
f240: 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  t.** error..*/.c
f250: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
f260: 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65  e3_errmsg(sqlite
f270: 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20  3 *db){.  const 
f280: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21  char *z;.  if( !
f290: 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
f2a0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
f2b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
f2c0: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
f2d0: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
f2e0: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
f2f0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
f300: 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53  Str(SQLITE_MISUS
f310: 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73  E_BKPT);.  }.  s
f320: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
f330: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
f340: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
f350: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d  ailed ){.    z =
f360: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
f370: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
f380: 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73 74 63  }else{.    testc
f390: 61 73 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30  ase( db->pErr==0
f3a0: 20 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61   );.    z = (cha
f3b0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
f3c0: 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29 3b  _text(db->pErr);
f3d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62  .    assert( !db
f3e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f3f0: 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
f400: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
f410: 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72  te3ErrStr(db->er
f420: 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rCode);.    }.  
f430: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
f440: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
f450: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  x);.  return z;.
f460: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
f470: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
f480: 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36  ** Return UTF-16
f490: 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68   encoded English
f4a0: 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
f4b0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
f4c0: 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f  t recent.** erro
f4d0: 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  r..*/.const void
f4e0: 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   *sqlite3_errmsg
f4f0: 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  16(sqlite3 *db){
f500: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
f510: 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d  u16 outOfMem[] =
f520: 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c   {.    'o', 'u',
f530: 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20   't', ' ', 'o', 
f540: 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27  'f', ' ', 'm', '
f550: 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72  e', 'm', 'o', 'r
f560: 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20  ', 'y', 0.  };. 
f570: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
f580: 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20  6 misuse[] = {. 
f590: 20 20 20 27 6c 27 2c 20 27 69 27 2c 20 27 62 27     'l', 'i', 'b'
f5a0: 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 72 27 2c  , 'r', 'a', 'r',
f5b0: 20 27 79 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   'y', ' ', .    
f5c0: 27 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27  'r', 'o', 'u', '
f5d0: 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27 65  t', 'i', 'n', 'e
f5e0: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 63 27  ', ' ', .    'c'
f5f0: 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c  , 'a', 'l', 'l',
f600: 20 27 65 27 2c 20 27 64 27 2c 20 27 20 27 2c 20   'e', 'd', ' ', 
f610: 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27  .    'o', 'u', '
f620: 74 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f  t', ' ', .    'o
f630: 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'f', ' ', .  
f640: 20 20 27 73 27 2c 20 27 65 27 2c 20 27 71 27 2c    's', 'e', 'q',
f650: 20 27 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20   'u', 'e', 'n', 
f660: 27 63 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b  'c', 'e', 0.  };
f670: 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ..  const void *
f680: 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
f690: 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64      return (void
f6a0: 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d   *)outOfMem;.  }
f6b0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
f6c0: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
f6d0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
f6e0: 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73  turn (void *)mis
f6f0: 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  use;.  }.  sqlit
f700: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
f710: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
f720: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f730: 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f  d ){.    z = (vo
f740: 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20  id *)outOfMem;. 
f750: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20   }else{.    z = 
f760: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
f770: 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a  xt16(db->pErr);.
f780: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a      if( z==0 ){.
f790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
f7a0: 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 64 62  orWithMsg(db, db
f7b0: 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71 6c 69 74  ->errCode, sqlit
f7c0: 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72  e3ErrStr(db->err
f7d0: 43 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 7a 20  Code));.      z 
f7e0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
f7f0: 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
f800: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  ;.    }.    /* A
f810: 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61   malloc() may ha
f820: 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69 6e  ve failed within
f830: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
f840: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
f850: 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  6().    ** above
f860: 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
f870: 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
f880: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f890: 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20   flag needs to. 
f8a0: 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65 64     ** be cleared
f8b0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
f8c0: 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65 63  g. Do this direc
f8d0: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
f8e0: 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  via.    ** sqlit
f8f0: 65 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20  e3ApiExit(), to 
f900: 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68  avoid setting th
f910: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
f920: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
f930: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e  .    */.    db->
f940: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
f950: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
f960: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
f970: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
f980: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
f990: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
f9a0: 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  6 */../*.** Retu
f9b0: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
f9c0: 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65  nt error code ge
f9d0: 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53 51  nerated by an SQ
f9e0: 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66  Lite routine. If
f9f0: 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73   NULL is.** pass
fa00: 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
fa10: 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61  ion, we assume a
fa20: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
fa30: 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   during sqlite3_
fa40: 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  open()..*/.int s
fa50: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73  qlite3_errcode(s
fa60: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
fa70: 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65  f( db && !sqlite
fa80: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
fa90: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
faa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
fab0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
fac0: 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
fad0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
fae0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
faf0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
fb00: 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64  eturn db->errCod
fb10: 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  e & db->errMask;
fb20: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  .}.int sqlite3_e
fb30: 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
fb40: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
fb50: 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
fb60: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
fb70: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
fb80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
fb90: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
fba0: 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
fbb0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
fbc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fbd0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
fbe0: 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
fbf0: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  de;.}../*.** Ret
fc00: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
fc10: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
fc20: 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70  kind of error sp
fc30: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  ecified in the.*
fc40: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72  * argument.  For
fc50: 20 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d 70 6c   now, this simpl
fc60: 79 20 63 61 6c 6c 73 20 74 68 65 20 69 6e 74 65  y calls the inte
fc70: 72 6e 61 6c 20 73 71 6c 69 74 65 33 45 72 72 53  rnal sqlite3ErrS
fc80: 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  tr().** function
fc90: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
fca0: 2a 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72 28  *sqlite3_errstr(
fcb0: 69 6e 74 20 72 63 29 7b 0a 20 20 72 65 74 75 72  int rc){.  retur
fcc0: 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
fcd0: 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  rc);.}../*.** In
fce0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 61 63  validate all cac
fcf0: 68 65 64 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  hed KeyInfo obje
fd00: 63 74 73 20 66 6f 72 20 64 61 74 61 62 61 73 65  cts for database
fd10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 22   connection "db"
fd20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fd30: 69 6e 76 61 6c 69 64 61 74 65 43 61 63 68 65 64  invalidateCached
fd40: 4b 65 79 49 6e 66 6f 28 73 71 6c 69 74 65 33 20  KeyInfo(sqlite3 
fd50: 2a 64 62 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b  *db){.  Db *pDb;
fd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd70: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
fd80: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
fd90: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
fda0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
fdb0: 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
fdc0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 48 61 73 68  number */.  Hash
fdd0: 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
fde0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
fdf0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
fe00: 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54  es in pDb */.  T
fe10: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
fe20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
fe30: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
fe40: 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  abase */.  Index
fe50: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
fe60: 20 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 69         /* Each i
fe70: 6e 64 65 78 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ndex */..  for(i
fe80: 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44  Db=0, pDb=db->aD
fe90: 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  b; iDb<db->nDb; 
fea0: 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20  iDb++, pDb++){. 
feb0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
fec0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
fed0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
fee0: 6e 74 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a  nter(pDb->pBt);.
fef0: 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65      for(k=sqlite
ff00: 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
ff10: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
ff20: 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48  );  k; k=sqliteH
ff30: 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20  ashNext(k)){.   
ff40: 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65     pTab = (Table
ff50: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
ff60: 28 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  (k);.      for(p
ff70: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
ff80: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
ff90: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
ffa0: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70 4b 65     if( pIdx->pKe
ffb0: 79 49 6e 66 6f 20 26 26 20 70 49 64 78 2d 3e 70  yInfo && pIdx->p
ffc0: 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20  KeyInfo->db==db 
ffd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
ffe0: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
fff0: 28 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 29  (pIdx->pKeyInfo)
10000 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
10010 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a  ->pKeyInfo = 0;.
10020 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10030 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
10040 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 44  te3BtreeLeave(pD
10050 62 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  b->pBt);.  }.}..
10060 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
10070 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ew collating fun
10080 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61  ction for databa
10090 73 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61  se "db".  The na
100a0 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61  me is zName.** a
100b0 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  nd the encoding 
100c0 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69  is enc..*/.stati
100d0 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c  c int createColl
100e0 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ation(.  sqlite3
100f0 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  * db,.  const ch
10100 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38  ar *zName, .  u8
10110 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43   enc,.  void* pC
10120 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
10130 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
10140 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
10150 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
10160 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
10170 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ).){.  CollSeq *
10180 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63  pColl;.  int enc
10190 32 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  2;.  .  assert( 
101a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
101b0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
101c0 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  ..  /* If SQLITE
101d0 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
101e0 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
101f0 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
10200 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
10210 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
10220 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
10230 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
10240 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
10250 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
10260 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
10270 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
10280 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e  nally..  */.  en
10290 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74  c2 = enc;.  test
102a0 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49  case( enc2==SQLI
102b0 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65  TE_UTF16 );.  te
102c0 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51  stcase( enc2==SQ
102d0 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
102e0 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32  ED );.  if( enc2
102f0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c  ==SQLITE_UTF16 |
10300 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  | enc2==SQLITE_U
10310 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a  TF16_ALIGNED ){.
10320 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54      enc2 = SQLIT
10330 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
10340 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51   }.  if( enc2<SQ
10350 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63  LITE_UTF8 || enc
10360 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  2>SQLITE_UTF16BE
10370 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10380 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
10390 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  T;.  }..  /* Che
103a0 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  ck if this call 
103b0 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72  is removing or r
103c0 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73  eplacing an exis
103d0 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a  ting collation .
103e0 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49    ** sequence. I
103f0 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20  f so, and there 
10400 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20  are active VMs, 
10410 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20  return busy. If 
10420 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e  there.  ** are n
10430 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e  o active VMs, in
10440 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65  validate any pre
10450 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
10460 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f  ents..  */.  pCo
10470 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
10480 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
10490 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  enc2, zName, 0);
104a0 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20  .  if( pColl && 
104b0 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20  pColl->xCmp ){. 
104c0 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65     if( db->nVdbe
104d0 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20  Active ){.      
104e0 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
104f0 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  Msg(db, SQLITE_B
10500 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75  USY, .        "u
10510 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f  nable to delete/
10520 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e  modify collation
10530 20 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f   sequence due to
10540 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
10550 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ts");.      retu
10560 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
10570 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
10580 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
10590 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
105a0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 61 63     invalidateCac
105b0 68 65 64 4b 65 79 49 6e 66 6f 28 64 62 29 3b 0a  hedKeyInfo(db);.
105c0 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61  .    /* If colla
105d0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
105e0 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  oll was created 
105f0 64 69 72 65 63 74 6c 79 20 62 79 20 61 20 63 61  directly by a ca
10600 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
10610 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
10620 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67  ation, and not g
10630 65 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e 74  enerated by synt
10640 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20  hCollSeq(),.    
10650 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69  ** then any copi
10660 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68  es made by synth
10670 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74  CollSeq() need t
10680 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  o be invalidated
10690 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63  ..    ** Also, c
106a0 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63  ollation destruc
106b0 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44  tor - CollSeq.xD
106c0 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20  el() - function 
106d0 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
106e0 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20  to be called..  
106f0 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70    */ .    if( (p
10700 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c  Coll->enc & ~SQL
10710 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
10720 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20  D)==enc2 ){.    
10730 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c    CollSeq *aColl
10740 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
10750 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  nd(&db->aCollSeq
10760 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
10770 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
10780 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
10790 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
107a0 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b   *p = &aColl[j];
107b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
107c0 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
107d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
107e0 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20   p->xDel ){.    
107f0 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28          p->xDel(
10800 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  p->pUser);.     
10810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10820 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20   p->xCmp = 0;.  
10830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10840 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f      }.  }..  pCo
10850 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
10860 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
10870 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b  enc2, zName, 1);
10880 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20  .  if( pColl==0 
10890 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
108a0 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e  NOMEM;.  pColl->
108b0 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b  xCmp = xCompare;
108c0 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20  .  pColl->pUser 
108d0 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d  = pCtx;.  pColl-
108e0 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20  >xDel = xDel;.  
108f0 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38  pColl->enc = (u8
10900 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20  )(enc2 | (enc & 
10910 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
10920 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65  GNED));.  sqlite
10930 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
10940 45 5f 4f 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20  E_OK);.  return 
10950 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
10960 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20  *.** This array 
10970 64 65 66 69 6e 65 73 20 68 61 72 64 20 75 70 70  defines hard upp
10980 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d  er bounds on lim
10990 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65 0a  it values.  The.
109a0 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d  ** initializer m
109b0 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20 73  ust be kept in s
109c0 79 6e 63 20 77 69 74 68 20 74 68 65 20 53 51 4c  ync with the SQL
109d0 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23  ITE_LIMIT_*.** #
109e0 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69 74  defines in sqlit
109f0 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e3.h..*/.static 
10a00 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64 4c  const int aHardL
10a10 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c  imit[] = {.  SQL
10a20 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a  ITE_MAX_LENGTH,.
10a30 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c    SQLITE_MAX_SQL
10a40 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
10a50 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20  E_MAX_COLUMN,.  
10a60 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
10a70 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  DEPTH,.  SQLITE_
10a80 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
10a90 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  ECT,.  SQLITE_MA
10aa0 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c  X_VDBE_OP,.  SQL
10ab0 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
10ac0 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  _ARG,.  SQLITE_M
10ad0 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20 53  AX_ATTACHED,.  S
10ae0 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
10af0 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20  ATTERN_LENGTH,. 
10b00 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49   SQLITE_MAX_VARI
10b10 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20 20 20 20  ABLE_NUMBER,    
10b20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 30 39    /* IMP: R-3809
10b30 31 2d 33 32 33 35 32 20 2a 2f 0a 20 20 53 51 4c  1-32352 */.  SQL
10b40 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
10b50 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  DEPTH,.  SQLITE_
10b60 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
10b70 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61  DS,.};../*.** Ma
10b80 6b 65 20 73 75 72 65 20 74 68 65 20 68 61 72 64  ke sure the hard
10b90 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74 20   limits are set 
10ba0 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61  to reasonable va
10bb0 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  lues.*/.#if SQLI
10bc0 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30  TE_MAX_LENGTH<10
10bd0 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
10be0 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _MAX_LENGTH must
10bf0 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30   be at least 100
10c00 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
10c10 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
10c20 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51  H<100.# error SQ
10c30 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
10c40 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
10c50 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a  east 100.#endif.
10c60 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  #if SQLITE_MAX_S
10c70 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45  QL_LENGTH>SQLITE
10c80 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72  _MAX_LENGTH.# er
10c90 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ror SQLITE_MAX_S
10ca0 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e  QL_LENGTH must n
10cb0 6f 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ot be greater th
10cc0 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  an SQLITE_MAX_LE
10cd0 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20  NGTH.#endif.#if 
10ce0 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
10cf0 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65  UND_SELECT<2.# e
10d00 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
10d10 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
10d20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
10d30 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   2.#endif.#if SQ
10d40 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
10d50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  <40.# error SQLI
10d60 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d  TE_MAX_VDBE_OP m
10d70 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
10d80 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  40.#endif.#if SQ
10d90 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
10da0 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54  N_ARG<0 || SQLIT
10db0 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
10dc0 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f 72 20  RG>1000.# error 
10dd0 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
10de0 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20  ION_ARG must be 
10df0 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 30  between 0 and 10
10e00 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
10e10 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
10e20 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  D<0 || SQLITE_MA
10e30 58 5f 41 54 54 41 43 48 45 44 3e 31 32 35 0a 23  X_ATTACHED>125.#
10e40 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
10e50 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74 20  X_ATTACHED must 
10e60 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
10e70 20 31 32 35 0a 23 65 6e 64 69 66 0a 23 69 66 20   125.#endif.#if 
10e80 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
10e90 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31  PATTERN_LENGTH<1
10ea0 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
10eb0 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
10ec0 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
10ed0 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69  at least 1.#endi
10ee0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
10ef0 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20  _COLUMN>32767.# 
10f00 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
10f10 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74  _COLUMN must not
10f20 20 65 78 63 65 65 64 20 33 32 37 36 37 0a 23 65   exceed 32767.#e
10f30 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
10f40 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
10f50 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  H<1.# error SQLI
10f60 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
10f70 45 50 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  EPTH must be at 
10f80 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23  least 1.#endif.#
10f90 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  if SQLITE_MAX_WO
10fa0 52 4b 45 52 5f 54 48 52 45 41 44 53 3c 30 20 7c  RKER_THREADS<0 |
10fb0 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  | SQLITE_MAX_WOR
10fc0 4b 45 52 5f 54 48 52 45 41 44 53 3e 35 30 0a 23  KER_THREADS>50.#
10fd0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
10fe0 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
10ff0 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
11000 20 30 20 61 6e 64 20 35 30 0a 23 65 6e 64 69 66   0 and 50.#endif
11010 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  .../*.** Change 
11020 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c  the value of a l
11030 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68  imit.  Report th
11040 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20  e old value..** 
11050 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69  If an invalid li
11060 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73 75 70  mit index is sup
11070 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31  plied, report -1
11080 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61  ..** Make no cha
11090 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72  nges but still r
110a0 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61  eport the old va
110b0 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65  lue if the.** ne
110c0 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  w limit is negat
110d0 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  ive..**.** A new
110e0 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65   lower limit doe
110f0 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69  s not shrink exi
11100 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73  sting constructs
11110 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70  ..** It merely p
11120 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73  revents new cons
11130 74 72 75 63 74 73 20 74 68 61 74 20 65 78 63 65  tructs that exce
11140 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20  ed the limit.** 
11150 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f  from forming..*/
11160 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d  .int sqlite3_lim
11170 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
11180 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74  int limitId, int
11190 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e   newLimit){.  in
111a0 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 0a 20 20  t oldLimit;...  
111b0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
111c0 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20 46 6f  R-30189-54097 Fo
111d0 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63 61 74  r each limit cat
111e0 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d  egory SQLITE_LIM
111f0 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65  IT_NAME.  ** the
11200 72 65 20 69 73 20 61 20 68 61 72 64 20 75 70 70  re is a hard upp
11210 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61 74 20  er bound set at 
11220 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79 20  compile-time by 
11230 61 20 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72  a C preprocessor
11240 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c  .  ** macro call
11250 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41  ed SQLITE_MAX_NA
11260 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d 49 54  ME. (The "_LIMIT
11270 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 69  _" in the name i
11280 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a  s changed to.  *
11290 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f  * "_MAX_".).  */
112a0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
112b0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
112c0 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49  IT_LENGTH]==SQLI
112d0 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b  TE_MAX_LENGTH );
112e0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
112f0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
11300 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d  IT_SQL_LENGTH]==
11310 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
11320 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72  ENGTH );.  asser
11330 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
11340 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
11350 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43  N]==SQLITE_MAX_C
11360 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72  OLUMN );.  asser
11370 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
11380 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
11390 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d  DEPTH]==SQLITE_M
113a0 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20 29 3b  AX_EXPR_DEPTH );
113b0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
113c0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
113d0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
113e0 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  CT]==SQLITE_MAX_
113f0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29  COMPOUND_SELECT)
11400 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
11410 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
11420 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51  MIT_VDBE_OP]==SQ
11430 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
11440 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
11450 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
11460 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41  LIMIT_FUNCTION_A
11470 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  RG]==SQLITE_MAX_
11480 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a  FUNCTION_ARG );.
11490 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
114a0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
114b0 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c  T_ATTACHED]==SQL
114c0 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
114d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
114e0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
114f0 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45  LIMIT_LIKE_PATTE
11500 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20  RN_LENGTH]==.   
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11530 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
11540 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
11550 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  ERN_LENGTH );.  
11560 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
11570 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
11580 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
11590 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52  ==SQLITE_MAX_VAR
115a0 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20  IABLE_NUMBER);. 
115b0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
115c0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
115d0 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 5d 3d  _TRIGGER_DEPTH]=
115e0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47  =SQLITE_MAX_TRIG
115f0 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  GER_DEPTH );.  a
11600 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
11610 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  t[SQLITE_LIMIT_W
11620 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 3d 3d  ORKER_THREADS]==
11630 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
11640 52 5f 54 48 52 45 41 44 53 20 29 3b 0a 20 20 61  R_THREADS );.  a
11650 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4c 49  ssert( SQLITE_LI
11660 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
11670 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c 49  DS==(SQLITE_N_LI
11680 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69 66  MIT-1) );...  if
11690 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c  ( limitId<0 || l
116a0 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e  imitId>=SQLITE_N
116b0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72 65  _LIMIT ){.    re
116c0 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f  turn -1;.  }.  o
116d0 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c  ldLimit = db->aL
116e0 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20  imit[limitId];. 
116f0 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30   if( newLimit>=0
11700 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
11710 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
11720 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a 20  52476-28732 */. 
11730 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
11740 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74  aHardLimit[limit
11750 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  Id] ){.      new
11760 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c 69 6d  Limit = aHardLim
11770 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f 2a  it[limitId];  /*
11780 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32 35   IMP: R-51463-25
11790 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  634 */.    }.   
117a0 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69   db->aLimit[limi
117b0 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  tId] = newLimit;
117c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c  .  }.  return ol
117d0 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  dLimit;         
117e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
117f0 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35 34 31  MP: R-53341-3541
11800 39 20 2a 2f 0a 7d 0a 23 69 66 20 64 65 66 69 6e  9 */.}.#if defin
11810 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
11820 5f 41 55 54 4f 5f 50 52 4f 46 49 4c 45 29 0a 2f  _AUTO_PROFILE)./
11830 2a 20 73 74 64 65 72 72 20 6c 6f 67 67 69 6e 67  * stderr logging
11840 20 2a 2f 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65   */.void _sqlite
11850 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65 28 76 6f  _auto_profile(vo
11860 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63  id *aux, const c
11870 68 61 72 20 2a 73 71 6c 2c 20 75 36 34 20 6e 73  har *sql, u64 ns
11880 29 3b 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f  );.void _sqlite_
11890 61 75 74 6f 5f 74 72 61 63 65 28 76 6f 69 64 20  auto_trace(void 
118a0 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72  *aux, const char
118b0 20 2a 73 71 6c 29 3b 0a 76 6f 69 64 20 5f 73 71   *sql);.void _sq
118c0 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c  lite_auto_profil
118d0 65 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e  e(void *aux, con
118e0 73 74 20 63 68 61 72 20 2a 73 71 6c 2c 20 75 36  st char *sql, u6
118f0 34 20 6e 73 29 20 7b 0a 23 70 72 61 67 6d 61 20  4 ns) {.#pragma 
11900 75 6e 75 73 65 64 28 61 75 78 29 0a 09 66 70 72  unused(aux)..fpr
11910 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 51 75  intf(stderr, "Qu
11920 65 72 79 3a 20 25 73 5c 6e 20 45 78 65 63 75 74  ery: %s\n Execut
11930 69 6f 6e 20 54 69 6d 65 3a 20 25 6c 6c 75 20 6d  ion Time: %llu m
11940 73 5c 6e 22 2c 20 73 71 6c 2c 20 6e 73 20 2f 20  s\n", sql, ns / 
11950 31 30 30 30 30 30 30 29 3b 0a 7d 0a 76 6f 69 64  1000000);.}.void
11960 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72   _sqlite_auto_tr
11970 61 63 65 28 76 6f 69 64 20 2a 61 75 78 2c 20 63  ace(void *aux, c
11980 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 29 20  onst char *sql) 
11990 7b 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  {..fprintf(stder
119a0 72 2c 20 22 54 72 61 63 65 53 51 4c 28 25 70 29  r, "TraceSQL(%p)
119b0 3a 20 25 73 5c 6e 22 2c 20 61 75 78 2c 20 73 71  : %s\n", aux, sq
119c0 6c 29 3b 0a 7d 0a 0a 2f 2a 20 73 79 73 6c 6f 67  l);.}../* syslog
119d0 20 6c 6f 67 67 69 6e 67 20 2a 2f 0a 23 69 6e 63   logging */.#inc
119e0 6c 75 64 65 20 3c 61 73 6c 2e 68 3e 0a 73 74 61  lude <asl.h>.sta
119f0 74 69 63 20 61 73 6c 63 6c 69 65 6e 74 20 61 75  tic aslclient au
11a00 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 3d 20 4e  tolog_client = N
11a10 55 4c 4c 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  ULL;.static void
11a20 20 5f 63 6c 6f 73 65 5f 61 73 6c 5f 6c 6f 67 28   _close_asl_log(
11a30 29 20 7b 0a 20 20 69 66 28 20 4e 55 4c 4c 21 3d  ) {.  if( NULL!=
11a40 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 29  autolog_client )
11a50 7b 0a 20 20 20 20 61 73 6c 5f 63 6c 6f 73 65 28  {.    asl_close(
11a60 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 29 3b  autolog_client);
11a70 0a 20 20 20 20 61 75 74 6f 6c 6f 67 5f 63 6c 69  .    autolog_cli
11a80 65 6e 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  ent = NULL;.  }.
11a90 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 6f  }.static void _o
11aa0 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28 29 20 7b 0a  pen_asl_log() {.
11ab0 20 20 69 66 28 20 4e 55 4c 4c 3d 3d 61 75 74 6f    if( NULL==auto
11ac0 6c 6f 67 5f 63 6c 69 65 6e 74 20 29 7b 0a 20 20  log_client ){.  
11ad0 20 20 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74    autolog_client
11ae0 20 3d 20 61 73 6c 5f 6f 70 65 6e 28 22 53 51 4c   = asl_open("SQL
11af0 69 74 65 22 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a  ite", NULL, 0);.
11b00 20 20 20 20 61 74 65 78 69 74 28 5f 63 6c 6f 73      atexit(_clos
11b10 65 5f 61 73 6c 5f 6c 6f 67 29 3b 0a 20 20 7d 0a  e_asl_log);.  }.
11b20 7d 0a 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f  }..void _sqlite_
11b30 61 75 74 6f 5f 70 72 6f 66 69 6c 65 5f 73 79 73  auto_profile_sys
11b40 6c 6f 67 28 76 6f 69 64 20 2a 61 75 78 2c 20 63  log(void *aux, c
11b50 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 2c 20  onst char *sql, 
11b60 75 36 34 20 6e 73 29 3b 0a 76 6f 69 64 20 5f 73  u64 ns);.void _s
11b70 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65  qlite_auto_trace
11b80 5f 73 79 73 6c 6f 67 28 76 6f 69 64 20 2a 61 75  _syslog(void *au
11b90 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  x, const char *s
11ba0 71 6c 29 3b 0a 76 6f 69 64 20 5f 73 71 6c 69 74  ql);.void _sqlit
11bb0 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65 5f 73  e_auto_profile_s
11bc0 79 73 6c 6f 67 28 76 6f 69 64 20 2a 61 75 78 2c  yslog(void *aux,
11bd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
11be0 2c 20 75 36 34 20 6e 73 29 20 7b 0a 23 70 72 61  , u64 ns) {.#pra
11bf0 67 6d 61 20 75 6e 75 73 65 64 28 61 75 78 29 0a  gma unused(aux).
11c00 09 61 73 6c 5f 6c 6f 67 28 61 75 74 6f 6c 6f 67  .asl_log(autolog
11c10 5f 63 6c 69 65 6e 74 2c 20 4e 55 4c 4c 2c 20 41  _client, NULL, A
11c20 53 4c 5f 4c 45 56 45 4c 5f 4e 4f 54 49 43 45 2c  SL_LEVEL_NOTICE,
11c30 20 22 51 75 65 72 79 3a 20 25 73 5c 6e 20 45 78   "Query: %s\n Ex
11c40 65 63 75 74 69 6f 6e 20 54 69 6d 65 3a 20 25 6c  ecution Time: %l
11c50 6c 75 20 6d 73 5c 6e 22 2c 20 73 71 6c 2c 20 6e  lu ms\n", sql, n
11c60 73 20 2f 20 31 30 30 30 30 30 30 29 3b 0a 7d 0a  s / 1000000);.}.
11c70 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74  void _sqlite_aut
11c80 6f 5f 74 72 61 63 65 5f 73 79 73 6c 6f 67 28 76  o_trace_syslog(v
11c90 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20  oid *aux, const 
11ca0 63 68 61 72 20 2a 73 71 6c 29 20 7b 0a 09 61 73  char *sql) {..as
11cb0 6c 5f 6c 6f 67 28 61 75 74 6f 6c 6f 67 5f 63 6c  l_log(autolog_cl
11cc0 69 65 6e 74 2c 20 4e 55 4c 4c 2c 20 41 53 4c 5f  ient, NULL, ASL_
11cd0 4c 45 56 45 4c 5f 4e 4f 54 49 43 45 2c 20 22 54  LEVEL_NOTICE, "T
11ce0 72 61 63 65 53 51 4c 28 25 70 29 3a 20 25 73 5c  raceSQL(%p): %s\
11cf0 6e 22 2c 20 61 75 78 2c 20 73 71 6c 29 3b 0a 7d  n", aux, sql);.}
11d00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
11d10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11d20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62 6f  used to parse bo
11d30 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e 2d  th URIs and non-
11d40 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70 61  URI filenames pa
11d50 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 75  ssed by the.** u
11d60 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63 74  ser to API funct
11d70 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70 65  ions sqlite3_ope
11d80 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  n() or sqlite3_o
11d90 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66 6f  pen_v2(), and fo
11da0 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55 52  r database.** UR
11db0 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  Is specified as 
11dc0 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20 73  part of ATTACH s
11dd0 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  tatements..**.**
11de0 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
11df0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
11e00 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  tion is the name
11e10 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75   of the VFS to u
11e20 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c  se (or.** a NULL
11e30 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65 20   to signify the 
11e40 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66 20  default VFS) if 
11e50 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f 74  the URI does not
11e60 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73 3d   contain a "vfs=
11e70 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70 61  xxx".** query pa
11e80 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65 63  rameter. The sec
11e90 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e  ond argument con
11ea0 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28 6f  tains the URI (o
11eb0 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61  r non-URI filena
11ec0 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20 57  me).** itself. W
11ed0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
11ee0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  n is called the 
11ef0 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c 65  *pFlags variable
11f00 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a   should contain.
11f10 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 66  ** the default f
11f20 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68 65  lags to open the
11f30 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
11f40 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75 65   with. The value
11f50 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a 70   stored in.** *p
11f60 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70 64  Flags may be upd
11f70 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  ated before retu
11f80 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52 49  rning if the URI
11f90 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61 69   filename contai
11fa0 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78 78  ns .** "cache=xx
11fb0 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78 22  x" or "mode=xxx"
11fc0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
11fd0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  s..**.** If succ
11fe0 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
11ff0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
12000 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70 56  n this case *ppV
12010 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  fs is set to poi
12020 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46 53  nt to.** the VFS
12030 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
12040 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  used to open the
12050 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
12060 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20 74  *pzFile is set t
12070 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  o.** point to a 
12080 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
12090 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  g the name of th
120a0 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 20  e file to open. 
120b0 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
120c0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
120d0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
120e0 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73 71  entually call sq
120f0 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f 20  lite3_free() to 
12100 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20  release.** this 
12110 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  buffer..**.** If
12120 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12130 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74 65  , then an SQLite
12140 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
12150 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a 45  eturned and *pzE
12160 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20  rrMsg.** may be 
12170 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
12180 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
12190 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c  ing an English l
121a0 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a 2a  anguage error .*
121b0 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73  * message. It is
121c0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
121d0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
121e0 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
121f0 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20  release.** this 
12200 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69 6e  buffer by callin
12210 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
12220 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12230 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e 73  ParseUri(.  cons
12240 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74  t char *zDefault
12250 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 56  Vfs,        /* V
12260 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f 20  FS to use if no 
12270 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79 20  "vfs=xxx" query 
12280 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  option */.  cons
12290 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20 20  t char *zUri,   
122a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
122b0 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 52  ul-terminated UR
122c0 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20  I to parse */.  
122d0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70 46  unsigned int *pF
122e0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
122f0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49 54  /* IN/OUT: SQLIT
12300 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73  E_OPEN_XXX flags
12310 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
12320 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20 20  s **ppVfs,      
12330 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 46        /* OUT: VF
12340 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20 63  S to use */ .  c
12350 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20 20  har **pzFile,   
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12370 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65 20  * OUT: Filename 
12380 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52 49  component of URI
12390 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
123a0 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20  rrMsg           
123b0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72        /* OUT: Er
123c0 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66 20  ror message (if 
123d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 2a  rc!=SQLITE_OK) *
123e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
123f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73  SQLITE_OK;.  uns
12400 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 20  igned int flags 
12410 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f 6e  = *pFlags;.  con
12420 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20  st char *zVfs = 
12430 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20 63  zDefaultVfs;.  c
12440 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68  har *zFile;.  ch
12450 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72 69  ar c;.  int nUri
12460 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
12470 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73 73  30(zUri);..  ass
12480 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d 3d  ert( *pzErrMsg==
12490 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66 6c  0 );..  if( ((fl
124a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
124b0 4e 5f 55 52 49 29 20 7c 7c 20 73 71 6c 69 74 65  N_URI) || sqlite
124c0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f  3GlobalConfig.bO
124d0 70 65 6e 55 72 69 29 20 0a 20 20 20 26 26 20 6e  penUri) .   && n
124e0 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Uri>=5 && memcmp
124f0 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20  (zUri, "file:", 
12500 35 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20  5)==0 .  ){.    
12510 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20  char *zOpt;.    
12520 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20  int eState;     
12530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12540 20 50 61 72 73 65 72 20 73 74 61 74 65 20 77 68   Parser state wh
12550 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20 2a  en parsing URI *
12560 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20 20  /.    int iIn;  
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12580 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61      /* Input cha
12590 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a  racter index */.
125a0 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30      int iOut = 0
125b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
125c0 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61 72    /* Output char
125d0 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20  acter index */. 
125e0 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e     int nByte = n
125f0 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20 20  Uri+2;          
12600 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
12610 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ce to allocate *
12620 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  /..    /* Make s
12630 75 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4f  ure the SQLITE_O
12640 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73 20  PEN_URI flag is 
12650 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20  set to indicate 
12660 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65 6e  to the VFS xOpen
12670 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20   .    ** method 
12680 74 68 61 74 20 74 68 65 72 65 20 6d 61 79 20 62  that there may b
12690 65 20 65 78 74 72 61 20 70 61 72 61 6d 65 74 65  e extra paramete
126a0 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  rs following the
126b0 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a   file-name.  */.
126c0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
126d0 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20  ITE_OPEN_URI;.. 
126e0 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69 49     for(iIn=0; iI
126f0 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20 6e  n<nUri; iIn++) n
12700 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69 49  Byte += (zUri[iI
12710 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a 46  n]=='&');.    zF
12720 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
12730 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20  lloc(nByte);.   
12740 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65   if( !zFile ) re
12750 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12760 4d 3b 0a 0a 20 20 20 20 69 49 6e 20 3d 20 35 3b  M;..    iIn = 5;
12770 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12780 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54 48 4f 52  ALLOW_URI_AUTHOR
12790 49 54 59 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ITY.    /* Disca
127a0 72 64 20 74 68 65 20 73 63 68 65 6d 65 20 61 6e  rd the scheme an
127b0 64 20 61 75 74 68 6f 72 69 74 79 20 73 65 67 6d  d authority segm
127c0 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52 49 2e  ents of the URI.
127d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55 72 69   */.    if( zUri
127e0 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72 69  [5]=='/' && zUri
127f0 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [6]=='/' ){.    
12800 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20 20    iIn = 7;.     
12810 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e   while( zUri[iIn
12820 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d  ] && zUri[iIn]!=
12830 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20  '/' ) iIn++;.   
12840 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20 26 26     if( iIn!=7 &&
12850 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d   (iIn!=16 || mem
12860 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74 22 2c  cmp("localhost",
12870 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29 20 29   &zUri[7], 9)) )
12880 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72  {.        *pzErr
12890 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
128a0 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20 75  rintf("invalid u
128b0 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20 25 2e  ri authority: %.
128c0 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  *s", .          
128d0 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69 5b 37    iIn-7, &zUri[7
128e0 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ]);.        rc =
128f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
12900 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
12910 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20  e_uri_out;.     
12920 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
12930 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
12940 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 61 6e   filename and an
12950 79 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  y query paramete
12960 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46 69 6c  rs into the zFil
12970 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 2a  e buffer. .    *
12980 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65 73 63  * Decode %HH esc
12990 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e 67 20  ape codes along 
129a0 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20 2a 2a  the way. .    **
129b0 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e 20 74  .    ** Within t
129c0 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69 61 62  his loop, variab
129d0 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20 62 65  le eState may be
129e0 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f 72 20   set to 0, 1 or 
129f0 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20  2, depending.   
12a00 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72 73 69   ** on the parsi
12a10 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73 20 66  ng context. As f
12a20 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a 20  ollows:.    **. 
12a30 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72 73 69     **   0: Parsi
12a40 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20  ng file-name..  
12a50 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73 69 6e    **   1: Parsin
12a60 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e 20 6f  g name section o
12a70 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71  f a name=value q
12a80 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
12a90 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61 72 73      **   2: Pars
12aa0 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74 69 6f  ing value sectio
12ab0 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75  n of a name=valu
12ac0 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
12ad0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 53  r..    */.    eS
12ae0 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 77 68  tate = 0;.    wh
12af0 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69  ile( (c = zUri[i
12b00 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23  In])!=0 && c!='#
12b10 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 2b 2b  ' ){.      iIn++
12b20 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
12b30 25 27 20 0a 20 20 20 20 20 20 20 26 26 20 73 71  %' .       && sq
12b40 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55  lite3Isxdigit(zU
12b50 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20 20 20  ri[iIn]) .      
12b60 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
12b70 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31 5d 29  git(zUri[iIn+1])
12b80 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
12b90 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d 20 28     int octet = (
12ba0 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28  sqlite3HexToInt(
12bb0 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20  zUri[iIn++]) << 
12bc0 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63 74 65  4);.        octe
12bd0 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65 78 54  t += sqlite3HexT
12be0 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d  oInt(zUri[iIn++]
12bf0 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  );..        asse
12c00 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26 26 20  rt( octet>=0 && 
12c10 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20 20 20  octet<256 );.   
12c20 20 20 20 20 20 69 66 28 20 6f 63 74 65 74 3d 3d       if( octet==
12c30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
12c40 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
12c50 20 74 61 6b 65 6e 20 77 68 65 6e 20 22 25 30 30   taken when "%00
12c60 22 20 61 70 70 65 61 72 73 20 77 69 74 68 69 6e  " appears within
12c70 20 74 68 65 20 55 52 49 2e 20 49 6e 20 74 68 69   the URI. In thi
12c80 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
12c90 61 73 65 20 77 65 20 69 67 6e 6f 72 65 20 61 6c  ase we ignore al
12ca0 6c 20 74 65 78 74 20 69 6e 20 74 68 65 20 72 65  l text in the re
12cb0 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 70  mainder of the p
12cc0 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20  ath, name or.   
12cd0 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
12ce0 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
12cf0 70 61 72 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72  parsed. So ignor
12d00 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  e the current ch
12d10 61 72 61 63 74 65 72 0a 20 20 20 20 20 20 20 20  aracter.        
12d20 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f    ** and skip to
12d30 20 74 68 65 20 6e 65 78 74 20 22 3f 22 2c 20 22   the next "?", "
12d40 3d 22 20 6f 72 20 22 26 22 2c 20 61 73 20 61 70  =" or "&", as ap
12d50 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20  propriate. */.  
12d60 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
12d70 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d  c = zUri[iIn])!=
12d80 30 20 26 26 20 63 21 3d 27 23 27 20 0a 20 20 20  0 && c!='#' .   
12d90 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
12da0 53 74 61 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27  State!=0 || c!='
12db0 3f 27 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ?').            
12dc0 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 31 20    && (eState!=1 
12dd0 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26 20 63 21  || (c!='=' && c!
12de0 3d 27 26 27 29 29 0a 20 20 20 20 20 20 20 20 20  ='&')).         
12df0 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21       && (eState!
12e00 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20  =2 || c!='&').  
12e10 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
12e20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20         iIn++;.  
12e30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12e40 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
12e50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12e60 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20 20 20  c = octet;.     
12e70 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74   }else if( eStat
12e80 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26 27 20  e==1 && (c=='&' 
12e90 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20  || c=='=') ){.  
12ea0 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b        if( zFile[
12eb0 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20  iOut-1]==0 ){.  
12ec0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d          /* An em
12ed0 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e  pty option name.
12ee0 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74   Ignore this opt
12ef0 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  ion altogether. 
12f00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  */.          whi
12f10 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26  le( zUri[iIn] &&
12f20 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20   zUri[iIn]!='#' 
12f30 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d  && zUri[iIn-1]!=
12f40 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20  '&' ) iIn++;.   
12f50 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
12f60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12f70 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20 29 7b     if( c=='&' ){
12f80 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65  .          zFile
12f90 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
12fa0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
12fb0 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
12fc0 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 2;.        }.
12fd0 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20          c = 0;. 
12fe0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
12ff0 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d  eState==0 && c==
13000 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74 65 3d  '?') || (eState=
13010 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20 29 7b  =2 && c=='&') ){
13020 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a  .        c = 0;.
13030 20 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d          eState =
13040 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
13050 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
13060 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = c;.    }.    i
13070 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29 20 7a  f( eState==1 ) z
13080 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
13090 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69  \0';.    zFile[i
130a0 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out++] = '\0';. 
130b0 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
130c0 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a   = '\0';..    /*
130d0 20 43 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   Check if there 
130e0 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73  were any options
130f0 20 73 70 65 63 69 66 69 65 64 20 74 68 61 74 20   specified that 
13100 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65 72 70  should be interp
13110 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20 68 65  reted .    ** he
13120 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68 61 74  re. Options that
13130 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 65 64   are interpreted
13140 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20 22 76   here include "v
13150 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20 74 68  fs" and those th
13160 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 73  at.    ** corres
13170 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20 74 68  pond to flags th
13180 61 74 20 6d 61 79 20 62 65 20 70 61 73 73 65 64  at may be passed
13190 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f   to the sqlite3_
131a0 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a  open_v2().    **
131b0 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20   method. */.    
131c0 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71  zOpt = &zFile[sq
131d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
131e0 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69  ile)+1];.    whi
131f0 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20  le( zOpt[0] ){. 
13200 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20       int nOpt = 
13210 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
13220 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63 68 61  zOpt);.      cha
13230 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b  r *zVal = &zOpt[
13240 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69  nOpt+1];.      i
13250 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65  nt nVal = sqlite
13260 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b  3Strlen30(zVal);
13270 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74  ..      if( nOpt
13280 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 22 76  ==3 && memcmp("v
13290 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30  fs", zOpt, 3)==0
132a0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56 66 73   ){.        zVfs
132b0 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d   = zVal;.      }
132c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
132d0 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a  ruct OpenMode {.
132e0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
132f0 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20  char *z;.       
13300 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20     int mode;.   
13310 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20       } *aMode = 
13320 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
13330 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a  *zModeType = 0;.
13340 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b          int mask
13350 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
13360 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20  t limit = 0;..  
13370 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d        if( nOpt==
13380 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63 61 63  5 && memcmp("cac
13390 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30  he", zOpt, 5)==0
133a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
133b0 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e  atic struct Open
133c0 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64 65 5b  Mode aCacheMode[
133d0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
133e0 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20 20 53    { "shared",  S
133f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
13400 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  DCACHE },.      
13410 20 20 20 20 20 20 7b 20 22 70 72 69 76 61 74 65        { "private
13420 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  ", SQLITE_OPEN_P
13430 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20  RIVATECACHE },. 
13440 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20             { 0, 
13450 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b  0 }.          };
13460 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b  ..          mask
13470 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   = SQLITE_OPEN_S
13480 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c 49 54  HAREDCACHE|SQLIT
13490 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
134a0 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20 20 61  CHE;.          a
134b0 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d 6f 64  Mode = aCacheMod
134c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d  e;.          lim
134d0 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  it = mask;.     
134e0 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d       zModeType =
134f0 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20 20 20   "cache";.      
13500 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
13510 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d  nOpt==4 && memcm
13520 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20  p("mode", zOpt, 
13530 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)==0 ){.       
13540 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
13550 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d   OpenMode aOpenM
13560 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
13570 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20 20 53        { "ro",  S
13580 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
13590 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  NLY },.         
135a0 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51 4c 49     { "rw",  SQLI
135b0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
135c0 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  E }, .          
135d0 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c 49 54    { "rwc", SQLIT
135e0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
135f0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
13600 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20 20  REATE },.       
13610 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c       { "memory",
13620 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
13630 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  ORY },.         
13640 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20     { 0, 0 }.    
13650 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20        };..      
13660 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54      mask = SQLIT
13670 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
13680 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
13690 41 44 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  ADWRITE.        
136a0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
136b0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
136c0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  | SQLITE_OPEN_ME
136d0 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20 20 20 20  MORY;.          
136e0 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64  aMode = aOpenMod
136f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d  e;.          lim
13700 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67  it = mask & flag
13710 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f  s;.          zMo
13720 64 65 54 79 70 65 20 3d 20 22 61 63 63 65 73 73  deType = "access
13730 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  ";.        }..  
13740 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64 65 20        if( aMode 
13750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
13760 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   i;.          in
13770 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  t mode = 0;.    
13780 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61        for(i=0; a
13790 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b  Mode[i].z; i++){
137a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
137b0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f  st char *z = aMo
137c0 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20  de[i].z;.       
137d0 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73       if( nVal==s
137e0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
137f0 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a  ) && 0==memcmp(z
13800 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b  Val, z, nVal) ){
13810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
13820 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d  ode = aMode[i].m
13830 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ode;.           
13840 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13860 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
13870 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  ( mode==0 ){.   
13880 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d           *pzErrM
13890 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
138a0 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 25 73  intf("no such %s
138b0 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64   mode: %s", zMod
138c0 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20  eType, zVal);.  
138d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
138e0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
138f0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61           goto pa
13900 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
13910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13920 20 20 20 69 66 28 20 28 6d 6f 64 65 20 26 20 7e     if( (mode & ~
13930 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
13940 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20  RY)>limit ){.   
13950 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d           *pzErrM
13960 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
13970 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f  intf("%s mode no
13980 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a  t allowed: %s",.
13990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139b0 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
139c0 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  e, zVal);.      
139d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
139e0 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 20 20  E_PERM;.        
139f0 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75      goto parse_u
13a00 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ri_out;.        
13a10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6c    }.          fl
13a20 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26 20 7e  ags = (flags & ~
13a30 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20  mask) | mode;.  
13a40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13a50 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a  .      zOpt = &z
13a60 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20  Val[nVal+1];.   
13a70 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
13a80 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   zFile = sqlite3
13a90 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b 32 29 3b  _malloc(nUri+2);
13aa0 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20  .    if( !zFile 
13ab0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
13ac0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 63 70  NOMEM;.    memcp
13ad0 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e  y(zFile, zUri, n
13ae0 55 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  Uri);.    zFile[
13af0 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  nUri] = '\0';.  
13b00 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20    zFile[nUri+1] 
13b10 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67  = '\0';.    flag
13b20 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
13b30 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70  N_URI;.  }..  *p
13b40 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
13b50 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20  fs_find(zVfs);. 
13b60 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30 20 29   if( *ppVfs==0 )
13b70 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20  {.    *pzErrMsg 
13b80 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
13b90 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20  f("no such vfs: 
13ba0 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20  %s", zVfs);.    
13bb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
13bc0 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75 72  R;.  }. parse_ur
13bd0 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  i_out:.  if( rc!
13be0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13bf0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13c00 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  File);.    zFile
13c10 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c   = 0;.  }.  *pFl
13c20 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a  ags = flags;.  *
13c30 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a  pzFile = zFile;.
13c40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13c50 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
13c60 54 45 5f 45 4e 41 42 4c 45 5f 41 55 54 4f 5f 50  TE_ENABLE_AUTO_P
13c70 52 4f 46 49 4c 45 29 0a 23 64 65 66 69 6e 65 20  ROFILE).#define 
13c80 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
13c90 4e 47 5f 53 54 44 45 52 52 20 31 0a 23 64 65 66  NG_STDERR 1.#def
13ca0 69 6e 65 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c  ine SQLITE_AUTOL
13cb0 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 20 32 0a  OGGING_SYSLOG 2.
13cc0 73 74 61 74 69 63 20 76 6f 69 64 20 65 6e 61 62  static void enab
13cd0 6c 65 41 75 74 6f 4c 6f 67 67 69 6e 67 28 0a 20  leAutoLogging(. 
13ce0 20 73 71 6c 69 74 65 33 20 2a 64 62 0a 29 7b 0a   sqlite3 *db.){.
13cf0 20 20 63 68 61 72 20 2a 65 6e 76 70 72 6f 66 69    char *envprofi
13d00 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  le = getenv("SQL
13d10 49 54 45 5f 41 55 54 4f 5f 50 52 4f 46 49 4c 45  ITE_AUTO_PROFILE
13d20 22 29 3b 0a 20 20 0a 20 20 69 66 28 20 65 6e 76  ");.  .  if( env
13d30 70 72 6f 66 69 6c 65 21 3d 4e 55 4c 4c 20 29 7b  profile!=NULL ){
13d40 0a 20 20 20 20 69 6e 74 20 77 68 65 72 65 20 3d  .    int where =
13d50 20 30 3b 0a 20 20 20 20 69 66 28 20 21 73 74 72   0;.    if( !str
13d60 6e 63 61 73 65 63 6d 70 28 22 31 22 2c 20 65 6e  ncasecmp("1", en
13d70 76 70 72 6f 66 69 6c 65 2c 20 31 29 20 29 7b 0a  vprofile, 1) ){.
13d80 20 20 20 20 20 20 69 66 28 20 69 73 61 74 74 79        if( isatty
13d90 28 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 77  (2) ){.        w
13da0 68 65 72 65 20 3d 20 53 51 4c 49 54 45 5f 41 55  here = SQLITE_AU
13db0 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44 45 52 52  TOLOGGING_STDERR
13dc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13dd0 20 20 20 20 20 20 20 77 68 65 72 65 20 3d 20 53         where = S
13de0 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e  QLITE_AUTOLOGGIN
13df0 47 5f 53 59 53 4c 4f 47 3b 0a 20 20 20 20 20 20  G_SYSLOG;.      
13e00 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  }.    } else if(
13e10 20 21 73 74 72 6e 63 61 73 65 63 6d 70 28 22 73   !strncasecmp("s
13e20 74 64 65 72 72 22 2c 20 65 6e 76 70 72 6f 66 69  tderr", envprofi
13e30 6c 65 2c 20 36 29 20 29 7b 0a 20 20 20 20 20 20  le, 6) ){.      
13e40 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45 5f 41  where = SQLITE_A
13e50 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44 45 52  UTOLOGGING_STDER
13e60 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  R;.    } else if
13e70 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70 28 22  ( !strncasecmp("
13e80 73 79 73 6c 6f 67 22 2c 20 65 6e 76 70 72 6f 66  syslog", envprof
13e90 69 6c 65 2c 20 36 29 20 29 7b 0a 20 20 20 20 20  ile, 6) ){.     
13ea0 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45 5f   where = SQLITE_
13eb0 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c  AUTOLOGGING_SYSL
13ec0 4f 47 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OG;.    }.    if
13ed0 28 20 77 68 65 72 65 3d 3d 53 51 4c 49 54 45 5f  ( where==SQLITE_
13ee0 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44 45  AUTOLOGGING_STDE
13ef0 52 52 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  RR ){.      sqli
13f00 74 65 33 5f 70 72 6f 66 69 6c 65 28 64 62 2c 20  te3_profile(db, 
13f10 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f  _sqlite_auto_pro
13f20 66 69 6c 65 2c 20 64 62 29 3b 0a 20 20 20 20 7d  file, db);.    }
13f30 65 6c 73 65 20 69 66 28 20 77 68 65 72 65 3d 3d  else if( where==
13f40 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
13f50 4e 47 5f 53 59 53 4c 4f 47 20 29 7b 0a 20 20 20  NG_SYSLOG ){.   
13f60 20 20 20 5f 6f 70 65 6e 5f 61 73 6c 5f 6c 6f 67     _open_asl_log
13f70 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ();.      sqlite
13f80 33 5f 70 72 6f 66 69 6c 65 28 64 62 2c 20 5f 73  3_profile(db, _s
13f90 71 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69  qlite_auto_profi
13fa0 6c 65 5f 73 79 73 6c 6f 67 2c 20 64 62 29 3b 0a  le_syslog, db);.
13fb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 68 61 72      }.  }.  char
13fc0 20 2a 65 6e 76 74 72 61 63 65 20 3d 20 67 65 74   *envtrace = get
13fd0 65 6e 76 28 22 53 51 4c 49 54 45 5f 41 55 54 4f  env("SQLITE_AUTO
13fe0 5f 54 52 41 43 45 22 29 3b 0a 20 20 69 66 28 20  _TRACE");.  if( 
13ff0 65 6e 76 74 72 61 63 65 21 3d 4e 55 4c 4c 20 29  envtrace!=NULL )
14000 7b 0a 20 20 20 20 69 6e 74 20 77 68 65 72 65 20  {.    int where 
14010 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 73 74  = 0;.    if( !st
14020 72 6e 63 61 73 65 63 6d 70 28 22 31 22 2c 20 65  rncasecmp("1", e
14030 6e 76 74 72 61 63 65 2c 20 31 29 20 29 7b 0a 20  nvtrace, 1) ){. 
14040 20 20 20 20 20 69 66 28 20 69 73 61 74 74 79 28       if( isatty(
14050 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  2) ){.        wh
14060 65 72 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54  ere = SQLITE_AUT
14070 4f 4c 4f 47 47 49 4e 47 5f 53 54 44 45 52 52 3b  OLOGGING_STDERR;
14080 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14090 20 20 20 20 20 20 77 68 65 72 65 20 3d 20 53 51        where = SQ
140a0 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47  LITE_AUTOLOGGING
140b0 5f 53 59 53 4c 4f 47 3b 0a 20 20 20 20 20 20 7d  _SYSLOG;.      }
140c0 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
140d0 21 73 74 72 6e 63 61 73 65 63 6d 70 28 22 73 74  !strncasecmp("st
140e0 64 65 72 72 22 2c 20 65 6e 76 74 72 61 63 65 2c  derr", envtrace,
140f0 20 36 29 20 29 7b 0a 20 20 20 20 20 20 77 68 65   6) ){.      whe
14100 72 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f  re = SQLITE_AUTO
14110 4c 4f 47 47 49 4e 47 5f 53 54 44 45 52 52 3b 0a  LOGGING_STDERR;.
14120 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 21      } else if( !
14130 73 74 72 6e 63 61 73 65 63 6d 70 28 22 73 79 73  strncasecmp("sys
14140 6c 6f 67 22 2c 20 65 6e 76 74 72 61 63 65 2c 20  log", envtrace, 
14150 36 29 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72  6) ){.      wher
14160 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c  e = SQLITE_AUTOL
14170 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20  OGGING_SYSLOG;. 
14180 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 68 65     }.    if( whe
14190 72 65 3d 3d 53 51 4c 49 54 45 5f 41 55 54 4f 4c  re==SQLITE_AUTOL
141a0 4f 47 47 49 4e 47 5f 53 54 44 45 52 52 20 29 7b  OGGING_STDERR ){
141b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
141c0 72 61 63 65 28 64 62 2c 20 5f 73 71 6c 69 74 65  race(db, _sqlite
141d0 5f 61 75 74 6f 5f 74 72 61 63 65 2c 20 64 62 29  _auto_trace, db)
141e0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
141f0 77 68 65 72 65 3d 3d 53 51 4c 49 54 45 5f 41 55  where==SQLITE_AU
14200 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47  TOLOGGING_SYSLOG
14210 20 29 7b 0a 20 20 20 20 20 20 5f 6f 70 65 6e 5f   ){.      _open_
14220 61 73 6c 5f 6c 6f 67 28 29 3b 0a 20 20 20 20 20  asl_log();.     
14230 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 64   sqlite3_trace(d
14240 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f  b, _sqlite_auto_
14250 74 72 61 63 65 5f 73 79 73 6c 6f 67 2c 20 64 62  trace_syslog, db
14260 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
14270 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
14280 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
14290 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69  he work of openi
142a0 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e  ng a database on
142b0 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71   behalf of.** sq
142c0 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64  lite3_open() and
142d0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
142e0 29 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ). The database 
142f0 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e  filename "zFilen
14300 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46  ame"  .** is UTF
14310 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73  -8 encoded..*/.s
14320 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61  tatic int openDa
14330 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20  tabase(.  const 
14340 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
14350 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
14360 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f  ename UTF-8 enco
14370 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ded */.  sqlite3
14380 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20   **ppDb,        
14390 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64  /* OUT: Returned
143a0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
143b0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   */.  unsigned i
143c0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20  nt flags,    /* 
143d0 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67  Operational flag
143e0 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
143f0 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a  r *zVfs       /*
14400 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   Name of the VFS
14410 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   to use */.){.  
14420 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
14430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14440 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74  /* Store allocat
14450 65 64 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a  ed handle here *
14460 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
14470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14480 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
14490 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68  de */.  int isTh
144a0 72 65 61 64 73 61 66 65 3b 20 20 20 20 20 20 20  readsafe;       
144b0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
144c0 66 6f 72 20 74 68 72 65 61 64 73 61 66 65 20 63  for threadsafe c
144d0 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
144e0 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b  char *zOpen = 0;
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14500 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  /* Filename argu
14510 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
14520 42 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20  BtreeOpen() */. 
14530 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
14540 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
14550 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67   /* Error messag
14560 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 50 61  e from sqlite3Pa
14570 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a 20 20 2a  rseUri() */..  *
14580 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65  ppDb = 0;.#ifnde
14590 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
145a0 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71  TOINIT.  rc = sq
145b0 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
145c0 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
145d0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
145e0 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f  ..  /* Only allo
145f0 77 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69  w sensible combi
14600 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69 74 73 20  nations of bits 
14610 69 6e 20 74 68 65 20 66 6c 61 67 73 20 61 72 67  in the flags arg
14620 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68  ument.  .  ** Th
14630 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20  row an error if 
14640 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f  any non-sense co
14650 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 75 73 65  mbination is use
14660 64 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 64  d.  If we.  ** d
14670 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65  o not block ille
14680 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  gal combinations
14690 20 68 65 72 65 2c 20 69 74 20 63 6f 75 6c 64 20   here, it could 
146a0 74 72 69 67 67 65 72 0a 20 20 2a 2a 20 61 73 73  trigger.  ** ass
146b0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
146c0 20 69 6e 20 64 65 65 70 65 72 20 6c 61 79 65 72   in deeper layer
146d0 73 2e 20 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d  s.  Sensible com
146e0 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61  binations.  ** a
146f0 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31  re:.  **.  **  1
14700 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  :  SQLITE_OPEN_R
14710 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a  EADONLY.  **  2:
14720 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
14730 41 44 57 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a  ADWRITE.  **  6:
14740 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
14750 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
14760 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a  _OPEN_CREATE.  *
14770 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  /.  assert( SQLI
14780 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
14790 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20 61    == 0x01 );.  a
147a0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50  ssert( SQLITE_OP
147b0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 3d 3d 20  EN_READWRITE == 
147c0 30 78 30 32 20 29 3b 0a 20 20 61 73 73 65 72 74  0x02 );.  assert
147d0 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  ( SQLITE_OPEN_CR
147e0 45 41 54 45 20 20 20 20 3d 3d 20 30 78 30 34 20  EATE    == 0x04 
147f0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  );.  testcase( (
14800 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
14810 78 30 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e  x02 ); /* READON
14820 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  LY */.  testcase
14830 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
14840 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52 45 41  ==0x04 ); /* REA
14850 44 57 52 49 54 45 20 2a 2f 0a 20 20 74 65 73 74  DWRITE */.  test
14860 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
14870 26 37 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a  &7))==0x40 ); /*
14880 20 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45   READWRITE | CRE
14890 41 54 45 20 2a 2f 0a 20 20 69 66 28 20 28 28 31  ATE */.  if( ((1
148a0 3c 3c 28 66 6c 61 67 73 26 37 29 29 20 26 20 30  <<(flags&7)) & 0
148b0 78 34 36 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  x46)==0 ) return
148c0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
148d0 4b 50 54 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  KPT;..  if( sqli
148e0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
148f0 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b  bCoreMutex==0 ){
14900 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
14910 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
14920 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
14930 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29  E_OPEN_NOMUTEX )
14940 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
14950 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  fe = 0;.  }else 
14960 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
14970 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
14980 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  X ){.    isThrea
14990 64 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  dsafe = 1;.  }el
149a0 73 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64  se{.    isThread
149b0 73 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c  safe = sqlite3Gl
149c0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
149d0 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  Mutex;.  }.  if(
149e0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
149f0 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
14a00 45 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 26  E ){.    flags &
14a10 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  = ~SQLITE_OPEN_S
14a20 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 65  HAREDCACHE;.  }e
14a30 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 47  lse if( sqlite3G
14a40 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72  lobalConfig.shar
14a50 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29  edCacheEnabled )
14a60 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  {.    flags |= S
14a70 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
14a80 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f  DCACHE;.  }..  /
14a90 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c  * Remove harmful
14aa0 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66   bits from the f
14ab0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 20  lags parameter. 
14ac0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c   **.  ** The SQL
14ad0 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
14ae0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e   and SQLITE_OPEN
14af0 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73  _FULLMUTEX flags
14b00 20 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74   were.  ** dealt
14b10 20 77 69 74 68 20 69 6e 20 74 68 65 20 70 72 65   with in the pre
14b20 76 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b  vious code block
14b30 2e 20 20 42 65 73 69 64 65 73 20 74 68 65 73 65  .  Besides these
14b40 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20  , the only.  ** 
14b50 76 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61 67  valid input flag
14b60 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  s for sqlite3_op
14b70 65 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c 49  en_v2() are SQLI
14b80 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
14b90 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50  ,.  ** SQLITE_OP
14ba0 45 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53 51  EN_READWRITE, SQ
14bb0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
14bc0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  , SQLITE_OPEN_SH
14bd0 41 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20  AREDCACHE,.  ** 
14be0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
14bf0 41 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73 6f  ATECACHE, and so
14c00 6d 65 20 72 65 73 65 72 76 65 64 20 62 69 74 73  me reserved bits
14c10 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b  .  Silently mask
14c20 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74  .  ** off all ot
14c30 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a  her flags..  */.
14c40 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53    flags &=  ~( S
14c50 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
14c60 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
14c70 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
14c80 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
14c90 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
14ca0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
14cb0 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20  N_DB |.         
14cc0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
14cd0 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20  N_TEMP_DB | .   
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
14cf0 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
14d00 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20  T_DB | .        
14d10 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
14d20 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
14d30 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
14d40 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
14d50 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  MP_JOURNAL | .  
14d60 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
14d70 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
14d80 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
14d90 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
14da0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
14db0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
14dc0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f    SQLITE_OPEN_NO
14dd0 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20  MUTEX |.        
14de0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
14df0 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20  EN_FULLMUTEX |. 
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
14e10 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
14e20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20             );.. 
14e30 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
14e40 20 73 71 6c 69 74 65 20 64 61 74 61 20 73 74 72   sqlite data str
14e50 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d  ucture */.  db =
14e60 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
14e70 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  ro( sizeof(sqlit
14e80 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d  e3) );.  if( db=
14e90 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62  =0 ) goto opendb
14ea0 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68  _out;.  if( isTh
14eb0 72 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20  readsafe ){.    
14ec0 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  db->mutex = sqli
14ed0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
14ee0 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
14ef0 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  SIVE);.    if( d
14f00 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  b->mutex==0 ){. 
14f10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
14f20 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20  e(db);.      db 
14f30 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 0;.      goto 
14f40 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20  opendb_out;.    
14f50 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
14f60 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
14f70 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
14f80 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20  rMask = 0xff;.  
14f90 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64  db->nDb = 2;.  d
14fa0 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
14fb0 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20  E_MAGIC_BUSY;.  
14fc0 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
14fd0 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65  bStatic;..  asse
14fe0 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61  rt( sizeof(db->a
14ff0 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61  Limit)==sizeof(a
15000 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20  HardLimit) );.  
15010 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69  memcpy(db->aLimi
15020 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73  t, aHardLimit, s
15030 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
15040 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d 69 74  ));.  db->aLimit
15050 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f  [SQLITE_LIMIT_WO
15060 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 20 3d 20  RKER_THREADS] = 
15070 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
15080 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3b 0a 20  ORKER_THREADS;. 
15090 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
150a0 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41  = 1;.  db->nextA
150b0 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64  utovac = -1;.  d
150c0 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c 69  b->szMmap = sqli
150d0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
150e0 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e 65  szMmap;.  db->ne
150f0 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a  xtPagesize = 0;.
15100 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72    db->nMaxSorter
15110 4d 6d 61 70 20 3d 20 30 78 37 46 46 46 46 46 46  Mmap = 0x7FFFFFF
15120 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  F;.  db->flags |
15130 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
15140 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f  lNames | SQLITE_
15150 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 7c 20  EnableTrigger | 
15160 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c  SQLITE_CacheSpil
15170 6c 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  l.#if !defined(S
15180 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
15190 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 29 20 7c  TOMATIC_INDEX) |
151a0 7c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  | SQLITE_DEFAULT
151b0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
151c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
151d0 20 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49    | SQLITE_AutoI
151e0 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndex.#endif.#if 
151f0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
15200 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20  KPTFULLFSYNC.   
15210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
15220 53 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46  SQLITE_CkptFullF
15230 53 79 6e 63 0a 23 65 6e 64 69 66 0a 23 69 66 20  Sync.#endif.#if 
15240 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
15250 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20  ILE_FORMAT<4.   
15260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
15270 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
15280 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64  eFmt.#endif.#ifd
15290 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
152a0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
152b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152c0 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78   | SQLITE_LoadEx
152d0 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23  tension.#endif.#
152e0 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
152f0 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49 47  T_RECURSIVE_TRIG
15300 47 45 52 53 0a 20 20 20 20 20 20 20 20 20 20 20  GERS.           
15310 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52        | SQLITE_R
15320 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69  ecTriggers.#endi
15330 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
15340 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52  LITE_DEFAULT_FOR
15350 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51  EIGN_KEYS) && SQ
15360 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52  LITE_DEFAULT_FOR
15370 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20  EIGN_KEYS.      
15380 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
15390 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a  ITE_ForeignKeys.
153a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20  #endif.      ;. 
153b0 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
153c0 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
153d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
153e0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
153f0 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  E.  sqlite3HashI
15400 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  nit(&db->aModule
15410 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
15420 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20  Add the default 
15430 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
15440 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52  ce BINARY. BINAR
15450 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68  Y works for both
15460 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20   UTF-8.  ** and 
15470 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61  UTF-16, so add a
15480 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63   version for eac
15490 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75  h to avoid any u
154a0 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20  nnecessary.  ** 
154b0 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65  conversions. The
154c0 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74   only error that
154d0 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20   can occur here 
154e0 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  is a malloc() fa
154f0 69 6c 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63 72  ilure..  */.  cr
15500 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
15510 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
15520 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43  TE_UTF8, 0, binC
15530 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
15540 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
15550 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c  b, "BINARY", SQL
15560 49 54 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20  ITE_UTF16BE, 0, 
15570 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
15580 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
15590 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c  on(db, "BINARY",
155a0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
155b0 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
155c0 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
155d0 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49  lation(db, "RTRI
155e0 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  M", SQLITE_UTF8,
155f0 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f   (void*)1, binCo
15600 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66  llFunc, 0);.  if
15610 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
15620 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f  ed ){.    goto o
15630 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20  pendb_out;.  }. 
15640 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d   db->pDfltColl =
15650 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
15660 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55  Seq(db, SQLITE_U
15670 54 46 38 2c 20 22 42 49 4e 41 52 59 22 2c 20 30  TF8, "BINARY", 0
15680 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
15690 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b  >pDfltColl!=0 );
156a0 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20  ..  /* Also add 
156b0 61 20 55 54 46 2d 38 20 63 61 73 65 2d 69 6e 73  a UTF-8 case-ins
156c0 65 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61 74 69  ensitive collati
156d0 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a  on sequence. */.
156e0 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
156f0 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20  n(db, "NOCASE", 
15700 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
15710 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46  nocaseCollatingF
15720 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 50  unc, 0);..  /* P
15730 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d  arse the filenam
15740 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20  e/URI argument. 
15750 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61  */.  db->openFla
15760 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63  gs = flags;.  rc
15770 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55   = sqlite3ParseU
15780 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61  ri(zVfs, zFilena
15790 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d  me, &flags, &db-
157a0 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26  >pVfs, &zOpen, &
157b0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
157c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
157d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
157e0 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e  ITE_NOMEM ) db->
157f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
15800 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
15810 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63  orWithMsg(db, rc
15820 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  , zErrMsg ? "%s"
15830 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a   : 0, zErrMsg);.
15840 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15850 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67  (zErrMsg);.    g
15860 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
15870 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74    }..  /* Open t
15880 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62  he backend datab
15890 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20  ase driver */.  
158a0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
158b0 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20  eOpen(db->pVfs, 
158c0 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e  zOpen, db, &db->
158d0 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20  aDb[0].pBt, 0,. 
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158f0 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53         flags | S
15900 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
15910 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  DB);.  if( rc!=S
15920 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15930 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
15940 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  OERR_NOMEM ){.  
15950 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15960 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
15970 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
15980 2c 20 72 63 29 3b 0a 20 20 20 20 67 6f 74 6f 20  , rc);.    goto 
15990 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
159a0 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63    db->aDb[0].pSc
159b0 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63  hema = sqlite3Sc
159c0 68 65 6d 61 47 65 74 28 64 62 2c 20 64 62 2d 3e  hemaGet(db, db->
159d0 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64  aDb[0].pBt);.  d
159e0 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
159f0 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
15a00 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 0a 20  aGet(db, 0);... 
15a10 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   /* The default 
15a20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72  safety_level for
15a30 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
15a40 73 65 20 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f  se is 'full'; fo
15a50 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20  r the temp.  ** 
15a60 64 61 74 61 62 61 73 65 20 69 74 20 69 73 20 27  database it is '
15a70 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d 61 74 63  NONE'. This matc
15a80 68 65 73 20 74 68 65 20 70 61 67 65 72 20 6c 61  hes the pager la
15a90 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a  yer defaults.  .
15aa0 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30    */.  db->aDb[0
15ab0 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22  ].zName = "main"
15ac0 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73  ;.  db->aDb[0].s
15ad0 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b  afety_level = 3;
15ae0 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e  .  db->aDb[1].zN
15af0 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20  ame = "temp";.  
15b00 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74  db->aDb[1].safet
15b10 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a 20 20  y_level = 1;..  
15b20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
15b30 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20  TE_MAGIC_OPEN;. 
15b40 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
15b50 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
15b60 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
15b70 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  }..  /* Register
15b80 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75   all built-in fu
15b90 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20  nctions, but do 
15ba0 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72  not attempt to r
15bb0 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  ead the.  ** dat
15bc0 61 62 61 73 65 20 73 63 68 65 6d 61 20 79 65 74  abase schema yet
15bd0 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61 79 65  . This is delaye
15be0 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  d until the firs
15bf0 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62  t time the datab
15c00 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65  ase.  ** is acce
15c10 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ssed..  */.  sql
15c20 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
15c30 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69  LITE_OK);.  sqli
15c40 74 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74  te3RegisterBuilt
15c50 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b  inFunctions(db);
15c60 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f  ..  /* Load auto
15c70 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73  matic extensions
15c80 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68   - extensions th
15c90 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67  at have been reg
15ca0 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69  istered.  ** usi
15cb0 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61  ng the sqlite3_a
15cc0 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69  utomatic_extensi
15cd0 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20  on() API..  */. 
15ce0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
15cf0 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28  rcode(db);.  if(
15d00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15d10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74  {.    sqlite3Aut
15d20 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28  oLoadExtensions(
15d30 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  db);.    rc = sq
15d40 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
15d50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
15d60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15d70 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
15d80 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  t;.    }.  }..#i
15d90 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
15da0 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64  LE_FTS1.  if( !d
15db0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15dc0 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ){.    extern in
15dd0 74 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69  t sqlite3Fts1Ini
15de0 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  t(sqlite3*);.   
15df0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
15e00 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  1Init(db);.  }.#
15e10 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
15e20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32  LITE_ENABLE_FTS2
15e30 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
15e40 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
15e50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15e60 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
15e70 74 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69  te3Fts2Init(sqli
15e80 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  te3*);.    rc = 
15e90 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28  sqlite3Fts2Init(
15ea0 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
15eb0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
15ec0 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 69 66 28  NABLE_FTS3.  if(
15ed0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
15ee0 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
15ef0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
15f00 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28  sqlite3Fts3Init(
15f10 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
15f20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
15f30 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20  NABLE_ICU.  if( 
15f40 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
15f50 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
15f60 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
15f70 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62  qlite3IcuInit(db
15f80 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
15f90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15fa0 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20  BLE_RTREE.  if( 
15fb0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
15fc0 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
15fd0 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  OK){.    rc = sq
15fe0 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64  lite3RtreeInit(d
15ff0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
16000 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45    /* -DSQLITE_DE
16010 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
16020 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55  DE=1 makes EXCLU
16030 53 49 56 45 20 74 68 65 20 64 65 66 61 75 6c 74  SIVE the default
16040 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
16050 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45  de.  -DSQLITE_DE
16060 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
16070 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c  DE=0 make NORMAL
16080 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
16090 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
160a0 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61   Doing nothing a
160b0 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73  t all also makes
160c0 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61   NORMAL the defa
160d0 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ult..  */.#ifdef
160e0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
160f0 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64  LOCKING_MODE.  d
16100 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20  b->dfltLockMode 
16110 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
16120 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20  _LOCKING_MODE;. 
16130 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
16140 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33  kingMode(sqlite3
16150 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61  BtreePager(db->a
16160 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20  Db[0].pBt),.    
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16180 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46        SQLITE_DEF
16190 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
161a0 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  E);.#endif..  if
161b0 28 20 72 63 20 29 20 73 71 6c 69 74 65 33 45 72  ( rc ) sqlite3Er
161c0 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20  ror(db, rc);..  
161d0 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f  /* Enable the lo
161e0 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73  okaside-malloc s
161f0 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65  ubsystem */.  se
16200 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c  tupLookaside(db,
16210 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   0, sqlite3Globa
16220 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73  lConfig.szLookas
16230 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
16250 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
16260 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20  .nLookaside);.. 
16270 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
16280 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  ocheckpoint(db, 
16290 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
162a0 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e  AL_AUTOCHECKPOIN
162b0 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a  T);..opendb_out:
162c0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
162d0 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28 20 64 62  zOpen);.  if( db
162e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
162f0 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20  db->mutex!=0 || 
16300 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30 20  isThreadsafe==0 
16310 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  || sqlite3Global
16320 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
16330 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  x==0 );.    sqli
16340 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
16350 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
16360 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
16370 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 61 73  rrcode(db);.  as
16380 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c 20 72  sert( db!=0 || r
16390 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
163a0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
163b0 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
163c0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
163d0 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a  b);.    db = 0;.
163e0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
163f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16400 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
16410 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a  ITE_MAGIC_SICK;.
16420 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
16430 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 45 4e  __APPLE__) && EN
16440 41 42 4c 45 5f 46 4f 52 43 45 5f 57 41 4c 0a 20  ABLE_FORCE_WAL. 
16450 20 69 66 28 20 64 62 20 26 26 20 21 72 63 20 29   if( db && !rc )
16460 7b 0a 20 20 20 20 69 66 20 28 28 30 20 3d 3d 20  {.    if ((0 == 
16470 61 63 63 65 73 73 28 22 2f 76 61 72 2f 64 62 2f  access("/var/db/
16480 65 6e 61 62 6c 65 46 6f 72 63 65 57 41 4c 22 2c  enableForceWAL",
16490 20 52 5f 4f 4b 29 29 29 20 7b 0a 23 69 66 64 65   R_OK))) {.#ifde
164a0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
164b0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
164c0 65 72 72 2c 20 22 53 51 4c 69 74 65 20 57 41 4c  err, "SQLite WAL
164d0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 45 4e   journal_mode EN
164e0 41 42 4c 45 44 20 62 79 20 64 65 66 61 75 6c 74  ABLED by default
164f0 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  .\n");.#endif.  
16500 20 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74      .      sqlit
16510 65 33 5f 65 78 65 63 28 64 62 2c 20 22 70 72 61  e3_exec(db, "pra
16520 67 6d 61 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  gma journal_mode
16530 3d 77 61 6c 22 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  =wal", NULL, NUL
16540 4c 2c 20 4e 55 4c 4c 29 3b 0a 23 69 66 64 65 66  L, NULL);.#ifdef
16550 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2f   SQLITE_DEBUG.//
16560 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 2f 2f 20      } else {.// 
16570 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
16580 65 72 72 2c 20 22 53 51 4c 69 74 65 20 57 41 4c  err, "SQLite WAL
16590 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 4e 4f   journal_mode NO
165a0 54 20 45 4e 41 42 4c 45 44 20 62 79 20 64 65 66  T ENABLED by def
165b0 61 75 6c 74 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69  ault.\n");.#endi
165c0 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  f.    }.  }.#end
165d0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
165e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 55 54  QLITE_ENABLE_AUT
165f0 4f 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 66 28  O_PROFILE).  if(
16600 20 64 62 20 26 26 20 21 72 63 20 29 7b 0a 20 20   db && !rc ){.  
16610 20 20 65 6e 61 62 6c 65 41 75 74 6f 4c 6f 67 67    enableAutoLogg
16620 69 6e 67 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  ing(db);.  }.#en
16630 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 64 62  dif.  *ppDb = db
16640 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16650 45 4e 41 42 4c 45 5f 53 51 4c 52 52 0a 20 20 53  ENABLE_SQLRR.  S
16660 52 52 65 63 4f 70 65 6e 28 64 62 2c 20 7a 46 69  RRecOpen(db, zFi
16670 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a  lename, flags);.
16680 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
16690 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
166a0 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  OG.  if( sqlite3
166b0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
166c0 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  llog ){.    /* O
166d0 70 65 6e 69 6e 67 20 61 20 64 62 20 68 61 6e 64  pening a db hand
166e0 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d  le. Fourth param
166f0 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 30  eter is passed 0
16700 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70  . */.    void *p
16710 41 72 67 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  Arg = sqlite3Glo
16720 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
16730 67 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65  gArg;.    sqlite
16740 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
16750 71 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c 20  qllog(pArg, db, 
16760 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20  zFilename, 0);. 
16770 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
16780 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  rn sqlite3ApiExi
16790 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  t(0, rc);.}../*.
167a0 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
167b0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
167c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  /.int sqlite3_op
167d0 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
167e0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20   *zFilename, .  
167f0 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a  sqlite3 **ppDb .
16800 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e  ){.  return open
16810 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61  Database(zFilena
16820 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20  me, ppDb,.      
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16840 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16850 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
16860 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a  PEN_CREATE, 0);.
16870 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  }.int sqlite3_op
16880 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63  en_v2(.  const c
16890 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20  har *filename,  
168a0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
168b0 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f  ename (UTF-8) */
168c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
168d0 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  b,         /* OU
168e0 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e  T: SQLite db han
168f0 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  dle */.  int fla
16900 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
16910 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63   /* Flags */.  c
16920 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
16930 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
16940 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20  f VFS module to 
16950 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  use */.){.  retu
16960 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  rn openDatabase(
16970 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20  filename, ppDb, 
16980 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c  (unsigned int)fl
16990 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23  ags, zVfs);.}..#
169a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
169b0 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f  IT_UTF16./*.** O
169c0 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61  pen a new databa
169d0 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
169e0 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  t sqlite3_open16
169f0 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  (.  const void *
16a00 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71  zFilename, .  sq
16a10 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a  lite3 **ppDb.){.
16a20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
16a30 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a  ilename8;   /* z
16a40 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64  Filename encoded
16a50 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61   in UTF-8 instea
16a60 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20  d of UTF-16 */. 
16a70 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
16a80 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pVal;.  int rc;.
16a90 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65  .  assert( zFile
16aa0 6e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74  name );.  assert
16ab0 28 20 70 70 44 62 20 29 3b 0a 20 20 2a 70 70 44  ( ppDb );.  *ppD
16ac0 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
16ad0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
16ae0 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  NIT.  rc = sqlit
16af0 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
16b00 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
16b10 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20  rn rc;.#endif.  
16b20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
16b30 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c  lueNew(0);.  sql
16b40 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
16b50 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e  pVal, -1, zFilen
16b60 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  ame, SQLITE_UTF1
16b70 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f  6NATIVE, SQLITE_
16b80 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65  STATIC);.  zFile
16b90 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56  name8 = sqlite3V
16ba0 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53  alueText(pVal, S
16bb0 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69  QLITE_UTF8);.  i
16bc0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b  f( zFilename8 ){
16bd0 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61  .    rc = openDa
16be0 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65  tabase(zFilename
16bf0 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20  8, ppDb,.       
16c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
16c10 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
16c20 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
16c30 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20  EN_CREATE, 0);. 
16c40 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 44 62     assert( *ppDb
16c50 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
16c60 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20  OMEM );.    if( 
16c70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
16c80 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
16c90 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68  *ppDb, 0, DB_Sch
16ca0 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20  emaLoaded) ){.  
16cb0 20 20 20 20 45 4e 43 28 2a 70 70 44 62 29 20 3d      ENC(*ppDb) =
16cc0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
16cd0 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  IVE;.    }.  }el
16ce0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
16cf0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
16d00 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
16d10 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75  e(pVal);..  retu
16d20 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  rn sqlite3ApiExi
16d30 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64  t(0, rc);.}.#end
16d40 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
16d50 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
16d60 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
16d70 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
16d80 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
16d90 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
16da0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
16db0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
16dc0 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
16dd0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
16de0 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
16df0 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
16e00 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
16e10 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
16e20 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
16e30 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  st void*).){.  i
16e40 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
16e50 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
16e60 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
16e70 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
16e80 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63  iled );.  rc = c
16e90 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
16ea0 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e  b, zName, (u8)en
16eb0 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  c, pCtx, xCompar
16ec0 65 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  e, 0);.  rc = sq
16ed0 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
16ee0 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
16ef0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
16f00 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
16f10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
16f20 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
16f30 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
16f40 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
16f50 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
16f60 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
16f70 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
16f80 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
16f90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16fa0 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
16fb0 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
16fc0 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
16fd0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
16fe0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
16ff0 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
17000 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
17010 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
17020 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
17030 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
17040 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
17050 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
17060 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
17070 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  ion(db, zName, (
17080 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  u8)enc, pCtx, xC
17090 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20  ompare, xDel);. 
170a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
170b0 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
170c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
170d0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
170e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
170f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17100 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
17110 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
17120 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
17130 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
17140 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
17150 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
17160 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36  eate_collation16
17170 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
17180 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
17190 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63  zName,.  int enc
171a0 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
171b0 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
171c0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
171d0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
171e0 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  t void*).){.  in
171f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17200 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38  ;.  char *zName8
17210 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
17220 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
17230 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
17240 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
17250 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71  );.  zName8 = sq
17260 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62  lite3Utf16to8(db
17270 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
17280 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
17290 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29  ;.  if( zName8 )
172a0 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74  {.    rc = creat
172b0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
172c0 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20  Name8, (u8)enc, 
172d0 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
172e0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
172f0 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38  bFree(db, zName8
17300 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
17310 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
17320 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
17330 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
17340 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
17350 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
17360 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
17370 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
17380 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
17390 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
173a0 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
173b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
173c0 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
173d0 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
173e0 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
173f0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
17400 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
17410 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
17420 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69  n_needed(.  sqli
17430 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
17440 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
17450 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
17460 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71  Needed)(void*,sq
17470 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
17480 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  Rep,const char*)
17490 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
174a0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
174b0 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  tex);.  db->xCol
174c0 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e  lNeeded = xCollN
174d0 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f  eeded;.  db->xCo
174e0 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a  llNeeded16 = 0;.
174f0 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
17500 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
17510 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
17520 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
17530 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
17540 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17550 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17560 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
17570 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61  Register a colla
17580 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
17590 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77  ctory callback w
175a0 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
175b0 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52   handle.** db. R
175c0 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69  eplace any previ
175d0 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20  ously installed 
175e0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
175f0 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69  ce factory..*/.i
17600 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61  nt sqlite3_colla
17610 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20  tion_needed16(. 
17620 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
17630 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64   void *pCollNeed
17640 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a  edArg, .  void(*
17650 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76  xCollNeeded16)(v
17660 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
17670 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74  t eTextRep,const
17680 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c   void*).){.  sql
17690 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
176a0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
176b0 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d  b->xCollNeeded =
176c0 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e   0;.  db->xCollN
176d0 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e  eeded16 = xCollN
176e0 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70  eeded16;.  db->p
176f0 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20  CollNeededArg = 
17700 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a  pCollNeededArg;.
17710 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
17720 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
17730 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17740 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
17750 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
17760 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  F16 */..#ifndef 
17770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
17780 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69  ECATED./*.** Thi
17790 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
177a0 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d  w an anachronism
177b0 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20  . It used to be 
177c0 75 73 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20  used to recover 
177d0 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63  from a.** malloc
177e0 28 29 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20  () failure, but 
177f0 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20  SQLite now does 
17800 74 68 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  this automatical
17810 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
17820 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65  e3_global_recove
17830 72 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  r(void){.  retur
17840 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
17850 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  endif../*.** Tes
17860 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72  t to see whether
17870 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61   or not the data
17880 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
17890 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
178a0 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72  .** mode.  Retur
178b0 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
178c0 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74  and FALSE if not
178d0 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  .  Autocommit mo
178e0 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64  de is on.** by d
178f0 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d  efault.  Autocom
17900 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65 64 20  mit is disabled 
17910 62 79 20 61 20 42 45 47 49 4e 20 73 74 61 74 65  by a BEGIN state
17920 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c  ment and reenabl
17930 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78  ed.** by the nex
17940 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c  t COMMIT or ROLL
17950 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  BACK..*/.int sql
17960 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d  ite3_get_autocom
17970 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  mit(sqlite3 *db)
17980 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61  {.  return db->a
17990 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a  utoCommit;.}../*
179a0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
179b0 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73  g routines are s
179c0 75 62 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f  ubtitutes for co
179d0 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43  nstants SQLITE_C
179e0 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54  ORRUPT,.** SQLIT
179f0 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45  E_MISUSE, SQLITE
17a00 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54  _CANTOPEN, SQLIT
17a10 45 5f 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73  E_IOERR and poss
17a20 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72  ibly other error
17a30 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20  .** constants.  
17a40 54 68 65 79 20 73 65 72 76 65 72 20 74 77 6f 20  They server two 
17a50 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20  purposes:.**.** 
17a60 20 20 31 2e 20 20 53 65 72 76 65 20 61 73 20 61    1.  Serve as a
17a70 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
17a80 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
17a90 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67  point in a debug
17aa0 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20  ger.**       to 
17ab0 64 65 74 65 63 74 20 77 68 65 6e 20 76 65 72 73  detect when vers
17ac0 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  ion error condit
17ad0 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  ions occurs..**.
17ae0 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20  **   2.  Invoke 
17af0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f  sqlite3_log() to
17b00 20 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75   provide the sou
17b10 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f  rce code locatio
17b20 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20  n where.**      
17b30 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72   a low-level err
17b40 6f 72 20 69 73 20 66 69 72 73 74 20 64 65 74 65  or is first dete
17b50 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  cted..*/.int sql
17b60 69 74 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72  ite3CorruptError
17b70 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
17b80 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
17b90 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
17ba0 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  og!=0 );.  sqlit
17bb0 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f  e3_log(SQLITE_CO
17bc0 52 52 55 50 54 2c 0a 20 20 20 20 20 20 20 20 20  RRUPT,.         
17bd0 20 20 20 20 20 22 64 61 74 61 62 61 73 65 20 63       "database c
17be0 6f 72 72 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e  orruption at lin
17bf0 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
17c00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17c10 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
17c20 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
17c30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17c40 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73  CORRUPT;.}.int s
17c50 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f  qlite3MisuseErro
17c60 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
17c70 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
17c80 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
17c90 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Log!=0 );.  sqli
17ca0 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d  te3_log(SQLITE_M
17cb0 49 53 55 53 45 2c 20 0a 20 20 20 20 20 20 20 20  ISUSE, .        
17cc0 20 20 20 20 20 20 22 6d 69 73 75 73 65 20 61 74        "misuse at
17cd0 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31   line %d of [%.1
17ce0 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  0s]",.          
17cf0 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73      lineno, 20+s
17d00 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
17d10 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
17d20 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e  ITE_MISUSE;.}.in
17d30 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65  t sqlite3Cantope
17d40 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  nError(int linen
17d50 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
17d60 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17d70 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
17d80 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
17d90 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20  ITE_CANTOPEN, . 
17da0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61               "ca
17db0 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20 61  nnot open file a
17dc0 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e  t line %d of [%.
17dd0 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20  10s]",.         
17de0 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b       lineno, 20+
17df0 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
17e00 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ());.  return SQ
17e10 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d  LITE_CANTOPEN;.}
17e20 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
17e30 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
17e40 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  D./*.** This is 
17e50 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f  a convenience ro
17e60 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73  utine that makes
17e70 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74   sure that all t
17e80 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a  hread-specific.*
17e90 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  * data for this 
17ea0 74 68 72 65 61 64 20 68 61 73 20 62 65 65 6e 20  thread has been 
17eb0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  deallocated..**.
17ec0 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e  ** SQLite no lon
17ed0 67 65 72 20 75 73 65 73 20 74 68 72 65 61 64 2d  ger uses thread-
17ee0 73 70 65 63 69 66 69 63 20 64 61 74 61 20 73 6f  specific data so
17ef0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
17f00 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e   now a.** no-op.
17f10 20 20 49 74 20 69 73 20 72 65 74 61 69 6e 65 64    It is retained
17f20 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20   for historical 
17f30 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a  compatibility..*
17f40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74  /.void sqlite3_t
17f50 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f  hread_cleanup(vo
17f60 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  id){.}.#endif../
17f70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61  *.** Return meta
17f80 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
17f90 75 74 20 61 20 73 70 65 63 69 66 69 63 20 63 6f  ut a specific co
17fa0 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61  lumn of a databa
17fb0 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65  se table..** See
17fc0 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69   comment in sqli
17fd0 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e  te3.h (sqlite.h.
17fe0 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  in) for details.
17ff0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
18000 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
18010 4d 45 54 41 44 41 54 41 0a 69 6e 74 20 73 71 6c  METADATA.int sql
18020 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
18030 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71  n_metadata(.  sq
18040 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
18050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
18060 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a  nection handle *
18070 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
18080 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20  zDbName,        
18090 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65  /* Database name
180a0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f   or NULL */.  co
180b0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
180c0 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62  Name,     /* Tab
180d0 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e  le name */.  con
180e0 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
180f0 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  Name,    /* Colu
18100 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61  mn name */.  cha
18110 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61  r const **pzData
18120 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50  Type,    /* OUTP
18130 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74  UT: Declared dat
18140 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72  a type */.  char
18150 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53   const **pzCollS
18160 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55  eq,     /* OUTPU
18170 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  T: Collation seq
18180 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  uence name */.  
18190 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20  int *pNotNull,  
181a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
181b0 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e  UTPUT: True if N
181c0 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
181d0 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69  nt exists */.  i
181e0 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c  nt *pPrimaryKey,
181f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
18200 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f  TPUT: True if co
18210 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20  lumn part of PK 
18220 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69  */.  int *pAutoi
18230 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
18240 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65   /* OUTPUT: True
18250 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75   if column is au
18260 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a  to-increment */.
18270 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
18280 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
18290 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  ;.  Table *pTab 
182a0 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  = 0;.  Column *p
182b0 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Col = 0;.  int i
182c0 43 6f 6c 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e  Col;..  char con
182d0 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20  st *zDataType = 
182e0 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
182f0 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20  *zCollSeq = 0;. 
18300 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30   int notnull = 0
18310 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b  ;.  int primaryk
18320 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75  ey = 0;.  int au
18330 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  toinc = 0;..  /*
18340 20 45 6e 73 75 72 65 20 74 68 65 20 64 61 74 61   Ensure the data
18350 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
18360 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20  been loaded */. 
18370 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
18380 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
18390 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
183a0 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72  nterAll(db);.  r
183b0 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28  c = sqlite3Init(
183c0 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  db, &zErrMsg);. 
183d0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
183e0 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  rc ){.    goto e
183f0 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  rror_out;.  }.. 
18400 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74   /* Locate the t
18410 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e  able in question
18420 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   */.  pTab = sql
18430 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
18440 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44  , zTableName, zD
18450 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70  bName);.  if( !p
18460 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  Tab || pTab->pSe
18470 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62  lect ){.    pTab
18480 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 0;.    goto e
18490 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  rror_out;.  }.. 
184a0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c   /* Find the col
184b0 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e  umn for which in
184c0 66 6f 20 69 73 20 72 65 71 75 65 73 74 65 64 20  fo is requested 
184d0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
184e0 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e  IsRowid(zColumnN
184f0 61 6d 65 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c  ame) ){.    iCol
18500 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
18510 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
18520 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20  ){.      pCol = 
18530 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
18540 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  ];.    }.  }else
18550 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30  {.    for(iCol=0
18560 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
18570 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
18580 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e    pCol = &pTab->
18590 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  aCol[iCol];.    
185a0 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
185b0 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  StrICmp(pCol->zN
185c0 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  ame, zColumnName
185d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
185e0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
185f0 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d  }.    if( iCol==
18600 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
18610 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20      pTab = 0;.  
18620 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
18630 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
18640 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
18650 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74  g block stores t
18660 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  he meta informat
18670 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ion that will be
18680 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74   returned.  ** t
18690 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20  o the caller in 
186a0 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20  local variables 
186b0 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c  zDataType, zColl
186c0 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72  Seq, notnull, pr
186d0 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e  imarykey.  ** an
186e0 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68  d autoinc. At th
186f0 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61  is point there a
18700 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69  re two possibili
18710 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a  ties:.  ** .  **
18720 20 20 20 20 20 31 2e 20 54 68 65 20 73 70 65 63       1. The spec
18730 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ified column nam
18740 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f  e was rowid", "o
18750 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22  id" or "_rowid_"
18760 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e   .  **        an
18770 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78  d there is no ex
18780 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65  plicitly declare
18790 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20  d IPK column. . 
187a0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20   **.  **     2. 
187b0 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  The table is not
187c0 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20   a view and the 
187d0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e  column name iden
187e0 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20  tified an .  ** 
187f0 20 20 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c         explicitl
18800 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d  y declared colum
18810 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66  n. Copy meta inf
18820 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70  ormation from *p
18830 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28  Col..  */ .  if(
18840 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61   pCol ){.    zDa
18850 74 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a  taType = pCol->z
18860 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53  Type;.    zCollS
18870 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c  eq = pCol->zColl
18880 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20  ;.    notnull = 
18890 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30  pCol->notNull!=0
188a0 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79  ;.    primarykey
188b0 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c    = (pCol->colFl
188c0 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52  ags & COLFLAG_PR
188d0 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61  IMKEY)!=0;.    a
188e0 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69  utoinc = pTab->i
188f0 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70  PKey==iCol && (p
18900 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
18910 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
18920 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )!=0;.  }else{. 
18930 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22     zDataType = "
18940 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72  INTEGER";.    pr
18950 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20  imarykey = 1;.  
18960 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65  }.  if( !zCollSe
18970 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65  q ){.    zCollSe
18980 71 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  q = "BINARY";.  
18990 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20  }..error_out:.  
189a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
189b0 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eAll(db);..  /* 
189c0 57 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63  Whether the func
189d0 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65  tion call succee
189e0 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73  ded or failed, s
189f0 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 61  et the output pa
18a00 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f  rameters.  ** to
18a10 20 77 68 61 74 65 76 65 72 20 74 68 65 69 72 20   whatever their 
18a20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72  local counterpar
18a30 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61  ts contain. If a
18a40 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
18a50 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73  r,.  ** this has
18a60 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a   the effect of z
18a70 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75  eroing all outpu
18a80 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20  t parameters..  
18a90 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54  */.  if( pzDataT
18aa0 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70  ype ) *pzDataTyp
18ab0 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20  e = zDataType;. 
18ac0 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29   if( pzCollSeq )
18ad0 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43   *pzCollSeq = zC
18ae0 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e  ollSeq;.  if( pN
18af0 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75  otNull ) *pNotNu
18b00 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20  ll = notnull;.  
18b10 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20  if( pPrimaryKey 
18b20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d  ) *pPrimaryKey =
18b30 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69   primarykey;.  i
18b40 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70  f( pAutoinc ) *p
18b50 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e  Autoinc = autoin
18b60 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  c;..  if( SQLITE
18b70 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62  _OK==rc && !pTab
18b80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
18b90 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
18ba0 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20  g);.    zErrMsg 
18bb0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
18bc0 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  (db, "no such ta
18bd0 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25  ble column: %s.%
18be0 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a  s", zTableName,.
18bf0 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e          zColumnN
18c00 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ame);.    rc = S
18c10 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
18c20 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57  .  sqlite3ErrorW
18c30 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 28  ithMsg(db, rc, (
18c40 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c  zErrMsg?"%s":0),
18c50 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c   zErrMsg);.  sql
18c60 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
18c70 45 72 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20  ErrMsg);.  rc = 
18c80 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
18c90 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
18ca0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
18cb0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
18cc0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
18cd0 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
18ce0 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
18cf0 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
18d00 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
18d10 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
18d20 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b  3_sleep(int ms){
18d30 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
18d40 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pVfs;.  int rc;.
18d50 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33    pVfs = sqlite3
18d60 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
18d70 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65  if( pVfs==0 ) re
18d80 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  turn 0;..  /* Th
18d90 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  is function work
18da0 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  s in millisecond
18db0 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65 72  s, but the under
18dc0 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20  lying OsSleep() 
18dd0 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d  .  ** API uses m
18de0 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e  icroseconds. Hen
18df0 63 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20  ce the 1000's.. 
18e00 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69   */.  rc = (sqli
18e10 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c  te3OsSleep(pVfs,
18e20 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b   1000*ms)/1000);
18e30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18e40 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72  ./*.** Enable or
18e50 20 64 69 73 61 62 6c 65 20 74 68 65 20 65 78 74   disable the ext
18e60 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64  ended result cod
18e70 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
18e80 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
18e90 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33  lt_codes(sqlite3
18ea0 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29   *db, int onoff)
18eb0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
18ec0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
18ed0 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73  x);.  db->errMas
18ee0 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66  k = onoff ? 0xff
18ef0 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20  ffffff : 0xff;. 
18f00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
18f10 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
18f20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18f30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
18f40 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f  voke the xFileCo
18f50 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20  ntrol method on 
18f60 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
18f70 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
18f80 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
18f90 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ol(sqlite3 *db, 
18fa0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
18fb0 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  ame, int op, voi
18fc0 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20  d *pArg){.  int 
18fd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
18fe0 52 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  R;.  Btree *pBtr
18ff0 65 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ee;..  sqlite3_m
19000 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
19010 75 74 65 78 29 3b 0a 20 20 70 42 74 72 65 65 20  utex);.  pBtree 
19020 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54  = sqlite3DbNameT
19030 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61  oBtree(db, zDbNa
19040 6d 65 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  me);.  if( pBtre
19050 65 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  e ){.    Pager *
19060 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69  pPager;.    sqli
19070 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20  te3_file *fd;.  
19080 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
19090 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
190a0 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
190b0 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 72  3BtreePager(pBtr
190c0 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ee);.    assert(
190d0 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
190e0 20 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61    fd = sqlite3Pa
190f0 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b  gerFile(pPager);
19100 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 64 21  .    assert( fd!
19110 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70  =0 );.    if( op
19120 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46  ==SQLITE_FCNTL_F
19130 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20  ILE_POINTER ){. 
19140 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66       *(sqlite3_f
19150 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b  ile**)pArg = fd;
19160 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19170 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
19180 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64   if( fd->pMethod
19190 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  s ){.      rc = 
191a0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
191b0 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72  trol(fd, op, pAr
191c0 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
191d0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
191e0 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
191f0 45 5f 4f 4b 29 26 26 28 6f 70 3d 3d 53 51 4c 49  E_OK)&&(op==SQLI
19200 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52  TE_FCNTL_LAST_ER
19210 52 4e 4f 29 26 26 28 2a 28 69 6e 74 20 2a 29 70  RNO)&&(*(int *)p
19220 41 72 67 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  Arg==0) ){.     
19230 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
19240 2a 70 57 61 6c 46 64 20 3d 20 73 71 6c 69 74 65  *pWalFd = sqlite
19250 33 50 61 67 65 72 57 61 6c 46 69 6c 65 28 70 50  3PagerWalFile(pP
19260 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
19270 66 28 20 70 57 61 6c 46 64 26 26 28 70 57 61 6c  f( pWalFd&&(pWal
19280 46 64 2d 3e 70 4d 65 74 68 6f 64 73 29 20 29 7b  Fd->pMethods) ){
19290 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
192a0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
192b0 74 72 6f 6c 28 70 57 61 6c 46 64 2c 20 6f 70 2c  trol(pWalFd, op,
192c0 20 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20   pArg);.        
192d0 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
192e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
192f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
19300 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20 20  TFOUND;.    }.  
19310 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19320 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
19330 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
19340 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
19350 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
19360 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
19370 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19380 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68   Interface to th
19390 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e  e testing logic.
193a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
193b0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74  test_control(int
193c0 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74   op, ...){.  int
193d0 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66   rc = 0;.#ifndef
193e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49   SQLITE_OMIT_BUI
193f0 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76 61 5f 6c  LTIN_TEST.  va_l
19400 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61  ist ap;.  va_sta
19410 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
19420 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20  itch( op ){..   
19430 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20   /*.    ** Save 
19440 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
19450 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20  e of the PRNG.. 
19460 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
19470 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
19480 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20  RNG_SAVE: {.    
19490 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76    sqlite3PrngSav
194a0 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  eState();.      
194b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
194c0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74    /*.    ** Rest
194d0 6f 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ore the state of
194e0 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65   the PRNG to the
194f0 20 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65   last state save
19500 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50  d using.    ** P
19510 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52  RNG_SAVE.  If PR
19520 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65  NG_SAVE has neve
19530 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61  r before been ca
19540 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  lled, then.    *
19550 2a 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73  * this verb acts
19560 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54   like PRNG_RESET
19570 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
19580 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
19590 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20  L_PRNG_RESTORE: 
195a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
195b0 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28  rngRestoreState(
195c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
195d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
195e0 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50    ** Reset the P
195f0 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20  RNG back to its 
19600 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74  uninitialized st
19610 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63  ate.  The next c
19620 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
19630 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
19640 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74  () will reseed t
19650 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20  he PRNG using a 
19660 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20  single call.    
19670 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f  ** to the xRando
19680 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20  mness method of 
19690 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e  the default VFS.
196a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
196b0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
196c0 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20  _PRNG_RESET: {. 
196d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
196e0 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20  domness(0,0);.  
196f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19700 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
19710 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
19720 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53  ntrol(BITVEC_TES
19730 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d  T, size, program
19740 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
19750 52 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e  Run a test again
19760 73 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65  st a Bitvec obje
19770 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65  ct of size.  The
19780 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e   program argumen
19790 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61  t.    ** is an a
197a0 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73  rray of integers
197b0 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
197c0 65 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20  e test.  Return 
197d0 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d  -1 on a.    ** m
197e0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
197f0 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63   error, 0 on suc
19800 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  cess, or non-zer
19810 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  o for an error..
19820 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73      ** See the s
19830 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c  qlite3BitvecBuil
19840 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64  tinTest() for ad
19850 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
19860 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
19870 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
19880 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53  TCTRL_BITVEC_TES
19890 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  T: {.      int s
198a0 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
198b0 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a  nt);.      int *
198c0 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  aProg = va_arg(a
198d0 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
198e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
198f0 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a  ecBuiltinTest(sz
19900 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20  , aProg);.      
19910 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
19920 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
19930 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
19940 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c  l(FAULT_INSTALL,
19950 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20 20   xCallback).    
19960 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e 67  **.    ** Arrang
19970 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61 6c  e to invoke xCal
19980 6c 62 61 63 6b 28 29 20 77 68 65 6e 65 76 65 72  lback() whenever
19990 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
199a0 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20  () is called,.  
199b0 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61 63    ** if xCallbac
199c0 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20  k is not NULL.. 
199d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 20     **.    ** As 
199e0 61 20 74 65 73 74 20 6f 66 20 74 68 65 20 66 61  a test of the fa
199f0 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d 65  ult simulator me
19a00 63 68 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c 20  chanism itself, 
19a10 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
19a20 30 29 0a 20 20 20 20 2a 2a 20 69 73 20 63 61 6c  0).    ** is cal
19a30 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  led immediately 
19a40 61 66 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e 67  after installing
19a50 20 74 68 65 20 6e 65 77 20 63 61 6c 6c 62 61 63   the new callbac
19a60 6b 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e  k and the return
19a70 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 66 72  .    ** value fr
19a80 6f 6d 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53  om sqlite3FaultS
19a90 69 6d 28 30 29 20 62 65 63 6f 6d 65 73 20 74 68  im(0) becomes th
19aa0 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20 20  e return from.  
19ab0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    ** sqlite3_tes
19ac0 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20 20  t_control()..   
19ad0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
19ae0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55  ITE_TESTCTRL_FAU
19af0 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20  LT_INSTALL: {.  
19b00 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70      /* MSVC is p
19b10 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69  icky about pulli
19b20 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f  ng func ptrs fro
19b30 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20  m va lists..    
19b40 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70    ** http://supp
19b50 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f  ort.microsoft.co
19b60 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20  m/kb/47961.     
19b70 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   ** sqlite3Globa
19b80 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c  lConfig.xTestCal
19b90 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61  lback = va_arg(a
19ba0 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29 29 3b  p, int(*)(int));
19bb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19bc0 74 79 70 65 64 65 66 20 69 6e 74 28 2a 54 45 53  typedef int(*TES
19bd0 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29  TCALLBACKFUNC_t)
19be0 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  (int);.      sql
19bf0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
19c00 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d  .xTestCallback =
19c10 20 76 61 5f 61 72 67 28 61 70 2c 20 54 45 53 54   va_arg(ap, TEST
19c20 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b  CALLBACKFUNC_t);
19c30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
19c40 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a  te3FaultSim(0);.
19c50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19c60 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
19c70 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
19c80 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d  control(BENIGN_M
19c90 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65  ALLOC_HOOKS, xBe
19ca0 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a  gin, xEnd).    *
19cb0 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65  *.    ** Registe
19cc0 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20  r hooks to call 
19cd0 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63  to indicate whic
19ce0 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  h malloc() failu
19cf0 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20  res .    ** are 
19d00 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20  benign..    */. 
19d10 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
19d20 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d  ESTCTRL_BENIGN_M
19d30 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20  ALLOC_HOOKS: {. 
19d40 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
19d50 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f  d (*void_functio
19d60 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20  n)(void);.      
19d70 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
19d80 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20  enignBegin;.    
19d90 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
19da0 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20  xBenignEnd;.    
19db0 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d    xBenignBegin =
19dc0 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
19dd0 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
19de0 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76    xBenignEnd = v
19df0 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
19e00 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
19e10 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c  sqlite3BenignMal
19e20 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e  locHooks(xBenign
19e30 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e  Begin, xBenignEn
19e40 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
19e50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
19e60 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
19e70 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
19e80 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
19e90 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e  ING_BYTE, unsign
19ea0 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  ed int X).    **
19eb0 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
19ec0 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20  PENDING byte to 
19ed0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
19ee0 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e   argument, if X>
19ef0 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e  0..    ** Make n
19f00 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d  o changes if X==
19f10 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76  0.  Return the v
19f20 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64  alue of the pend
19f30 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  ing byte.    ** 
19f40 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62  as it existing b
19f50 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
19f60 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  ne was called.. 
19f70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50     **.    ** IMP
19f80 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e  ORTANT:  Changin
19f90 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  g the PENDING by
19fa0 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30  te from 0x400000
19fb0 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20  00 results in.  
19fc0 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74    ** an incompat
19fd0 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69  ible database fi
19fe0 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e  le format.  Chan
19ff0 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47  ging the PENDING
1a000 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69   byte.    ** whi
1a010 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  le any database 
1a020 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70  connection is op
1a030 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e  en results in un
1a040 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20  defined and.    
1a050 2a 2a 20 64 69 6c 65 74 65 72 69 6f 75 73 20 62  ** dileterious b
1a060 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a  ehavior..    */.
1a070 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1a080 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
1a090 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72  _BYTE: {.      r
1a0a0 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  c = PENDING_BYTE
1a0b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1a0c0 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20  _OMIT_WSD.      
1a0d0 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  {.        unsign
1a0e0 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20  ed int newVal = 
1a0f0 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
1a100 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
1a110 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73    if( newVal ) s
1a120 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74  qlite3PendingByt
1a130 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20  e = newVal;.    
1a140 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1a150 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1a160 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1a170 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1a180 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1a190 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58  RL_ASSERT, int X
1a1a0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1a1b0 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
1a1c0 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
1a1d0 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74  test to see whet
1a1e0 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a  her or not.    *
1a1f0 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65  * assert() was e
1a200 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
1a210 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73  e-time.  If X is
1a220 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74   true and assert
1a230 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61  ().    ** is ena
1a240 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  bled, then the r
1a250 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
1a260 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72  rue.  If X is tr
1a270 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73  ue and.    ** as
1a280 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
1a290 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  ed, then the ret
1a2a0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72  urn value is zer
1a2b0 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20  o.  If X is.    
1a2c0 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  ** false and ass
1a2d0 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
1a2e0 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72  , then the asser
1a2f0 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74  tion fires and t
1a300 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
1a310 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20  s aborts.  If X 
1a320 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  is false and ass
1a330 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
1a340 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  d, then the.    
1a350 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
1a360 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a  is zero..    */.
1a370 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1a380 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a  TESTCTRL_ASSERT:
1a390 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c   {.      volatil
1a3a0 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20  e int x = 0;.   
1a3b0 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d 20     assert( (x = 
1a3c0 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21  va_arg(ap,int))!
1a3d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
1a3e0 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   x;.      break;
1a3f0 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a  .    }...    /*.
1a400 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1a410 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1a420 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
1a430 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  AYS, int X).    
1a440 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
1a450 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
1a460 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
1a470 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c  o see how the AL
1a480 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20  WAYS and.    ** 
1a490 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72  NEVER macros wer
1a4a0 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  e defined at com
1a4b0 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a  pile-time..    *
1a4c0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74  *.    ** The ret
1a4d0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57  urn value is ALW
1a4e0 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a  AYS(X).  .    **
1a4f0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
1a500 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20  mmended test is 
1a510 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65  X==2.  If the re
1a520 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c  turn value is 2,
1a530 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20   that means.    
1a540 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20  ** ALWAYS() and 
1a550 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68  NEVER() are both
1a560 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
1a570 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63  ugh macros, whic
1a580 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  h is the.    ** 
1a590 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e  default setting.
1a5a0 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
1a5b0 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e  value is 1, then
1a5c0 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74   ALWAYS() is eit
1a5d0 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d  her.    ** hard-
1a5e0 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72  coded to true or
1a5f0 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73   else it asserts
1a600 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74   if its argument
1a610 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a   is false..    *
1a620 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61  * The first beha
1a630 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64  vior (hard-coded
1a640 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65   to true) is the
1a650 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
1a660 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1a670 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
1a680 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  t assert() is di
1a690 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73  sabled and the s
1a6a0 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68  econd.    ** beh
1a6b0 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66  avior (assert if
1a6c0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
1a6d0 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c   ALWAYS() is fal
1a6e0 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20  se) is the case 
1a6f0 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
1a700 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
1a710 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65   shows that asse
1a720 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e  rt() is enabled.
1a730 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1a740 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74  he run-time test
1a750 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74   procedure might
1a760 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20   look something 
1a770 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
1a780 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20  *.    **    if( 
1a790 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1a7a0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1a7b0 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d  CTRL_ALWAYS, 2)=
1a7c0 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20  =2 ){.    **    
1a7d0 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e    // ALWAYS() an
1a7e0 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f  d NEVER() are no
1a7f0 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
1a800 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20   macros.    **  
1a810 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1a820 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1a830 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1a840 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20  _ASSERT, 1) ){. 
1a850 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
1a860 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20  WAYS(x) asserts 
1a870 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20  that x is true. 
1a880 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73  NEVER(x) asserts
1a890 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20   x is false..   
1a8a0 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   **    }else{.  
1a8b0 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
1a8c0 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73  AYS(x) is a cons
1a8d0 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78  tant 1.  NEVER(x
1a8e0 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
1a8f0 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20  0..    **    }. 
1a900 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1a910 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1a920 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69  LWAYS: {.      i
1a930 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
1a940 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20  ,int);.      rc 
1a950 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20 20  = ALWAYS(x);.   
1a960 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a970 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1a980 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1a990 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1a9a0 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 29  TCTRL_BYTEORDER)
1a9b0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1a9c0 54 68 65 20 69 6e 74 65 67 65 72 20 72 65 74 75  The integer retu
1a9d0 72 6e 65 64 20 72 65 76 65 61 6c 73 20 74 68 65  rned reveals the
1a9e0 20 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74   byte-order of t
1a9f0 68 65 20 63 6f 6d 70 75 74 65 72 20 6f 6e 20 77  he computer on w
1aa00 68 69 63 68 0a 20 20 20 20 2a 2a 20 53 51 4c 69  hich.    ** SQLi
1aa10 74 65 20 69 73 20 72 75 6e 6e 69 6e 67 3a 0a 20  te is running:. 
1aa20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1aa30 20 20 20 31 20 20 20 20 20 62 69 67 2d 65 6e 64     1     big-end
1aa40 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e  ian,    determin
1aa50 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20  ed at run-time. 
1aa60 20 20 20 2a 2a 20 20 20 20 20 20 31 30 20 20 20     **      10   
1aa70 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c    little-endian,
1aa80 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72   determined at r
1aa90 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20  un-time.    **  
1aaa0 34 33 32 31 30 31 20 20 20 20 20 62 69 67 2d 65  432101     big-e
1aab0 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d  ndian,    determ
1aac0 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
1aad0 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 31 32 33  time.    **  123
1aae0 34 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65  410     little-e
1aaf0 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65  ndian, determine
1ab00 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1ab10 65 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 63 61  e.    */ .    ca
1ab20 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1ab30 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a 20 7b 0a  RL_BYTEORDER: {.
1ab40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1ab50 45 5f 42 59 54 45 4f 52 44 45 52 2a 31 30 30 20  E_BYTEORDER*100 
1ab60 2b 20 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45  + SQLITE_LITTLEE
1ab70 4e 44 49 41 4e 2a 31 30 20 2b 20 53 51 4c 49 54  NDIAN*10 + SQLIT
1ab80 45 5f 42 49 47 45 4e 44 49 41 4e 3b 0a 20 20 20  E_BIGENDIAN;.   
1ab90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1aba0 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1abb0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1abc0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52  QLITE_TESTCTRL_R
1abd0 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20  ESERVE, sqlite3 
1abe0 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
1abf0 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
1ac00 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20  e nReserve size 
1ac10 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69  to N for the mai
1ac20 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68  n database on th
1ac30 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
1ac40 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  * connection db.
1ac50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1ac60 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1ac70 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20  _RESERVE: {.    
1ac80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1ac90 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1aca0 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  e3*);.      int 
1acb0 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
1acc0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1acd0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1ace0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
1acf0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
1ad00 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b  ageSize(db->aDb[
1ad10 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29  0].pBt, 0, x, 0)
1ad20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1ad30 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1ad40 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72  mutex);.      br
1ad50 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1ad60 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  /*  sqlite3_test
1ad70 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1ad80 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
1ad90 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20  ATIONS, sqlite3 
1ada0 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
1adb0 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65  **.    ** Enable
1adc0 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69   or disable vari
1add0 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
1ade0 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  s for testing pu
1adf0 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20  rposes.  The .  
1ae00 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20    ** argument N 
1ae10 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
1ae20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f  optimizations to
1ae30 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46   be disabled.  F
1ae40 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a  or normal.    **
1ae50 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f   operation N sho
1ae60 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69  uld be 0.  The i
1ae70 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65  dea is that a te
1ae80 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65  st program (like
1ae90 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20   the.    ** SQL 
1aea0 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c  Logic Test or SL
1aeb0 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63  T test module) c
1aec0 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20  an run the same 
1aed0 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  SQL multiple tim
1aee0 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76  es.    ** with v
1aef0 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
1af00 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f  ions disabled to
1af10 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1af20 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20   same answer.   
1af30 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20   ** is obtained 
1af40 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20  in every case.. 
1af50 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1af60 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
1af70 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a  PTIMIZATIONS: {.
1af80 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1af90 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1afa0 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1afb0 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d  db->dbOptFlags =
1afc0 20 28 75 31 36 29 28 76 61 5f 61 72 67 28 61 70   (u16)(va_arg(ap
1afd0 2c 20 69 6e 74 29 20 26 20 30 78 66 66 66 66 29  , int) & 0xffff)
1afe0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1aff0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
1b000 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20  ITE_N_KEYWORD.  
1b010 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
1b020 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1b030 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57  _TESTCTRL_ISKEYW
1b040 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ORD, const char 
1b050 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20  *zWord).    **. 
1b060 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69     ** If zWord i
1b070 73 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f  s a keyword reco
1b080 67 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61  gnized by the pa
1b090 72 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72  rser, then retur
1b0a0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  n the.    ** num
1b0b0 62 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e  ber of keywords.
1b0c0 20 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73    Or if zWord is
1b0d0 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20   not a keyword, 
1b0e0 72 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a  return 0..    **
1b0f0 20 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65   .    ** This te
1b100 73 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e  st feature is on
1b110 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ly available in 
1b120 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e  the amalgamation
1b130 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68   since.    ** th
1b140 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  e SQLITE_N_KEYWO
1b150 52 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  RD macro is not 
1b160 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
1b170 66 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20  file if SQLite. 
1b180 20 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75     ** is built u
1b190 73 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f  sing separate so
1b1a0 75 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  urce files..    
1b1b0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1b1c0 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45  TE_TESTCTRL_ISKE
1b1d0 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63  YWORD: {.      c
1b1e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64  onst char *zWord
1b1f0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f   = va_arg(ap, co
1b200 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
1b210 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
1b220 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29  3Strlen30(zWord)
1b230 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71  ;.      rc = (sq
1b240 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
1b250 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21  ((u8*)zWord, n)!
1b260 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45  =TK_ID) ? SQLITE
1b270 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a  _N_KEYWORD : 0;.
1b280 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b290 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20   }.#endif ..    
1b2a0 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
1b2b0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1b2c0 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d  ESTCTRL_SCRATCHM
1b2d0 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77  ALLOC, sz, &pNew
1b2e0 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a  , pFree);.    **
1b2f0 0a 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72  .    ** Pass pFr
1b300 65 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53  ee into sqlite3S
1b310 63 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20  cratchFree(). . 
1b320 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68     ** If sz>0 th
1b330 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63  en allocate a sc
1b340 72 61 74 63 68 20 62 75 66 66 65 72 20 69 6e 74  ratch buffer int
1b350 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f  o pNew.  .    */
1b360 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b370 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43  _TESTCTRL_SCRATC
1b380 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  HMALLOC: {.     
1b390 20 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a   void *pFree, **
1b3a0 70 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74  ppNew;.      int
1b3b0 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20   sz;.      sz = 
1b3c0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1b3d0 0a 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76  .      ppNew = v
1b3e0 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a  a_arg(ap, void**
1b3f0 29 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d  );.      pFree =
1b400 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
1b410 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  *);.      if( sz
1b420 20 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69   ) *ppNew = sqli
1b430 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
1b440 28 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  (sz);.      sqli
1b450 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 70  te3ScratchFree(p
1b460 46 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Free);.      bre
1b470 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1b480 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1b490 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1b4a0 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
1b4b0 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e  ME_FAULT, int on
1b4c0 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  off);.    **.   
1b4d0 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72   ** If parameter
1b4e0 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65   onoff is non-ze
1b4f0 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68  ro, configure th
1b500 65 20 77 72 61 70 70 65 72 73 20 73 6f 20 74 68  e wrappers so th
1b510 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75  at all.    ** su
1b520 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
1b530 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e  o localtime() an
1b540 64 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e  d variants fail.
1b550 20 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72   If onoff is zer
1b560 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74  o,.    ** undo t
1b570 68 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20  his setting..   
1b580 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1b590 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
1b5a0 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a  ALTIME_FAULT: {.
1b5b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1b5c0 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c  balConfig.bLocal
1b5d0 74 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61  timeFault = va_a
1b5e0 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1b5f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b600 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1b610 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
1b620 45 58 50 4c 41 49 4e 29 0a 20 20 20 20 2f 2a 20  EXPLAIN).    /* 
1b630 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1b640 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1b650 53 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53  STCTRL_EXPLAIN_S
1b660 54 4d 54 2c 0a 20 20 20 20 2a 2a 20 20 20 20 20  TMT,.    **     
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b680 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a     sqlite3_stmt*
1b690 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a  ,const char**);.
1b6a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
1b6b0 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53   compiled with S
1b6c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
1b6d0 45 5f 45 58 50 4c 41 49 4e 2c 20 65 61 63 68 20  E_EXPLAIN, each 
1b6e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 6f 6c  sqlite3_stmt hol
1b6f0 64 73 0a 20 20 20 20 2a 2a 20 61 20 73 74 72 69  ds.    ** a stri
1b700 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
1b710 73 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20  s the optimized 
1b720 70 61 72 73 65 20 74 72 65 65 2e 20 20 54 68 69  parse tree.  Thi
1b730 73 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 0a 20  s test-control. 
1b740 20 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20     ** returns a 
1b750 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20  pointer to that 
1b760 73 74 72 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  string..    */. 
1b770 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1b780 45 53 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f  ESTCTRL_EXPLAIN_
1b790 53 54 4d 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  STMT: {.      sq
1b7a0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1b7b0 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  t = va_arg(ap, s
1b7c0 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 3b 0a 20  qlite3_stmt*);. 
1b7d0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1b7e0 2a 2a 70 7a 52 65 74 20 3d 20 76 61 5f 61 72 67  **pzRet = va_arg
1b7f0 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
1b800 2a 29 3b 0a 20 20 20 20 20 20 2a 70 7a 52 65 74  *);.      *pzRet
1b810 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78   = sqlite3VdbeEx
1b820 70 6c 61 6e 61 74 69 6f 6e 28 28 56 64 62 65 2a  planation((Vdbe*
1b830 29 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 62  )pStmt);.      b
1b840 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1b850 69 66 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c  if..    /*   sql
1b860 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1b870 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1b880 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c  L_NEVER_CORRUPT,
1b890 20 69 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20   int);.    **.  
1b8a0 20 20 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61    ** Set or clea
1b8b0 72 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e  r a flag that in
1b8c0 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1b8d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1b8e0 73 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20  s always well-. 
1b8f0 20 20 20 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64     ** formed and
1b900 20 6e 65 76 65 72 20 63 6f 72 72 75 70 74 2e 20   never corrupt. 
1b910 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 63 6c   This flag is cl
1b920 65 61 72 20 62 79 20 64 65 66 61 75 6c 74 2c 20  ear by default, 
1b930 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 0a  indicating that.
1b940 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1b950 66 69 6c 65 73 20 6d 69 67 68 74 20 68 61 76 65  files might have
1b960 20 61 72 62 69 74 72 61 72 79 20 63 6f 72 72 75   arbitrary corru
1b970 70 74 69 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20  ption.  Setting 
1b980 74 68 65 20 66 6c 61 67 20 64 75 72 69 6e 67 0a  the flag during.
1b990 20 20 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 63      ** testing c
1b9a0 61 75 73 65 73 20 63 65 72 74 61 69 6e 20 61 73  auses certain as
1b9b0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1b9c0 73 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 6f  s in the code to
1b9d0 20 62 65 20 61 63 74 69 76 61 74 65 64 0a 20 20   be activated.  
1b9e0 20 20 2a 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73    ** that demons
1b9f0 74 72 61 74 20 69 6e 76 61 72 69 61 6e 74 73 20  trat invariants 
1ba00 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  on well-formed d
1ba10 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 20  atabase files.. 
1ba20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1ba30 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
1ba40 45 56 45 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a  EVER_CORRUPT: {.
1ba50 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1ba60 62 61 6c 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43  balConfig.neverC
1ba70 6f 72 72 75 70 74 20 3d 20 76 61 5f 61 72 67 28  orrupt = va_arg(
1ba80 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1ba90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20  break;.    }... 
1baa0 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1bab0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1bac0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42  ITE_TESTCTRL_VDB
1bad0 45 5f 43 4f 56 45 52 41 47 45 2c 20 78 43 61 6c  E_COVERAGE, xCal
1bae0 6c 62 61 63 6b 2c 20 70 74 72 29 3b 0a 20 20 20  lback, ptr);.   
1baf0 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74   **.    ** Set t
1bb00 68 65 20 56 44 42 45 20 63 6f 76 65 72 61 67 65  he VDBE coverage
1bb10 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
1bb20 6f 6e 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 20  on to xCallback 
1bb30 77 69 74 68 20 63 6f 6e 74 65 78 74 20 0a 20 20  with context .  
1bb40 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 70 74 72    ** pointer ptr
1bb50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1bb60 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1bb70 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 3a  L_VDBE_COVERAGE:
1bb80 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   {.#ifdef SQLITE
1bb90 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20  _VDBE_COVERAGE. 
1bba0 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
1bbb0 64 20 28 2a 62 72 61 6e 63 68 5f 63 61 6c 6c 62  d (*branch_callb
1bbc0 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 75  ack)(void*,int,u
1bbd0 38 2c 75 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  8,u8);.      sql
1bbe0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1bbf0 2e 78 56 64 62 65 42 72 61 6e 63 68 20 3d 20 76  .xVdbeBranch = v
1bc00 61 5f 61 72 67 28 61 70 2c 62 72 61 6e 63 68 5f  a_arg(ap,branch_
1bc10 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20  callback);.     
1bc20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1bc30 6e 66 69 67 2e 70 56 64 62 65 42 72 61 6e 63 68  nfig.pVdbeBranch
1bc40 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Arg = va_arg(ap,
1bc50 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20  void*);.#endif. 
1bc60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bc70 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
1bc80 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1bc90 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1bca0 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62  _SORTER_MMAP, db
1bcb0 2c 20 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20 20 20  , nMax); */.    
1bcc0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1bcd0 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50  CTRL_SORTER_MMAP
1bce0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1bcf0 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61  3 *db = va_arg(a
1bd00 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  p, sqlite3*);.  
1bd10 20 20 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74      db->nMaxSort
1bd20 65 72 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  erMmap = va_arg(
1bd30 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1bd40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1bd50 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1bd60 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1bd70 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e  TE_TESTCTRL_ISIN
1bd80 49 54 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  IT);.    **.    
1bd90 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1bda0 5f 4f 4b 20 69 66 20 53 51 4c 69 74 65 20 68 61  _OK if SQLite ha
1bdb0 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  s been initializ
1bdc0 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 45 52  ed and SQLITE_ER
1bdd0 52 4f 52 20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f  ROR if.    ** no
1bde0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
1bdf0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1be00 52 4c 5f 49 53 49 4e 49 54 3a 20 7b 0a 20 20 20  RL_ISINIT: {.   
1be10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
1be20 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69  obalConfig.isIni
1be30 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  t==0 ) rc = SQLI
1be40 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
1be50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1be60 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23  .  va_end(ap);.#
1be70 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1be80 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53  OMIT_BUILTIN_TES
1be90 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  T */.  return rc
1bea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1beb0 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75  is a utility rou
1bec0 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20  tine, useful to 
1bed0 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
1bee0 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73  ons, that checks
1bef0 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20  .** to see if a 
1bf00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 61  database file wa
1bf10 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e  s a URI that con
1bf20 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66 69  tained a specifi
1bf30 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61  c query .** para
1bf40 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f  meter, and if so
1bf50 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c   obtains the val
1bf60 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ue of the query 
1bf70 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
1bf80 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
1bf90 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
1bfa0 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20  ilename pointer 
1bfb0 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20  passed into the 
1bfc0 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f  xOpen().** metho
1bfd0 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65  d of a VFS imple
1bfe0 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
1bff0 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20  zParam argument 
1c000 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
1c010 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61  he.** query para
1c020 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20  meter we seek.  
1c030 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1c040 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  urns the value o
1c050 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20  f the zParam.** 
1c060 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74 20  parameter if it 
1c070 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65 20  exists.  If the 
1c080 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e  parameter does n
1c090 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 72  ot exist, this r
1c0a0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
1c0b0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
1c0c0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
1c0d0 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72  *sqlite3_uri_par
1c0e0 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61  ameter(const cha
1c0f0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
1c100 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
1c110 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  ){.  if( zFilena
1c120 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  me==0 ) return 0
1c130 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d  ;.  zFilename +=
1c140 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1c150 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b  (zFilename) + 1;
1c160 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e  .  while( zFilen
1c170 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e  ame[0] ){.    in
1c180 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a 46 69  t x = strcmp(zFi
1c190 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
1c1a0 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  .    zFilename +
1c1b0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1c1c0 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
1c1d0 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29  ;.    if( x==0 )
1c1e0 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
1c1f0 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  e;.    zFilename
1c200 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
1c210 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  n30(zFilename) +
1c220 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
1c230 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
1c240 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61  urn a boolean va
1c250 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20  lue for a query 
1c260 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e  parameter..*/.in
1c270 74 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  t sqlite3_uri_bo
1c280 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 72  olean(const char
1c290 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e   *zFilename, con
1c2a0 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c  st char *zParam,
1c2b0 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20 63   int bDflt){.  c
1c2c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
1c2d0 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
1c2e0 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  eter(zFilename, 
1c2f0 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74  zParam);.  bDflt
1c300 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72   = bDflt!=0;.  r
1c310 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65  eturn z ? sqlite
1c320 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62  3GetBoolean(z, b
1c330 44 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d  Dflt) : bDflt;.}
1c340 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1c350 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
1c360 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72  value for a quer
1c370 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a  y parameter..*/.
1c380 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
1c390 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36 34 28  lite3_uri_int64(
1c3a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1c3b0 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20  Filename,    /* 
1c3c0 46 69 6c 65 6e 61 6d 65 20 61 73 20 70 61 73 73  Filename as pass
1c3d0 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20  ed to xOpen */. 
1c3e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c3f0 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55 52  ram,       /* UR
1c400 49 20 70 61 72 61 6d 65 74 65 72 20 73 6f 75 67  I parameter soug
1c410 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ht */.  sqlite3_
1c420 69 6e 74 36 34 20 62 44 66 6c 74 20 20 20 20 20  int64 bDflt     
1c430 20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66 20 70    /* return if p
1c440 61 72 61 6d 65 74 65 72 20 69 73 20 6d 69 73 73  arameter is miss
1c450 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ing */.){.  cons
1c460 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
1c470 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
1c480 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  r(zFilename, zPa
1c490 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ram);.  sqlite3_
1c4a0 69 6e 74 36 34 20 76 3b 0a 20 20 69 66 28 20 7a  int64 v;.  if( z
1c4b0 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72   && sqlite3DecOr
1c4c0 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 29 3d  HexToI64(z, &v)=
1c4d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c4e0 20 20 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d    bDflt = v;.  }
1c4f0 0a 20 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b  .  return bDflt;
1c500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1c510 20 74 68 65 20 42 74 72 65 65 20 70 6f 69 6e 74   the Btree point
1c520 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  er identified by
1c530 20 7a 44 62 4e 61 6d 65 2e 20 20 52 65 74 75 72   zDbName.  Retur
1c540 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
1c550 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73  und..*/.Btree *s
1c560 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
1c570 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ree(sqlite3 *db,
1c580 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1c590 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
1c5a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
1c5b0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
1c5c0 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
1c5d0 42 74 0a 20 20 20 20 20 26 26 20 28 7a 44 62 4e  Bt.     && (zDbN
1c5e0 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ame==0 || sqlite
1c5f0 33 53 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d 65  3StrICmp(zDbName
1c600 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61  , db->aDb[i].zNa
1c610 6d 65 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20  me)==0).    ){. 
1c620 20 20 20 20 20 72 65 74 75 72 6e 20 64 62 2d 3e       return db->
1c630 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
1c640 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1c650 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1c660 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f  n the filename o
1c670 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
1c680 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
1c690 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
1c6a0 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73  nection..*/.cons
1c6b0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
1c6c0 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69  db_filename(sqli
1c6d0 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
1c6e0 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20  har *zDbName){. 
1c6f0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 73 71   Btree *pBt = sq
1c700 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72  lite3DbNameToBtr
1c710 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b  ee(db, zDbName);
1c720 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20  .  return pBt ? 
1c730 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
1c740 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20 30  ilename(pBt) : 0
1c750 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1c760 6e 20 31 20 69 66 20 64 61 74 61 62 61 73 65 20  n 1 if database 
1c770 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  is read-only or 
1c780 30 20 69 66 20 72 65 61 64 2f 77 72 69 74 65 2e  0 if read/write.
1c790 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a    Return -1 if.*
1c7a0 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61  * no such databa
1c7b0 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e  se exists..*/.in
1c7c0 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61  t sqlite3_db_rea
1c7d0 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a 64  donly(sqlite3 *d
1c7e0 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1c7f0 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65  DbName){.  Btree
1c800 20 2a 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44   *pBt = sqlite3D
1c810 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
1c820 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74   zDbName);.  ret
1c830 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65  urn pBt ? sqlite
1c840 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79  3BtreeIsReadonly
1c850 28 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a 0a 23  (pBt) : -1;.}..#
1c860 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  if (SQLITE_ENABL
1c870 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26  E_APPLE_SPI>0) &
1c880 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1c890 45 5f 5f 29 0a 0a 23 69 6e 63 6c 75 64 65 20 22  E__)..#include "
1c8a0 73 71 6c 69 74 65 33 5f 70 72 69 76 61 74 65 2e  sqlite3_private.
1c8b0 68 22 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 73 74 69  h"../* .** Testi
1c8c0 6e 67 20 61 20 66 69 6c 65 20 70 61 74 68 20 66  ng a file path f
1c8d0 6f 72 20 73 71 6c 69 74 65 20 6c 6f 63 6b 73 20  or sqlite locks 
1c8e0 68 65 6c 64 20 62 79 20 61 20 70 72 6f 63 65 73  held by a proces
1c8f0 73 20 49 44 2e 20 0a 2a 2a 20 52 65 74 75 72 6e  s ID. .** Return
1c900 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41  s SQLITE_LOCKSTA
1c910 54 45 5f 4f 4e 20 69 66 20 6c 6f 63 6b 73 20 61  TE_ON if locks a
1c920 72 65 20 70 72 65 73 65 6e 74 20 6f 6e 20 70 61  re present on pa
1c930 74 68 0a 2a 2a 20 74 68 61 74 20 77 6f 75 6c 64  th.** that would
1c940 20 70 72 65 76 65 6e 74 20 77 72 69 74 69 6e 67   prevent writing
1c950 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1c960 2e 0a 2a 2f 0a 69 6e 74 20 5f 73 71 6c 69 74 65  ..*/.int _sqlite
1c970 33 5f 6c 6f 63 6b 73 74 61 74 65 28 63 6f 6e 73  3_lockstate(cons
1c980 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 70 69  t char *path, pi
1c990 64 5f 74 20 70 69 64 29 7b 0a 20 20 73 71 6c 69  d_t pid){.  sqli
1c9a0 74 65 33 20 2a 64 62 20 3d 20 4e 55 4c 4c 3b 0a  te3 *db = NULL;.
1c9b0 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33    .  if( sqlite3
1c9c0 5f 6f 70 65 6e 5f 76 32 28 70 61 74 68 2c 20 26  _open_v2(path, &
1c9d0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  db, SQLITE_OPEN_
1c9e0 52 45 41 44 4f 4e 4c 59 2c 20 4e 55 4c 4c 29 20  READONLY, NULL) 
1c9f0 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  == SQLITE_OK ){.
1ca00 20 20 20 20 4c 6f 63 6b 73 74 61 74 65 50 49 44      LockstatePID
1ca10 20 6c 6f 63 6b 73 74 61 74 65 20 3d 20 7b 70 69   lockstate = {pi
1ca20 64 2c 20 2d 31 7d 3b 0a 20 20 20 20 73 71 6c 69  d, -1};.    sqli
1ca30 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
1ca40 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
1ca50 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
1ca60 45 5f 50 49 44 2c 20 26 6c 6f 63 6b 73 74 61 74  E_PID, &lockstat
1ca70 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
1ca80 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 69  close(db);.    i
1ca90 6e 74 20 73 74 61 74 65 20 3d 20 6c 6f 63 6b 73  nt state = locks
1caa0 74 61 74 65 2e 73 74 61 74 65 3b 0a 20 20 20 20  tate.state;.    
1cab0 72 65 74 75 72 6e 20 73 74 61 74 65 3b 0a 20 20  return state;.  
1cac0 7d 0a 20 20 69 66 28 20 4e 55 4c 4c 21 3d 64 62  }.  if( NULL!=db
1cad0 20 29 7b 20 0a 20 20 20 20 73 71 6c 69 74 65 33   ){ .    sqlite3
1cae0 5f 63 6c 6f 73 65 28 64 62 29 3b 20 2f 2a 20 6e  _close(db); /* n
1caf0 65 65 64 20 74 6f 20 63 6c 6f 73 65 20 65 76 65  eed to close eve
1cb00 6e 20 69 66 20 6f 70 65 6e 20 72 65 74 75 72 6e  n if open return
1cb10 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
1cb20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1cb30 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 45 52 52 4f  E_LOCKSTATE_ERRO
1cb40 52 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  R;.}..#endif /* 
1cb50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1cb60 50 4c 45 5f 53 50 49 20 2a 2f 0a                 PLE_SPI */.