/ Hex Artifact Content
Login

Artifact b3ce9d74745c8ebd16aca28dcacbd30a080626c9:


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 72 65  f( !db ){.    re
64f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6500: 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
6510: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
6520: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
6530: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
6540: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
6550: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6560: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
6570: 3b 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44  ;..  /* Force xD
6580: 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20  isconnect calls 
6590: 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74  on all virtual t
65a0: 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f  ables */.  disco
65b0: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29  nnectAllVtab(db)
65c0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61  ;..  /* If a tra
65d0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
65e0: 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74  , the disconnect
65f0: 41 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61  AllVtab() call a
6600: 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  bove.  ** will n
6610: 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74  ot have called t
6620: 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29  he xDisconnect()
6630: 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76   method on any v
6640: 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c  irtual.  ** tabl
6650: 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56  es in the db->aV
6660: 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54  Trans[] array. T
6670: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c  he following sql
6680: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
6690: 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  ().  ** call wil
66a0: 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64  l do so. We need
66b0: 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f   to do this befo
66c0: 72 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72  re the check for
66d0: 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c   active.  ** SQL
66e0: 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f   statements belo
66f0: 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c  w, as the v-tabl
6700: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
6710: 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a   may be storing.
6720: 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72    ** some prepar
6730: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ed statements in
6740: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20  ternally..  */. 
6750: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
6760: 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  back(db);..  /* 
6770: 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f 72 20  Legacy behavior 
6780: 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29  (sqlite3_close()
6790: 20 62 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f   behavior) is to
67a0: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c   return.  ** SQL
67b0: 49 54 45 5f 42 55 53 59 20 69 66 20 74 68 65 20  ITE_BUSY if the 
67c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e  connection can n
67d0: 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d  ot be closed imm
67e0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
67f0: 20 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69   if( !forceZombi
6800: 65 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49  e && connectionI
6810: 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20  sBusy(db) ){.   
6820: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
6830: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 22  , SQLITE_BUSY, "
6840: 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20  unable to close 
6850: 64 75 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a  due to unfinaliz
6860: 65 64 20 22 0a 20 20 20 20 20 20 20 22 73 74 61  ed ".       "sta
6870: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
6880: 69 73 68 65 64 20 62 61 63 6b 75 70 73 22 29 3b  ished backups");
6890: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
68a0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
68b0: 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ex);.    return 
68c0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
68d0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
68e0: 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20  ENABLE_SQLLOG.  
68f0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
6900: 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
6910: 29 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e  ){.    /* Closin
6920: 67 20 74 68 65 20 68 61 6e 64 6c 65 2e 20 46 6f  g the handle. Fo
6930: 75 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  urth parameter i
6940: 73 20 70 61 73 73 65 64 20 74 68 65 20 76 61 6c  s passed the val
6950: 75 65 20 32 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ue 2. */.    sql
6960: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
6970: 2e 78 53 71 6c 6c 6f 67 28 73 71 6c 69 74 65 33  .xSqllog(sqlite3
6980: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71  GlobalConfig.pSq
6990: 6c 6c 6f 67 41 72 67 2c 20 64 62 2c 20 30 2c 20  llogArg, db, 0, 
69a0: 32 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  2);.  }.#endif..
69b0: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
69c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f   connection into
69d0: 20 61 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68   a zombie and th
69e0: 65 6e 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a  en close it..  *
69f0: 2f 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  /.  db->magic = 
6a00: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d  SQLITE_MAGIC_ZOM
6a10: 42 49 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65  BIE;.  sqlite3Le
6a20: 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65  aveMutexAndClose
6a30: 5a 6f 6d 62 69 65 28 64 62 29 3b 0a 20 20 72 65  Zombie(db);.  re
6a40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72  }../*.** Two var
6a60: 69 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70  iations on the p
6a70: 75 62 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20  ublic interface 
6a80: 66 6f 72 20 63 6c 6f 73 69 6e 67 20 61 20 64 61  for closing a da
6a90: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
6aa0: 74 69 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74 65  tion. The sqlite
6ab0: 33 5f 63 6c 6f 73 65 28 29 20 76 65 72 73 69 6f  3_close() versio
6ac0: 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
6ad0: 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61  _BUSY and.** lea
6ae0: 76 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ves the connecti
6af0: 6f 6e 20 6f 70 74 69 6f 6e 20 69 66 20 74 68 65  on option if the
6b00: 72 65 20 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a  re are unfinaliz
6b10: 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73  ed prepared.** s
6b20: 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66  tatements or unf
6b30: 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f  inished sqlite3_
6b40: 62 61 63 6b 75 70 73 2e 20 20 54 68 65 20 73 71  backups.  The sq
6b50: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
6b60: 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72 63  .** version forc
6b70: 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  es the connectio
6b80: 6e 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f  n to become a zo
6b90: 6d 62 69 65 20 69 66 20 74 68 65 72 65 20 61 72  mbie if there ar
6ba0: 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65  e.** unclosed re
6bb0: 73 6f 75 72 63 65 73 2c 20 61 6e 64 20 61 72 72  sources, and arr
6bc0: 61 6e 67 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f  anges for deallo
6bd0: 63 61 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20  cation when the 
6be0: 6c 61 73 74 0a 2a 2a 20 70 72 65 70 61 72 65 20  last.** prepare 
6bf0: 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c  statement or sql
6c00: 69 74 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73  ite3_backup clos
6c10: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
6c20: 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33  e3_close(sqlite3
6c30: 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71   *db){ return sq
6c40: 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 30 29  lite3Close(db,0)
6c50: 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ; }.int sqlite3_
6c60: 63 6c 6f 73 65 5f 76 32 28 73 71 6c 69 74 65 33  close_v2(sqlite3
6c70: 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71   *db){ return sq
6c80: 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 31 29  lite3Close(db,1)
6c90: 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ; }.../*.** Clos
6ca0: 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 64  e the mutex on d
6cb0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6cc0: 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72  on db..**.** Fur
6cd0: 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 64 61 74  thermore, if dat
6ce0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6cf0: 20 64 62 20 69 73 20 61 20 7a 6f 6d 62 69 65 20   db is a zombie 
6d00: 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68  (meaning that th
6d10: 65 72 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ere.** has been 
6d20: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
6d30: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
6d40: 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f  ) or sqlite3_clo
6d50: 73 65 5f 76 32 28 64 62 29 29 20 61 6e 64 0a 2a  se_v2(db)) and.*
6d60: 2a 20 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f  * every sqlite3_
6d70: 73 74 6d 74 20 68 61 73 20 6e 6f 77 20 62 65 65  stmt has now bee
6d80: 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20  n finalized and 
6d90: 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 62 61  every sqlite3_ba
6da0: 63 6b 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69  ckup has.** fini
6db0: 73 68 65 64 2c 20 74 68 65 6e 20 66 72 65 65 20  shed, then free 
6dc0: 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a  all resources..*
6dd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4c 65  /.void sqlite3Le
6de0: 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65  aveMutexAndClose
6df0: 5a 6f 6d 62 69 65 28 73 71 6c 69 74 65 33 20 2a  Zombie(sqlite3 *
6e00: 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  db){.  HashElem 
6e10: 2a 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *i;             
6e20: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
6e30: 61 62 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f  able iterator */
6e40: 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20  .  int j;..  /* 
6e50: 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
6e60: 73 74 61 6e 64 69 6e 67 20 73 71 6c 69 74 65 33  standing sqlite3
6e70: 5f 73 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33  _stmt or sqlite3
6e80: 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a  _backup objects.
6e90: 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 63    ** or if the c
6ea0: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f  onnection has no
6eb0: 74 20 79 65 74 20 62 65 65 6e 20 63 6c 6f 73 65  t yet been close
6ec0: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f  d by sqlite3_clo
6ed0: 73 65 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68  se_v2(),.  ** th
6ee0: 65 6e 20 6a 75 73 74 20 6c 65 61 76 65 20 74 68  en just leave th
6ef0: 65 20 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75  e mutex and retu
6f00: 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  rn..  */.  if( d
6f10: 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45  b->magic!=SQLITE
6f20: 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c  _MAGIC_ZOMBIE ||
6f30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73   connectionIsBus
6f40: 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  y(db) ){.    sql
6f50: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6f60: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
6f70: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
6f80: 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
6f90: 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
6fa0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 64 61 74  ans that the dat
6fb0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6fc0: 20 68 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64   has.  ** closed
6fd0: 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d   all sqlite3_stm
6fe0: 74 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 62 61  t and sqlite3_ba
6ff0: 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 61 6e 64  ckup objects and
7000: 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70   has been.  ** p
7010: 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
7020: 5f 63 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20  _close (meaning 
7030: 74 68 61 74 20 69 74 20 69 73 20 61 20 7a 6f 6d  that it is a zom
7040: 62 69 65 29 2e 20 20 54 68 65 72 65 66 6f 72 65  bie).  Therefore
7050: 2c 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20  ,.  ** go ahead 
7060: 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 72 65 73  and free all res
7070: 6f 75 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20  ources..  */..  
7080: 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  /* If a transact
7090: 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 72 6f 6c  ion is open, rol
70a0: 6c 20 69 74 20 62 61 63 6b 2e 20 54 68 69 73 20  l it back. This 
70b0: 61 6c 73 6f 20 65 6e 73 75 72 65 73 20 74 68 61  also ensures tha
70c0: 74 20 69 66 0a 20 20 2a 2a 20 61 6e 79 20 64 61  t if.  ** any da
70d0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 73 20 68  tabase schemas h
70e0: 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
70f0: 64 20 62 79 20 61 6e 20 75 6e 63 6f 6d 6d 69 74  d by an uncommit
7100: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ted transaction.
7110: 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20 72 65    ** they are re
7120: 73 65 74 2e 20 41 6e 64 20 74 68 61 74 20 74 68  set. And that th
7130: 65 20 72 65 71 75 69 72 65 64 20 62 2d 74 72 65  e required b-tre
7140: 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 20  e mutex is held 
7150: 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 74 68 65  to make.  ** the
7160: 20 70 61 67 65 72 20 72 6f 6c 6c 62 61 63 6b 20   pager rollback 
7170: 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65 74  and schema reset
7180: 20 61 6e 20 61 74 6f 6d 69 63 20 6f 70 65 72 61   an atomic opera
7190: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  tion. */.  sqlit
71a0: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
71b0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20  , SQLITE_OK);.. 
71c0: 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74   /* Free any out
71d0: 73 74 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69  standing Savepoi
71e0: 6e 74 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a  nt structures. *
71f0: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  /.  sqlite3Close
7200: 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
7210: 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
7220: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
7230: 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d  ions */.  for(j=
7240: 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b  0; j<db->nDb; j+
7250: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
7260: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
7270: 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[j];.    if( pD
7280: 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
7290: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
72a0: 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  e(pDb->pBt);.   
72b0: 20 20 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b     pDb->pBt = 0;
72c0: 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20  .      if( j!=1 
72d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
72e0: 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  pSchema = 0;.   
72f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
7300: 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 54 45   /* Clear the TE
7310: 4d 50 20 73 63 68 65 6d 61 20 73 65 70 61 72 61  MP schema separa
7320: 74 65 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f  tely and last */
7330: 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31  .  if( db->aDb[1
7340: 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ].pSchema ){.   
7350: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
7360: 65 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ear(db->aDb[1].p
7370: 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73  Schema);.  }.  s
7380: 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b  qlite3VtabUnlock
7390: 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  List(db);..  /* 
73a0: 46 72 65 65 20 75 70 20 74 68 65 20 61 72 72 61  Free up the arra
73b0: 79 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20 64  y of auxiliary d
73c0: 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 73 71  atabases */.  sq
73d0: 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74  lite3CollapseDat
73e0: 61 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a  abaseArray(db);.
73f0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44    assert( db->nD
7400: 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74  b<=2 );.  assert
7410: 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61  ( db->aDb==db->a
7420: 44 62 53 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f  DbStatic );..  /
7430: 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20  * Tell the code 
7440: 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74  in notify.c that
7450: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
7460: 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20  no longer holds 
7470: 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61  any.  ** locks a
7480: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  nd does not requ
7490: 69 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 20  ire any further 
74a0: 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
74b0: 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
74c0: 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
74d0: 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20  nClosed(db);..  
74e0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79  for(j=0; j<Array
74f0: 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61  Size(db->aFunc.a
7500: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e  ); j++){.    Fun
7510: 63 44 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48  cDef *pNext, *pH
7520: 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72  ash, *p;.    for
7530: 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a  (p=db->aFunc.a[j
7540: 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a  ]; p; p=pHash){.
7550: 20 20 20 20 20 20 70 48 61 73 68 20 3d 20 70 2d        pHash = p-
7560: 3e 70 48 61 73 68 3b 0a 20 20 20 20 20 20 77 68  >pHash;.      wh
7570: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20  ile( p ){.      
7580: 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f    functionDestro
7590: 79 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  y(db, p);.      
75a0: 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
75b0: 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  xt;.        sqli
75c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
75d0: 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e  ;.        p = pN
75e0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
75f0: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73   }.  }.  for(i=s
7600: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
7610: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69  db->aCollSeq); i
7620: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
7630: 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c  xt(i)){.    Coll
7640: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f  Seq *pColl = (Co
7650: 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61  llSeq *)sqliteHa
7660: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f  shData(i);.    /
7670: 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73  * Invoke any des
7680: 74 72 75 63 74 6f 72 73 20 72 65 67 69 73 74 65  tructors registe
7690: 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f  red for collatio
76a0: 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 72 20  n sequence user 
76b0: 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  data. */.    for
76c0: 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
76d0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  .      if( pColl
76e0: 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20  [j].xDel ){.    
76f0: 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65      pColl[j].xDe
7700: 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72  l(pColl[j].pUser
7710: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7720: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
7730: 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20  ee(db, pColl);. 
7740: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
7750: 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c  Clear(&db->aColl
7760: 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Seq);.#ifndef SQ
7770: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
7780: 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73  LTABLE.  for(i=s
7790: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
77a0: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b  db->aModule); i;
77b0: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
77c0: 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c  t(i)){.    Modul
77d0: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
77e0: 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  e *)sqliteHashDa
77f0: 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
7800: 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b  Mod->xDestroy ){
7810: 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65  .      pMod->xDe
7820: 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78  stroy(pMod->pAux
7830: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
7840: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7850: 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Mod);.  }.  sqli
7860: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62  te3HashClear(&db
7870: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64  ->aModule);.#end
7880: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72  if..  sqlite3Err
7890: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
78a0: 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63  , 0); /* Dealloc
78b0: 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64 20  ates any cached 
78c0: 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a  error strings. *
78d0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  /.  sqlite3Value
78e0: 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a  Free(db->pErr);.
78f0: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78    sqlite3CloseEx
7900: 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 0a 20  tensions(db);.. 
7910: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
7920: 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b  ITE_MAGIC_ERROR;
7930: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d  ..  /* The temp-
7940: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
7950: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66  is allocated dif
7960: 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68  ferently from th
7970: 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20  e other schema. 
7980: 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69   ** objects (usi
7990: 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  ng sqliteMalloc(
79a0: 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  ) directly, inst
79b0: 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74  ead of sqlite3Bt
79c0: 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20  reeSchema())..  
79d0: 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74  ** So it needs t
79e0: 6f 20 62 65 20 66 72 65 65 64 20 68 65 72 65 2e  o be freed here.
79f0: 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72   Todo: Why not r
7a00: 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68  oll the temp sch
7a10: 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ema into.  ** th
7a20: 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c  e same sqliteMal
7a30: 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65  loc() as the one
7a40: 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20   that allocates 
7a50: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
7a60: 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20  ** structure?.  
7a70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
7a80: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31  ee(db, db->aDb[1
7a90: 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ].pSchema);.  sq
7aa0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
7ab0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
7ac0: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
7ad0: 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b  TE_MAGIC_CLOSED;
7ae0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
7af0: 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29  _free(db->mutex)
7b00: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
7b10: 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d  lookaside.nOut==
7b20: 30 20 29 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f  0 );  /* Fails o
7b30: 6e 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  n a lookaside me
7b40: 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69  mory leak */.  i
7b50: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
7b60: 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  .bMalloced ){.  
7b70: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
7b80: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
7b90: 61 72 74 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  art);.  }.#ifdef
7ba0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
7bb0: 51 4c 52 52 0a 20 20 53 52 52 65 63 43 6c 6f 73  QLRR.  SRRecClos
7bc0: 65 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20  e(db);.#endif.  
7bd0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
7be0: 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  db);.}../*.** Ro
7bf0: 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62  llback all datab
7c00: 61 73 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74  ase files.  If t
7c10: 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53  ripCode is not S
7c20: 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a  QLITE_OK, then.*
7c30: 2a 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  * any open curso
7c40: 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  rs are invalidat
7c50: 65 64 20 28 22 74 72 69 70 70 65 64 22 20 2d 20  ed ("tripped" - 
7c60: 61 73 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20  as in "tripping 
7c70: 61 20 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65  a circuit.** bre
7c80: 61 6b 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20  aker") and made 
7c90: 74 6f 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f  to return tripCo
7ca0: 64 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  de if there are 
7cb0: 61 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61  any further.** a
7cc0: 74 74 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74  ttempts to use t
7cd0: 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76  hat cursor..*/.v
7ce0: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
7cf0: 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  ackAll(sqlite3 *
7d00: 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  db, int tripCode
7d10: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
7d20: 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20  t inTrans = 0;. 
7d30: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7d40: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
7d50: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
7d60: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
7d70: 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62  lloc();..  /* Ob
7d80: 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20  tain all b-tree 
7d90: 6d 75 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d  mutexes before m
7da0: 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20  aking any calls 
7db0: 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  to BtreeRollback
7dc0: 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69  (). .  ** This i
7dd0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63  s important in c
7de0: 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ase the transact
7df0: 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64  ion being rolled
7e00: 20 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d   back has.  ** m
7e10: 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61  odified the data
7e20: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
7e30: 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78  the b-tree mutex
7e40: 65 73 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e  es are not taken
7e50: 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e  .  ** here, then
7e60: 20 61 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d   another shared-
7e70: 63 61 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  cache connection
7e80: 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20   might sneak in 
7e90: 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65  between.  ** the
7ea0: 20 64 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61   database rollba
7eb0: 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65  ck and schema re
7ec0: 73 65 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63  set, which can c
7ed0: 61 75 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20  ause false.  ** 
7ee0: 63 6f 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72  corruption repor
7ef0: 74 73 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73  ts in some cases
7f00: 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
7f10: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
7f20: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
7f30: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
7f40: 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62     Btree *p = db
7f50: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
7f60: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
7f70: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
7f80: 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b  eIsInTrans(p) ){
7f90: 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73  .        inTrans
7fa0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
7fb0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
7fc0: 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70  Rollback(p, trip
7fd0: 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Code);.    }.  }
7fe0: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
7ff0: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71  llback(db);.  sq
8000: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
8010: 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 28  lloc();..  if( (
8020: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
8030: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21  _InternChanges)!
8040: 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62  =0 && db->init.b
8050: 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  usy==0 ){.    sq
8060: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
8070: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
8080: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
8090: 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43  setAllSchemasOfC
80a0: 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20  onnection(db);. 
80b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
80c0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a  eLeaveAll(db);..
80d0: 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65    /* Any deferre
80e0: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  d constraint vio
80f0: 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77  lations have now
8100: 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
8110: 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  */.  db->nDeferr
8120: 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62  edCons = 0;.  db
8130: 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
8140: 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c  ns = 0;.  db->fl
8150: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44  ags &= ~SQLITE_D
8160: 65 66 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49  eferFKs;..  /* I
8170: 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63  f one has been c
8180: 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b  onfigured, invok
8190: 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68  e the rollback-h
81a0: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ook callback */.
81b0: 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62    if( db->xRollb
81c0: 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28  ackCallback && (
81d0: 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e  inTrans || !db->
81e0: 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20  autoCommit) ){. 
81f0: 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b     db->xRollback
8200: 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f  Callback(db->pRo
8210: 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a  llbackArg);.  }.
8220: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8230: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
8240: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
8250: 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ame correspondin
8260: 67 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 63  g to the error c
8270: 6f 64 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ode.** specified
8280: 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
8290: 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
82a0: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 63 6f  (SQLITE_TEST).co
82b0: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
82c0: 33 45 72 72 4e 61 6d 65 28 69 6e 74 20 72 63 29  3ErrName(int rc)
82d0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
82e0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zName = 0;.  int
82f0: 20 69 2c 20 6f 72 69 67 52 63 20 3d 20 72 63 3b   i, origRc = rc;
8300: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20  .  for(i=0; i<2 
8310: 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b  && zName==0; i++
8320: 2c 20 72 63 20 26 3d 20 30 78 66 66 29 7b 0a 20  , rc &= 0xff){. 
8330: 20 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b     switch( rc ){
8340: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8350: 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 20  TE_OK:          
8360: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8370: 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20  SQLITE_OK";     
8380: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8390: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
83a0: 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20  ITE_ERROR:      
83b0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
83c0: 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20  "SQLITE_ERROR"; 
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
83e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
83f0: 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20  LITE_INTERNAL:  
8400: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
8410: 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41   "SQLITE_INTERNA
8420: 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  L";          bre
8430: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8440: 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20  QLITE_PERM:     
8450: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
8460: 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b  = "SQLITE_PERM";
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
8480: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8490: 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20  SQLITE_ABORT:   
84a0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
84b0: 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54   = "SQLITE_ABORT
84c0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
84d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
84e0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
84f0: 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d  LLBACK:     zNam
8500: 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52  e = "SQLITE_ABOR
8510: 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20  T_ROLLBACK";    
8520: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8530: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20  e SQLITE_BUSY:  
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
8550: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53  me = "SQLITE_BUS
8560: 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Y";             
8570: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8580: 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  se SQLITE_BUSY_R
8590: 45 43 4f 56 45 52 59 3a 20 20 20 20 20 20 7a 4e  ECOVERY:      zN
85a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55  ame = "SQLITE_BU
85b0: 53 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 20 20  SY_RECOVERY";   
85c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
85d0: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ase SQLITE_BUSY_
85e0: 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20 20 7a  SNAPSHOT:      z
85f0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
8600: 55 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20  USY_SNAPSHOT";  
8610: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8620: 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  case SQLITE_LOCK
8630: 45 44 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ED:             
8640: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8650: 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 20 20  LOCKED";        
8660: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8670: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43   case SQLITE_LOC
8680: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3a  KED_SHAREDCACHE:
8690: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
86a0: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
86b0: 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  CHE";break;.    
86c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
86d0: 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20  MEM:            
86e0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
86f0: 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20  E_NOMEM";       
8700: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8710: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
8720: 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20  EADONLY:        
8730: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8740: 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20  TE_READONLY";   
8750: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8760: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8770: 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52  READONLY_RECOVER
8780: 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  Y:  zName = "SQL
8790: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43  ITE_READONLY_REC
87a0: 4f 56 45 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20  OVERY"; break;. 
87b0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
87c0: 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f  _READONLY_CANTLO
87d0: 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  CK:  zName = "SQ
87e0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
87f0: 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  NTLOCK"; break;.
8800: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8810: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
8820: 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ACK:  zName = "S
8830: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
8840: 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b  OLLBACK"; break;
8850: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8860: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
8870: 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  VED:   zName = "
8880: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
8890: 44 42 4d 4f 56 45 44 22 3b 20 20 62 72 65 61 6b  DBMOVED";  break
88a0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
88b0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20  ITE_INTERRUPT:  
88c0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
88d0: 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  "SQLITE_INTERRUP
88e0: 54 22 3b 20 20 20 20 20 20 20 20 20 62 72 65 61  T";         brea
88f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8900: 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20  LITE_IOERR:     
8910: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
8920: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b   "SQLITE_IOERR";
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
8940: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8950: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
8960: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
8970: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8980: 52 45 41 44 22 3b 20 20 20 20 20 20 20 20 62 72  READ";        br
8990: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
89a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
89b0: 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65  RT_READ:   zName
89c0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
89d0: 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b 20 20 62  _SHORT_READ";  b
89e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
89f0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
8a00: 49 54 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ITE:        zNam
8a10: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8a20: 52 5f 57 52 49 54 45 22 3b 20 20 20 20 20 20 20  R_WRITE";       
8a30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8a40: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  e SQLITE_IOERR_F
8a50: 53 59 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e 61  SYNC:        zNa
8a60: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8a70: 52 52 5f 46 53 59 4e 43 22 3b 20 20 20 20 20 20  RR_FSYNC";      
8a80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8a90: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8aa0: 44 49 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e  DIR_FSYNC:    zN
8ab0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8ac0: 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20  ERR_DIR_FSYNC"; 
8ad0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8ae0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8af0: 5f 54 52 55 4e 43 41 54 45 3a 20 20 20 20 20 7a  _TRUNCATE:     z
8b00: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8b10: 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20  OERR_TRUNCATE"; 
8b20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8b30: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8b40: 52 5f 46 53 54 41 54 3a 20 20 20 20 20 20 20 20  R_FSTAT:        
8b50: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8b60: 49 4f 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20  IOERR_FSTAT";   
8b70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8b80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8b90: 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20  RR_UNLOCK:      
8ba0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8bb0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20  _IOERR_UNLOCK"; 
8bc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8bd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8be0: 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20  ERR_RDLOCK:     
8bf0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8c00: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b  E_IOERR_RDLOCK";
8c10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8c20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8c30: 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20  OERR_DELETE:    
8c40: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8c50: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22  TE_IOERR_DELETE"
8c60: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
8c70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8c80: 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3a 20 20  IOERR_BLOCKED:  
8c90: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8ca0: 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
8cb0: 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  D";     break;. 
8cc0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8cd0: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20  _IOERR_NOMEM:   
8ce0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8cf0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
8d00: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
8d10: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8d20: 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3a 20  E_IOERR_ACCESS: 
8d30: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8d40: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
8d50: 53 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  SS";      break;
8d60: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8d70: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
8d80: 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20  SERVEDLOCK:.    
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
8db0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8dc0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
8dd0: 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  OCK"; break;.   
8de0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8df0: 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20  OERR_LOCK:      
8e00: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8e10: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20  TE_IOERR_LOCK"; 
8e20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8e30: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8e40: 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20  IOERR_CLOSE:    
8e50: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8e60: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22  ITE_IOERR_CLOSE"
8e70: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
8e80: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8e90: 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45  _IOERR_DIR_CLOSE
8ea0: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
8eb0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43  LITE_IOERR_DIR_C
8ec0: 4c 4f 53 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a  LOSE";   break;.
8ed0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8ee0: 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a  E_IOERR_SHMOPEN:
8ef0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8f00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
8f10: 50 45 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  PEN";     break;
8f20: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8f30: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
8f40: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
8f50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
8f60: 53 49 5a 45 22 3b 20 20 20 20 20 62 72 65 61 6b  SIZE";     break
8f70: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8f80: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43  ITE_IOERR_SHMLOC
8f90: 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  K:      zName = 
8fa0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
8fb0: 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72 65 61  MLOCK";     brea
8fc0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8fd0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
8fe0: 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  P:       zName =
8ff0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
9000: 48 4d 4d 41 50 22 3b 20 20 20 20 20 20 62 72 65  HMMAP";      bre
9010: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9020: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
9030: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
9040: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
9050: 53 45 45 4b 22 3b 20 20 20 20 20 20 20 20 62 72  SEEK";        br
9060: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9070: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
9080: 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65  ETE_NOENT: zName
9090: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
90a0: 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62  _DELETE_NOENT";b
90b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
90c0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d   SQLITE_IOERR_MM
90d0: 41 50 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  AP:         zNam
90e0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
90f0: 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20 20 20  R_MMAP";        
9100: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9110: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  e SQLITE_IOERR_G
9120: 45 54 54 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61  ETTEMPPATH:  zNa
9130: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
9140: 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 22 3b  RR_GETTEMPPATH";
9150: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9160: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
9170: 43 4f 4e 56 50 41 54 48 3a 20 20 20 20 20 7a 4e  CONVPATH:     zN
9180: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
9190: 45 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20  ERR_CONVPATH";  
91a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
91b0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ase SQLITE_CORRU
91c0: 50 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a  PT:            z
91d0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
91e0: 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20  ORRUPT";        
91f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9200: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52  case SQLITE_CORR
9210: 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20 20 20  UPT_VTAB:       
9220: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9230: 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b 20 20  CORRUPT_VTAB";  
9240: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9250: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
9260: 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20 20  FOUND:          
9270: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9280: 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20 20  _NOTFOUND";     
9290: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
92a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55    case SQLITE_FU
92b0: 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  LL:             
92c0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
92d0: 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20 20  E_FULL";        
92e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
92f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
9300: 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20 20  ANTOPEN:        
9310: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9320: 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20  TE_CANTOPEN";   
9330: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9340: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9350: 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44  CANTOPEN_NOTEMPD
9360: 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  IR: zName = "SQL
9370: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54  ITE_CANTOPEN_NOT
9380: 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20  EMPDIR";break;. 
9390: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
93a0: 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a  _CANTOPEN_ISDIR:
93b0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
93c0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53  LITE_CANTOPEN_IS
93d0: 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  DIR";    break;.
93e0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
93f0: 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
9400: 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ATH:  zName = "S
9410: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
9420: 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61 6b 3b  ULLPATH"; break;
9430: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9440: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56  TE_CANTOPEN_CONV
9450: 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  PATH:  zName = "
9460: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
9470: 43 4f 4e 56 50 41 54 48 22 3b 20 62 72 65 61 6b  CONVPATH"; break
9480: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9490: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20  ITE_PROTOCOL:   
94a0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
94b0: 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  "SQLITE_PROTOCOL
94c0: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
94d0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
94e0: 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20  LITE_EMPTY:     
94f0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9500: 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b   "SQLITE_EMPTY";
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
9520: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9530: 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20  QLITE_SCHEMA:   
9540: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9550: 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  = "SQLITE_SCHEMA
9560: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
9570: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9580: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20  SQLITE_TOOBIG:  
9590: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
95a0: 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49   = "SQLITE_TOOBI
95b0: 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  G";            b
95c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
95d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
95e0: 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  NT:         zNam
95f0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
9600: 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20 20 20  TRAINT";        
9610: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9620: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
9630: 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61  INT_UNIQUE:  zNa
9640: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
9650: 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b  STRAINT_UNIQUE";
9660: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9670: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
9680: 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e  AINT_TRIGGER: zN
9690: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
96a0: 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
96b0: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
96c0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
96d0: 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
96e0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9700: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9710: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
9720: 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72 65 61  EIGNKEY";   brea
9730: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9740: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9750: 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d  CHECK:   zName =
9760: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
9770: 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62 72 65  INT_CHECK";  bre
9780: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9790: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
97a0: 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20  _PRIMARYKEY:.   
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
97d0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
97e0: 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
97f0: 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  EY";   break;.  
9800: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9810: 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55  CONSTRAINT_NOTNU
9820: 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  LL: zName = "SQL
9830: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e  ITE_CONSTRAINT_N
9840: 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20  OTNULL";break;. 
9850: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9860: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
9870: 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20  ITHOOK:.        
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9890: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
98a0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
98b0: 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20  NT_COMMITHOOK"; 
98c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
98d0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
98e0: 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a  RAINT_VTAB:    z
98f0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9900: 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 22 3b  ONSTRAINT_VTAB";
9910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9920: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
9930: 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a  TRAINT_FUNCTION:
9940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9960: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9970: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43  _CONSTRAINT_FUNC
9980: 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65 61 6b  TION";     break
9990: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
99a0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52  ITE_CONSTRAINT_R
99b0: 4f 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20  OWID:   zName = 
99c0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
99d0: 4e 54 5f 52 4f 57 49 44 22 3b 20 20 62 72 65 61  NT_ROWID";  brea
99e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
99f0: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20  LITE_MISMATCH:  
9a00: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9a10: 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43   "SQLITE_MISMATC
9a20: 48 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  H";          bre
9a30: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9a40: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20  QLITE_MISUSE:   
9a50: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9a60: 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  = "SQLITE_MISUSE
9a70: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
9a80: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9a90: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20  SQLITE_NOLFS:   
9aa0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9ab0: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53   = "SQLITE_NOLFS
9ac0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
9ad0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9ae0: 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20   SQLITE_AUTH:   
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9b00: 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55 54 48  e = "SQLITE_AUTH
9b10: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
9b20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9b30: 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a  e SQLITE_FORMAT:
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
9b50: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52  me = "SQLITE_FOR
9b60: 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  MAT";           
9b70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9b80: 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a  se SQLITE_RANGE:
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
9ba0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41  ame = "SQLITE_RA
9bb0: 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20 20 20  NGE";           
9bc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9bd0: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  ase SQLITE_NOTAD
9be0: 42 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  B:             z
9bf0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
9c00: 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20 20 20  OTADB";         
9c10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9c20: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a  case SQLITE_ROW:
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c40: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9c50: 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20 20 20  ROW";           
9c60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9c70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
9c80: 49 43 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  ICE:            
9c90: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9ca0: 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20 20 20 20  _NOTICE";       
9cb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9cc0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
9cd0: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c  TICE_RECOVER_WAL
9ce0: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
9cf0: 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52  E_NOTICE_RECOVER
9d00: 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20  _WAL";break;.   
9d10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
9d20: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
9d30: 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20 20  LLBACK:.        
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9d60: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52  "SQLITE_NOTICE_R
9d70: 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22  ECOVER_ROLLBACK"
9d80: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
9d90: 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49  ase SQLITE_WARNI
9da0: 4e 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a  NG:            z
9db0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57  Name = "SQLITE_W
9dc0: 41 52 4e 49 4e 47 22 3b 20 20 20 20 20 20 20 20  ARNING";        
9dd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9de0: 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e  case SQLITE_WARN
9df0: 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20  ING_AUTOINDEX:  
9e00: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9e10: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
9e20: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  X"; break;.     
9e30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e   case SQLITE_DON
9e40: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E:              
9e50: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9e60: 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20 20  _DONE";         
9e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9e80: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d  }.  }.  if( zNam
9e90: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  e==0 ){.    stat
9ea0: 69 63 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  ic char zBuf[50]
9eb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
9ec0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
9ed0: 75 66 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49  uf), zBuf, "SQLI
9ee0: 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c  TE_UNKNOWN(%d)",
9ef0: 20 6f 72 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e   origRc);.    zN
9f00: 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a  ame = zBuf;.  }.
9f10: 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
9f20: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
9f30: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
9f40: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
9f50: 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f  ribes the kind o
9f60: 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65  f error specifie
9f70: 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75  d in the.** argu
9f80: 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  ment..*/.const c
9f90: 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53  har *sqlite3ErrS
9fa0: 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74  tr(int rc){.  st
9fb0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a  atic const char*
9fc0: 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20   const aMsg[] = 
9fd0: 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  {.    /* SQLITE_
9fe0: 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22  OK          */ "
9ff0: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20  not an error",. 
a000: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52     /* SQLITE_ERR
a010: 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c  OR       */ "SQL
a020: 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20   logic error or 
a030: 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61 73 65  missing database
a040: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a050: 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20  _INTERNAL    */ 
a060: 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  0,.    /* SQLITE
a070: 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20  _PERM        */ 
a080: 22 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69  "access permissi
a090: 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20  on denied",.    
a0a0: 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  /* SQLITE_ABORT 
a0b0: 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61        */ "callba
a0c0: 63 6b 20 72 65 71 75 65 73 74 65 64 20 71 75 65  ck requested que
a0d0: 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f  ry abort",.    /
a0e0: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20  * SQLITE_BUSY   
a0f0: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
a100: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
a110: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b    /* SQLITE_LOCK
a120: 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61  ED      */ "data
a130: 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f  base table is lo
a140: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
a150: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20  LITE_NOMEM      
a160: 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f   */ "out of memo
a170: 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ry",.    /* SQLI
a180: 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a  TE_READONLY    *
a190: 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72  / "attempt to wr
a1a0: 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64  ite a readonly d
a1b0: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
a1c0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
a1d0: 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70  T   */ "interrup
a1e0: 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ted",.    /* SQL
a1f0: 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20  ITE_IOERR       
a200: 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72  */ "disk I/O err
a210: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
a220: 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a  TE_CORRUPT     *
a230: 2f 20 22 64 61 74 61 62 61 73 65 20 64 69 73 6b  / "database disk
a240: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
a250: 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  med",.    /* SQL
a260: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20  ITE_NOTFOUND    
a270: 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72  */ "unknown oper
a280: 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53  ation",.    /* S
a290: 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20  QLITE_FULL      
a2a0: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f    */ "database o
a2b0: 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c  r disk is full",
a2c0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
a2d0: 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75  ANTOPEN    */ "u
a2e0: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
a2f0: 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20  tabase file",.  
a300: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54    /* SQLITE_PROT
a310: 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b  OCOL    */ "lock
a320: 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20  ing protocol",. 
a330: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50     /* SQLITE_EMP
a340: 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62  TY       */ "tab
a350: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  le contains no d
a360: 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ata",.    /* SQL
a370: 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20  ITE_SCHEMA      
a380: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73 63 68  */ "database sch
a390: 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 22  ema has changed"
a3a0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a3b0: 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22  TOOBIG      */ "
a3c0: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74  string or blob t
a3d0: 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20  oo big",.    /* 
a3e0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
a3f0: 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e  T  */ "constrain
a400: 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f  t failed",.    /
a410: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  * SQLITE_MISMATC
a420: 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70  H    */ "datatyp
a430: 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20  e mismatch",.   
a440: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53   /* SQLITE_MISUS
a450: 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61  E      */ "libra
a460: 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65  ry routine calle
a470: 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63  d out of sequenc
a480: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
a490: 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f  E_NOLFS       */
a4a0: 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70   "large file sup
a4b0: 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64  port is disabled
a4c0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a4d0: 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20  _AUTH        */ 
a4e0: 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64  "authorization d
a4f0: 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  enied",.    /* S
a500: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20  QLITE_FORMAT    
a510: 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20    */ "auxiliary 
a520: 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20  database format 
a530: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
a540: 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20  QLITE_RANGE     
a550: 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f    */ "bind or co
a560: 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f  lumn index out o
a570: 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a  f range",.    /*
a580: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20   SQLITE_NOTADB  
a590: 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20      */ "file is 
a5a0: 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69 73 20  encrypted or is 
a5b0: 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65 22 2c  not a database",
a5c0: 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  .  };.  const ch
a5d0: 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e  ar *zErr = "unkn
a5e0: 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77  own error";.  sw
a5f0: 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20  itch( rc ){.    
a600: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
a610: 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20  T_ROLLBACK: {.  
a620: 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72      zErr = "abor
a630: 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43  t due to ROLLBAC
a640: 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  K";.      break;
a650: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
a660: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26  lt: {.      rc &
a670: 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66  = 0xff;.      if
a680: 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20  ( ALWAYS(rc>=0) 
a690: 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28  && rc<ArraySize(
a6a0: 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63  aMsg) && aMsg[rc
a6b0: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
a6c0: 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b  zErr = aMsg[rc];
a6d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
a6e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
a6f0: 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d    return zErr;.}
a700: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
a710: 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
a720: 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  a busy callback 
a730: 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20  that sleeps and 
a740: 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75  tries.** again u
a750: 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76  ntil a timeout v
a760: 61 6c 75 65 20 69 73 20 72 65 61 63 68 65 64 2e  alue is reached.
a770: 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61    The timeout va
a780: 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74  lue is.** an int
a790: 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d  eger number of m
a7a0: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73  illiseconds pass
a7b0: 65 64 20 69 6e 20 61 73 20 74 68 65 20 66 69 72  ed in as the fir
a7c0: 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  st.** argument..
a7d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
a7e0: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
a7f0: 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a  allback(. void *
a800: 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ptr,            
a810: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
a820: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e  onnection */. in
a830: 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20  t count         
a840: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a850: 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20   of times table 
a860: 68 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f  has been busy */
a870: 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .){.#if SQLITE_O
a880: 53 5f 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e 65  S_WIN || (define
a890: 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26  d(HAVE_USLEEP) &
a8a0: 26 20 48 41 56 45 5f 55 53 4c 45 45 50 29 0a 20  & HAVE_USLEEP). 
a8b0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
a8c0: 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20   delays[] =.    
a8d0: 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20   { 1, 2, 5, 10, 
a8e0: 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20  15, 20, 25, 25, 
a8f0: 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31   25,  50,  50, 1
a900: 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  00 };.  static c
a910: 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d  onst u8 totals[]
a920: 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20   =.     { 0, 1, 
a930: 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35  3,  8, 18, 33, 5
a940: 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c  3, 78, 103, 128,
a950: 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64   178, 228 };.# d
a960: 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41 72 72  efine NDELAY Arr
a970: 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29 0a 20  aySize(delays). 
a980: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
a990: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
a9a0: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64   int timeout = d
a9b0: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a  b->busyTimeout;.
a9c0: 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69    int delay, pri
a9d0: 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  or;..  assert( c
a9e0: 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ount>=0 );.  if(
a9f0: 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20   count < NDELAY 
aa00: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64  ){.    delay = d
aa10: 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  elays[count];.  
aa20: 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73    prior = totals
aa30: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65  [count];.  }else
aa40: 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65  {.    delay = de
aa50: 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a  lays[NDELAY-1];.
aa60: 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61      prior = tota
aa70: 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64  ls[NDELAY-1] + d
aa80: 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45  elay*(count-(NDE
aa90: 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69  LAY-1));.  }.  i
aaa0: 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79  f( prior + delay
aab0: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
aac0: 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75    delay = timeou
aad0: 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69  t - prior;.    i
aae0: 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65  f( delay<=0 ) re
aaf0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
ab00: 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d  lite3OsSleep(db-
ab10: 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30  >pVfs, delay*100
ab20: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  0);.  return 1;.
ab30: 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20  #else.  sqlite3 
ab40: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
ab50: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
ab60: 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20  out = ((sqlite3 
ab70: 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65  *)ptr)->busyTime
ab80: 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e  out;.  if( (coun
ab90: 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65  t+1)*1000 > time
aba0: 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  out ){.    retur
abb0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
abc0: 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56  e3OsSleep(db->pV
abd0: 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20  fs, 1000000);.  
abe0: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
abf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
ac00: 20 74 68 65 20 67 69 76 65 6e 20 62 75 73 79 20   the given busy 
ac10: 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  handler..**.** T
ac20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
ac30: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70  alled when an op
ac40: 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77  eration failed w
ac50: 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49  ith a lock..** I
ac60: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  f this routine r
ac70: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
ac80: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74   the lock is ret
ac90: 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20  ried.  If it.** 
aca0: 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f  returns 0, the o
acb0: 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20  peration aborts 
acc0: 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42  with an SQLITE_B
acd0: 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e  USY error..*/.in
ace0: 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  t sqlite3InvokeB
acf0: 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48  usyHandler(BusyH
ad00: 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e  andler *p){.  in
ad10: 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45 56 45  t rc;.  if( NEVE
ad20: 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46  R(p==0) || p->xF
ad30: 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75  unc==0 || p->nBu
ad40: 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b  sy<0 ) return 0;
ad50: 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63  .  rc = p->xFunc
ad60: 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75  (p->pArg, p->nBu
ad70: 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  sy);.  if( rc==0
ad80: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79   ){.    p->nBusy
ad90: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
ada0: 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a      p->nBusy++;.
adb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
adc0: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
add0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
ade0: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66   busy callback f
adf0: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
ae00: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
ae10: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
ae20: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
ae30: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
ae40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
ae50: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20  busy_handler(.  
ae60: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69  sqlite3 *db,.  i
ae70: 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64  nt (*xBusy)(void
ae80: 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  *,int),.  void *
ae90: 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65  pArg.){.  sqlite
aea0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
aeb0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
aec0: 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e  busyHandler.xFun
aed0: 63 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d  c = xBusy;.  db-
aee0: 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72  >busyHandler.pAr
aef0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e  g = pArg;.  db->
af00: 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73  busyHandler.nBus
af10: 79 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73  y = 0;.  db->bus
af20: 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20  yTimeout = 0;.  
af30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
af40: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
af50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
af60: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
af70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
af80: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
af90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
afa0: 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73  sets the progres
afb0: 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  s callback for a
afc0: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
afd0: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
afe0: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
aff0: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
b000: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  en argument. The
b010: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
b020: 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e  ck will.** be in
b030: 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73  voked every nOps
b040: 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69   opcodes..*/.voi
b050: 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65  d sqlite3_progre
b060: 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  ss_handler(.  sq
b070: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
b080: 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a  t nOps,.  int (*
b090: 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a  xProgress)(void*
b0a0: 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ), .  void *pArg
b0b0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
b0c0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
b0d0: 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73  tex);.  if( nOps
b0e0: 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50  >0 ){.    db->xP
b0f0: 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72  rogress = xProgr
b100: 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  ess;.    db->nPr
b110: 6f 67 72 65 73 73 4f 70 73 20 3d 20 28 75 6e 73  ogressOps = (uns
b120: 69 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20 20  igned)nOps;.    
b130: 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67  db->pProgressArg
b140: 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65   = pArg;.  }else
b150: 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72  {.    db->xProgr
b160: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  ess = 0;.    db-
b170: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20  >nProgressOps = 
b180: 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67  0;.    db->pProg
b190: 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d  ressArg = 0;.  }
b1a0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
b1b0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
b1c0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  );.}.#endif.../*
b1d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b1e0: 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61   installs a defa
b1f0: 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ult busy handler
b200: 20 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20   that waits for 
b210: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  the.** specified
b220: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
b230: 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72  seconds before r
b240: 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69  eturning 0..*/.i
b250: 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  nt sqlite3_busy_
b260: 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20  timeout(sqlite3 
b270: 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20  *db, int ms){.  
b280: 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20  if( ms>0 ){.    
b290: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
b2a0: 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44  dler(db, sqliteD
b2b0: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
b2c0: 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a  ck, (void*)db);.
b2d0: 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65      db->busyTime
b2e0: 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 7d 65 6c 73  out = ms;.  }els
b2f0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  e{.    sqlite3_b
b300: 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20  usy_handler(db, 
b310: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  0, 0);.  }.  ret
b320: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b330: 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e  ../*.** Cause an
b340: 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74  y pending operat
b350: 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69  ion to stop at i
b360: 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f  ts earliest oppo
b370: 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64  rtunity..*/.void
b380: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
b390: 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  pt(sqlite3 *db){
b3a0: 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  .  db->u1.isInte
b3b0: 72 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a  rrupted = 1;.}..
b3c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b3d0: 74 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20  tion is exactly 
b3e0: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
b3f0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
b400: 69 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a  ion(), except.**
b410: 20 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69   that it is desi
b420: 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  gned to be calle
b430: 64 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f  d by internal co
b440: 64 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e  de. The differen
b450: 63 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66  ce is.** that if
b460: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
b470: 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  s in sqlite3_cre
b480: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
b490: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  an error code.**
b4a0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
b4b0: 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65   the mallocFaile
b4c0: 64 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20  d flag cleared. 
b4d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
b4e0: 72 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c  reateFunc(.  sql
b4f0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
b500: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f  t char *zFunctio
b510: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
b520: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
b530: 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c  void *pUserData,
b540: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
b550: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
b560: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
b570: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
b580: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
b590: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
b5a0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
b5b0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
b5c0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
b5d0: 74 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72  t*),.  FuncDestr
b5e0: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
b5f0: 6f 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  or.){.  FuncDef 
b600: 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  *p;.  int nName;
b610: 0a 20 20 69 6e 74 20 65 78 74 72 61 46 6c 61 67  .  int extraFlag
b620: 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  s;..  assert( sq
b630: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b640: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
b650: 20 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61   if( zFunctionNa
b660: 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28  me==0 ||.      (
b670: 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c  xFunc && (xFinal
b680: 20 7c 7c 20 78 53 74 65 70 29 29 20 7c 7c 20 0a   || xStep)) || .
b690: 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26 26        (!xFunc &&
b6a0: 20 28 78 46 69 6e 61 6c 20 26 26 20 21 78 53 74   (xFinal && !xSt
b6b0: 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 21  ep)) ||.      (!
b6c0: 78 46 75 6e 63 20 26 26 20 28 21 78 46 69 6e 61  xFunc && (!xFina
b6d0: 6c 20 26 26 20 78 53 74 65 70 29 29 20 7c 7c 0a  l && xStep)) ||.
b6e0: 20 20 20 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c        (nArg<-1 |
b6f0: 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41  | nArg>SQLITE_MA
b700: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20  X_FUNCTION_ARG) 
b710: 7c 7c 0a 20 20 20 20 20 20 28 32 35 35 3c 28 6e  ||.      (255<(n
b720: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
b730: 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f  rlen30( zFunctio
b740: 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20  nName))) ){.    
b750: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
b760: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  SUSE_BKPT;.  }..
b770: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
b780: 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d  _FUNC_CONSTANT==
b790: 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
b7a0: 53 54 49 43 20 29 3b 0a 20 20 65 78 74 72 61 46  STIC );.  extraF
b7b0: 6c 61 67 73 20 3d 20 65 6e 63 20 26 20 20 53 51  lags = enc &  SQ
b7c0: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
b7d0: 49 43 3b 0a 20 20 65 6e 63 20 26 3d 20 28 53 51  IC;.  enc &= (SQ
b7e0: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
b7f0: 4b 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20  K|SQLITE_ANY);. 
b800: 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
b810: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a  _OMIT_UTF16.  /*
b820: 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   If SQLITE_UTF16
b830: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
b840: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79   the encoding ty
b850: 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68  pe, transform th
b860: 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f  is.  ** to one o
b870: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  f SQLITE_UTF16LE
b880: 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36   or SQLITE_UTF16
b890: 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  BE using the.  *
b8a0: 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
b8b0: 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49  TIVE macro. SQLI
b8c0: 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20  TE_UTF16 is not 
b8d0: 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  used internally.
b8e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51  .  **.  ** If SQ
b8f0: 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63  LITE_ANY is spec
b900: 69 66 69 65 64 2c 20 61 64 64 20 74 68 72 65 65  ified, add three
b910: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
b920: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74   function.  ** t
b930: 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  o the hash table
b940: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63  ..  */.  if( enc
b950: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29  ==SQLITE_UTF16 )
b960: 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49  {.    enc = SQLI
b970: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
b980: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d    }else if( enc=
b990: 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20  =SQLITE_ANY ){. 
b9a0: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72     int rc;.    r
b9b0: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
b9c0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74  eFunc(db, zFunct
b9d0: 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  ionName, nArg, S
b9e0: 51 4c 49 54 45 5f 55 54 46 38 7c 65 78 74 72 61  QLITE_UTF8|extra
b9f0: 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
ba00: 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63  pUserData, xFunc
ba10: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
ba20: 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20   pDestructor);. 
ba30: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
ba40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
ba50: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
ba60: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69  Func(db, zFuncti
ba70: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51  onName, nArg, SQ
ba80: 4c 49 54 45 5f 55 54 46 31 36 4c 45 7c 65 78 74  LITE_UTF16LE|ext
ba90: 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  raFlags,.       
baa0: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46     pUserData, xF
bab0: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
bac0: 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  al, pDestructor)
bad0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
bae0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
baf0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
bb00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20  ;.    }.    enc 
bb10: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  = SQLITE_UTF16BE
bb20: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e  ;.  }.#else.  en
bb30: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
bb40: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20  .#endif.  .  /* 
bb50: 43 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73  Check if an exis
bb60: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73  ting function is
bb70: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
bb80: 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66  n or deleted. If
bb90: 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68   so,.  ** and th
bba0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
bbb0: 4d 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  Ms, then return 
bbc0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20  SQLITE_BUSY. If 
bbd0: 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  a function.  ** 
bbe0: 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64  is being overrid
bbf0: 64 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20  den/deleted but 
bc00: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74  there are no act
bc10: 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74  ive VMs, allow t
bc20: 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  he.  ** operatio
bc30: 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75  n to continue bu
bc40: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  t invalidate all
bc50: 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61   precompiled sta
bc60: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
bc70: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
bc80: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
bc90: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
bca0: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
bcb0: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20   0);.  if( p && 
bcc0: 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  (p->funcFlags & 
bcd0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d  SQLITE_FUNC_ENCM
bce0: 41 53 4b 29 3d 3d 65 6e 63 20 26 26 20 70 2d 3e  ASK)==enc && p->
bcf0: 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20  nArg==nArg ){.  
bd00: 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41    if( db->nVdbeA
bd10: 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73  ctive ){.      s
bd20: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
bd30: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
bd40: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
bd50: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75   delete/modify u
bd60: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65  ser-function due
bd70: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
bd80: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61  ments");.      a
bd90: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
bda0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
bdb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bdc0: 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
bdd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
bde0: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
bdf0: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
be00: 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  }.  }..  p = sql
be10: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
be20: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
be30: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
be40: 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20   (u8)enc, 1);.  
be50: 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e  assert(p || db->
be60: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20  mallocFailed);. 
be70: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
be80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
be90: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
bea0: 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   an older versio
beb0: 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  n of the functio
bec0: 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75  n with a configu
bed0: 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69  red destructor i
bee0: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70  s.  ** being rep
bef0: 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65  laced invoke the
bf00: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
bf10: 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tion here. */.  
bf20: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
bf30: 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70  db, p);..  if( p
bf40: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
bf50: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
bf60: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Ref++;.  }.  p->
bf70: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44  pDestructor = pD
bf80: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e  estructor;.  p->
bf90: 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e  funcFlags = (p->
bfa0: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
bfb0: 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29  TE_FUNC_ENCMASK)
bfc0: 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 20   | extraFlags;. 
bfd0: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 75   testcase( p->fu
bfe0: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
bff0: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29  _DETERMINISTIC )
c000: 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78  ;.  p->xFunc = x
c010: 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70  Func;.  p->xStep
c020: 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78   = xStep;.  p->x
c030: 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61  Finalize = xFina
c040: 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74  l;.  p->pUserDat
c050: 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20  a = pUserData;. 
c060: 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29   p->nArg = (u16)
c070: 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53  nArg;.  return S
c080: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c090: 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73  ** Create new us
c0a0: 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  er functions..*/
c0b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
c0c0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
c0d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
c0e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
c0f0: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
c100: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
c110: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  *p,.  void (*xFu
c120: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
c130: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
c140: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
c150: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
c160: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
c170: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
c180: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
c190: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
c1a0: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75  text*).){.  retu
c1b0: 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
c1c0: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
c1d0: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
c1e0: 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  nc, p, xFunc, xS
c1f0: 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tep,.           
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c210: 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c           xFinal,
c220: 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69   0);.}..int sqli
c230: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
c240: 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
c250: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
c260: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
c270: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
c280: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
c290: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
c2a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
c2b0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
c2c0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
c2d0: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
c2e0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
c2f0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
c300: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
c310: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
c320: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  ,.  void (*xDest
c330: 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a  roy)(void *).){.
c340: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c350: 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44  E_ERROR;.  FuncD
c360: 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20  estructor *pArg 
c370: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
c380: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
c390: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65  utex);.  if( xDe
c3a0: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72  stroy ){.    pAr
c3b0: 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63  g = (FuncDestruc
c3c0: 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  tor *)sqlite3DbM
c3d0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
c3e0: 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63  zeof(FuncDestruc
c3f0: 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  tor));.    if( !
c400: 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44  pArg ){.      xD
c410: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20  estroy(p);.     
c420: 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d   goto out;.    }
c430: 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74  .    pArg->xDest
c440: 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a  roy = xDestroy;.
c450: 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44      pArg->pUserD
c460: 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72  ata = p;.  }.  r
c470: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
c480: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c  eFunc(db, zFunc,
c490: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
c4a0: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
c4b0: 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66  nal, pArg);.  if
c4c0: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
c4d0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nRef==0 ){.    a
c4e0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
c4f0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73  E_OK );.    xDes
c500: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c  troy(p);.    sql
c510: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
c520: 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a  Arg);.  }.. out:
c530: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
c540: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
c550: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
c560: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
c570: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c580: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c590: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20  _OMIT_UTF16.int 
c5a0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
c5b0: 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  unction16(.  sql
c5c0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
c5d0: 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f  t void *zFunctio
c5e0: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
c5f0: 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  g,.  int eTextRe
c600: 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  p,.  void *p,.  
c610: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
c620: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
c630: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
c640: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
c650: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
c660: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
c670: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
c680: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
c690: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
c6a0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
c6b0: 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71  ar *zFunc8;.  sq
c6c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
c6d0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
c6e0: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
c6f0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
c700: 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55  Func8 = sqlite3U
c710: 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e  tf16to8(db, zFun
c720: 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53  ctionName, -1, S
c730: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
c740: 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  E);.  rc = sqlit
c750: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
c760: 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65   zFunc8, nArg, e
c770: 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46 75 6e  TextRep, p, xFun
c780: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
c790: 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ,0);.  sqlite3Db
c7a0: 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29  Free(db, zFunc8)
c7b0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
c7c0: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
c7d0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
c7e0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
c7f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
c800: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
c810: 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
c820: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
c830: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
c840: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
c850: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
c860: 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
c870: 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
c880: 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
c890: 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
c8a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
c8b0: 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
c8c0: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
c8d0: 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
c8e0: 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
c8f0: 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
c900: 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
c910: 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
c920: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
c930: 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
c940: 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
c950: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
c960: 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
c970: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
c980: 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
c990: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
c9a0: 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
c9b0: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
c9c0: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
c9d0: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
c9e0: 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
c9f0: 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
ca00: 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
ca10: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
ca20: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
ca30: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
ca40: 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
ca50: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
ca60: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
ca70: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
ca80: 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E_OK;.  sqlite3_
ca90: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
caa0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71  mutex);.  if( sq
cab0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
cac0: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  n(db, zName, nNa
cad0: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
cae0: 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a  _UTF8, 0)==0 ){.
caf0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cb00: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
cb10: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
cb20: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e      0, sqlite3In
cb50: 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  validFunction, 0
cb60: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
cb70: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
cb80: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
cb90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
cba0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
cbb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
cbc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cbd0: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65  T_TRACE./*.** Re
cbe0: 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66  gister a trace f
cbf0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
cc00: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
cc10: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
cc20: 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65  d trace.** is re
cc30: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
cc40: 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e  A NULL trace fun
cc50: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
cc60: 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65   no tracing is e
cc70: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
cc80: 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73  NULL.** trace is
cc90: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
cca0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
ccb0: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
ccc0: 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a  start of each.**
ccd0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
cce0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
ccf0: 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a  _trace(sqlite3 *
cd00: 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63  db, void (*xTrac
cd10: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
cd20: 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
cd30: 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  g){.  void *pOld
cd40: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
cd50: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
cd60: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
cd70: 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62  >pTraceArg;.  db
cd80: 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63  ->xTrace = xTrac
cd90: 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
cda0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
cdb0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
cdc0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
cdd0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a  eturn pOld;.}./*
cde0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70  .** Register a p
cdf0: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e  rofile function.
ce00: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
ce10: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
ce20: 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72  egistered .** pr
ce30: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69  ofile function i
ce40: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
ce50: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69  .** A NULL profi
ce60: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  le function mean
ce70: 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c  s that no profil
ce80: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
ce90: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
cea0: 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69  profile is a poi
ceb0: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
cec0: 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
ced0: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
cee0: 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20  sion of.** each 
cef0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68  SQL statement th
cf00: 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f  at is run..*/.vo
cf10: 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66  id *sqlite3_prof
cf20: 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ile(.  sqlite3 *
cf30: 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72  db,.  void (*xPr
cf40: 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  ofile)(void*,con
cf50: 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f  st char*,sqlite_
cf60: 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  uint64),.  void 
cf70: 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20  *pArg.){.  void 
cf80: 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  *pOld;.  sqlite3
cf90: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
cfa0: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
cfb0: 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72  = db->pProfileAr
cfc0: 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c  g;.  db->xProfil
cfd0: 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20  e = xProfile;.  
cfe0: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20  db->pProfileArg 
cff0: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
d000: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d010: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
d020: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69  rn pOld;.}.#endi
d030: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d040: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
d050: 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63   Register a func
d060: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
d070: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
d080: 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a  ction commits..*
d090: 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64  * If the invoked
d0a0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
d0b0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
d0c0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f   the commit beco
d0d0: 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63  mes a.** rollbac
d0e0: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  k..*/.void *sqli
d0f0: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
d100: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d120: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
d130: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
d140: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
d150: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
d160: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
d170: 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
d180: 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
d190: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
d1a0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
d1b0: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
d1c0: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
d1d0: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
d1e0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
d1f0: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
d200: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20  b->pCommitArg;. 
d210: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
d220: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
d230: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ;.  db->pCommitA
d240: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
d250: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
d260: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
d270: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f  eturn pOld;.}../
d280: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
d290: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
d2a0: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
d2b0: 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
d2c0: 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
d2d0: 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
d2e0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
d2f0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
d300: 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74  d *sqlite3_updat
d310: 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
d320: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
d330: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
d340: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
d350: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
d360: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
d370: 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  oid*,int,char co
d380: 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74  nst *,char const
d390: 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29   *,sqlite_int64)
d3a0: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d3c0: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
d3d0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
d3e0: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20    void *pRet;.  
d3f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
d400: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
d410: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70    pRet = db->pUp
d420: 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  dateArg;.  db->x
d430: 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
d440: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
d450: 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70  ->pUpdateArg = p
d460: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
d470: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
d480: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
d490: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
d4a0: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
d4b0: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
d4c0: 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
d4d0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
d4e0: 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68  ed.** back by th
d4f0: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
d500: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
d510: 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63  *sqlite3_rollbac
d520: 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  k_hook(.  sqlite
d530: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
d540: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
d550: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
d560: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
d570: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
d580: 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61  oid*), /* Callba
d590: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
d5a0: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
d5b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
d5c0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
d5d0: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
d5e0: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
d5f0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d600: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
d610: 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62  Ret = db->pRollb
d620: 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52  ackArg;.  db->xR
d630: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
d640: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
d650: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20  b->pRollbackArg 
d660: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
d670: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d680: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
d690: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
d6a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d6b0: 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  WAL./*.** The sq
d6c0: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
d6d0: 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
d6e0: 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ered by sqlite3_
d6f0: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
d700: 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20  nt()..** Invoke 
d710: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
d720: 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75  kpoint if the nu
d730: 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
d740: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a  n the log file.*
d750: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
d760: 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72  n sqlite3.pWalAr
d770: 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74  g cast to an int
d780: 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65 20  eger (the value 
d790: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a  configured by.**
d7a0: 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
d7b0: 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20  int())..*/ .int 
d7c0: 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
d7d0: 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70  tHook(.  void *p
d7e0: 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  ClientData,     
d7f0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20  /* Argument */. 
d800: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
d810: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
d820: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ction */.  const
d830: 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
d840: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f    /* Database */
d850: 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20  .  int nFrame   
d860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
d870: 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20  e of WAL */.){. 
d880: 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c   if( nFrame>=SQL
d890: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
d8a0: 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20  ClientData) ){. 
d8b0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
d8c0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
d8d0: 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63     sqlite3_wal_c
d8e0: 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44  heckpoint(db, zD
d8f0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  b);.    sqlite3E
d900: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
d910: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
d920: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
d930: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
d940: 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
d950: 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c  Configure an sql
d960: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
d970: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f  callback to auto
d980: 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70  matically checkp
d990: 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61  oint.** a databa
d9a0: 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74  se after committ
d9b0: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
d9c0: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
d9d0: 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65  Frame or.** more
d9e0: 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
d9f0: 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67  og file. Passing
da00: 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74   zero or a negat
da10: 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68 65  ive value as the
da20: 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d  .** nFrame param
da30: 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61 75  eter disables au
da40: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
da50: 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a  nts entirely..**
da60: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
da70: 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 74   registered by t
da80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70  his function rep
da90: 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74 69  laces any existi
daa0: 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72  ng callback.** r
dab0: 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 20  egistered using 
dac0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
dad0: 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65  (). Likewise, re
dae0: 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c  gistering a call
daf0: 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71  back.** using sq
db00: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
db10: 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 75   disables the au
db20: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
db30: 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20  nt mechanism.** 
db40: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68  configured by th
db50: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
db60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
db70: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73  autocheckpoint(s
db80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
db90: 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20  nFrame){.#ifdef 
dba0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
dbb0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
dbc0: 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44  ER(db);.  UNUSED
dbd0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d  _PARAMETER(nFram
dbe0: 65 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  e);.#else.  if( 
dbf0: 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20  nFrame>0 ){.    
dc00: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
dc10: 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44  (db, sqlite3WalD
dc20: 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49  efaultHook, SQLI
dc30: 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46  TE_INT_TO_PTR(nF
dc40: 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  rame));.  }else{
dc50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
dc60: 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b  _hook(db, 0, 0);
dc70: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
dc80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dc90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
dca0: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
dcb0: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
dcc0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
dcd0: 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  on is written.**
dce0: 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d   into the write-
dcf0: 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69  ahead-log by thi
dd00: 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
dd10: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
dd20: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
dd30: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd50: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
dd60: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
dd70: 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
dd80: 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f  t(*xCallback)(vo
dd90: 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  id *, sqlite3*, 
dda0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
ddb0: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  ),.  void *pArg 
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
dde0: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
ddf0: 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a   xCallback() */.
de00: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
de10: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69  E_OMIT_WAL.  voi
de20: 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
de30: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
de40: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
de50: 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b  t = db->pWalArg;
de60: 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62  .  db->xWalCallb
de70: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
de80: 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d  .  db->pWalArg =
de90: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
dea0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
deb0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
dec0: 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20  n pRet;.#else.  
ded0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
dee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70  .}../*.** Checkp
def0: 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44  oint database zD
df00: 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
df10: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
df20: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
df30: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
df40: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
df50: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  se handle */.  c
df60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
df80: 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68  * Name of attach
df90: 65 64 20 64 61 74 61 62 61 73 65 20 28 6f 72 20  ed database (or 
dfa0: 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65  NULL) */.  int e
dfb0: 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Mode,           
dfc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
dfd0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
dfe0: 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  * value */.  int
dff0: 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20   *pnLog,        
e000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e010: 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c  OUT: Size of WAL
e020: 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a   log in frames *
e030: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20  /.  int *pnCkpt 
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e050: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61      /* OUT: Tota
e060: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  l number of fram
e070: 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  es checkpointed 
e080: 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  */.){.#ifdef SQL
e090: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72  ITE_OMIT_WAL.  r
e0a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e0b0: 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
e0e0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
e0f0: 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41   iDb = SQLITE_MA
e100: 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20  X_ATTACHED;  /* 
e110: 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e  sqlite3.aDb[] in
e120: 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65  dex of db to che
e130: 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  ckpoint */..  /*
e140: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
e150: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
e160: 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61   to -1 in case a
e170: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
e180: 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29  */.  if( pnLog )
e190: 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20   *pnLog = -1;.  
e1a0: 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e  if( pnCkpt ) *pn
e1b0: 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73  Ckpt = -1;..  as
e1c0: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
e1d0: 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e 53 51 4c  CKPOINT_FULL>SQL
e1e0: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
e1f0: 41 53 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  ASSIVE );.  asse
e200: 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
e210: 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51 4c 49 54  POINT_FULL<SQLIT
e220: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
e230: 54 41 52 54 20 29 3b 0a 20 20 61 73 73 65 72 74  TART );.  assert
e240: 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
e250: 49 4e 54 5f 50 41 53 53 49 56 45 2b 32 3d 3d 53  INT_PASSIVE+2==S
e260: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
e270: 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20 69 66  _RESTART );.  if
e280: 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43  ( eMode<SQLITE_C
e290: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
e2a0: 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54  E || eMode>SQLIT
e2b0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
e2c0: 54 41 52 54 20 29 7b 0a 20 20 20 20 72 65 74 75  TART ){.    retu
e2d0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
e2e0: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
e2f0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
e300: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
e310: 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a  Db && zDb[0] ){.
e320: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
e330: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
e340: 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  zDb);.  }.  if( 
e350: 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  iDb<0 ){.    rc 
e360: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
e370: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e380: 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f  (db, SQLITE_ERRO
e390: 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  R, "unknown data
e3a0: 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b  base: %s", zDb);
e3b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
e3c0: 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70   = sqlite3Checkp
e3d0: 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65 4d  oint(db, iDb, eM
e3e0: 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
e3f0: 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pt);.    sqlite3
e400: 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
e410: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
e420: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
e430: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
e440: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
e450: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
e460: 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
e470: 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
e480: 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66  database zDb. If
e490: 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72   zDb is NULL, or
e4a0: 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a   if the buffer z
e4b0: 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  Db points.** to 
e4c0: 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d  contains a zero-
e4d0: 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20 61  length string, a
e4e0: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
e4f0: 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63 68  bases are .** ch
e500: 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69  eckpointed..*/.i
e510: 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  nt sqlite3_wal_c
e520: 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
e530: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
e540: 72 20 2a 7a 44 62 29 7b 0a 20 20 72 65 74 75 72  r *zDb){.  retur
e550: 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  n sqlite3_wal_ch
e560: 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20  eckpoint_v2(db, 
e570: 7a 44 62 2c 20 53 51 4c 49 54 45 5f 43 48 45 43  zDb, SQLITE_CHEC
e580: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20  KPOINT_PASSIVE, 
e590: 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  0, 0);.}..#ifnde
e5a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
e5b0: 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68  L./*.** Run a ch
e5c0: 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61  eckpoint on data
e5d0: 62 61 73 65 20 69 44 62 2e 20 54 68 69 73 20 69  base iDb. This i
e5e0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74  s a no-op if dat
e5f0: 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20  abase iDb is.** 
e600: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  not currently op
e610: 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a  en in WAL mode..
e620: 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
e630: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
e640: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
e650: 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65  eing checkpointe
e660: 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  d, this .** func
e670: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
e680: 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61  ITE_LOCKED and a
e690: 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e   checkpoint is n
e6a0: 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66  ot attempted. If
e6b0: 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63   .** an error oc
e6c0: 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69  curs while runni
e6d0: 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  ng the checkpoin
e6e0: 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  t, an SQLite err
e6f0: 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
e700: 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51  eturned (i.e. SQ
e710: 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68  LITE_IOERR). Oth
e720: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
e730: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  K..**.** The mut
e740: 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ex on database h
e750: 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20  andle db should 
e760: 62 65 20 68 65 6c 64 20 62 79 20 74 68 65 20 63  be held by the c
e770: 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78  aller. The mutex
e780: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
e790: 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 63  ith the specific
e7a0: 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68   b-tree being ch
e7b0: 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61  eckpointed is ta
e7c0: 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66  ken by.** this f
e7d0: 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68  unction while th
e7e0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  e checkpoint is 
e7f0: 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  running..**.** I
e800: 66 20 69 44 62 20 69 73 20 70 61 73 73 65 64 20  f iDb is passed 
e810: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
e820: 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74  HED, then all at
e830: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
e840: 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69   are.** checkpoi
e850: 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  nted. If an erro
e860: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
e870: 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20   it is returned 
e880: 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a  immediately -.**
e890: 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   no attempt is m
e8a0: 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e  ade to checkpoin
e8b0: 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20  t any remaining 
e8c0: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a  databases..**.**
e8d0: 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
e8e0: 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   is one of SQLIT
e8f0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
e900: 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45  SIVE, FULL or RE
e910: 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  START..*/.int sq
e920: 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
e930: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
e940: 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c   iDb, int eMode,
e950: 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74   int *pnLog, int
e960: 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74   *pnCkpt){.  int
e970: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e990: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
e9a0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9c0: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
e9d0: 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74 61  ate through atta
e9e0: 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e  ched dbs */.  in
e9f0: 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20 20  t bBusy = 0;    
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ea10: 20 54 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f   True if SQLITE_
ea20: 42 55 53 59 20 68 61 73 20 62 65 65 6e 20 65 6e  BUSY has been en
ea30: 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20  countered */..  
ea40: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
ea50: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
ea60: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
ea70: 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e  t( !pnLog || *pn
ea80: 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73  Log==-1 );.  ass
ea90: 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20  ert( !pnCkpt || 
eaa0: 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a  *pnCkpt==-1 );..
eab0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
eac0: 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49  >nDb && rc==SQLI
ead0: 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
eae0: 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69   if( i==iDb || i
eaf0: 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41  Db==SQLITE_MAX_A
eb00: 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20  TTACHED ){.     
eb10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
eb20: 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d  eeCheckpoint(db-
eb30: 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f  >aDb[i].pBt, eMo
eb40: 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70  de, pnLog, pnCkp
eb50: 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20  t);.      pnLog 
eb60: 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70  = 0;.      pnCkp
eb70: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
eb80: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
eb90: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75 73   ){.        bBus
eba0: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  y = 1;.        r
ebb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ebc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ebd0: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
ebe0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42 75  SQLITE_OK && bBu
ebf0: 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  sy) ? SQLITE_BUS
ec00: 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  Y : rc;.}.#endif
ec10: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
ec20: 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  WAL */../*.** Th
ec30: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
ec40: 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e  rns true if main
ec50: 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62  -memory should b
ec60: 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
ec70: 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  f.** a temporary
ec80: 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69   file for transi
ec90: 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73 20  ent pager files 
eca0: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  and statement jo
ecb0: 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76  urnals..** The v
ecc0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64 65  alue returned de
ecd0: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
ece0: 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73  ue of db->temp_s
ecf0: 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a  tore (runtime.**
ed00: 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20   parameter) and 
ed10: 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  the compile time
ed20: 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45   value of SQLITE
ed30: 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65  _TEMP_STORE. The
ed40: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  .** following ta
ed50: 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
ed60: 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62  e relationship b
ed70: 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f  etween these two
ed80: 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74   values.** and t
ed90: 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  his functions re
eda0: 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  turn value..**.*
edb0: 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  *   SQLITE_TEMP_
edc0: 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65  STORE     db->te
edd0: 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63  mp_store     Loc
ede0: 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61  ation of tempora
edf0: 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  ry database.**  
ee00: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
ee10: 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
ee20: 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
ee30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20  --------.**   0 
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee60: 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
ee70: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
ee80: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
ee90: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
eea0: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
eeb0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
eec0: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
eed0: 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
eee0: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
ef00: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
ef10: 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef40: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
ef50: 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef70: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
ef80: 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
ef90: 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20  turn 0).**   2  
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efb0: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
efc0: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
efd0: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
efe0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
eff0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
f000: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
f010: 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
f020: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
f030: 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20           any    
f040: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
f050: 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
f060: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
f070: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73  empInMemory(cons
f080: 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t sqlite3 *db){.
f090: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
f0a0: 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72  STORE==1.  retur
f0b0: 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
f0c0: 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  re==2 );.#endif.
f0d0: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
f0e0: 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72  STORE==2.  retur
f0f0: 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
f100: 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a  re!=1 );.#endif.
f110: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
f120: 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74 75 72  STORE==3.  retur
f130: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  n 1;.#endif.#if 
f140: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
f150: 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45  E<1 || SQLITE_TE
f160: 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72 65 74  MP_STORE>3.  ret
f170: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
f180: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
f190: 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  F-8 encoded Engl
f1a0: 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
f1b0: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
f1c0: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
f1d0: 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  rror..*/.const c
f1e0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
f1f0: 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29  msg(sqlite3 *db)
f200: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
f210: 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
f220: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
f230: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
f240: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66  NOMEM);.  }.  if
f250: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
f260: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
f270: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
f280: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
f290: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
f2a0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
f2b0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
f2c0: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
f2d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f2e0: 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  ){.    z = sqlit
f2f0: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
f300: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b  NOMEM);.  }else{
f310: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64  .    testcase( d
f320: 62 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20  b->pErr==0 );.  
f330: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c    z = (char*)sql
f340: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
f350: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61  db->pErr);.    a
f360: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
f370: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
f380: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
f390: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72    z = sqlite3Err
f3a0: 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29  Str(db->errCode)
f3b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
f3c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
f3d0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
f3e0: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66  return z;.}..#if
f3f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f400: 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74  _UTF16./*.** Ret
f410: 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64  urn UTF-16 encod
f420: 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  ed English langu
f430: 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  age explanation 
f440: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
f450: 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a  nt.** error..*/.
f460: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
f470: 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c  te3_errmsg16(sql
f480: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61  ite3 *db){.  sta
f490: 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75  tic const u16 ou
f4a0: 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20  tOfMem[] = {.   
f4b0: 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20   'o', 'u', 't', 
f4c0: 27 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27  ' ', 'o', 'f', '
f4d0: 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d   ', 'm', 'e', 'm
f4e0: 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27  ', 'o', 'r', 'y'
f4f0: 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69  , 0.  };.  stati
f500: 63 20 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75  c const u16 misu
f510: 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27  se[] = {.    'l'
f520: 2c 20 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c  , 'i', 'b', 'r',
f530: 20 27 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20   'a', 'r', 'y', 
f540: 27 20 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27  ' ', .    'r', '
f550: 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69  o', 'u', 't', 'i
f560: 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27  ', 'n', 'e', ' '
f570: 2c 20 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c  , .    'c', 'a',
f580: 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20   'l', 'l', 'e', 
f590: 27 64 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'd', ' ', .    '
f5a0: 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20  o', 'u', 't', ' 
f5b0: 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27  ', .    'o', 'f'
f5c0: 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c  , ' ', .    's',
f5d0: 20 27 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20   'e', 'q', 'u', 
f5e0: 27 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27  'e', 'n', 'c', '
f5f0: 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f  e', 0.  };..  co
f600: 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69  nst void *z;.  i
f610: 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65  f( !db ){.    re
f620: 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74  turn (void *)out
f630: 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28  OfMem;.  }.  if(
f640: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
f650: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
f660: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
f670: 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20  void *)misuse;. 
f680: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
f690: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
f6a0: 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ex);.  if( db->m
f6b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
f6c0: 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f     z = (void *)o
f6d0: 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65  utOfMem;.  }else
f6e0: 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  {.    z = sqlite
f6f0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64  3_value_text16(d
f700: 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66  b->pErr);.    if
f710: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
f720: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
f730: 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71   db->errCode, sq
f740: 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e  lite3ErrStr(db->
f750: 65 72 72 43 6f 64 65 29 29 3b 0a 20 20 20 20 20  errCode));.     
f760: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
f770: 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
f780: 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rr);.    }.    /
f790: 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79  * A malloc() may
f7a0: 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 69 74   have failed wit
f7b0: 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hin the call to 
f7c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
f7d0: 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62  xt16().    ** ab
f7e0: 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ove. If this is 
f7f0: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
f800: 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
f810: 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74  led flag needs t
f820: 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61  o.    ** be clea
f830: 72 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  red before retur
f840: 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69  ning. Do this di
f850: 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20  rectly, instead 
f860: 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71  of via.    ** sq
f870: 6c 69 74 65 33 41 70 69 45 78 69 74 28 29 2c 20  lite3ApiExit(), 
f880: 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67  to avoid setting
f890: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
f8a0: 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61  ndle error messa
f8b0: 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ge..    */.    d
f8c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f8d0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
f8e0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
f8f0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
f900: 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
f910: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
f920: 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
f930: 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72  eturn the most r
f940: 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ecent error code
f950: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e   generated by an
f960: 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e   SQLite routine.
f970: 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70   If NULL is.** p
f980: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
f990: 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d  nction, we assum
f9a0: 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  e a malloc() fai
f9b0: 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74  led during sqlit
f9c0: 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e  e3_open()..*/.in
f9d0: 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  t sqlite3_errcod
f9e0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
f9f0: 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c    if( db && !sql
fa00: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
fa10: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
fa20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fa30: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
fa40: 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64  }.  if( !db || d
fa50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
fa60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
fa70: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
fa80: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72    return db->err
fa90: 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61  Code & db->errMa
faa0: 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  sk;.}.int sqlite
fab0: 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
fac0: 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  de(sqlite3 *db){
fad0: 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71  .  if( db && !sq
fae0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
faf0: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
fb00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fb10: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
fb20: 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20   }.  if( !db || 
fb30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
fb40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
fb50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
fb60: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72  .  return db->er
fb70: 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rCode;.}../*.** 
fb80: 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  Return a string 
fb90: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
fba0: 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  he kind of error
fbb0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
fbc0: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20  e.** argument.  
fbd0: 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20 73 69  For now, this si
fbe0: 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68 65 20 69  mply calls the i
fbf0: 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74 65 33 45  nternal sqlite3E
fc00: 72 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74  rrStr().** funct
fc10: 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ion..*/.const ch
fc20: 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 73  ar *sqlite3_errs
fc30: 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 72 65  tr(int rc){.  re
fc40: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53  turn sqlite3ErrS
fc50: 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tr(rc);.}../*.**
fc60: 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   Invalidate all 
fc70: 63 61 63 68 65 64 20 4b 65 79 49 6e 66 6f 20 6f  cached KeyInfo o
fc80: 62 6a 65 63 74 73 20 66 6f 72 20 64 61 74 61 62  bjects for datab
fc90: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22  ase connection "
fca0: 64 62 22 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  db".*/.static vo
fcb0: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 43 61 63  id invalidateCac
fcc0: 68 65 64 4b 65 79 49 6e 66 6f 28 73 71 6c 69 74  hedKeyInfo(sqlit
fcd0: 65 33 20 2a 64 62 29 7b 0a 20 20 44 62 20 2a 70  e3 *db){.  Db *p
fce0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
fcf0: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
fd00: 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
fd10: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
fd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fd30: 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
fd40: 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 48  ex number */.  H
fd50: 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
fd60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
fd70: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
fd80: 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a  ables in pDb */.
fd90: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
fda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fdb0: 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
fdc0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e  database */.  In
fdd0: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
fde0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 61 63            /* Eac
fdf0: 68 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 66 6f  h index */..  fo
fe00: 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d  r(iDb=0, pDb=db-
fe10: 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  >aDb; iDb<db->nD
fe20: 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29  b; iDb++, pDb++)
fe30: 7b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  {.    if( pDb->p
fe40: 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  Bt==0 ) continue
fe50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
fe60: 65 65 45 6e 74 65 72 28 70 44 62 2d 3e 70 42 74  eeEnter(pDb->pBt
fe70: 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c  );.    for(k=sql
fe80: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44  iteHashFirst(&pD
fe90: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
fea0: 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69  ash);  k; k=sqli
feb0: 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a  teHashNext(k)){.
fec0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
fed0: 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
fee0: 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 66 6f  ata(k);.      fo
fef0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
ff00: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
ff10: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
ff20: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
ff30: 70 4b 65 79 49 6e 66 6f 20 26 26 20 70 49 64 78  pKeyInfo && pIdx
ff40: 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d  ->pKeyInfo->db==
ff50: 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  db ){.          
ff60: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
ff70: 72 65 66 28 70 49 64 78 2d 3e 70 4b 65 79 49 6e  ref(pIdx->pKeyIn
ff80: 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  fo);.          p
ff90: 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Idx->pKeyInfo = 
ffa0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
ffb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
ffc0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
ffd0: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a  (pDb->pBt);.  }.
ffe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
fff0: 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20  a new collating 
10000 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74  function for dat
10010 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65  abase "db".  The
10020 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a   name is zName.*
10030 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69  * and the encodi
10040 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74  ng is enc..*/.st
10050 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43  atic int createC
10060 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69  ollation(.  sqli
10070 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74  te3* db,.  const
10080 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
10090 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a   u8 enc,.  void*
100a0 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
100b0 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
100c0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
100d0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
100e0 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
100f0 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  id*).){.  CollSe
10100 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
10110 65 6e 63 32 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  enc2;.  int nNam
10120 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
10130 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20  n30(zName);.  . 
10140 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10150 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
10160 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
10170 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  If SQLITE_UTF16 
10180 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
10190 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  the encoding typ
101a0 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69  e, transform thi
101b0 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66  s.  ** to one of
101c0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
101d0 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  or SQLITE_UTF16B
101e0 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  E using the.  **
101f0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
10200 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54  IVE macro. SQLIT
10210 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75  E_UTF16 is not u
10220 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  sed internally..
10230 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e    */.  enc2 = en
10240 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65  c;.  testcase( e
10250 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
10260 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6 );.  testcase(
10270 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
10280 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20  F16_ALIGNED );. 
10290 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54   if( enc2==SQLIT
102a0 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d  E_UTF16 || enc2=
102b0 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  =SQLITE_UTF16_AL
102c0 49 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63  IGNED ){.    enc
102d0 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  2 = SQLITE_UTF16
102e0 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66  NATIVE;.  }.  if
102f0 28 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54  ( enc2<SQLITE_UT
10300 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54  F8 || enc2>SQLIT
10310 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20  E_UTF16BE ){.   
10320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
10330 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
10340 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
10350 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f  his call is remo
10360 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e  ving or replacin
10370 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f  g an existing co
10380 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65  llation .  ** se
10390 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61  quence. If so, a
103a0 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74  nd there are act
103b0 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20  ive VMs, return 
103c0 62 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20  busy. If there. 
103d0 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76   ** are no activ
103e0 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74  e VMs, invalidat
103f0 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c  e any pre-compil
10400 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
10410 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   */.  pColl = sq
10420 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
10430 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
10440 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Name, 0);.  if( 
10450 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e  pColl && pColl->
10460 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20  xCmp ){.    if( 
10470 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
10480 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10490 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
104a0 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20  _BUSY, .        
104b0 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74  "unable to delet
104c0 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69  e/modify collati
104d0 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20  on sequence due 
104e0 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  to active statem
104f0 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65  ents");.      re
10500 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
10510 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10520 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
10530 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
10540 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43  .    invalidateC
10550 61 63 68 65 64 4b 65 79 49 6e 66 6f 28 64 62 29  achedKeyInfo(db)
10560 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c  ;..    /* If col
10570 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
10580 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65  pColl was create
10590 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 61 20  d directly by a 
105a0 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
105b0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
105c0 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74  llation, and not
105d0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 73 79   generated by sy
105e0 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20  nthCollSeq(),.  
105f0 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f    ** then any co
10600 70 69 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e  pies made by syn
10610 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64  thCollSeq() need
10620 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74   to be invalidat
10630 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c  ed..    ** Also,
10640 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72   collation destr
10650 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e  uctor - CollSeq.
10660 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f  xDel() - functio
10670 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a  n may need.    *
10680 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a  * to be called..
10690 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20      */ .    if( 
106a0 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53  (pColl->enc & ~S
106b0 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
106c0 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20  NED)==enc2 ){.  
106d0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f      CollSeq *aCo
106e0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ll = sqlite3Hash
106f0 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  Find(&db->aCollS
10700 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  eq, zName, nName
10710 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
10720 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
10730 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
10740 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26    CollSeq *p = &
10750 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
10760 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43    if( p->enc==pC
10770 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
10780 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65        if( p->xDe
10790 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
107a0 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65   p->xDel(p->pUse
107b0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
107c0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d            p->xCm
107d0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  p = 0;.        }
107e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
107f0 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   }..  pColl = sq
10800 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
10810 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
10820 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20  Name, 1);.  if( 
10830 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  pColl==0 ) retur
10840 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
10850 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20    pColl->xCmp = 
10860 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c  xCompare;.  pCol
10870 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b  l->pUser = pCtx;
10880 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d  .  pColl->xDel =
10890 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e   xDel;.  pColl->
108a0 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20  enc = (u8)(enc2 
108b0 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f  | (enc & SQLITE_
108c0 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b  UTF16_ALIGNED));
108d0 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
108e0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
108f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10900 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
10910 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69   This array defi
10920 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62  nes hard upper b
10930 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76  ounds on limit v
10940 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69  alues.  The.** i
10950 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20  nitializer must 
10960 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20  be kept in sync 
10970 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
10980 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69  LIMIT_*.** #defi
10990 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  nes in sqlite3.h
109a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
109b0 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74  t int aHardLimit
109c0 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f  [] = {.  SQLITE_
109d0 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  MAX_LENGTH,.  SQ
109e0 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
109f0 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
10a00 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49  X_COLUMN,.  SQLI
10a10 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
10a20 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
10a30 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c  COMPOUND_SELECT,
10a40 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  .  SQLITE_MAX_VD
10a50 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f  BE_OP,.  SQLITE_
10a60 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
10a70 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  ,.  SQLITE_MAX_A
10a80 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54  TTACHED,.  SQLIT
10a90 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
10aa0 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  RN_LENGTH,.  SQL
10ab0 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
10ac0 5f 4e 55 4d 42 45 52 2c 0a 20 20 53 51 4c 49 54  _NUMBER,.  SQLIT
10ad0 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
10ae0 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d  PTH,.};../*.** M
10af0 61 6b 65 20 73 75 72 65 20 74 68 65 20 68 61 72  ake sure the har
10b00 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74  d limits are set
10b10 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76   to reasonable v
10b20 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c  alues.*/.#if SQL
10b30 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31  ITE_MAX_LENGTH<1
10b40 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
10b50 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73  E_MAX_LENGTH mus
10b60 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
10b70 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
10b80 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
10b90 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53  TH<100.# error S
10ba0 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
10bb0 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
10bc0 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
10bd0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
10be0 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54  SQL_LENGTH>SQLIT
10bf0 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65  E_MAX_LENGTH.# e
10c00 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
10c10 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  SQL_LENGTH must 
10c20 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72 20 74  not be greater t
10c30 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  han SQLITE_MAX_L
10c40 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66  ENGTH.#endif.#if
10c50 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
10c60 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20  OUND_SELECT<2.# 
10c70 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
10c80 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
10c90 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
10ca0 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 2.#endif.#if S
10cb0 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
10cc0 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  P<40.# error SQL
10cd0 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20  ITE_MAX_VDBE_OP 
10ce0 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
10cf0 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   40.#endif.#if S
10d00 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
10d10 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49  ON_ARG<0 || SQLI
10d20 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
10d30 41 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f 72  ARG>1000.# error
10d40 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
10d50 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65  TION_ARG must be
10d60 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31   between 0 and 1
10d70 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  000.#endif.#if S
10d80 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
10d90 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  ED<0 || SQLITE_M
10da0 41 58 5f 41 54 54 41 43 48 45 44 3e 36 32 0a 23  AX_ATTACHED>62.#
10db0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
10dc0 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74 20  X_ATTACHED must 
10dd0 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
10de0 20 36 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   62.#endif.#if S
10df0 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
10e00 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a  ATTERN_LENGTH<1.
10e10 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
10e20 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
10e30 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
10e40 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66  t least 1.#endif
10e50 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
10e60 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65  COLUMN>32767.# e
10e70 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
10e80 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20  COLUMN must not 
10e90 65 78 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e  exceed 32767.#en
10ea0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
10eb0 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
10ec0 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <1.# error SQLIT
10ed0 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
10ee0 50 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  PTH must be at l
10ef0 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 0a 0a  east 1.#endif...
10f00 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
10f10 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69   value of a limi
10f20 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f  t.  Report the o
10f30 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20  ld value..** If 
10f40 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74  an invalid limit
10f50 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69   index is suppli
10f60 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a  ed, report -1..*
10f70 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
10f80 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f  s but still repo
10f90 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  rt the old value
10fa0 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c   if the.** new l
10fb0 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
10fc0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f  ..**.** A new lo
10fd0 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e  wer limit does n
10fe0 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69  ot shrink existi
10ff0 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a  ng constructs..*
11000 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76  * It merely prev
11010 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75  ents new constru
11020 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64 20  cts that exceed 
11030 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f  the limit.** fro
11040 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e  m forming..*/.in
11050 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28  t sqlite3_limit(
11060 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
11070 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65   limitId, int ne
11080 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f  wLimit){.  int o
11090 6c 64 4c 69 6d 69 74 3b 0a 0a 0a 20 20 2f 2a 20  ldLimit;...  /* 
110a0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
110b0 30 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65  0189-54097 For e
110c0 61 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f  ach limit catego
110d0 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  ry SQLITE_LIMIT_
110e0 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20  NAME.  ** there 
110f0 69 73 20 61 20 68 61 72 64 20 75 70 70 65 72 20  is a hard upper 
11100 62 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d  bound set at com
11110 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43  pile-time by a C
11120 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20   preprocessor.  
11130 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20  ** macro called 
11140 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e  SQLITE_MAX_NAME.
11150 20 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20   (The "_LIMIT_" 
11160 69 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63  in the name is c
11170 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22  hanged to.  ** "
11180 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20  _MAX_".).  */.  
11190 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
111a0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
111b0 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  LENGTH]==SQLITE_
111c0 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  MAX_LENGTH );.  
111d0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
111e0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
111f0 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c  SQL_LENGTH]==SQL
11200 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
11210 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
11220 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
11230 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d  E_LIMIT_COLUMN]=
11240 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55  =SQLITE_MAX_COLU
11250 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  MN );.  assert( 
11260 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
11270 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
11280 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
11290 45 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20  EXPR_DEPTH );.  
112a0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
112b0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
112c0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d  COMPOUND_SELECT]
112d0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  ==SQLITE_MAX_COM
112e0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20  POUND_SELECT);. 
112f0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
11300 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
11310 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54  _VDBE_OP]==SQLIT
11320 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b  E_MAX_VDBE_OP );
11330 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
11340 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
11350 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d  IT_FUNCTION_ARG]
11360 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  ==SQLITE_MAX_FUN
11370 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61  CTION_ARG );.  a
11380 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
11390 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41  t[SQLITE_LIMIT_A
113a0 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45  TTACHED]==SQLITE
113b0 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b  _MAX_ATTACHED );
113c0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
113d0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
113e0 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
113f0 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20  LENGTH]==.      
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11420 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
11430 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
11440 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
11450 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
11460 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
11470 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53  IABLE_NUMBER]==S
11480 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
11490 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73  LE_NUMBER);.  as
114a0 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
114b0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52  [SQLITE_LIMIT_TR
114c0 49 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51  IGGER_DEPTH]==SQ
114d0 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
114e0 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
114f0 72 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  rt( SQLITE_LIMIT
11500 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3d 3d  _TRIGGER_DEPTH==
11510 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d  (SQLITE_N_LIMIT-
11520 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69  1) );...  if( li
11530 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74  mitId<0 || limit
11540 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d  Id>=SQLITE_N_LIM
11550 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  IT ){.    return
11560 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69   -1;.  }.  oldLi
11570 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74  mit = db->aLimit
11580 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28  [limitId];.  if(
11590 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20   newLimit>=0 ){ 
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37    /* IMP: R-5247
115c0 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69  6-28732 */.    i
115d0 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72  f( newLimit>aHar
115e0 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20  dLimit[limitId] 
115f0 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69  ){.      newLimi
11600 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c  t = aHardLimit[l
11610 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50  imitId];  /* IMP
11620 3a 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20  : R-51463-25634 
11630 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  */.    }.    db-
11640 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
11650 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d   = newLimit;.  }
11660 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d  .  return oldLim
11670 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
11680 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
11690 52 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f  R-53341-35419 */
116a0 0a 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  .}.#if defined(S
116b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 55 54  QLITE_ENABLE_AUT
116c0 4f 5f 50 52 4f 46 49 4c 45 29 0a 2f 2a 20 73 74  O_PROFILE)./* st
116d0 64 65 72 72 20 6c 6f 67 67 69 6e 67 20 2a 2f 0a  derr logging */.
116e0 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74  void _sqlite_aut
116f0 6f 5f 70 72 6f 66 69 6c 65 28 76 6f 69 64 20 2a  o_profile(void *
11700 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  aux, const char 
11710 2a 73 71 6c 2c 20 75 36 34 20 6e 73 29 3b 0a 76  *sql, u64 ns);.v
11720 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f  oid _sqlite_auto
11730 5f 74 72 61 63 65 28 76 6f 69 64 20 2a 61 75 78  _trace(void *aux
11740 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  , const char *sq
11750 6c 29 3b 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65  l);.void _sqlite
11760 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65 28 76 6f  _auto_profile(vo
11770 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63  id *aux, const c
11780 68 61 72 20 2a 73 71 6c 2c 20 75 36 34 20 6e 73  har *sql, u64 ns
11790 29 20 7b 0a 23 70 72 61 67 6d 61 20 75 6e 75 73  ) {.#pragma unus
117a0 65 64 28 61 75 78 29 0a 09 66 70 72 69 6e 74 66  ed(aux)..fprintf
117b0 28 73 74 64 65 72 72 2c 20 22 51 75 65 72 79 3a  (stderr, "Query:
117c0 20 25 73 5c 6e 20 45 78 65 63 75 74 69 6f 6e 20   %s\n Execution 
117d0 54 69 6d 65 3a 20 25 6c 6c 75 20 6d 73 5c 6e 22  Time: %llu ms\n"
117e0 2c 20 73 71 6c 2c 20 6e 73 20 2f 20 31 30 30 30  , sql, ns / 1000
117f0 30 30 30 29 3b 0a 7d 0a 76 6f 69 64 20 5f 73 71  000);.}.void _sq
11800 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 28  lite_auto_trace(
11810 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74  void *aux, const
11820 20 63 68 61 72 20 2a 73 71 6c 29 20 7b 0a 09 66   char *sql) {..f
11830 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
11840 54 72 61 63 65 53 51 4c 28 25 70 29 3a 20 25 73  TraceSQL(%p): %s
11850 5c 6e 22 2c 20 61 75 78 2c 20 73 71 6c 29 3b 0a  \n", aux, sql);.
11860 7d 0a 0a 2f 2a 20 73 79 73 6c 6f 67 20 6c 6f 67  }../* syslog log
11870 67 69 6e 67 20 2a 2f 0a 23 69 6e 63 6c 75 64 65  ging */.#include
11880 20 3c 61 73 6c 2e 68 3e 0a 73 74 61 74 69 63 20   <asl.h>.static 
11890 61 73 6c 63 6c 69 65 6e 74 20 61 75 74 6f 6c 6f  aslclient autolo
118a0 67 5f 63 6c 69 65 6e 74 20 3d 20 4e 55 4c 4c 3b  g_client = NULL;
118b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 63 6c  .static void _cl
118c0 6f 73 65 5f 61 73 6c 5f 6c 6f 67 28 29 20 7b 0a  ose_asl_log() {.
118d0 20 20 69 66 28 20 4e 55 4c 4c 21 3d 61 75 74 6f    if( NULL!=auto
118e0 6c 6f 67 5f 63 6c 69 65 6e 74 20 29 7b 0a 20 20  log_client ){.  
118f0 20 20 61 73 6c 5f 63 6c 6f 73 65 28 61 75 74 6f    asl_close(auto
11900 6c 6f 67 5f 63 6c 69 65 6e 74 29 3b 0a 20 20 20  log_client);.   
11910 20 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20   autolog_client 
11920 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 73 74  = NULL;.  }.}.st
11930 61 74 69 63 20 76 6f 69 64 20 5f 6f 70 65 6e 5f  atic void _open_
11940 61 73 6c 5f 6c 6f 67 28 29 20 7b 0a 20 20 69 66  asl_log() {.  if
11950 28 20 4e 55 4c 4c 3d 3d 61 75 74 6f 6c 6f 67 5f  ( NULL==autolog_
11960 63 6c 69 65 6e 74 20 29 7b 0a 20 20 20 20 61 75  client ){.    au
11970 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 3d 20 61  tolog_client = a
11980 73 6c 5f 6f 70 65 6e 28 22 53 51 4c 69 74 65 22  sl_open("SQLite"
11990 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20  , NULL, 0);.    
119a0 61 74 65 78 69 74 28 5f 63 6c 6f 73 65 5f 61 73  atexit(_close_as
119b0 6c 5f 6c 6f 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 76  l_log);.  }.}..v
119c0 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f  oid _sqlite_auto
119d0 5f 70 72 6f 66 69 6c 65 5f 73 79 73 6c 6f 67 28  _profile_syslog(
119e0 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74  void *aux, const
119f0 20 63 68 61 72 20 2a 73 71 6c 2c 20 75 36 34 20   char *sql, u64 
11a00 6e 73 29 3b 0a 76 6f 69 64 20 5f 73 71 6c 69 74  ns);.void _sqlit
11a10 65 5f 61 75 74 6f 5f 74 72 61 63 65 5f 73 79 73  e_auto_trace_sys
11a20 6c 6f 67 28 76 6f 69 64 20 2a 61 75 78 2c 20 63  log(void *aux, c
11a30 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 29 3b  onst char *sql);
11a40 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75  .void _sqlite_au
11a50 74 6f 5f 70 72 6f 66 69 6c 65 5f 73 79 73 6c 6f  to_profile_syslo
11a60 67 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e  g(void *aux, con
11a70 73 74 20 63 68 61 72 20 2a 73 71 6c 2c 20 75 36  st char *sql, u6
11a80 34 20 6e 73 29 20 7b 0a 23 70 72 61 67 6d 61 20  4 ns) {.#pragma 
11a90 75 6e 75 73 65 64 28 61 75 78 29 0a 09 61 73 6c  unused(aux)..asl
11aa0 5f 6c 6f 67 28 61 75 74 6f 6c 6f 67 5f 63 6c 69  _log(autolog_cli
11ab0 65 6e 74 2c 20 4e 55 4c 4c 2c 20 41 53 4c 5f 4c  ent, NULL, ASL_L
11ac0 45 56 45 4c 5f 4e 4f 54 49 43 45 2c 20 22 51 75  EVEL_NOTICE, "Qu
11ad0 65 72 79 3a 20 25 73 5c 6e 20 45 78 65 63 75 74  ery: %s\n Execut
11ae0 69 6f 6e 20 54 69 6d 65 3a 20 25 6c 6c 75 20 6d  ion Time: %llu m
11af0 73 5c 6e 22 2c 20 73 71 6c 2c 20 6e 73 20 2f 20  s\n", sql, ns / 
11b00 31 30 30 30 30 30 30 29 3b 0a 7d 0a 76 6f 69 64  1000000);.}.void
11b10 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72   _sqlite_auto_tr
11b20 61 63 65 5f 73 79 73 6c 6f 67 28 76 6f 69 64 20  ace_syslog(void 
11b30 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72  *aux, const char
11b40 20 2a 73 71 6c 29 20 7b 0a 09 61 73 6c 5f 6c 6f   *sql) {..asl_lo
11b50 67 28 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74  g(autolog_client
11b60 2c 20 4e 55 4c 4c 2c 20 41 53 4c 5f 4c 45 56 45  , NULL, ASL_LEVE
11b70 4c 5f 4e 4f 54 49 43 45 2c 20 22 54 72 61 63 65  L_NOTICE, "Trace
11b80 53 51 4c 28 25 70 29 3a 20 25 73 5c 6e 22 2c 20  SQL(%p): %s\n", 
11b90 61 75 78 2c 20 73 71 6c 29 3b 0a 7d 0a 23 65 6e  aux, sql);.}.#en
11ba0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
11bb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
11bc0 20 74 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55   to parse both U
11bd0 52 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20  RIs and non-URI 
11be0 66 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64  filenames passed
11bf0 20 62 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20   by the.** user 
11c00 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73  to API functions
11c10 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20   sqlite3_open() 
11c20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  or sqlite3_open_
11c30 76 32 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61  v2(), and for da
11c40 74 61 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73  tabase.** URIs s
11c50 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74  pecified as part
11c60 20 6f 66 20 41 54 54 41 43 48 20 73 74 61 74 65   of ATTACH state
11c70 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ments..**.** The
11c80 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
11c90 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
11ca0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
11cb0 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 28  the VFS to use (
11cc0 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20  or.** a NULL to 
11cd0 73 69 67 6e 69 66 79 20 74 68 65 20 64 65 66 61  signify the defa
11ce0 75 6c 74 20 56 46 53 29 20 69 66 20 74 68 65 20  ult VFS) if the 
11cf0 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  URI does not con
11d00 74 61 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22  tain a "vfs=xxx"
11d10 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65  .** query parame
11d20 74 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ter. The second 
11d30 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e  argument contain
11d40 73 20 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f  s the URI (or no
11d50 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a  n-URI filename).
11d60 2a 2a 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20  ** itself. When 
11d70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
11d80 20 63 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c   called the *pFl
11d90 61 67 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f  ags variable sho
11da0 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74  uld contain.** t
11db0 68 65 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73  he default flags
11dc0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74   to open the dat
11dd0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74  abase handle wit
11de0 68 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f  h. The value sto
11df0 72 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67  red in.** *pFlag
11e00 73 20 6d 61 79 20 62 65 20 75 70 64 61 74 65 64  s may be updated
11e10 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
11e20 67 20 69 66 20 74 68 65 20 55 52 49 20 66 69 6c  g if the URI fil
11e30 65 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a  ename contains .
11e40 2a 2a 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f  ** "cache=xxx" o
11e50 72 20 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65  r "mode=xxx" que
11e60 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a  ry parameters..*
11e70 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
11e80 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
11e90 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
11ea0 69 73 20 63 61 73 65 20 2a 70 70 56 66 73 20 69  is case *ppVfs i
11eb0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
11ec0 6f 0a 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61  o.** the VFS tha
11ed0 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
11ee0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74   to open the dat
11ef0 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46  abase file. *pzF
11f00 69 6c 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  ile is set to.**
11f10 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
11f20 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
11f30 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
11f40 6c 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69  le to open. It i
11f50 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
11f60 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
11f70 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
11f80 61 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65  ally call sqlite
11f90 33 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65  3_free() to rele
11fa0 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66  ase.** this buff
11fb0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  er..**.** If an 
11fc0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
11fd0 65 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  en an SQLite err
11fe0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
11ff0 6e 65 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73  ned and *pzErrMs
12000 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20  g.** may be set 
12010 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
12020 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
12030 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  an English langu
12040 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65  age error .** me
12050 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65  ssage. It is the
12060 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
12070 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
12080 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
12090 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66  ase.** this buff
120a0 65 72 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  er by calling sq
120b0 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
120c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73  .int sqlite3Pars
120d0 65 55 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68  eUri(.  const ch
120e0 61 72 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c  ar *zDefaultVfs,
120f0 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74          /* VFS t
12100 6f 20 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73  o use if no "vfs
12110 3d 78 78 78 22 20 71 75 65 72 79 20 6f 70 74 69  =xxx" query opti
12120 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
12130 61 72 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20  ar *zUri,       
12140 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74          /* Nul-t
12150 65 72 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f  erminated URI to
12160 20 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69   parse */.  unsi
12170 67 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73  gned int *pFlags
12180 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
12190 4e 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50  N/OUT: SQLITE_OP
121a0 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  EN_XXX flags */.
121b0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a    sqlite3_vfs **
121c0 70 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  ppVfs,          
121d0 20 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f    /* OUT: VFS to
121e0 20 75 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20   use */ .  char 
121f0 2a 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20  **pzFile,       
12200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
12210 54 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70  T: Filename comp
12220 6f 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a  onent of URI */.
12230 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
12240 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
12250 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
12260 6d 65 73 73 61 67 65 20 28 69 66 20 72 63 21 3d  message (if rc!=
12270 53 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b  SQLITE_OK) */.){
12280 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12290 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65  TE_OK;.  unsigne
122a0 64 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70  d int flags = *p
122b0 46 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63  Flags;.  const c
122c0 68 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66  har *zVfs = zDef
122d0 61 75 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20  aultVfs;.  char 
122e0 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63  *zFile;.  char c
122f0 3b 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73  ;.  int nUri = s
12300 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12310 55 72 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  Uri);..  assert(
12320 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b   *pzErrMsg==0 );
12330 0a 0a 20 20 69 66 28 20 28 28 66 6c 61 67 73 20  ..  if( ((flags 
12340 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
12350 49 29 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f  I) || sqlite3Glo
12360 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55  balConfig.bOpenU
12370 72 69 29 20 0a 20 20 20 26 26 20 6e 55 72 69 3e  ri) .   && nUri>
12380 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72  =5 && memcmp(zUr
12390 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d  i, "file:", 5)==
123a0 30 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  0 .  ){.    char
123b0 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20   *zOpt;.    int 
123c0 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  eState;         
123d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
123e0 73 65 72 20 73 74 61 74 65 20 77 68 65 6e 20 70  ser state when p
123f0 61 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20  arsing URI */.  
12400 20 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20    int iIn;      
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12420 2f 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63 74  /* Input charact
12430 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  er index */.    
12440 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20  int iOut = 0;   
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12460 20 4f 75 74 70 75 74 20 63 68 61 72 61 63 74 65   Output characte
12470 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  r index */.    i
12480 6e 74 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b  nt nByte = nUri+
12490 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2;           /* 
124a0 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  Bytes of space t
124b0 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20  o allocate */.. 
124c0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
124d0 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  the SQLITE_OPEN_
124e0 55 52 49 20 66 6c 61 67 20 69 73 20 73 65 74 20  URI flag is set 
124f0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74  to indicate to t
12500 68 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20  he VFS xOpen .  
12510 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74    ** method that
12520 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 78   there may be ex
12530 74 72 61 20 70 61 72 61 6d 65 74 65 72 73 20 66  tra parameters f
12540 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c  ollowing the fil
12550 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20  e-name.  */.    
12560 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
12570 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66  OPEN_URI;..    f
12580 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55  or(iIn=0; iIn<nU
12590 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65  ri; iIn++) nByte
125a0 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d   += (zUri[iIn]==
125b0 27 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  '&');.    zFile 
125c0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
125d0 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
125e0 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e   !zFile ) return
125f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a   SQLITE_NOMEM;..
12600 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66      iIn = 5;.#if
12610 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f  ndef SQLITE_ALLO
12620 57 5f 55 52 49 5f 41 55 54 48 4f 52 49 54 59 0a  W_URI_AUTHORITY.
12630 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
12640 68 65 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75  he scheme and au
12650 74 68 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73  thority segments
12660 20 6f 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a   of the URI. */.
12670 20 20 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d      if( zUri[5]=
12680 3d 27 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d  ='/' && zUri[6]=
12690 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49  ='/' ){.      iI
126a0 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69  n = 7;.      whi
126b0 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26  le( zUri[iIn] &&
126c0 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20   zUri[iIn]!='/' 
126d0 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69  ) iIn++;.      i
126e0 66 28 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49  f( iIn!=7 && (iI
126f0 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28  n!=16 || memcmp(
12700 22 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55  "localhost", &zU
12710 72 69 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20  ri[7], 9)) ){.  
12720 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
12730 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
12740 66 28 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61  f("invalid uri a
12750 75 74 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c  uthority: %.*s",
12760 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49   .            iI
12770 6e 2d 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a  n-7, &zUri[7]);.
12780 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
12790 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
127a0 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
127b0 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  i_out;.      }. 
127c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
127d0 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c   /* Copy the fil
127e0 65 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75  ename and any qu
127f0 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 69  ery parameters i
12800 6e 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75  nto the zFile bu
12810 66 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65  ffer. .    ** De
12820 63 6f 64 65 20 25 48 48 20 65 73 63 61 70 65 20  code %HH escape 
12830 63 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20  codes along the 
12840 77 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  way. .    **.   
12850 20 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20   ** Within this 
12860 6c 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65  loop, variable e
12870 53 74 61 74 65 20 6d 61 79 20 62 65 20 73 65 74  State may be set
12880 20 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64   to 0, 1 or 2, d
12890 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20  epending.    ** 
128a0 6f 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20 63  on the parsing c
128b0 6f 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f  ontext. As follo
128c0 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ws:.    **.    *
128d0 2a 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66  *   0: Parsing f
128e0 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a  ile-name..    **
128f0 20 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61     1: Parsing na
12900 6d 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20  me section of a 
12910 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79  name=value query
12920 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20   parameter..    
12930 2a 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20  **   2: Parsing 
12940 76 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66  value section of
12950 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75   a name=value qu
12960 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20  ery parameter.. 
12970 20 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65     */.    eState
12980 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
12990 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29   (c = zUri[iIn])
129a0 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b  !=0 && c!='#' ){
129b0 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20  .      iIn++;.  
129c0 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a      if( c=='%' .
129d0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
129e0 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69  3Isxdigit(zUri[i
129f0 49 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20  In]) .       && 
12a00 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
12a10 7a 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20  zUri[iIn+1]) .  
12a20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
12a30 6e 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69  nt octet = (sqli
12a40 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69  te3HexToInt(zUri
12a50 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a  [iIn++]) << 4);.
12a60 20 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d          octet +=
12a70 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74   sqlite3HexToInt
12a80 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a  (zUri[iIn++]);..
12a90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12aa0 6f 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65  octet>=0 && octe
12ab0 74 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20  t<256 );.       
12ac0 20 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b   if( octet==0 ){
12ad0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
12ae0 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
12af0 65 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61 70  en when "%00" ap
12b00 70 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65  pears within the
12b10 20 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20   URI. In this.  
12b20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
12b30 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65  we ignore all te
12b40 78 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e  xt in the remain
12b50 64 65 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c  der of the path,
12b60 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20   name or.       
12b70 20 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72     ** value curr
12b80 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73  ently being pars
12b90 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68  ed. So ignore th
12ba0 65 20 63 75 72 72 65 6e 74 20 63 68 61 72 61 63  e current charac
12bb0 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ter.          **
12bc0 20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65   and skip to the
12bd0 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f   next "?", "=" o
12be0 72 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70  r "&", as approp
12bf0 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20  riate. */.      
12c00 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
12c10 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26  zUri[iIn])!=0 &&
12c20 20 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20   c!='#' .       
12c30 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
12c40 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a  e!=0 || c!='?').
12c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
12c60 20 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28   (eState!=1 || (
12c70 63 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27  c!='=' && c!='&'
12c80 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
12c90 20 26 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c   && (eState!=2 |
12ca0 7c 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20  | c!='&').      
12cb0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
12cc0 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20     iIn++;.      
12cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12ce0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
12cf0 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20    }.        c = 
12d00 6f 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c  octet;.      }el
12d10 73 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31  se if( eState==1
12d20 20 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63   && (c=='&' || c
12d30 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20  =='=') ){.      
12d40 20 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74    if( zFile[iOut
12d50 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1]==0 ){.      
12d60 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20      /* An empty 
12d70 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e  option name. Ign
12d80 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20  ore this option 
12d90 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20  altogether. */. 
12da0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
12db0 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72  zUri[iIn] && zUr
12dc0 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a  i[iIn]!='#' && z
12dd0 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20  Uri[iIn-1]!='&' 
12de0 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  ) iIn++;.       
12df0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
12e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
12e10 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20  f( c=='&' ){.   
12e20 20 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75         zFile[iOu
12e30 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  t++] = '\0';.   
12e40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12e50 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 32        eState = 2
12e60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12e70 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
12e80 20 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74 61   }else if( (eSta
12e90 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29  te==0 && c=='?')
12ea0 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20 26   || (eState==2 &
12eb0 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20  & c=='&') ){.   
12ec0 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
12ed0 20 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b 0a      eState = 1;.
12ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46        }.      zF
12ef0 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b  ile[iOut++] = c;
12f00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
12f10 53 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65  State==1 ) zFile
12f20 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
12f30 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  .    zFile[iOut+
12f40 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  +] = '\0';.    z
12f50 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
12f60 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  \0';..    /* Che
12f70 63 6b 20 69 66 20 74 68 65 72 65 20 77 65 72 65  ck if there were
12f80 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70 65   any options spe
12f90 63 69 66 69 65 64 20 74 68 61 74 20 73 68 6f 75  cified that shou
12fa0 6c 64 20 62 65 20 69 6e 74 65 72 70 72 65 74 65  ld be interprete
12fb0 64 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e 20  d .    ** here. 
12fc0 4f 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65  Options that are
12fd0 20 69 6e 74 65 72 70 72 65 74 65 64 20 68 65 72   interpreted her
12fe0 65 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22 20  e include "vfs" 
12ff0 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a 20  and those that. 
13000 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64     ** correspond
13010 20 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20 6d   to flags that m
13020 61 79 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  ay be passed to 
13030 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  the sqlite3_open
13040 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74  _v2().    ** met
13050 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74  hod. */.    zOpt
13060 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65   = &zFile[sqlite
13070 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
13080 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  +1];.    while( 
13090 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  zOpt[0] ){.     
130a0 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69   int nOpt = sqli
130b0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74  te3Strlen30(zOpt
130c0 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  );.      char *z
130d0 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74  Val = &zOpt[nOpt
130e0 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  +1];.      int n
130f0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Val = sqlite3Str
13100 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20  len30(zVal);..  
13110 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20      if( nOpt==3 
13120 26 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c  && memcmp("vfs",
13130 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a   zOpt, 3)==0 ){.
13140 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 7a          zVfs = z
13150 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Val;.      }else
13160 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
13170 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20   OpenMode {.    
13180 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
13190 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 69   *z;.          i
131a0 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  nt mode;.       
131b0 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20   } *aMode = 0;. 
131c0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f         char *zMo
131d0 64 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  deType = 0;.    
131e0 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30      int mask = 0
131f0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 69  ;.        int li
13200 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  mit = 0;..      
13210 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26    if( nOpt==5 &&
13220 20 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22 2c   memcmp("cache",
13230 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a   zOpt, 5)==0 ){.
13240 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
13250 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
13260 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20   aCacheMode[] = 
13270 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  {.            { 
13280 22 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49 54  "shared",  SQLIT
13290 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
132a0 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  HE },.          
132b0 20 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20 53    { "private", S
132c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
132d0 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20  TECACHE },.     
132e0 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a         { 0, 0 }.
132f0 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20            };..  
13300 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53          mask = S
13310 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
13320 44 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50  DCACHE|SQLITE_OP
13330 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 3b  EN_PRIVATECACHE;
13340 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65  .          aMode
13350 20 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20   = aCacheMode;. 
13360 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d           limit =
13370 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20   mask;.         
13380 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63 61   zModeType = "ca
13390 63 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  che";.        }.
133a0 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74          if( nOpt
133b0 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d  ==4 && memcmp("m
133c0 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d  ode", zOpt, 4)==
133d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
133e0 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65  tatic struct Ope
133f0 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b  nMode aOpenMode[
13400 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
13410 20 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49 54    { "ro",  SQLIT
13420 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
13430 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
13440 20 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f   "rw",  SQLITE_O
13450 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c  PEN_READWRITE },
13460 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20   .            { 
13470 22 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50  "rwc", SQLITE_OP
13480 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
13490 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
134a0 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
134b0 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c   { "memory", SQL
134c0 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20  ITE_OPEN_MEMORY 
134d0 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
134e0 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20   0, 0 }.        
134f0 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20    };..          
13500 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50  mask = SQLITE_OP
13510 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51  EN_READONLY | SQ
13520 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
13530 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  ITE.            
13540 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
13550 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51  OPEN_CREATE | SQ
13560 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
13570 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64  ;.          aMod
13580 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20  e = aOpenMode;. 
13590 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d           limit =
135a0 20 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20   mask & flags;. 
135b0 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79           zModeTy
135c0 70 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20  pe = "access";. 
135d0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
135e0 20 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20    if( aMode ){. 
135f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
13600 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f            int mo
13610 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
13620 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65    for(i=0; aMode
13630 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20  [i].z; i++){.   
13640 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
13650 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69  har *z = aMode[i
13660 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ].z;.           
13670 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74   if( nVal==sqlit
13680 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26  e3Strlen30(z) &&
13690 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c   0==memcmp(zVal,
136a0 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20   z, nVal) ){.   
136b0 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20             mode 
136c0 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b  = aMode[i].mode;
136d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
136e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
136f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
13700 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f            if( mo
13710 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  de==0 ){.       
13720 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
13730 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
13740 28 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64  ("no such %s mod
13750 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70  e: %s", zModeTyp
13760 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  e, zVal);.      
13770 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13780 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
13790 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f       goto parse_
137a0 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  uri_out;.       
137b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
137c0 66 28 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49  f( (mode & ~SQLI
137d0 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e  TE_OPEN_MEMORY)>
137e0 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  limit ){.       
137f0 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
13800 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
13810 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c  ("%s mode not al
13820 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20 20 20  lowed: %s",.    
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13850 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a      zModeType, z
13860 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Val);.          
13870 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 45    rc = SQLITE_PE
13880 52 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  RM;.            
13890 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
138a0 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ut;.          }.
138b0 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
138c0 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b  = (flags & ~mask
138d0 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20  ) | mode;.      
138e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
138f0 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b     zOpt = &zVal[
13900 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a  nVal+1];.    }..
13910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69    }else{.    zFi
13920 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  le = sqlite3_mal
13930 6c 6f 63 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20  loc(nUri+2);.   
13940 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65   if( !zFile ) re
13950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13960 4d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 46  M;.    memcpy(zF
13970 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29  ile, zUri, nUri)
13980 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69  ;.    zFile[nUri
13990 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
139a0 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c  ile[nUri+1] = '\
139b0 30 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d  0';.    flags &=
139c0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52   ~SQLITE_OPEN_UR
139d0 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73  I;.  }..  *ppVfs
139e0 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
139f0 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28  ind(zVfs);.  if(
13a00 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20   *ppVfs==0 ){.  
13a10 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
13a20 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e  lite3_mprintf("n
13a30 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c  o such vfs: %s",
13a40 20 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d   zVfs);.    rc =
13a50 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
13a60 20 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75   }. parse_uri_ou
13a70 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
13a80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
13a90 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
13aa0 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30  );.    zFile = 0
13ab0 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20  ;.  }.  *pFlags 
13ac0 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69  = flags;.  *pzFi
13ad0 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65  le = zFile;.  re
13ae0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
13af0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
13b00 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49  NABLE_AUTO_PROFI
13b10 4c 45 29 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  LE).#define SQLI
13b20 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
13b30 54 44 45 52 52 20 31 0a 23 64 65 66 69 6e 65 20  TDERR 1.#define 
13b40 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
13b50 4e 47 5f 53 59 53 4c 4f 47 20 32 0a 73 74 61 74  NG_SYSLOG 2.stat
13b60 69 63 20 76 6f 69 64 20 65 6e 61 62 6c 65 41 75  ic void enableAu
13b70 74 6f 4c 6f 67 67 69 6e 67 28 0a 20 20 73 71 6c  toLogging(.  sql
13b80 69 74 65 33 20 2a 64 62 0a 29 7b 0a 20 20 63 68  ite3 *db.){.  ch
13b90 61 72 20 2a 65 6e 76 70 72 6f 66 69 6c 65 20 3d  ar *envprofile =
13ba0 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
13bb0 41 55 54 4f 5f 50 52 4f 46 49 4c 45 22 29 3b 0a  AUTO_PROFILE");.
13bc0 20 20 0a 20 20 69 66 28 20 65 6e 76 70 72 6f 66    .  if( envprof
13bd0 69 6c 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  ile!=NULL ){.   
13be0 20 69 6e 74 20 77 68 65 72 65 20 3d 20 30 3b 0a   int where = 0;.
13bf0 20 20 20 20 69 66 28 20 21 73 74 72 6e 63 61 73      if( !strncas
13c00 65 63 6d 70 28 22 31 22 2c 20 65 6e 76 70 72 6f  ecmp("1", envpro
13c10 66 69 6c 65 2c 20 31 29 20 29 7b 0a 20 20 20 20  file, 1) ){.    
13c20 20 20 69 66 28 20 69 73 61 74 74 79 28 32 29 20    if( isatty(2) 
13c30 29 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  ){.        where
13c40 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f   = SQLITE_AUTOLO
13c50 47 47 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20 20  GGING_STDERR;.  
13c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13c70 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54     where = SQLIT
13c80 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59  E_AUTOLOGGING_SY
13c90 53 4c 4f 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SLOG;.      }.  
13ca0 20 20 7d 20 65 6c 73 65 20 69 66 28 20 21 73 74    } else if( !st
13cb0 72 6e 63 61 73 65 63 6d 70 28 22 73 74 64 65 72  rncasecmp("stder
13cc0 72 22 2c 20 65 6e 76 70 72 6f 66 69 6c 65 2c 20  r", envprofile, 
13cd0 36 29 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72  6) ){.      wher
13ce0 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c  e = SQLITE_AUTOL
13cf0 4f 47 47 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20  OGGING_STDERR;. 
13d00 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 21 73     } else if( !s
13d10 74 72 6e 63 61 73 65 63 6d 70 28 22 73 79 73 6c  trncasecmp("sysl
13d20 6f 67 22 2c 20 65 6e 76 70 72 6f 66 69 6c 65 2c  og", envprofile,
13d30 20 36 29 20 29 7b 0a 20 20 20 20 20 20 77 68 65   6) ){.      whe
13d40 72 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f  re = SQLITE_AUTO
13d50 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a  LOGGING_SYSLOG;.
13d60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 68      }.    if( wh
13d70 65 72 65 3d 3d 53 51 4c 49 54 45 5f 41 55 54 4f  ere==SQLITE_AUTO
13d80 4c 4f 47 47 49 4e 47 5f 53 54 44 45 52 52 20 29  LOGGING_STDERR )
13d90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
13da0 70 72 6f 66 69 6c 65 28 64 62 2c 20 5f 73 71 6c  profile(db, _sql
13db0 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65  ite_auto_profile
13dc0 2c 20 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , db);.    }else
13dd0 20 69 66 28 20 77 68 65 72 65 3d 3d 53 51 4c 49   if( where==SQLI
13de0 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
13df0 59 53 4c 4f 47 20 29 7b 0a 20 20 20 20 20 20 5f  YSLOG ){.      _
13e00 6f 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28 29 3b 0a  open_asl_log();.
13e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
13e20 6f 66 69 6c 65 28 64 62 2c 20 5f 73 71 6c 69 74  ofile(db, _sqlit
13e30 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65 5f 73  e_auto_profile_s
13e40 79 73 6c 6f 67 2c 20 64 62 29 3b 0a 20 20 20 20  yslog, db);.    
13e50 7d 0a 20 20 7d 0a 20 20 63 68 61 72 20 2a 65 6e  }.  }.  char *en
13e60 76 74 72 61 63 65 20 3d 20 67 65 74 65 6e 76 28  vtrace = getenv(
13e70 22 53 51 4c 49 54 45 5f 41 55 54 4f 5f 54 52 41  "SQLITE_AUTO_TRA
13e80 43 45 22 29 3b 0a 20 20 69 66 28 20 65 6e 76 74  CE");.  if( envt
13e90 72 61 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  race!=NULL ){.  
13ea0 20 20 69 6e 74 20 77 68 65 72 65 20 3d 20 30 3b    int where = 0;
13eb0 0a 20 20 20 20 69 66 28 20 21 73 74 72 6e 63 61  .    if( !strnca
13ec0 73 65 63 6d 70 28 22 31 22 2c 20 65 6e 76 74 72  secmp("1", envtr
13ed0 61 63 65 2c 20 31 29 20 29 7b 0a 20 20 20 20 20  ace, 1) ){.     
13ee0 20 69 66 28 20 69 73 61 74 74 79 28 32 29 20 29   if( isatty(2) )
13ef0 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 20  {.        where 
13f00 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47  = SQLITE_AUTOLOG
13f10 47 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20 20 20  GING_STDERR;.   
13f20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13f30 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45    where = SQLITE
13f40 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53  _AUTOLOGGING_SYS
13f50 4c 4f 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LOG;.      }.   
13f60 20 7d 20 65 6c 73 65 20 69 66 28 20 21 73 74 72   } else if( !str
13f70 6e 63 61 73 65 63 6d 70 28 22 73 74 64 65 72 72  ncasecmp("stderr
13f80 22 2c 20 65 6e 76 74 72 61 63 65 2c 20 36 29 20  ", envtrace, 6) 
13f90 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d  ){.      where =
13fa0 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47   SQLITE_AUTOLOGG
13fb0 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20 20 20 20  ING_STDERR;.    
13fc0 7d 20 65 6c 73 65 20 69 66 28 20 21 73 74 72 6e  } else if( !strn
13fd0 63 61 73 65 63 6d 70 28 22 73 79 73 6c 6f 67 22  casecmp("syslog"
13fe0 2c 20 65 6e 76 74 72 61 63 65 2c 20 36 29 20 29  , envtrace, 6) )
13ff0 7b 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d 20  {.      where = 
14000 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
14010 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20 20 20 20 7d  NG_SYSLOG;.    }
14020 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 3d 3d  .    if( where==
14030 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
14040 4e 47 5f 53 54 44 45 52 52 20 29 7b 0a 20 20 20  NG_STDERR ){.   
14050 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65     sqlite3_trace
14060 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75 74  (db, _sqlite_aut
14070 6f 5f 74 72 61 63 65 2c 20 64 62 29 3b 0a 20 20  o_trace, db);.  
14080 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72    }else if( wher
14090 65 3d 3d 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f  e==SQLITE_AUTOLO
140a0 47 47 49 4e 47 5f 53 59 53 4c 4f 47 20 29 7b 0a  GGING_SYSLOG ){.
140b0 20 20 20 20 20 20 5f 6f 70 65 6e 5f 61 73 6c 5f        _open_asl_
140c0 6c 6f 67 28 29 3b 0a 20 20 20 20 20 20 73 71 6c  log();.      sql
140d0 69 74 65 33 5f 74 72 61 63 65 28 64 62 2c 20 5f  ite3_trace(db, _
140e0 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63  sqlite_auto_trac
140f0 65 5f 73 79 73 6c 6f 67 2c 20 64 62 29 3b 0a 20  e_syslog, db);. 
14100 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
14110 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
14120 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
14130 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61  ork of opening a
14140 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68   database on beh
14150 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  alf of.** sqlite
14160 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c  3_open() and sql
14170 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54  ite3_open16(). T
14180 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14190 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22  name "zFilename"
141a0 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65    .** is UTF-8 e
141b0 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
141c0 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61  c int openDataba
141d0 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  se(.  const char
141e0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20   *zFilename, /* 
141f0 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
14200 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
14210 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
14220 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  pDb,        /* O
14230 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74  UT: Returned dat
14240 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
14250 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
14260 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72  lags,    /* Oper
14270 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f  ational flags */
14280 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14290 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Vfs       /* Nam
142a0 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
142b0 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  use */.){.  sqli
142c0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
142d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
142e0 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68  tore allocated h
142f0 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
14300 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
14310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14320 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
14330 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61 64  /.  int isThread
14340 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20 20  safe;           
14350 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
14360 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65  threadsafe conne
14370 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72  ctions */.  char
14380 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20   *zOpen = 0;    
14390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
143a0 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
143b0 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65   to pass to Btre
143c0 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61  eOpen() */.  cha
143d0 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20  r *zErrMsg = 0; 
143e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
143f0 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  Error message fr
14400 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55  om sqlite3ParseU
14410 72 69 28 29 20 2a 2f 0a 0a 20 20 2a 70 70 44 62  ri() */..  *ppDb
14420 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
14430 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
14440 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  IT.  rc = sqlite
14450 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
14460 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
14470 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  n rc;.#endif..  
14480 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65  /* Only allow se
14490 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69  nsible combinati
144a0 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74  ons of bits in t
144b0 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
144c0 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20  t.  .  ** Throw 
144d0 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20  an error if any 
144e0 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e  non-sense combin
144f0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20  ation is used.  
14500 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f  If we.  ** do no
14510 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20  t block illegal 
14520 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72  combinations her
14530 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67  e, it could trig
14540 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  ger.  ** assert(
14550 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  ) statements in 
14560 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20  deeper layers.  
14570 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61  Sensible combina
14580 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a  tions.  ** are:.
14590 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53    **.  **  1:  S
145a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
145b0 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51  NLY.  **  2:  SQ
145c0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
145d0 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51  ITE.  **  6:  SQ
145e0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
145f0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
14600 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20  N_CREATE.  */.  
14610 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
14620 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d  PEN_READONLY  ==
14630 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72   0x01 );.  asser
14640 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  t( SQLITE_OPEN_R
14650 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32  EADWRITE == 0x02
14660 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
14670 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
14680 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20      == 0x04 );. 
14690 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28   testcase( (1<<(
146a0 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20  flags&7))==0x02 
146b0 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a  ); /* READONLY *
146c0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31  /.  testcase( (1
146d0 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78  <<(flags&7))==0x
146e0 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49  04 ); /* READWRI
146f0 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  TE */.  testcase
14700 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
14710 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41  ==0x40 ); /* REA
14720 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20  DWRITE | CREATE 
14730 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66  */.  if( ((1<<(f
14740 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36 29  lags&7)) & 0x46)
14750 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
14760 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
14770 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ..  if( sqlite3G
14780 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
14790 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  eMutex==0 ){.   
147a0 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
147b0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  0;.  }else if( f
147c0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
147d0 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20  EN_NOMUTEX ){.  
147e0 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
147f0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
14800 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
14810 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b  PEN_FULLMUTEX ){
14820 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
14830 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
14840 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
14850 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
14860 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
14870 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  x;.  }.  if( fla
14880 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
14890 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 29 7b  _PRIVATECACHE ){
148a0 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53  .    flags &= ~S
148b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
148c0 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20  DCACHE;.  }else 
148d0 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
148e0 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61  lConfig.sharedCa
148f0 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20  cheEnabled ){.  
14900 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
14910 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
14920 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  HE;.  }..  /* Re
14930 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74  move harmful bit
14940 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73  s from the flags
14950 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a   parameter.  **.
14960 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f    ** The SQLITE_
14970 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64  OPEN_NOMUTEX and
14980 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
14990 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65 72  LMUTEX flags wer
149a0 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74  e.  ** dealt wit
149b0 68 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  h in the previou
149c0 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42  s code block.  B
149d0 65 73 69 64 65 73 20 74 68 65 73 65 2c 20 74 68  esides these, th
149e0 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69  e only.  ** vali
149f0 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f  d input flags fo
14a00 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
14a10 32 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f  2() are SQLITE_O
14a20 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20  PEN_READONLY,.  
14a30 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ** SQLITE_OPEN_R
14a40 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45  EADWRITE, SQLITE
14a50 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51  _OPEN_CREATE, SQ
14a60 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
14a70 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49  CACHE,.  ** SQLI
14a80 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
14a90 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72  ACHE, and some r
14aa0 65 73 65 72 76 65 64 20 62 69 74 73 2e 20 20 53  eserved bits.  S
14ab0 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a  ilently mask.  *
14ac0 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20  * off all other 
14ad0 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c  flags..  */.  fl
14ae0 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54  ags &=  ~( SQLIT
14af0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
14b00 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
14b10 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
14b20 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
14b30 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
14b40 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
14b50 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
14b60 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
14b70 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  MP_DB | .       
14b80 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
14b90 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
14ba0 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
14bb0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
14bc0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  AIN_JOURNAL | . 
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
14be0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
14bf0 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
14c00 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
14c10 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
14c20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
14c30 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
14c40 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20  STER_JOURNAL |. 
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
14c60 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
14c70 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X |.            
14c80 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46     SQLITE_OPEN_F
14c90 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20  ULLMUTEX |.     
14ca0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
14cb0 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20  _OPEN_WAL.      
14cc0 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20         );..  /* 
14cd0 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
14ce0 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ite data structu
14cf0 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c  re */.  db = sql
14d00 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
14d10 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20  sizeof(sqlite3) 
14d20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29  );.  if( db==0 )
14d30 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
14d40 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61 64  ;.  if( isThread
14d50 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e  safe ){.    db->
14d60 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
14d70 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
14d80 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
14d90 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
14da0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
14db0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
14dc0 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b  );.      db = 0;
14dd0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
14de0 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  db_out;.    }.  
14df0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
14e00 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
14e10 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73  x);.  db->errMas
14e20 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e  k = 0xff;.  db->
14e30 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d  nDb = 2;.  db->m
14e40 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
14e50 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e  GIC_BUSY;.  db->
14e60 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61  aDb = db->aDbSta
14e70 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  tic;..  assert( 
14e80 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
14e90 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64  t)==sizeof(aHard
14ea0 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63  Limit) );.  memc
14eb0 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61  py(db->aLimit, a
14ec0 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f  HardLimit, sizeo
14ed0 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a  f(db->aLimit));.
14ee0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
14ef0 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74   = 1;.  db->next
14f00 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20  Autovac = -1;.  
14f10 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c  db->szMmap = sql
14f20 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
14f30 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e  .szMmap;.  db->n
14f40 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b  extPagesize = 0;
14f50 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
14f60 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
14f70 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e  ames | SQLITE_En
14f80 61 62 6c 65 54 72 69 67 67 65 72 20 7c 20 53 51  ableTrigger | SQ
14f90 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a  LITE_CacheSpill.
14fa0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
14fb0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
14fc0 4d 41 54 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20  MATIC_INDEX) || 
14fd0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
14fe0 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
14ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15000 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  | SQLITE_AutoInd
15010 65 78 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  ex.#endif.#if SQ
15020 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 4b 50  LITE_DEFAULT_CKP
15030 54 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 20  TFULLFSYNC.     
15040 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
15050 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79  LITE_CkptFullFSy
15060 6e 63 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  nc.#endif.#if SQ
15070 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
15080 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20  E_FORMAT<4.     
15090 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
150a0 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
150b0 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  mt.#endif.#ifdef
150c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
150d0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
150e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
150f0 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65   SQLITE_LoadExte
15100 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66  nsion.#endif.#if
15110 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
15120 52 45 43 55 52 53 49 56 45 5f 54 52 49 47 47 45  RECURSIVE_TRIGGE
15130 52 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RS.             
15140 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63      | SQLITE_Rec
15150 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a  Triggers.#endif.
15160 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
15170 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49  TE_DEFAULT_FOREI
15180 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49  GN_KEYS) && SQLI
15190 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49  TE_DEFAULT_FOREI
151a0 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20  GN_KEYS.        
151b0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
151c0 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65  E_ForeignKeys.#e
151d0 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73  ndif.      ;.  s
151e0 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
151f0 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
15200 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15210 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
15220 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
15230 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
15240 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64  .#endif..  /* Ad
15250 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  d the default co
15260 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
15270 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20   BINARY. BINARY 
15280 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55  works for both U
15290 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54  TF-8.  ** and UT
152a0 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76  F-16, so add a v
152b0 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  ersion for each 
152c0 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e  to avoid any unn
152d0 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f  ecessary.  ** co
152e0 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f  nversions. The o
152f0 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63  nly error that c
15300 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73  an occur here is
15310 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
15320 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61  ure..  */.  crea
15330 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
15340 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
15350 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c  _UTF8, 0, binCol
15360 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
15370 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
15380 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
15390 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69  E_UTF16BE, 0, bi
153a0 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
153b0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
153c0 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53  (db, "BINARY", S
153d0 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30  QLITE_UTF16LE, 0
153e0 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
153f0 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
15400 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22  tion(db, "RTRIM"
15410 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28  , SQLITE_UTF8, (
15420 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c  void*)1, binColl
15430 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  Func, 0);.  if( 
15440 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
15450 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
15460 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64  ndb_out;.  }.  d
15470 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73  b->pDfltColl = s
15480 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
15490 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46  q(db, SQLITE_UTF
154a0 38 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b  8, "BINARY", 0);
154b0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
154c0 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a  DfltColl!=0 );..
154d0 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61 20    /* Also add a 
154e0 55 54 46 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e  UTF-8 case-insen
154f0 73 69 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e  sitive collation
15500 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20   sequence. */.  
15510 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
15520 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51  db, "NOCASE", SQ
15530 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f  LITE_UTF8, 0, no
15540 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e  caseCollatingFun
15550 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 50 61 72  c, 0);..  /* Par
15560 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f  se the filename/
15570 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f  URI argument. */
15580 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73  .  db->openFlags
15590 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d   = flags;.  rc =
155a0 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
155b0 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (zVfs, zFilename
155c0 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70  , &flags, &db->p
155d0 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45  Vfs, &zOpen, &zE
155e0 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63  rrMsg);.  if( rc
155f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15600 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15610 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d 61  E_NOMEM ) db->ma
15620 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
15630 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15640 28 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67  (db, rc, zErrMsg
15650 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a 45 72   ? "%s" : 0, zEr
15660 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
15670 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
15680 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  ;.    goto opend
15690 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b_out;.  }..  /*
156a0 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e   Open the backen
156b0 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65  d database drive
156c0 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  r */.  rc = sqli
156d0 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d  te3BtreeOpen(db-
156e0 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62  >pVfs, zOpen, db
156f0 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  , &db->aDb[0].pB
15700 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  t, 0,.          
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6c                fl
15720 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ags | SQLITE_OPE
15730 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66  N_MAIN_DB);.  if
15740 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15750 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
15760 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
15770 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  M ){.      rc = 
15780 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
15790 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
157a0 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b  rror(db, rc, 0);
157b0 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
157c0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  _out;.  }.  db->
157d0 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[0].pSchema =
157e0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
157f0 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d  t(db, db->aDb[0]
15800 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62  .pBt);.  db->aDb
15810 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71  [1].pSchema = sq
15820 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
15830 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68  b, 0);...  /* Th
15840 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74 79  e default safety
15850 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d  _level for the m
15860 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
15870 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20  'full'; for the 
15880 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61  temp.  ** databa
15890 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e  se it is 'NONE'.
158a0 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
158b0 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64 65  e pager layer de
158c0 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  faults.  .  */. 
158d0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d   db->aDb[0].zNam
158e0 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62  e = "main";.  db
158f0 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f  ->aDb[0].safety_
15900 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62 2d  level = 3;.  db-
15910 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20  >aDb[1].zName = 
15920 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44  "temp";.  db->aD
15930 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[1].safety_leve
15940 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61  l = 1;..  db->ma
15950 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
15960 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64  IC_OPEN;.  if( d
15970 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15980 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
15990 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  db_out;.  }..  /
159a0 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62  * Register all b
159b0 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e  uilt-in function
159c0 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74  s, but do not at
159d0 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68  tempt to read th
159e0 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
159f0 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73  schema yet. This
15a00 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69   is delayed unti
15a10 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  l the first time
15a20 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
15a30 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a  ** is accessed..
15a40 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72    */.  sqlite3Er
15a50 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
15a60 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  K, 0);.  sqlite3
15a70 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46  RegisterBuiltinF
15a80 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20  unctions(db);.. 
15a90 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74   /* Load automat
15aa0 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20  ic extensions - 
15ab0 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20  extensions that 
15ac0 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74  have been regist
15ad0 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20  ered.  ** using 
15ae0 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f  the sqlite3_auto
15af0 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28  matic_extension(
15b00 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72 63  ) API..  */.  rc
15b10 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
15b20 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63  de(db);.  if( rc
15b30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15b40 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f     sqlite3AutoLo
15b50 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  adExtensions(db)
15b60 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
15b70 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
15b80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15b90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
15ba0 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
15bb0 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
15bc0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
15bd0 46 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS1.  if( !db->
15be0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
15bf0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
15c00 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 73  qlite3Fts1Init(s
15c10 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63  qlite3*);.    rc
15c20 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e   = sqlite3Fts1In
15c30 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
15c40 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
15c50 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20  E_ENABLE_FTS2.  
15c60 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
15c70 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
15c80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78  ITE_OK ){.    ex
15c90 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
15ca0 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts2Init(sqlite3
15cb0 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
15cc0 69 74 65 33 46 74 73 32 49 6e 69 74 28 64 62 29  ite3Fts2Init(db)
15cd0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
15ce0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
15cf0 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64  LE_FTS3.  if( !d
15d00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15d10 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
15d20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
15d30 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62 29  ite3Fts3Init(db)
15d40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
15d50 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
15d60 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62  LE_ICU.  if( !db
15d70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
15d80 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
15d90 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
15da0 74 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a  te3IcuInit(db);.
15db0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
15dc0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15dd0 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62  _RTREE.  if( !db
15de0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
15df0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
15e00 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
15e10 65 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b  e3RtreeInit(db);
15e20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
15e30 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55  * -DSQLITE_DEFAU
15e40 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
15e50 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56  1 makes EXCLUSIV
15e60 45 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  E the default lo
15e70 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e  cking.  ** mode.
15e80 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55    -DSQLITE_DEFAU
15e90 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
15ea0 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68  0 make NORMAL th
15eb0 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
15ec0 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f  g.  ** mode.  Do
15ed0 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61  ing nothing at a
15ee0 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f  ll also makes NO
15ef0 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
15f00 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
15f10 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
15f20 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e  KING_MODE.  db->
15f30 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53  dfltLockMode = S
15f40 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
15f50 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71  CKING_MODE;.  sq
15f60 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
15f70 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72  gMode(sqlite3Btr
15f80 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b  eePager(db->aDb[
15f90 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20  0].pBt),.       
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fb0 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
15fc0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b  T_LOCKING_MODE);
15fd0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72  .#endif..  if( r
15fe0 63 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72  c ) sqlite3Error
15ff0 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20  (db, rc, 0);..  
16000 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f  /* Enable the lo
16010 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73  okaside-malloc s
16020 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65  ubsystem */.  se
16030 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c  tupLookaside(db,
16040 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   0, sqlite3Globa
16050 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73  lConfig.szLookas
16060 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
16080 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
16090 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20  .nLookaside);.. 
160a0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
160b0 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  ocheckpoint(db, 
160c0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
160d0 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e  AL_AUTOCHECKPOIN
160e0 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a  T);..opendb_out:
160f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
16100 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28 20 64 62  zOpen);.  if( db
16110 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16120 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20  db->mutex!=0 || 
16130 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30 20  isThreadsafe==0 
16140 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  || sqlite3Global
16150 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
16160 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  x==0 );.    sqli
16170 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
16180 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
16190 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
161a0 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 61 73  rrcode(db);.  as
161b0 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c 20 72  sert( db!=0 || r
161c0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
161d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
161e0 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
161f0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
16200 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a  b);.    db = 0;.
16210 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
16220 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16230 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
16240 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a  ITE_MAGIC_SICK;.
16250 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
16260 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 45 4e  __APPLE__) && EN
16270 41 42 4c 45 5f 46 4f 52 43 45 5f 57 41 4c 0a 20  ABLE_FORCE_WAL. 
16280 20 69 66 28 20 64 62 20 26 26 20 21 72 63 20 29   if( db && !rc )
16290 7b 0a 20 20 20 20 69 66 20 28 28 30 20 3d 3d 20  {.    if ((0 == 
162a0 61 63 63 65 73 73 28 22 2f 76 61 72 2f 64 62 2f  access("/var/db/
162b0 65 6e 61 62 6c 65 46 6f 72 63 65 57 41 4c 22 2c  enableForceWAL",
162c0 20 52 5f 4f 4b 29 29 29 20 7b 0a 23 69 66 64 65   R_OK))) {.#ifde
162d0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
162e0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
162f0 65 72 72 2c 20 22 53 51 4c 69 74 65 20 57 41 4c  err, "SQLite WAL
16300 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 45 4e   journal_mode EN
16310 41 42 4c 45 44 20 62 79 20 64 65 66 61 75 6c 74  ABLED by default
16320 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  .\n");.#endif.  
16330 20 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74      .      sqlit
16340 65 33 5f 65 78 65 63 28 64 62 2c 20 22 70 72 61  e3_exec(db, "pra
16350 67 6d 61 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  gma journal_mode
16360 3d 77 61 6c 22 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  =wal", NULL, NUL
16370 4c 2c 20 4e 55 4c 4c 29 3b 0a 23 69 66 64 65 66  L, NULL);.#ifdef
16380 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2f   SQLITE_DEBUG.//
16390 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 2f 2f 20      } else {.// 
163a0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
163b0 65 72 72 2c 20 22 53 51 4c 69 74 65 20 57 41 4c  err, "SQLite WAL
163c0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 4e 4f   journal_mode NO
163d0 54 20 45 4e 41 42 4c 45 44 20 62 79 20 64 65 66  T ENABLED by def
163e0 61 75 6c 74 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69  ault.\n");.#endi
163f0 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  f.    }.  }.#end
16400 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
16410 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 55 54  QLITE_ENABLE_AUT
16420 4f 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 66 28  O_PROFILE).  if(
16430 20 64 62 20 26 26 20 21 72 63 20 29 7b 0a 20 20   db && !rc ){.  
16440 20 20 65 6e 61 62 6c 65 41 75 74 6f 4c 6f 67 67    enableAutoLogg
16450 69 6e 67 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  ing(db);.  }.#en
16460 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 64 62  dif.  *ppDb = db
16470 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16480 45 4e 41 42 4c 45 5f 53 51 4c 52 52 0a 20 20 53  ENABLE_SQLRR.  S
16490 52 52 65 63 4f 70 65 6e 28 64 62 2c 20 7a 46 69  RRecOpen(db, zFi
164a0 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a  lename, flags);.
164b0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
164c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
164d0 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  OG.  if( sqlite3
164e0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
164f0 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  llog ){.    /* O
16500 70 65 6e 69 6e 67 20 61 20 64 62 20 68 61 6e 64  pening a db hand
16510 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d  le. Fourth param
16520 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 30  eter is passed 0
16530 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70  . */.    void *p
16540 41 72 67 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  Arg = sqlite3Glo
16550 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
16560 67 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65  gArg;.    sqlite
16570 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
16580 71 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c 20  qllog(pArg, db, 
16590 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20  zFilename, 0);. 
165a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
165b0 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  rn sqlite3ApiExi
165c0 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  t(0, rc);.}../*.
165d0 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
165e0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
165f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  /.int sqlite3_op
16600 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
16610 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20   *zFilename, .  
16620 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a  sqlite3 **ppDb .
16630 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e  ){.  return open
16640 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61  Database(zFilena
16650 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20  me, ppDb,.      
16660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16670 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16680 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
16690 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a  PEN_CREATE, 0);.
166a0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  }.int sqlite3_op
166b0 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63  en_v2(.  const c
166c0 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20  har *filename,  
166d0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
166e0 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f  ename (UTF-8) */
166f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
16700 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  b,         /* OU
16710 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e  T: SQLite db han
16720 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  dle */.  int fla
16730 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
16740 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63   /* Flags */.  c
16750 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
16760 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
16770 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20  f VFS module to 
16780 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  use */.){.  retu
16790 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  rn openDatabase(
167a0 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20  filename, ppDb, 
167b0 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c  (unsigned int)fl
167c0 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23  ags, zVfs);.}..#
167d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
167e0 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f  IT_UTF16./*.** O
167f0 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61  pen a new databa
16800 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
16810 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  t sqlite3_open16
16820 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  (.  const void *
16830 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71  zFilename, .  sq
16840 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a  lite3 **ppDb.){.
16850 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
16860 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a  ilename8;   /* z
16870 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64  Filename encoded
16880 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61   in UTF-8 instea
16890 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20  d of UTF-16 */. 
168a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
168b0 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pVal;.  int rc;.
168c0 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65  .  assert( zFile
168d0 6e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74  name );.  assert
168e0 28 20 70 70 44 62 20 29 3b 0a 20 20 2a 70 70 44  ( ppDb );.  *ppD
168f0 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
16900 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
16910 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  NIT.  rc = sqlit
16920 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
16930 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
16940 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20  rn rc;.#endif.  
16950 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
16960 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c  lueNew(0);.  sql
16970 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
16980 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e  pVal, -1, zFilen
16990 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  ame, SQLITE_UTF1
169a0 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f  6NATIVE, SQLITE_
169b0 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65  STATIC);.  zFile
169c0 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56  name8 = sqlite3V
169d0 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53  alueText(pVal, S
169e0 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69  QLITE_UTF8);.  i
169f0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b  f( zFilename8 ){
16a00 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61  .    rc = openDa
16a10 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65  tabase(zFilename
16a20 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20  8, ppDb,.       
16a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
16a40 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
16a50 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
16a60 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20  EN_CREATE, 0);. 
16a70 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 44 62     assert( *ppDb
16a80 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
16a90 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20  OMEM );.    if( 
16aa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
16ab0 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
16ac0 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68  *ppDb, 0, DB_Sch
16ad0 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20  emaLoaded) ){.  
16ae0 20 20 20 20 45 4e 43 28 2a 70 70 44 62 29 20 3d      ENC(*ppDb) =
16af0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
16b00 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  IVE;.    }.  }el
16b10 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
16b20 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
16b30 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
16b40 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75  e(pVal);..  retu
16b50 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  rn sqlite3ApiExi
16b60 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64  t(0, rc);.}.#end
16b70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
16b80 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
16b90 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
16ba0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
16bb0 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
16bc0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
16bd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
16be0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
16bf0 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
16c00 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
16c10 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
16c20 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
16c30 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
16c40 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
16c50 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
16c60 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  st void*).){.  i
16c70 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
16c80 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
16c90 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
16ca0 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
16cb0 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63  iled );.  rc = c
16cc0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
16cd0 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e  b, zName, (u8)en
16ce0 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  c, pCtx, xCompar
16cf0 65 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  e, 0);.  rc = sq
16d00 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
16d10 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
16d20 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
16d30 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
16d40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
16d50 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
16d60 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
16d70 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
16d80 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
16d90 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
16da0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
16db0 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
16dc0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16dd0 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
16de0 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
16df0 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
16e00 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
16e10 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
16e20 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
16e30 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
16e40 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
16e50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
16e60 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
16e70 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
16e80 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
16e90 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
16ea0 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  ion(db, zName, (
16eb0 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  u8)enc, pCtx, xC
16ec0 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20  ompare, xDel);. 
16ed0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
16ee0 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
16ef0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
16f00 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
16f10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16f20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16f30 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
16f40 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
16f50 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
16f60 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
16f70 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
16f80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
16f90 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36  eate_collation16
16fa0 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
16fb0 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
16fc0 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63  zName,.  int enc
16fd0 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
16fe0 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
16ff0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
17000 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
17010 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  t void*).){.  in
17020 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17030 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38  ;.  char *zName8
17040 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
17050 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
17060 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
17070 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
17080 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71  );.  zName8 = sq
17090 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62  lite3Utf16to8(db
170a0 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
170b0 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
170c0 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29  ;.  if( zName8 )
170d0 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74  {.    rc = creat
170e0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
170f0 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20  Name8, (u8)enc, 
17100 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
17110 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
17120 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38  bFree(db, zName8
17130 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
17140 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
17150 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
17160 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
17170 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
17180 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
17190 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
171a0 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
171b0 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
171c0 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
171d0 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
171e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
171f0 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
17200 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
17210 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
17220 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
17230 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
17240 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
17250 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69  n_needed(.  sqli
17260 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
17270 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
17280 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
17290 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71  Needed)(void*,sq
172a0 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
172b0 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  Rep,const char*)
172c0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
172d0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
172e0 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  tex);.  db->xCol
172f0 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e  lNeeded = xCollN
17300 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f  eeded;.  db->xCo
17310 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a  llNeeded16 = 0;.
17320 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
17330 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
17340 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
17350 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
17360 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
17370 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17380 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17390 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
173a0 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61  Register a colla
173b0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
173c0 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77  ctory callback w
173d0 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
173e0 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52   handle.** db. R
173f0 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69  eplace any previ
17400 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20  ously installed 
17410 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
17420 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69  ce factory..*/.i
17430 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61  nt sqlite3_colla
17440 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20  tion_needed16(. 
17450 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
17460 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64   void *pCollNeed
17470 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a  edArg, .  void(*
17480 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76  xCollNeeded16)(v
17490 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
174a0 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74  t eTextRep,const
174b0 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c   void*).){.  sql
174c0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
174d0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
174e0 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d  b->xCollNeeded =
174f0 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e   0;.  db->xCollN
17500 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e  eeded16 = xCollN
17510 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70  eeded16;.  db->p
17520 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20  CollNeededArg = 
17530 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a  pCollNeededArg;.
17540 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
17550 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
17560 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17570 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
17580 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
17590 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  F16 */..#ifndef 
175a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
175b0 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69  ECATED./*.** Thi
175c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
175d0 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d  w an anachronism
175e0 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20  . It used to be 
175f0 75 73 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20  used to recover 
17600 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63  from a.** malloc
17610 28 29 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20  () failure, but 
17620 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20  SQLite now does 
17630 74 68 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  this automatical
17640 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
17650 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65  e3_global_recove
17660 72 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  r(void){.  retur
17670 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
17680 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  endif../*.** Tes
17690 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72  t to see whether
176a0 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61   or not the data
176b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
176c0 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
176d0 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72  .** mode.  Retur
176e0 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
176f0 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74  and FALSE if not
17700 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  .  Autocommit mo
17710 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64  de is on.** by d
17720 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d  efault.  Autocom
17730 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65 64 20  mit is disabled 
17740 62 79 20 61 20 42 45 47 49 4e 20 73 74 61 74 65  by a BEGIN state
17750 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c  ment and reenabl
17760 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78  ed.** by the nex
17770 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c  t COMMIT or ROLL
17780 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  BACK..*/.int sql
17790 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d  ite3_get_autocom
177a0 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  mit(sqlite3 *db)
177b0 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61  {.  return db->a
177c0 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a  utoCommit;.}../*
177d0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
177e0 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73  g routines are s
177f0 75 62 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f  ubtitutes for co
17800 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43  nstants SQLITE_C
17810 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54  ORRUPT,.** SQLIT
17820 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45  E_MISUSE, SQLITE
17830 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54  _CANTOPEN, SQLIT
17840 45 5f 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73  E_IOERR and poss
17850 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72  ibly other error
17860 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20  .** constants.  
17870 54 68 65 79 20 73 65 72 76 65 72 20 74 77 6f 20  They server two 
17880 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20  purposes:.**.** 
17890 20 20 31 2e 20 20 53 65 72 76 65 20 61 73 20 61    1.  Serve as a
178a0 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
178b0 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
178c0 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67  point in a debug
178d0 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20  ger.**       to 
178e0 64 65 74 65 63 74 20 77 68 65 6e 20 76 65 72 73  detect when vers
178f0 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  ion error condit
17900 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  ions occurs..**.
17910 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20  **   2.  Invoke 
17920 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f  sqlite3_log() to
17930 20 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75   provide the sou
17940 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f  rce code locatio
17950 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20  n where.**      
17960 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72   a low-level err
17970 6f 72 20 69 73 20 66 69 72 73 74 20 64 65 74 65  or is first dete
17980 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  cted..*/.int sql
17990 69 74 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72  ite3CorruptError
179a0 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
179b0 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
179c0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
179d0 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  og!=0 );.  sqlit
179e0 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f  e3_log(SQLITE_CO
179f0 52 52 55 50 54 2c 0a 20 20 20 20 20 20 20 20 20  RRUPT,.         
17a00 20 20 20 20 20 22 64 61 74 61 62 61 73 65 20 63       "database c
17a10 6f 72 72 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e  orruption at lin
17a20 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
17a30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17a40 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
17a50 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
17a60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17a70 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73  CORRUPT;.}.int s
17a80 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f  qlite3MisuseErro
17a90 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
17aa0 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
17ab0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
17ac0 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Log!=0 );.  sqli
17ad0 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d  te3_log(SQLITE_M
17ae0 49 53 55 53 45 2c 20 0a 20 20 20 20 20 20 20 20  ISUSE, .        
17af0 20 20 20 20 20 20 22 6d 69 73 75 73 65 20 61 74        "misuse at
17b00 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31   line %d of [%.1
17b10 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  0s]",.          
17b20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73      lineno, 20+s
17b30 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
17b40 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
17b50 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e  ITE_MISUSE;.}.in
17b60 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65  t sqlite3Cantope
17b70 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  nError(int linen
17b80 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
17b90 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17ba0 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
17bb0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
17bc0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20  ITE_CANTOPEN, . 
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61               "ca
17be0 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20 61  nnot open file a
17bf0 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e  t line %d of [%.
17c00 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20  10s]",.         
17c10 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b       lineno, 20+
17c20 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
17c30 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ());.  return SQ
17c40 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d  LITE_CANTOPEN;.}
17c50 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
17c60 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
17c70 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  D./*.** This is 
17c80 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f  a convenience ro
17c90 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73  utine that makes
17ca0 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74   sure that all t
17cb0 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a  hread-specific.*
17cc0 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  * data for this 
17cd0 74 68 72 65 61 64 20 68 61 73 20 62 65 65 6e 20  thread has been 
17ce0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  deallocated..**.
17cf0 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e  ** SQLite no lon
17d00 67 65 72 20 75 73 65 73 20 74 68 72 65 61 64 2d  ger uses thread-
17d10 73 70 65 63 69 66 69 63 20 64 61 74 61 20 73 6f  specific data so
17d20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
17d30 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e   now a.** no-op.
17d40 20 20 49 74 20 69 73 20 72 65 74 61 69 6e 65 64    It is retained
17d50 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20   for historical 
17d60 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a  compatibility..*
17d70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74  /.void sqlite3_t
17d80 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f  hread_cleanup(vo
17d90 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  id){.}.#endif../
17da0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61  *.** Return meta
17db0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
17dc0 75 74 20 61 20 73 70 65 63 69 66 69 63 20 63 6f  ut a specific co
17dd0 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61  lumn of a databa
17de0 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65  se table..** See
17df0 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69   comment in sqli
17e00 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e  te3.h (sqlite.h.
17e10 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  in) for details.
17e20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
17e30 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
17e40 4d 45 54 41 44 41 54 41 0a 69 6e 74 20 73 71 6c  METADATA.int sql
17e50 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
17e60 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71  n_metadata(.  sq
17e70 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
17e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
17e90 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a  nection handle *
17ea0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
17eb0 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20  zDbName,        
17ec0 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65  /* Database name
17ed0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f   or NULL */.  co
17ee0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
17ef0 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62  Name,     /* Tab
17f00 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e  le name */.  con
17f10 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
17f20 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  Name,    /* Colu
17f30 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61  mn name */.  cha
17f40 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61  r const **pzData
17f50 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50  Type,    /* OUTP
17f60 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74  UT: Declared dat
17f70 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72  a type */.  char
17f80 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53   const **pzCollS
17f90 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55  eq,     /* OUTPU
17fa0 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  T: Collation seq
17fb0 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  uence name */.  
17fc0 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20  int *pNotNull,  
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
17fe0 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e  UTPUT: True if N
17ff0 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
18000 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69  nt exists */.  i
18010 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c  nt *pPrimaryKey,
18020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
18030 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f  TPUT: True if co
18040 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20  lumn part of PK 
18050 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69  */.  int *pAutoi
18060 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
18070 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65   /* OUTPUT: True
18080 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75   if column is au
18090 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a  to-increment */.
180a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
180b0 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
180c0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  ;.  Table *pTab 
180d0 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  = 0;.  Column *p
180e0 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Col = 0;.  int i
180f0 43 6f 6c 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e  Col;..  char con
18100 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20  st *zDataType = 
18110 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
18120 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20  *zCollSeq = 0;. 
18130 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30   int notnull = 0
18140 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b  ;.  int primaryk
18150 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75  ey = 0;.  int au
18160 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  toinc = 0;..  /*
18170 20 45 6e 73 75 72 65 20 74 68 65 20 64 61 74 61   Ensure the data
18180 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
18190 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20  been loaded */. 
181a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
181b0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
181c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
181d0 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72  nterAll(db);.  r
181e0 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28  c = sqlite3Init(
181f0 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  db, &zErrMsg);. 
18200 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
18210 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  rc ){.    goto e
18220 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  rror_out;.  }.. 
18230 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74   /* Locate the t
18240 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e  able in question
18250 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   */.  pTab = sql
18260 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
18270 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44  , zTableName, zD
18280 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70  bName);.  if( !p
18290 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  Tab || pTab->pSe
182a0 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62  lect ){.    pTab
182b0 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 0;.    goto e
182c0 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  rror_out;.  }.. 
182d0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c   /* Find the col
182e0 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e  umn for which in
182f0 66 6f 20 69 73 20 72 65 71 75 65 73 74 65 64 20  fo is requested 
18300 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
18310 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e  IsRowid(zColumnN
18320 61 6d 65 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c  ame) ){.    iCol
18330 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
18340 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
18350 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20  ){.      pCol = 
18360 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
18370 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  ];.    }.  }else
18380 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30  {.    for(iCol=0
18390 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
183a0 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
183b0 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e    pCol = &pTab->
183c0 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  aCol[iCol];.    
183d0 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
183e0 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  StrICmp(pCol->zN
183f0 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  ame, zColumnName
18400 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
18410 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
18420 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d  }.    if( iCol==
18430 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
18440 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20      pTab = 0;.  
18450 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
18460 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
18470 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
18480 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74  g block stores t
18490 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  he meta informat
184a0 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ion that will be
184b0 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74   returned.  ** t
184c0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20  o the caller in 
184d0 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20  local variables 
184e0 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c  zDataType, zColl
184f0 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72  Seq, notnull, pr
18500 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e  imarykey.  ** an
18510 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68  d autoinc. At th
18520 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61  is point there a
18530 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69  re two possibili
18540 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a  ties:.  ** .  **
18550 20 20 20 20 20 31 2e 20 54 68 65 20 73 70 65 63       1. The spec
18560 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ified column nam
18570 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f  e was rowid", "o
18580 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22  id" or "_rowid_"
18590 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e   .  **        an
185a0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78  d there is no ex
185b0 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65  plicitly declare
185c0 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20  d IPK column. . 
185d0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20   **.  **     2. 
185e0 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  The table is not
185f0 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20   a view and the 
18600 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e  column name iden
18610 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20  tified an .  ** 
18620 20 20 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c         explicitl
18630 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d  y declared colum
18640 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66  n. Copy meta inf
18650 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70  ormation from *p
18660 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28  Col..  */ .  if(
18670 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61   pCol ){.    zDa
18680 74 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a  taType = pCol->z
18690 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53  Type;.    zCollS
186a0 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c  eq = pCol->zColl
186b0 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20  ;.    notnull = 
186c0 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30  pCol->notNull!=0
186d0 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79  ;.    primarykey
186e0 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c    = (pCol->colFl
186f0 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52  ags & COLFLAG_PR
18700 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61  IMKEY)!=0;.    a
18710 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69  utoinc = pTab->i
18720 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70  PKey==iCol && (p
18730 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
18740 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
18750 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )!=0;.  }else{. 
18760 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22     zDataType = "
18770 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72  INTEGER";.    pr
18780 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20  imarykey = 1;.  
18790 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65  }.  if( !zCollSe
187a0 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65  q ){.    zCollSe
187b0 71 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  q = "BINARY";.  
187c0 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20  }..error_out:.  
187d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
187e0 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eAll(db);..  /* 
187f0 57 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63  Whether the func
18800 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65  tion call succee
18810 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73  ded or failed, s
18820 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 61  et the output pa
18830 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f  rameters.  ** to
18840 20 77 68 61 74 65 76 65 72 20 74 68 65 69 72 20   whatever their 
18850 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72  local counterpar
18860 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61  ts contain. If a
18870 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
18880 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73  r,.  ** this has
18890 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a   the effect of z
188a0 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75  eroing all outpu
188b0 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20  t parameters..  
188c0 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54  */.  if( pzDataT
188d0 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70  ype ) *pzDataTyp
188e0 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20  e = zDataType;. 
188f0 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29   if( pzCollSeq )
18900 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43   *pzCollSeq = zC
18910 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e  ollSeq;.  if( pN
18920 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75  otNull ) *pNotNu
18930 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20  ll = notnull;.  
18940 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20  if( pPrimaryKey 
18950 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d  ) *pPrimaryKey =
18960 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69   primarykey;.  i
18970 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70  f( pAutoinc ) *p
18980 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e  Autoinc = autoin
18990 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  c;..  if( SQLITE
189a0 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62  _OK==rc && !pTab
189b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
189c0 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
189d0 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20  g);.    zErrMsg 
189e0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
189f0 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  (db, "no such ta
18a00 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25  ble column: %s.%
18a10 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a  s", zTableName,.
18a20 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e          zColumnN
18a30 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ame);.    rc = S
18a40 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
18a50 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
18a60 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67  db, rc, (zErrMsg
18a70 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73  ?"%s":0), zErrMs
18a80 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
18a90 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
18aa0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
18ab0 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
18ac0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
18ad0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
18ae0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18af0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
18b00 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
18b10 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
18b20 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
18b30 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69  time slept..*/.i
18b40 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70  nt sqlite3_sleep
18b50 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69  (int ms){.  sqli
18b60 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20  te3_vfs *pVfs;. 
18b70 20 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20   int rc;.  pVfs 
18b80 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
18b90 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66  nd(0);.  if( pVf
18ba0 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  s==0 ) return 0;
18bb0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
18bc0 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69  tion works in mi
18bd0 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20  lliseconds, but 
18be0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f  the underlying O
18bf0 73 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41  sSleep() .  ** A
18c00 50 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63  PI uses microsec
18c10 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20  onds. Hence the 
18c20 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72  1000's..  */.  r
18c30 63 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c  c = (sqlite3OsSl
18c40 65 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d  eep(pVfs, 1000*m
18c50 73 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75  s)/1000);.  retu
18c60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18c70 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
18c80 65 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72  e the extended r
18c90 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a  esult codes..*/.
18ca0 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65  int sqlite3_exte
18cb0 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
18cc0 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
18cd0 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71 6c  nt onoff){.  sql
18ce0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
18cf0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
18d00 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f  b->errMask = ono
18d10 66 66 20 3f 20 30 78 66 66 66 66 66 66 66 66 20  ff ? 0xffffffff 
18d20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65  : 0xff;.  sqlite
18d30 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
18d40 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
18d50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18d60 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
18d70 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d  e xFileControl m
18d80 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69  ethod on a parti
18d90 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a  cular database..
18da0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  */.int sqlite3_f
18db0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69  ile_control(sqli
18dc0 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
18dd0 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e  har *zDbName, in
18de0 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
18df0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
18e00 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 42 74  LITE_ERROR;.  Bt
18e10 72 65 65 20 2a 70 42 74 72 65 65 3b 0a 0a 20 20  ree *pBtree;..  
18e20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
18e30 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
18e40 20 20 70 42 74 72 65 65 20 3d 20 73 71 6c 69 74    pBtree = sqlit
18e50 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28  e3DbNameToBtree(
18e60 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  db, zDbName);.  
18e70 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
18e80 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
18e90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
18ea0 65 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69 74  e *fd;.    sqlit
18eb0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
18ec0 72 65 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ree);.    pPager
18ed0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
18ee0 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  ager(pBtree);.  
18ef0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18f00 21 3d 30 20 29 3b 0a 20 20 20 20 66 64 20 3d 20  !=0 );.    fd = 
18f10 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
18f20 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
18f30 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20  sert( fd!=0 );. 
18f40 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54     if( op==SQLIT
18f50 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49  E_FCNTL_FILE_POI
18f60 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28  NTER ){.      *(
18f70 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70  sqlite3_file**)p
18f80 41 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20  Arg = fd;.      
18f90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18fa0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 64      }else if( fd
18fb0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
18fc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18fd0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64  OsFileControl(fd
18fe0 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 23 69 66  , op, pArg);.#if
18ff0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19000 5f 57 41 4c 0a 20 20 20 20 20 20 69 66 28 20 28  _WAL.      if( (
19010 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 26 26  rc==SQLITE_OK)&&
19020 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54  (op==SQLITE_FCNT
19030 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 29 26 26 28  L_LAST_ERRNO)&&(
19040 2a 28 69 6e 74 20 2a 29 70 41 72 67 3d 3d 30 29  *(int *)pArg==0)
19050 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19060 74 65 33 5f 66 69 6c 65 20 2a 70 57 61 6c 46 64  te3_file *pWalFd
19070 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
19080 61 6c 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a  alFile(pPager);.
19090 20 20 20 20 20 20 20 20 69 66 28 20 70 57 61 6c          if( pWal
190a0 46 64 26 26 28 70 57 61 6c 46 64 2d 3e 70 4d 65  Fd&&(pWalFd->pMe
190b0 74 68 6f 64 73 29 20 29 7b 0a 20 20 20 20 20 20  thods) ){.      
190c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
190d0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 57  OsFileControl(pW
190e0 61 6c 46 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b  alFd, op, pArg);
190f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19100 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65   }.#endif.    }e
19110 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
19120 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
19130 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
19140 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
19150 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ree);.  }.  sqli
19160 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c  te3Error(db, rc,
19170 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d   0);.  sqlite3_m
19180 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
19190 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
191a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74  rc;.}../*.** Int
191b0 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65  erface to the te
191c0 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a  sting logic..*/.
191d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74  int sqlite3_test
191e0 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c  _control(int op,
191f0 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20   ...){.  int rc 
19200 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
19210 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
19220 5f 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74 20  _TEST.  va_list 
19230 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
19240 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
19250 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a  ( op ){..    /*.
19260 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20      ** Save the 
19270 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
19280 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a   the PRNG..    *
19290 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
192a0 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
192b0 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SAVE: {.      sq
192c0 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61  lite3PrngSaveSta
192d0 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
192e0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
192f0 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20  .    ** Restore 
19300 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
19310 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73   PRNG to the las
19320 74 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73  t state saved us
19330 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f  ing.    ** PRNG_
19340 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53  SAVE.  If PRNG_S
19350 41 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65  AVE has never be
19360 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64  fore been called
19370 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
19380 69 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b  is verb acts lik
19390 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20  e PRNG_RESET..  
193a0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
193b0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
193c0 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20  NG_RESTORE: {.  
193d0 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52      sqlite3PrngR
193e0 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20  estoreState();. 
193f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19400 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
19410 20 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20   Reset the PRNG 
19420 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e  back to its unin
19430 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e  itialized state.
19440 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a    The next call.
19450 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
19460 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77  3_randomness() w
19470 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50  ill reseed the P
19480 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67  RNG using a sing
19490 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  le call.    ** t
194a0 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73  o the xRandomnes
194b0 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  s method of the 
194c0 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20  default VFS..   
194d0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
194e0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
194f0 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20  G_RESET: {.     
19500 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
19510 65 73 73 28 30 2c 30 29 3b 0a 20 20 20 20 20 20  ess(0,0);.      
19520 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
19530 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
19540 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
19550 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73  l(BITVEC_TEST, s
19560 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20  ize, program).  
19570 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20    **.    ** Run 
19580 61 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61  a test against a
19590 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f   Bitvec object o
195a0 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f  f size.  The pro
195b0 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20  gram argument.  
195c0 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79    ** is an array
195d0 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61   of integers tha
195e0 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65  t defines the te
195f0 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f  st.  Return -1 o
19600 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72  n a.    ** memor
19610 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
19620 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73  or, 0 on success
19630 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  , or non-zero fo
19640 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  r an error..    
19650 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74  ** See the sqlit
19660 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
19670 65 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  est() for additi
19680 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
19690 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
196a0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
196b0 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b  L_BITVEC_TEST: {
196c0 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  .      int sz = 
196d0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
196e0 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f  .      int *aPro
196f0 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  g = va_arg(ap, i
19700 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt*);.      rc =
19710 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
19720 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50  iltinTest(sz, aP
19730 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rog);.      brea
19740 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
19750 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
19760 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45  _test_control(BE
19770 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b  NIGN_MALLOC_HOOK
19780 53 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29  S, xBegin, xEnd)
19790 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
197a0 65 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f  egister hooks to
197b0 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74   call to indicat
197c0 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29  e which malloc()
197d0 20 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a   failures .    *
197e0 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20  * are benign..  
197f0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
19800 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45  LITE_TESTCTRL_BE
19810 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b  NIGN_MALLOC_HOOK
19820 53 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64  S: {.      typed
19830 65 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66  ef void (*void_f
19840 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a  unction)(void);.
19850 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74        void_funct
19860 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e  ion xBenignBegin
19870 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e  ;.      void_fun
19880 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64  ction xBenignEnd
19890 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42  ;.      xBenignB
198a0 65 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70  egin = va_arg(ap
198b0 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  , void_function)
198c0 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45  ;.      xBenignE
198d0 6e 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  nd = va_arg(ap, 
198e0 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a  void_function);.
198f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e        sqlite3Ben
19900 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78  ignMallocHooks(x
19910 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65  BenignBegin, xBe
19920 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20  nignEnd);.      
19930 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
19940 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
19950 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
19960 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
19970 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  L_PENDING_BYTE, 
19980 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a  unsigned int X).
19990 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65      **.    ** Se
199a0 74 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  t the PENDING by
199b0 74 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  te to the value 
199c0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c  in the argument,
199d0 20 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20   if X>0..    ** 
199e0 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
199f0 69 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e  if X==0.  Return
19a00 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
19a10 65 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20  e pending byte. 
19a20 20 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73     ** as it exis
19a30 74 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73  ting before this
19a40 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
19a50 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  led..    **.    
19a60 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43  ** IMPORTANT:  C
19a70 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44  hanging the PEND
19a80 49 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78  ING byte from 0x
19a90 34 30 30 30 30 30 30 30 20 72 65 73 75 6c 74 73  40000000 results
19aa0 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e   in.    ** an in
19ab0 63 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62  compatible datab
19ac0 61 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ase file format.
19ad0 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50    Changing the P
19ae0 45 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20  ENDING byte.    
19af0 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74  ** while any dat
19b00 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
19b10 20 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73   is open results
19b20 20 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e   in undefined an
19b30 64 0a 20 20 20 20 2a 2a 20 64 69 6c 65 74 65 72  d.    ** dileter
19b40 69 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20  ious behavior.. 
19b50 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
19b60 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
19b70 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20  ENDING_BYTE: {. 
19b80 20 20 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e       rc = PENDIN
19b90 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20  G_BYTE;.#ifndef 
19ba0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
19bb0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
19bc0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77  unsigned int new
19bd0 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Val = va_arg(ap,
19be0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a   unsigned int);.
19bf0 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 56          if( newV
19c00 61 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64  al ) sqlite3Pend
19c10 69 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c  ingByte = newVal
19c20 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
19c30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19c40 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
19c50 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
19c60 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
19c70 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c  TESTCTRL_ASSERT,
19c80 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
19c90 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f     ** This actio
19ca0 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e  n provides a run
19cb0 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65  -time test to se
19cc0 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
19cd0 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29  .    ** assert()
19ce0 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20   was enabled at 
19cf0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49  compile-time.  I
19d00 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 20  f X is true and 
19d10 61 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20  assert().    ** 
19d20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
19d30 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
19d40 65 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 58  e is true.  If X
19d50 20 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20   is true and.   
19d60 20 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73 20   ** assert() is 
19d70 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
19d80 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
19d90 69 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69  is zero.  If X i
19da0 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61  s.    ** false a
19db0 6e 64 20 61 73 73 65 72 74 28 29 20 69 73 20 65  nd assert() is e
19dc0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
19dd0 20 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73   assertion fires
19de0 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
19df0 70 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20  process aborts. 
19e00 20 49 66 20 58 20 69 73 20 66 61 6c 73 65 20 61   If X is false a
19e10 6e 64 20 61 73 73 65 72 74 28 29 20 69 73 20 64  nd assert() is d
19e20 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
19e30 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  e.    ** return 
19e40 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20  value is zero.. 
19e50 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
19e60 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
19e70 53 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76  SSERT: {.      v
19e80 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20  olatile int x = 
19e90 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
19ea0 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   (x = va_arg(ap,
19eb0 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  int))!=0 );.    
19ec0 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20    rc = x;.      
19ed0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20  break;.    }... 
19ee0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
19ef0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
19f00 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
19f10 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58  RL_ALWAYS, int X
19f20 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
19f30 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
19f40 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
19f50 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20  test to see how 
19f60 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20  the ALWAYS and. 
19f70 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72     ** NEVER macr
19f80 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20  os were defined 
19f90 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
19fa0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
19fb0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
19fc0 69 73 20 41 4c 57 41 59 53 28 58 29 2e 20 20 0a  is ALWAYS(X).  .
19fd0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
19fe0 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65  e recommended te
19ff0 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20  st is X==2.  If 
1a000 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1a010 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e   is 2, that mean
1a020 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28  s.    ** ALWAYS(
1a030 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72  ) and NEVER() ar
1a040 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73  e both no-op pas
1a050 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73  s-through macros
1a060 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 20  , which is the. 
1a070 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65     ** default se
1a080 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72  tting.  If the r
1a090 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31  eturn value is 1
1a0a0 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20  , then ALWAYS() 
1a0b0 69 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a  is either.    **
1a0c0 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74   hard-coded to t
1a0d0 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61  rue or else it a
1a0e0 73 73 65 72 74 73 20 69 66 20 69 74 73 20 61 72  sserts if its ar
1a0f0 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e  gument is false.
1a100 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73  .    ** The firs
1a110 74 20 62 65 68 61 76 69 6f 72 20 28 68 61 72 64  t behavior (hard
1a120 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20  -coded to true) 
1a130 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
1a140 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
1a150 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
1a160 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
1a170 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64   is disabled and
1a180 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20   the second.    
1a190 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73 73  ** behavior (ass
1a1a0 65 72 74 20 69 66 20 74 68 65 20 61 72 67 75 6d  ert if the argum
1a1b0 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20  ent to ALWAYS() 
1a1c0 69 73 20 66 61 6c 73 65 29 20 69 73 20 74 68 65  is false) is the
1a1d0 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
1a1e0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1a1f0 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
1a200 74 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  t assert() is en
1a210 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  abled..    **.  
1a220 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d    ** The run-tim
1a230 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65  e test procedure
1a240 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65   might look some
1a250 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a  thing like this:
1a260 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1a270 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65    if( sqlite3_te
1a280 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1a290 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
1a2a0 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20  S, 2)==2 ){.    
1a2b0 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59  **      // ALWAY
1a2c0 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20  S() and NEVER() 
1a2d0 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74  are no-op pass-t
1a2e0 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20  hrough macros.  
1a2f0 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66    **    }else if
1a300 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  ( sqlite3_test_c
1a310 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1a320 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31  STCTRL_ASSERT, 1
1a330 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  ) ){.    **     
1a340 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73   // ALWAYS(x) as
1a350 73 65 72 74 73 20 74 68 61 74 20 78 20 69 73 20  serts that x is 
1a360 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61  true. NEVER(x) a
1a370 73 73 65 72 74 73 20 78 20 69 73 20 66 61 6c 73  sserts x is fals
1a380 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c  e..    **    }el
1a390 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  se{.    **      
1a3a0 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73 20  // ALWAYS(x) is 
1a3b0 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e  a constant 1.  N
1a3c0 45 56 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e  EVER(x) is a con
1a3d0 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20  stant 0..    ** 
1a3e0 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20     }.    */.    
1a3f0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1a400 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20  CTRL_ALWAYS: {. 
1a410 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
1a420 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
1a430 20 20 20 72 63 20 3d 20 41 4c 57 41 59 53 28 78     rc = ALWAYS(x
1a440 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a450 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1a460 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    **   sqlite3_t
1a470 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1a480 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45  TE_TESTCTRL_BYTE
1a490 4f 52 44 45 52 29 3b 0a 20 20 20 20 2a 2a 0a 20  ORDER);.    **. 
1a4a0 20 20 20 2a 2a 20 54 68 65 20 69 6e 74 65 67 65     ** The intege
1a4b0 72 20 72 65 74 75 72 6e 65 64 20 72 65 76 65 61  r returned revea
1a4c0 6c 73 20 74 68 65 20 62 79 74 65 2d 6f 72 64 65  ls the byte-orde
1a4d0 72 20 6f 66 20 74 68 65 20 63 6f 6d 70 75 74 65  r of the compute
1a4e0 72 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 2a  r on which.    *
1a4f0 2a 20 53 51 4c 69 74 65 20 69 73 20 72 75 6e 6e  * SQLite is runn
1a500 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ing:.    **.    
1a510 2a 2a 20 20 20 20 20 20 20 31 20 20 20 20 20 62  **       1     b
1a520 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65  ig-endian,    de
1a530 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d  termined at run-
1a540 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  time.    **     
1a550 20 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65   10     little-e
1a560 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65  ndian, determine
1a570 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20  d at run-time.  
1a580 20 20 2a 2a 20 20 34 33 32 31 30 31 20 20 20 20    **  432101    
1a590 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20   big-endian,    
1a5a0 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f  determined at co
1a5b0 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a  mpile-time.    *
1a5c0 2a 20 20 31 32 33 34 31 30 20 20 20 20 20 6c 69  *  123410     li
1a5d0 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74  ttle-endian, det
1a5e0 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69  ermined at compi
1a5f0 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2f 20 0a  le-time.    */ .
1a600 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1a610 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44  TESTCTRL_BYTEORD
1a620 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  ER: {.      rc =
1a630 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45   SQLITE_BYTEORDE
1a640 52 2a 31 30 30 20 2b 20 53 51 4c 49 54 45 5f 4c  R*100 + SQLITE_L
1a650 49 54 54 4c 45 45 4e 44 49 41 4e 2a 31 30 20 2b  ITTLEENDIAN*10 +
1a660 20 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41   SQLITE_BIGENDIA
1a670 4e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  N;.      break;.
1a680 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
1a690 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1a6a0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1a6b0 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73 71  CTRL_RESERVE, sq
1a6c0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
1a6d0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1a6e0 53 65 74 20 74 68 65 20 6e 52 65 73 65 72 76 65  Set the nReserve
1a6f0 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74   size to N for t
1a700 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1a710 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1a720 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69  .    ** connecti
1a730 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20  on db..    */.  
1a740 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1a750 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20  STCTRL_RESERVE: 
1a760 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
1a770 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  *db = va_arg(ap,
1a780 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20   sqlite3*);.    
1a790 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67    int x = va_arg
1a7a0 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
1a7b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1a7c0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1a7d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1a7e0 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 64 62  eeSetPageSize(db
1a7f0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c  ->aDb[0].pBt, 0,
1a800 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   x, 0);.      sq
1a810 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1a820 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1a830 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a840 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65  ..    /*  sqlite
1a850 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1a860 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
1a870 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71  PTIMIZATIONS, sq
1a880 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
1a890 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1a8a0 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
1a8b0 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69  e various optimi
1a8c0 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73 74  zations for test
1a8d0 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54  ing purposes.  T
1a8e0 68 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d  he .    ** argum
1a8f0 65 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d 61  ent N is a bitma
1a900 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69  sk of optimizati
1a910 6f 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ons to be disabl
1a920 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a  ed.  For normal.
1a930 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
1a940 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 20   N should be 0. 
1a950 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
1a960 74 20 61 20 74 65 73 74 20 70 72 6f 67 72 61 6d  t a test program
1a970 20 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20 2a   (like the.    *
1a980 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73 74  * SQL Logic Test
1a990 20 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f 64   or SLT test mod
1a9a0 75 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68 65  ule) can run the
1a9b0 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70   same SQL multip
1a9c0 6c 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20  le times.    ** 
1a9d0 77 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70 74  with various opt
1a9e0 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61 62  imizations disab
1a9f0 6c 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68  led to verify th
1aa00 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  at the same answ
1aa10 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62 74  er.    ** is obt
1aa20 61 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20 63  ained in every c
1aa30 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1aa40 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1aa50 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
1aa60 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NS: {.      sqli
1aa70 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67  te3 *db = va_arg
1aa80 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a  (ap, sqlite3*);.
1aa90 20 20 20 20 20 20 64 62 2d 3e 64 62 4f 70 74 46        db->dbOptF
1aaa0 6c 61 67 73 20 3d 20 28 75 31 36 29 28 76 61 5f  lags = (u16)(va_
1aab0 61 72 67 28 61 70 2c 20 69 6e 74 29 20 26 20 30  arg(ap, int) & 0
1aac0 78 66 66 66 66 29 3b 0a 20 20 20 20 20 20 62 72  xffff);.      br
1aad0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  eak;.    }..#ifd
1aae0 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57  ef SQLITE_N_KEYW
1aaf0 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  ORD.    /* sqlit
1ab00 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1ab10 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1ab20 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74  ISKEYWORD, const
1ab30 20 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20   char *zWord).  
1ab40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a    **.    ** If z
1ab50 57 6f 72 64 20 69 73 20 61 20 6b 65 79 77 6f 72  Word is a keywor
1ab60 64 20 72 65 63 6f 67 6e 69 7a 65 64 20 62 79 20  d recognized by 
1ab70 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 6e  the parser, then
1ab80 20 72 65 74 75 72 6e 20 74 68 65 0a 20 20 20 20   return the.    
1ab90 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79  ** number of key
1aba0 77 6f 72 64 73 2e 20 20 4f 72 20 69 66 20 7a 57  words.  Or if zW
1abb0 6f 72 64 20 69 73 20 6e 6f 74 20 61 20 6b 65 79  ord is not a key
1abc0 77 6f 72 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a  word, return 0..
1abd0 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54      ** .    ** T
1abe0 68 69 73 20 74 65 73 74 20 66 65 61 74 75 72 65  his test feature
1abf0 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
1ac00 6c 65 20 69 6e 20 74 68 65 20 61 6d 61 6c 67 61  le in the amalga
1ac10 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20  mation since.   
1ac20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e   ** the SQLITE_N
1ac30 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f 20 69  _KEYWORD macro i
1ac40 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 69 6e  s not defined in
1ac50 20 74 68 69 73 20 66 69 6c 65 20 69 66 20 53 51   this file if SQ
1ac60 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  Lite.    ** is b
1ac70 75 69 6c 74 20 75 73 69 6e 67 20 73 65 70 61 72  uilt using separ
1ac80 61 74 65 20 73 6f 75 72 63 65 20 66 69 6c 65 73  ate source files
1ac90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1aca0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1acb0 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20  L_ISKEYWORD: {. 
1acc0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1acd0 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72 67 28  *zWord = va_arg(
1ace0 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  ap, const char*)
1acf0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
1ad00 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1ad10 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 72 63  zWord);.      rc
1ad20 20 3d 20 28 73 71 6c 69 74 65 33 4b 65 79 77 6f   = (sqlite3Keywo
1ad30 72 64 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72  rdCode((u8*)zWor
1ad40 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20  d, n)!=TK_ID) ? 
1ad50 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44  SQLITE_N_KEYWORD
1ad60 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   : 0;.      brea
1ad70 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
1ad80 0a 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ..    /* sqlite3
1ad90 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1ada0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43  LITE_TESTCTRL_SC
1adb0 52 41 54 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c  RATCHMALLOC, sz,
1adc0 20 26 70 4e 65 77 2c 20 70 46 72 65 65 29 3b 0a   &pNew, pFree);.
1add0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61      **.    ** Pa
1ade0 73 73 20 70 46 72 65 65 20 69 6e 74 6f 20 73 71  ss pFree into sq
1adf0 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65  lite3ScratchFree
1ae00 28 29 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 73  (). .    ** If s
1ae10 7a 3e 30 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  z>0 then allocat
1ae20 65 20 61 20 73 63 72 61 74 63 68 20 62 75 66 66  e a scratch buff
1ae30 65 72 20 69 6e 74 6f 20 70 4e 65 77 2e 20 20 0a  er into pNew.  .
1ae40 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1ae50 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1ae60 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b  SCRATCHMALLOC: {
1ae70 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 46 72  .      void *pFr
1ae80 65 65 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20 20 20  ee, **ppNew;.   
1ae90 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20     int sz;.     
1aea0 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   sz = va_arg(ap,
1aeb0 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 70 70 4e   int);.      ppN
1aec0 65 77 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ew = va_arg(ap, 
1aed0 76 6f 69 64 2a 2a 29 3b 0a 20 20 20 20 20 20 70  void**);.      p
1aee0 46 72 65 65 20 3d 20 76 61 5f 61 72 67 28 61 70  Free = va_arg(ap
1aef0 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
1af00 69 66 28 20 73 7a 20 29 20 2a 70 70 4e 65 77 20  if( sz ) *ppNew 
1af10 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68  = sqlite3Scratch
1af20 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20  Malloc(sz);.    
1af30 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68    sqlite3Scratch
1af40 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20  Free(pFree);.   
1af50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1af60 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1af70 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1af80 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c  QLITE_TESTCTRL_L
1af90 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20  OCALTIME_FAULT, 
1afa0 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20  int onoff);.    
1afb0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72  **.    ** If par
1afc0 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20  ameter onoff is 
1afd0 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67  non-zero, config
1afe0 75 72 65 20 74 68 65 20 77 72 61 70 70 65 72 73  ure the wrappers
1aff0 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20 20   so that all.   
1b000 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 63   ** subsequent c
1b010 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d  alls to localtim
1b020 65 28 29 20 61 6e 64 20 76 61 72 69 61 6e 74 73  e() and variants
1b030 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20   fail. If onoff 
1b040 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20  is zero,.    ** 
1b050 75 6e 64 6f 20 74 68 69 73 20 73 65 74 74 69 6e  undo this settin
1b060 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  g..    */.    ca
1b070 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1b080 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55  RL_LOCALTIME_FAU
1b090 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LT: {.      sqli
1b0a0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1b0b0 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20  bLocaltimeFault 
1b0c0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1b0d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b0e0 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e      }..#if defin
1b0f0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1b100 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20  _TREE_EXPLAIN). 
1b110 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1b120 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1b130 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 45 58 50  ITE_TESTCTRL_EXP
1b140 4c 41 49 4e 5f 53 54 4d 54 2c 0a 20 20 20 20 2a  LAIN_STMT,.    *
1b150 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b160 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b170 5f 73 74 6d 74 2a 2c 63 6f 6e 73 74 20 63 68 61  _stmt*,const cha
1b180 72 2a 2a 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  r**);.    **.   
1b190 20 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20   ** If compiled 
1b1a0 77 69 74 68 20 53 51 4c 49 54 45 5f 45 4e 41 42  with SQLITE_ENAB
1b1b0 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 2c  LE_TREE_EXPLAIN,
1b1c0 20 65 61 63 68 20 73 71 6c 69 74 65 33 5f 73 74   each sqlite3_st
1b1d0 6d 74 20 68 6f 6c 64 73 0a 20 20 20 20 2a 2a 20  mt holds.    ** 
1b1e0 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
1b1f0 73 63 72 69 62 65 73 20 74 68 65 20 6f 70 74 69  scribes the opti
1b200 6d 69 7a 65 64 20 70 61 72 73 65 20 74 72 65 65  mized parse tree
1b210 2e 20 20 54 68 69 73 20 74 65 73 74 2d 63 6f 6e  .  This test-con
1b220 74 72 6f 6c 0a 20 20 20 20 2a 2a 20 72 65 74 75  trol.    ** retu
1b230 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
1b240 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0a 20 20   that string..  
1b250 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1b260 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 45 58  LITE_TESTCTRL_EX
1b270 50 4c 41 49 4e 5f 53 54 4d 54 3a 20 7b 0a 20 20  PLAIN_STMT: {.  
1b280 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
1b290 20 2a 70 53 74 6d 74 20 3d 20 76 61 5f 61 72 67   *pStmt = va_arg
1b2a0 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d  (ap, sqlite3_stm
1b2b0 74 2a 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t*);.      const
1b2c0 20 63 68 61 72 20 2a 2a 70 7a 52 65 74 20 3d 20   char **pzRet = 
1b2d0 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74  va_arg(ap, const
1b2e0 20 63 68 61 72 2a 2a 29 3b 0a 20 20 20 20 20 20   char**);.      
1b2f0 2a 70 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33  *pzRet = sqlite3
1b300 56 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28  VdbeExplanation(
1b310 28 56 64 62 65 2a 29 70 53 74 6d 74 29 3b 0a 20  (Vdbe*)pStmt);. 
1b320 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b330 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
1b340 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1b350 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1b360 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f  ESTCTRL_NEVER_CO
1b370 52 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20 20 20  RRUPT, int);.   
1b380 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 6f   **.    ** Set o
1b390 72 20 63 6c 65 61 72 20 61 20 66 6c 61 67 20 74  r clear a flag t
1b3a0 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68  hat indicates th
1b3b0 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
1b3c0 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73 20 77  file is always w
1b3d0 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f 72 6d  ell-.    ** form
1b3e0 65 64 20 61 6e 64 20 6e 65 76 65 72 20 63 6f 72  ed and never cor
1b3f0 72 75 70 74 2e 20 20 54 68 69 73 20 66 6c 61 67  rupt.  This flag
1b400 20 69 73 20 63 6c 65 61 72 20 62 79 20 64 65 66   is clear by def
1b410 61 75 6c 74 2c 20 69 6e 64 69 63 61 74 69 6e 67  ault, indicating
1b420 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 64 61 74   that.    ** dat
1b430 61 62 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68  abase files migh
1b440 74 20 68 61 76 65 20 61 72 62 69 74 72 61 72 79  t have arbitrary
1b450 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53 65   corruption.  Se
1b460 74 74 69 6e 67 20 74 68 65 20 66 6c 61 67 20 64  tting the flag d
1b470 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74 65 73  uring.    ** tes
1b480 74 69 6e 67 20 63 61 75 73 65 73 20 63 65 72 74  ting causes cert
1b490 61 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  ain assert() sta
1b4a0 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63  tements in the c
1b4b0 6f 64 65 20 74 6f 20 62 65 20 61 63 74 69 76 61  ode to be activa
1b4c0 74 65 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ted.    ** that 
1b4d0 64 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76 61 72  demonstrat invar
1b4e0 69 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f  iants on well-fo
1b4f0 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
1b500 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  les..    */.    
1b510 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1b520 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55  CTRL_NEVER_CORRU
1b530 50 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  PT: {.      sqli
1b540 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1b550 6e 65 76 65 72 43 6f 72 72 75 70 74 20 3d 20 76  neverCorrupt = v
1b560 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
1b570 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b580 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71   }...    /*   sq
1b590 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1b5a0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1b5b0 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  RL_VDBE_COVERAGE
1b5c0 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70 74 72  , xCallback, ptr
1b5d0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1b5e0 20 53 65 74 20 74 68 65 20 56 44 42 45 20 63 6f   Set the VDBE co
1b5f0 76 65 72 61 67 65 20 63 61 6c 6c 62 61 63 6b 20  verage callback 
1b600 66 75 6e 63 74 69 6f 6e 20 74 6f 20 78 43 61 6c  function to xCal
1b610 6c 62 61 63 6b 20 77 69 74 68 20 63 6f 6e 74 65  lback with conte
1b620 78 74 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  xt .    ** point
1b630 65 72 20 70 74 72 2e 0a 20 20 20 20 2a 2f 0a 20  er ptr..    */. 
1b640 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1b650 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56  ESTCTRL_VDBE_COV
1b660 45 52 41 47 45 3a 20 7b 0a 23 69 66 64 65 66 20  ERAGE: {.#ifdef 
1b670 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
1b680 52 41 47 45 0a 20 20 20 20 20 20 74 79 70 65 64  RAGE.      typed
1b690 65 66 20 76 6f 69 64 20 28 2a 62 72 61 6e 63 68  ef void (*branch
1b6a0 5f 63 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  _callback)(void*
1b6b0 2c 69 6e 74 2c 75 38 2c 75 38 29 3b 0a 20 20 20  ,int,u8,u8);.   
1b6c0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1b6d0 43 6f 6e 66 69 67 2e 78 56 64 62 65 42 72 61 6e  Config.xVdbeBran
1b6e0 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 62  ch = va_arg(ap,b
1b6f0 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 3b  ranch_callback);
1b700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1b710 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62 65  obalConfig.pVdbe
1b720 42 72 61 6e 63 68 41 72 67 20 3d 20 76 61 5f 61  BranchArg = va_a
1b730 72 67 28 61 70 2c 76 6f 69 64 2a 29 3b 0a 23 65  rg(ap,void*);.#e
1b740 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
1b750 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 76  ;.    }..  }.  v
1b760 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69  a_end(ap);.#endi
1b770 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1b780 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f  _BUILTIN_TEST */
1b790 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b7a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
1b7b0 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65   utility routine
1b7c0 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20  , useful to VFS 
1b7d0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c  implementations,
1b7e0 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20   that checks.** 
1b7f0 74 6f 20 73 65 65 20 69 66 20 61 20 64 61 74 61  to see if a data
1b800 62 61 73 65 20 66 69 6c 65 20 77 61 73 20 61 20  base file was a 
1b810 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  URI that contain
1b820 65 64 20 61 20 73 70 65 63 69 66 69 63 20 71 75  ed a specific qu
1b830 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ery .** paramete
1b840 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74  r, and if so obt
1b850 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  ains the value o
1b860 66 20 74 68 65 20 71 75 65 72 79 20 70 61 72 61  f the query para
1b870 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  meter..**.** The
1b880 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d   zFilename argum
1b890 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e  ent is the filen
1b8a0 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73  ame pointer pass
1b8b0 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65  ed into the xOpe
1b8c0 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66  n().** method of
1b8d0 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74   a VFS implement
1b8e0 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72  ation.  The zPar
1b8f0 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  am argument is t
1b900 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a  he name of the.*
1b910 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  * query paramete
1b920 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73  r we seek.  This
1b930 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1b940 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1b950 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61  e zParam.** para
1b960 6d 65 74 65 72 20 69 66 20 69 74 20 65 78 69 73  meter if it exis
1b970 74 73 2e 20 20 49 66 20 74 68 65 20 70 61 72 61  ts.  If the para
1b980 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65  meter does not e
1b990 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  xist, this routi
1b9a0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  ne.** returns a 
1b9b0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  NULL pointer..*/
1b9c0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1b9d0 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
1b9e0 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
1b9f0 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20  Filename, const 
1ba00 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20  char *zParam){. 
1ba10 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
1ba20 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1ba30 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c  zFilename += sql
1ba40 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
1ba50 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77  lename) + 1;.  w
1ba60 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b  hile( zFilename[
1ba70 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  0] ){.    int x 
1ba80 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  = strcmp(zFilena
1ba90 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20  me, zParam);.   
1baa0 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
1bab0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
1bac0 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
1bad0 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74    if( x==0 ) ret
1bae0 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  urn zFilename;. 
1baf0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20     zFilename += 
1bb00 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1bb10 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a  zFilename) + 1;.
1bb20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1bb30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1bb40 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  a boolean value 
1bb50 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61  for a query para
1bb60 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  meter..*/.int sq
1bb70 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
1bb80 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  n(const char *zF
1bb90 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  ilename, const c
1bba0 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74  har *zParam, int
1bbb0 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74   bDflt){.  const
1bbc0 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
1bbd0 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
1bbe0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72  (zFilename, zPar
1bbf0 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62  am);.  bDflt = b
1bc00 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72  Dflt!=0;.  retur
1bc10 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74  n z ? sqlite3Get
1bc20 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74  Boolean(z, bDflt
1bc30 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a  ) : bDflt;.}../*
1bc40 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d  .** Return a 64-
1bc50 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75  bit integer valu
1bc60 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61  e for a query pa
1bc70 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69  rameter..*/.sqli
1bc80 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65  te3_int64 sqlite
1bc90 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63  3_uri_int64(.  c
1bca0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1bcb0 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65  name,    /* File
1bcc0 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64 20 74  name as passed t
1bcd0 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e  o xOpen */.  con
1bce0 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c  st char *zParam,
1bcf0 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61         /* URI pa
1bd00 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a  rameter sought *
1bd10 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1bd20 34 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a  4 bDflt       /*
1bd30 20 72 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d   return if param
1bd40 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  eter is missing 
1bd50 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
1bd60 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
1bd70 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46  uri_parameter(zF
1bd80 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29  ilename, zParam)
1bd90 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
1bda0 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20  4 v;.  if( z && 
1bdb0 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c  sqlite3Atoi64(z,
1bdc0 20 26 76 2c 20 73 71 6c 69 74 65 33 53 74 72 6c   &v, sqlite3Strl
1bdd0 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f  en30(z), SQLITE_
1bde0 55 54 46 38 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  UTF8)==SQLITE_OK
1bdf0 20 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20   ){.    bDflt = 
1be00 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  v;.  }.  return 
1be10 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  bDflt;.}../*.** 
1be20 52 65 74 75 72 6e 20 74 68 65 20 42 74 72 65 65  Return the Btree
1be30 20 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66   pointer identif
1be40 69 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20  ied by zDbName. 
1be50 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
1be60 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74  not found..*/.Bt
1be70 72 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61  ree *sqlite3DbNa
1be80 6d 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65  meToBtree(sqlite
1be90 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1bea0 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69  r *zDbName){.  i
1beb0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1bec0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
1bed0 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44  {.    if( db->aD
1bee0 62 5b 69 5d 2e 70 42 74 0a 20 20 20 20 20 26 26  b[i].pBt.     &&
1bef0 20 28 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20   (zDbName==0 || 
1bf00 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1bf10 44 62 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b  DbName, db->aDb[
1bf20 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 29 0a 20 20  i].zName)==0).  
1bf30 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
1bf40 6e 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  n db->aDb[i].pBt
1bf50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1bf60 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1bf70 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65   Return the file
1bf80 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
1bf90 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  base associated 
1bfa0 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 0a  with a database.
1bfb0 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
1bfc0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1bfd0 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d  lite3_db_filenam
1bfe0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
1bff0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1c000 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  me){.  Btree *pB
1c010 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  t = sqlite3DbNam
1c020 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
1c030 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
1c040 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72  pBt ? sqlite3Btr
1c050 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 70 42  eeGetFilename(pB
1c060 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  t) : 0;.}../*.**
1c070 20 52 65 74 75 72 6e 20 31 20 69 66 20 64 61 74   Return 1 if dat
1c080 61 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e  abase is read-on
1c090 6c 79 20 6f 72 20 30 20 69 66 20 72 65 61 64 2f  ly or 0 if read/
1c0a0 77 72 69 74 65 2e 20 20 52 65 74 75 72 6e 20 2d  write.  Return -
1c0b0 31 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  1 if.** no such 
1c0c0 64 61 74 61 62 61 73 65 20 65 78 69 73 74 73 2e  database exists.
1c0d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1c0e0 64 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69  db_readonly(sqli
1c0f0 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
1c100 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20  har *zDbName){. 
1c110 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 73 71   Btree *pBt = sq
1c120 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72  lite3DbNameToBtr
1c130 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b  ee(db, zDbName);
1c140 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20  .  return pBt ? 
1c150 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
1c160 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 42 74  adonly(sqlite3Bt
1c170 72 65 65 50 61 67 65 72 28 70 42 74 29 29 20 3a  reePager(pBt)) :
1c180 20 2d 31 3b 0a 7d 0a 0a 23 69 66 20 28 53 51 4c   -1;.}..#if (SQL
1c190 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45  ITE_ENABLE_APPLE
1c1a0 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e  _SPI>0) && defin
1c1b0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 0a 23  ed(__APPLE__)..#
1c1c0 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
1c1d0 5f 70 72 69 76 61 74 65 2e 68 22 0a 0a 2f 2a 20  _private.h"../* 
1c1e0 0a 2a 2a 20 54 65 73 74 69 6e 67 20 61 20 66 69  .** Testing a fi
1c1f0 6c 65 20 70 61 74 68 20 66 6f 72 20 73 71 6c 69  le path for sqli
1c200 74 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  te locks held by
1c210 20 61 20 70 72 6f 63 65 73 73 20 49 44 2e 20 0a   a process ID. .
1c220 2a 2a 20 52 65 74 75 72 6e 73 20 53 51 4c 49 54  ** Returns SQLIT
1c230 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 4e 20 69  E_LOCKSTATE_ON i
1c240 66 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73  f locks are pres
1c250 65 6e 74 20 6f 6e 20 70 61 74 68 0a 2a 2a 20 74  ent on path.** t
1c260 68 61 74 20 77 6f 75 6c 64 20 70 72 65 76 65 6e  hat would preven
1c270 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
1c280 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
1c290 74 20 5f 73 71 6c 69 74 65 33 5f 6c 6f 63 6b 73  t _sqlite3_locks
1c2a0 74 61 74 65 28 63 6f 6e 73 74 20 63 68 61 72 20  tate(const char 
1c2b0 2a 70 61 74 68 2c 20 70 69 64 5f 74 20 70 69 64  *path, pid_t pid
1c2c0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1c2d0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 0a 20 20 69 66   = NULL;.  .  if
1c2e0 28 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  ( sqlite3_open_v
1c2f0 32 28 70 61 74 68 2c 20 26 64 62 2c 20 53 51 4c  2(path, &db, SQL
1c300 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1c310 59 2c 20 4e 55 4c 4c 29 20 3d 3d 20 53 51 4c 49  Y, NULL) == SQLI
1c320 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 4c 6f 63  TE_OK ){.    Loc
1c330 6b 73 74 61 74 65 50 49 44 20 6c 6f 63 6b 73 74  kstatePID lockst
1c340 61 74 65 20 3d 20 7b 70 69 64 2c 20 2d 31 7d 3b  ate = {pid, -1};
1c350 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
1c360 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
1c370 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  LL, SQLITE_FCNTL
1c380 5f 4c 4f 43 4b 53 54 41 54 45 5f 50 49 44 2c 20  _LOCKSTATE_PID, 
1c390 26 6c 6f 63 6b 73 74 61 74 65 29 3b 0a 20 20 20  &lockstate);.   
1c3a0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
1c3b0 62 29 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74  b);.    int stat
1c3c0 65 20 3d 20 6c 6f 63 6b 73 74 61 74 65 2e 73 74  e = lockstate.st
1c3d0 61 74 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ate;.    return 
1c3e0 73 74 61 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28  state;.  }.  if(
1c3f0 20 4e 55 4c 4c 21 3d 64 62 20 29 7b 20 0a 20 20   NULL!=db ){ .  
1c400 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
1c410 64 62 29 3b 20 2f 2a 20 6e 65 65 64 20 74 6f 20  db); /* need to 
1c420 63 6c 6f 73 65 20 65 76 65 6e 20 69 66 20 6f 70  close even if op
1c430 65 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  en returns an er
1c440 72 6f 72 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  ror */.  }.  ret
1c450 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53  urn SQLITE_LOCKS
1c460 54 41 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23  TATE_ERROR;.}..#
1c470 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1c480 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49  ENABLE_APPLE_SPI
1c490 20 2a 2f 0a                                       */.