/ Hex Artifact Content
Login

Artifact 350f909c5435f2898f1b5fcd416695ab347889c4:


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 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
0360: 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a 69 6e  _ENABLE_JSON1.in
0370: 74 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e  t sqlite3Json1In
0380: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
0390: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
03a0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 69  TE_ENABLE_FTS5.i
03b0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
03c0: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
03d0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
03e0: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
03f0: 4e 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  N./* IMPLEMENTAT
0400: 49 4f 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36 2d  ION-OF: R-46656-
0410: 34 35 31 35 36 20 54 68 65 20 73 71 6c 69 74 65  45156 The sqlite
0420: 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69  3_version[] stri
0430: 6e 67 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 63  ng constant.** c
0440: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78 74  ontains the text
0450: 20 6f 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49   of SQLITE_VERSI
0460: 4f 4e 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f  ON macro. .*/.co
0470: 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65 33  nst char sqlite3
0480: 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c  _version[] = SQL
0490: 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e  ITE_VERSION;.#en
04a0: 64 69 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e  dif../* IMPLEMEN
04b0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33 35  TATION-OF: R-535
04c0: 33 36 2d 34 32 35 37 35 20 54 68 65 20 73 71 6c  36-42575 The sql
04d0: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
04e0: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
04f0: 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ns.** a pointer 
0500: 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 73 71  to the to the sq
0510: 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20  lite3_version[] 
0520: 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e  string constant.
0530: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
0540: 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  *sqlite3_libvers
0550: 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72  ion(void){ retur
0560: 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  n sqlite3_versio
0570: 6e 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  n; }../* IMPLEME
0580: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 36 33  NTATION-OF: R-63
0590: 31 32 34 2d 33 39 33 30 30 20 54 68 65 20 73 71  124-39300 The sq
05a0: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
05b0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
05c0: 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  s a.** pointer t
05d0: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74  o a string const
05e0: 61 6e 74 20 77 68 6f 73 65 20 76 61 6c 75 65 20  ant whose value 
05f0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
0600: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f 55  he.** SQLITE_SOU
0610: 52 43 45 5f 49 44 20 43 20 70 72 65 70 72 6f 63  RCE_ID C preproc
0620: 65 73 73 6f 72 20 6d 61 63 72 6f 2e 20 0a 2a 2f  essor macro. .*/
0630: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
0640: 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 76 6f  ite3_sourceid(vo
0650: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
0660: 54 45 5f 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a  TE_SOURCE_ID; }.
0670: 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49  ./* IMPLEMENTATI
0680: 4f 4e 2d 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36  ON-OF: R-35210-6
0690: 33 35 30 38 20 54 68 65 20 73 71 6c 69 74 65 33  3508 The sqlite3
06a0: 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
06b0: 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  er() function.**
06c0: 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74 65   returns an inte
06d0: 67 65 72 20 65 71 75 61 6c 20 74 6f 20 53 51 4c  ger equal to SQL
06e0: 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  ITE_VERSION_NUMB
06f0: 45 52 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ER..*/.int sqlit
0700: 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75  e3_libversion_nu
0710: 6d 62 65 72 28 76 6f 69 64 29 7b 20 72 65 74 75  mber(void){ retu
0720: 72 6e 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  rn SQLITE_VERSIO
0730: 4e 5f 4e 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 20  N_NUMBER; }../* 
0740: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
0750: 46 3a 20 52 2d 32 30 37 39 30 2d 31 34 30 32 35  F: R-20790-14025
0760: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72   The sqlite3_thr
0770: 65 61 64 73 61 66 65 28 29 20 66 75 6e 63 74 69  eadsafe() functi
0780: 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65  on returns.** ze
0790: 72 6f 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ro if and only i
07a0: 66 20 53 51 4c 69 74 65 20 77 61 73 20 63 6f 6d  f SQLite was com
07b0: 70 69 6c 65 64 20 77 69 74 68 20 6d 75 74 65 78  piled with mutex
07c0: 69 6e 67 20 63 6f 64 65 20 6f 6d 69 74 74 65 64  ing code omitted
07d0: 20 64 75 65 20 74 6f 0a 2a 2a 20 74 68 65 20 53   due to.** the S
07e0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
07f0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
0800: 74 69 6f 6e 20 62 65 69 6e 67 20 73 65 74 20 74  tion being set t
0810: 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  o 0..*/.int sqli
0820: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 76  te3_threadsafe(v
0830: 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c  oid){ return SQL
0840: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3b 20  ITE_THREADSAFE; 
0850: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f  }../*.** When co
0860: 6d 70 69 6c 69 6e 67 20 74 68 65 20 74 65 73 74  mpiling the test
0870: 20 66 69 78 74 75 72 65 20 6f 72 20 77 69 74 68   fixture or with
0880: 20 64 65 62 75 67 67 69 6e 67 20 65 6e 61 62 6c   debugging enabl
0890: 65 64 20 28 6f 6e 20 57 69 6e 33 32 29 2c 0a 2a  ed (on Win32),.*
08a0: 2a 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20  * this variable 
08b0: 62 65 69 6e 67 20 73 65 74 20 74 6f 20 6e 6f 6e  being set to non
08c0: 2d 7a 65 72 6f 20 77 69 6c 6c 20 63 61 75 73 65  -zero will cause
08d0: 20 4f 53 54 52 41 43 45 20 6d 61 63 72 6f 73 20   OSTRACE macros 
08e0: 74 6f 20 65 6d 69 74 0a 2a 2a 20 65 78 74 72 61  to emit.** extra
08f0: 20 64 69 61 67 6e 6f 73 74 69 63 20 69 6e 66 6f   diagnostic info
0900: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64  rmation..*/.#ifd
0910: 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f  ef SQLITE_HAVE_O
0920: 53 5f 54 52 41 43 45 0a 23 20 69 66 6e 64 65 66  S_TRACE.# ifndef
0930: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53   SQLITE_DEBUG_OS
0940: 5f 54 52 41 43 45 0a 23 20 20 20 64 65 66 69 6e  _TRACE.#   defin
0950: 65 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f  e SQLITE_DEBUG_O
0960: 53 5f 54 52 41 43 45 20 30 0a 23 20 65 6e 64 69  S_TRACE 0.# endi
0970: 66 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 4f  f.  int sqlite3O
0980: 53 54 72 61 63 65 20 3d 20 53 51 4c 49 54 45 5f  STrace = SQLITE_
0990: 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 3b 0a  DEBUG_OS_TRACE;.
09a0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
09b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
09c0: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
09d0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
09e0: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
09f0: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0a00: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
0a10: 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e  r is not NULL an
0a20: 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  d if.** SQLITE_E
0a30: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 69 73  NABLE_IOTRACE is
0a40: 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d   enabled, then m
0a50: 65 73 73 61 67 65 73 20 64 65 73 63 72 69 62 69  essages describi
0a60: 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65  ng.** I/O active
0a70: 20 61 72 65 20 77 72 69 74 74 65 6e 20 75 73 69   are written usi
0a80: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
0a90: 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61 67 65  .  These message
0aa0: 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 64 65  s.** are intende
0ab0: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
0ac0: 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a  activity only..*
0ad0: 2f 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f 69  /.SQLITE_API voi
0ae0: 64 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20  d (SQLITE_CDECL 
0af0: 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 29  *sqlite3IoTrace)
0b00: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e  (const char*, ..
0b10: 2e 29 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  .) = 0;.#endif..
0b20: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c  /*.** If the fol
0b30: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
0b40: 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  riable points to
0b50: 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 68 20   a string which 
0b60: 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f  is the.** name o
0b70: 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74  f a directory, t
0b80: 68 65 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f  hen that directo
0b90: 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ry will be used 
0ba0: 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70  to store.** temp
0bb0: 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a  orary files..**.
0bc0: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  ** See also the 
0bd0: 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f  "PRAGMA temp_sto
0be0: 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51  re_directory" SQ
0bf0: 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68  L command..*/.ch
0c00: 61 72 20 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70  ar *sqlite3_temp
0c10: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  _directory = 0;.
0c20: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f  ./*.** If the fo
0c30: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
0c40: 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74  ariable points t
0c50: 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 68  o a string which
0c60: 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20   is the.** name 
0c70: 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  of a directory, 
0c80: 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63 74  then that direct
0c90: 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ory will be used
0ca0: 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 61 6c 6c   to store.** all
0cb0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
0cc0: 73 70 65 63 69 66 69 65 64 20 77 69 74 68 20 61  specified with a
0cd0: 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
0ce0: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  me..**.** See al
0cf0: 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41 20 64  so the "PRAGMA d
0d00: 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  ata_store_direct
0d10: 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  ory" SQL command
0d20: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
0d30: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
0d40: 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e  y = 0;../*.** In
0d50: 69 74 69 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e  itialize SQLite.
0d60: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f    .**.** This ro
0d70: 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
0d80: 6c 6c 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  lled to initiali
0d90: 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ze the memory al
0da0: 6c 6f 63 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53  location,.** VFS
0db0: 2c 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73  , and mutex subs
0dc0: 79 73 74 65 6d 73 20 70 72 69 6f 72 20 74 6f 20  ystems prior to 
0dd0: 64 6f 69 6e 67 20 61 6e 79 20 73 65 72 69 6f 75  doing any seriou
0de0: 73 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53  s work with.** S
0df0: 51 4c 69 74 65 2e 20 20 42 75 74 20 61 73 20 6c  QLite.  But as l
0e00: 6f 6e 67 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f  ong as you do no
0e10: 74 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 53  t compile with S
0e20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
0e30: 4e 49 54 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  NIT.** this rout
0e40: 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
0e50: 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
0e60: 20 62 79 20 6b 65 79 20 72 6f 75 74 69 6e 65 73   by key routines
0e70: 20 73 75 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69   such as.** sqli
0e80: 74 65 33 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a  te3_open().  .**
0e90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
0ea0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65   is a no-op exce
0eb0: 70 74 20 6f 6e 20 69 74 73 20 76 65 72 79 20 66  pt on its very f
0ec0: 69 72 73 74 20 63 61 6c 6c 20 66 6f 72 20 74 68  irst call for th
0ed0: 65 20 70 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72  e process,.** or
0ee0: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
0ef0: 61 6c 6c 20 61 66 74 65 72 20 61 20 63 61 6c 6c  all after a call
0f00: 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 68 75 74   to sqlite3_shut
0f10: 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  down..**.** The 
0f20: 66 69 72 73 74 20 74 68 72 65 61 64 20 74 6f 20  first thread to 
0f30: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
0f40: 65 20 72 75 6e 73 20 74 68 65 20 69 6e 69 74 69  e runs the initi
0f50: 61 6c 69 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20  alization to.** 
0f60: 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20  completion.  If 
0f70: 73 75 62 73 65 71 75 65 6e 74 20 74 68 72 65 61  subsequent threa
0f80: 64 73 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ds call this rou
0f90: 74 69 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20  tine before the 
0fa0: 66 69 72 73 74 0a 2a 2a 20 74 68 72 65 61 64 20  first.** thread 
0fb0: 68 61 73 20 66 69 6e 69 73 68 65 64 20 74 68 65  has finished the
0fc0: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
0fd0: 70 72 6f 63 65 73 73 2c 20 74 68 65 6e 20 74 68  process, then th
0fe0: 65 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  e subsequent.** 
0ff0: 74 68 72 65 61 64 73 20 6d 75 73 74 20 62 6c 6f  threads must blo
1000: 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  ck until the fir
1010: 73 74 20 74 68 72 65 61 64 20 66 69 6e 69 73 68  st thread finish
1020: 65 73 20 77 69 74 68 20 74 68 65 20 69 6e 69 74  es with the init
1030: 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ialization..**.*
1040: 2a 20 54 68 65 20 66 69 72 73 74 20 74 68 72 65  * The first thre
1050: 61 64 20 6d 69 67 68 74 20 63 61 6c 6c 20 74 68  ad might call th
1060: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 63 75 72  is routine recur
1070: 73 69 76 65 6c 79 2e 20 20 52 65 63 75 72 73 69  sively.  Recursi
1080: 76 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74  ve.** calls to t
1090: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
10a0: 6c 64 20 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66  ld not block, of
10b0: 20 63 6f 75 72 73 65 2e 20 20 4f 74 68 65 72 77   course.  Otherw
10c0: 69 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69  ise the.** initi
10d0: 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73  alization proces
10e0: 73 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f  s would never co
10f0: 6d 70 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65  mplete..**.** Le
1100: 74 20 58 20 62 65 20 74 68 65 20 66 69 72 73 74  t X be the first
1110: 20 74 68 72 65 61 64 20 74 6f 20 65 6e 74 65 72   thread to enter
1120: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
1130: 4c 65 74 20 59 20 62 65 20 73 6f 6d 65 20 6f 74  Let Y be some ot
1140: 68 65 72 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20  her.** thread.  
1150: 54 68 65 6e 20 77 68 69 6c 65 20 74 68 65 20 69  Then while the i
1160: 6e 69 74 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f  nitial invocatio
1170: 6e 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  n of this routin
1180: 65 20 62 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63  e by X is.** inc
1190: 6f 6d 70 6c 65 74 65 2c 20 69 74 20 69 73 20 72  omplete, it is r
11a0: 65 71 75 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a  equired that:.**
11b0: 0a 2a 2a 20 20 20 20 2a 20 20 43 61 6c 6c 73 20  .**    *  Calls 
11c0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
11d0: 66 72 6f 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63  from Y must bloc
11e0: 6b 20 75 6e 74 69 6c 20 74 68 65 20 6f 75 74 65  k until the oute
11f0: 72 2d 6d 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20  r-most.**       
1200: 63 61 6c 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65  call by X comple
1210: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  tes..**.**    * 
1220: 20 52 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   Recursive calls
1230: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
1240: 20 66 72 6f 6d 20 74 68 72 65 61 64 20 58 20 72   from thread X r
1250: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
1260: 79 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68 6f  y.**       witho
1270: 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ut blocking..*/.
1280: 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  int sqlite3_init
1290: 69 61 6c 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20  ialize(void){.  
12a0: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
12b0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
12c0: 74 65 72 3b 20 29 20 20 20 20 20 20 20 2f 2a 20  ter; )       /* 
12d0: 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69 63 20  The main static 
12e0: 6d 75 74 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72  mutex */.  int r
12f0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1310: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1320: 74 20 63 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66  t code */.#ifdef
1330: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e   SQLITE_EXTRA_IN
1340: 49 54 0a 20 20 69 6e 74 20 62 52 75 6e 45 78 74  IT.  int bRunExt
1350: 72 61 49 6e 69 74 20 3d 20 30 3b 20 20 20 20 20  raInit = 0;     
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1370: 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 69 74 69    /* Extra initi
1380: 61 6c 69 7a 61 74 69 6f 6e 20 6e 65 65 64 65 64  alization needed
1390: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64   */.#endif..#ifd
13a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
13b0: 53 44 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  SD.  rc = sqlite
13c0: 33 5f 77 73 64 5f 69 6e 69 74 28 34 30 39 36 2c  3_wsd_init(4096,
13d0: 20 32 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d   24);.  if( rc!=
13e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1400: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1410: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
1420: 73 65 72 74 28 29 20 66 61 69 6c 73 20 6f 6e 20  sert() fails on 
1430: 73 6f 6d 65 20 6f 62 73 63 75 72 65 20 70 72 6f  some obscure pro
1440: 63 65 73 73 6f 72 2f 63 6f 6d 70 69 6c 65 72 0a  cessor/compiler.
1450: 20 20 2a 2a 20 63 6f 6d 62 69 6e 61 74 69 6f 6e    ** combination
1460: 2c 20 74 68 65 20 77 6f 72 6b 2d 61 72 6f 75 6e  , the work-aroun
1470: 64 20 69 73 20 74 6f 20 73 65 74 20 74 68 65 20  d is to set the 
1480: 63 6f 72 72 65 63 74 20 70 6f 69 6e 74 65 72 0a  correct pointer.
1490: 20 20 2a 2a 20 73 69 7a 65 20 61 74 20 63 6f 6d    ** size at com
14a0: 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20  pile-time using 
14b0: 2d 44 53 51 4c 49 54 45 5f 50 54 52 53 49 5a 45  -DSQLITE_PTRSIZE
14c0: 3d 6e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  =n compile-time 
14d0: 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65  option */.  asse
14e0: 72 74 28 20 53 51 4c 49 54 45 5f 50 54 52 53 49  rt( SQLITE_PTRSI
14f0: 5a 45 3d 3d 73 69 7a 65 6f 66 28 63 68 61 72 2a  ZE==sizeof(char*
1500: 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51  ) );..  /* If SQ
1510: 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64 79 20  Lite is already 
1520: 63 6f 6d 70 6c 65 74 65 6c 79 20 69 6e 69 74 69  completely initi
1530: 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20 74 68 69  alized, then thi
1540: 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73  s call.  ** to s
1550: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
1560: 65 28 29 20 73 68 6f 75 6c 64 20 62 65 20 61 20  e() should be a 
1570: 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 74 68 65 20  no-op.  But the 
1580: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
1590: 20 2a 2a 20 6d 75 73 74 20 62 65 20 63 6f 6d 70   ** must be comp
15a0: 6c 65 74 65 2e 20 20 53 6f 20 69 73 49 6e 69 74  lete.  So isInit
15b0: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 73 65 74   must not be set
15c0: 20 75 6e 74 69 6c 20 74 68 65 20 76 65 72 79 20   until the very 
15d0: 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73  end.  ** of this
15e0: 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20   routine..  */. 
15f0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
1600: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
1610: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1620: 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  OK;..  /* Make s
1630: 75 72 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ure the mutex su
1640: 62 73 79 73 74 65 6d 20 69 73 20 69 6e 69 74 69  bsystem is initi
1650: 61 6c 69 7a 65 64 2e 20 20 49 66 20 75 6e 61 62  alized.  If unab
1660: 6c 65 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74  le to .  ** init
1670: 69 61 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78  ialize the mutex
1680: 20 73 75 62 73 79 73 74 65 6d 2c 20 72 65 74 75   subsystem, retu
1690: 72 6e 20 65 61 72 6c 79 20 77 69 74 68 20 74 68  rn early with th
16a0: 65 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66  e error..  ** If
16b0: 20 74 68 65 20 73 79 73 74 65 6d 20 69 73 20 73   the system is s
16c0: 6f 20 73 69 63 6b 20 74 68 61 74 20 77 65 20 61  o sick that we a
16d0: 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  re unable to all
16e0: 6f 63 61 74 65 20 61 20 6d 75 74 65 78 2c 0a 20  ocate a mutex,. 
16f0: 20 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 74   ** there is not
1700: 20 6d 75 63 68 20 53 51 4c 69 74 65 20 69 73 20   much SQLite is 
1710: 67 6f 69 6e 67 20 74 6f 20 62 65 20 61 62 6c 65  going to be able
1720: 20 74 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a   to do..  **.  *
1730: 2a 20 54 68 65 20 6d 75 74 65 78 20 73 75 62 73  * The mutex subs
1740: 79 73 74 65 6d 20 6d 75 73 74 20 74 61 6b 65 20  ystem must take 
1750: 63 61 72 65 20 6f 66 20 73 65 72 69 61 6c 69 7a  care of serializ
1760: 69 6e 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a  ing its own.  **
1770: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e   initialization.
1780: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
1790: 69 74 65 33 4d 75 74 65 78 49 6e 69 74 28 29 3b  ite3MutexInit();
17a0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
17b0: 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69  rn rc;..  /* Ini
17c0: 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c  tialize the mall
17d0: 6f 63 28 29 20 73 79 73 74 65 6d 20 61 6e 64 20  oc() system and 
17e0: 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70 49  the recursive pI
17f0: 6e 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a  nitMutex mutex..
1800: 20 20 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74    ** This operat
1810: 69 6f 6e 20 69 73 20 70 72 6f 74 65 63 74 65 64  ion is protected
1820: 20 62 79 20 74 68 65 20 53 54 41 54 49 43 5f 4d   by the STATIC_M
1830: 41 53 54 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f  ASTER mutex.  No
1840: 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74  te that.  ** Mut
1850: 65 78 41 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c  exAlloc() is cal
1860: 6c 65 64 20 66 6f 72 20 61 20 73 74 61 74 69 63  led for a static
1870: 20 6d 75 74 65 78 20 70 72 69 6f 72 20 74 6f 20   mutex prior to 
1880: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
1890: 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62  .  ** malloc sub
18a0: 73 79 73 74 65 6d 20 2d 20 74 68 69 73 20 69 6d  system - this im
18b0: 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 61  plies that the a
18c0: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 73  llocation of a s
18d0: 74 61 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78  tatic.  ** mutex
18e0: 20 6d 75 73 74 20 6e 6f 74 20 72 65 71 75 69 72   must not requir
18f0: 65 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20 74  e support from t
1900: 68 65 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  he malloc subsys
1910: 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45  tem..  */.  MUTE
1920: 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72  X_LOGIC( pMaster
1930: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
1940: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1950: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
1960: 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ; ).  sqlite3_mu
1970: 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
1980: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f  r);.  sqlite3Glo
1990: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
19a0: 78 49 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28  xInit = 1;.  if(
19b0: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
19c0: 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e  onfig.isMallocIn
19d0: 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  it ){.    rc = s
19e0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74  qlite3MallocInit
19f0: 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ();.  }.  if( rc
1a00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a10: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1a20: 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49  Config.isMallocI
1a30: 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  nit = 1;.    if(
1a40: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
1a50: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1a60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1a70: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
1a80: 6e 69 74 4d 75 74 65 78 20 3d 0a 20 20 20 20 20  nitMutex =.     
1a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74        sqlite3Mut
1aa0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
1ab0: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b  UTEX_RECURSIVE);
1ac0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1ad0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
1ae0: 43 6f 72 65 4d 75 74 65 78 20 26 26 20 21 73 71  CoreMutex && !sq
1af0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1b00: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a  g.pInitMutex ){.
1b10: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1b20: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1b30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b40: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1b50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
1b60: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1b70: 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b  .nRefInitMutex++
1b80: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1b90: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
1ba0: 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72  ter);..  /* If r
1bb0: 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  c is not SQLITE_
1bc0: 4f 4b 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  OK at this point
1bd0: 2c 20 74 68 65 6e 20 65 69 74 68 65 72 20 74 68  , then either th
1be0: 65 20 6d 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75  e malloc.  ** su
1bf0: 62 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f  bsystem could no
1c00: 74 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  t be initialized
1c10: 20 6f 72 20 74 68 65 20 73 79 73 74 65 6d 20 66   or the system f
1c20: 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74  ailed to allocat
1c30: 65 0a 20 20 2a 2a 20 74 68 65 20 70 49 6e 69 74  e.  ** the pInit
1c40: 4d 75 74 65 78 20 6d 75 74 65 78 2e 20 52 65 74  Mutex mutex. Ret
1c50: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  urn an error in 
1c60: 65 69 74 68 65 72 20 63 61 73 65 2e 20 20 2a 2f  either case.  */
1c70: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1c80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1c90: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
1ca0: 20 44 6f 20 74 68 65 20 72 65 73 74 20 6f 66 20   Do the rest of 
1cb0: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
1cc0: 6f 6e 20 75 6e 64 65 72 20 74 68 65 20 72 65 63  on under the rec
1cd0: 75 72 73 69 76 65 20 6d 75 74 65 78 20 73 6f 0a  ursive mutex so.
1ce0: 20 20 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c    ** that we wil
1cf0: 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 68 61 6e  l be able to han
1d00: 64 6c 65 20 72 65 63 75 72 73 69 76 65 20 63 61  dle recursive ca
1d10: 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71  lls into.  ** sq
1d20: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1d30: 28 29 2e 20 20 54 68 65 20 72 65 63 75 72 73 69  ().  The recursi
1d40: 76 65 20 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c  ve calls normall
1d50: 79 20 63 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20  y come through. 
1d60: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69   ** sqlite3_os_i
1d70: 6e 69 74 28 29 20 77 68 65 6e 20 69 74 20 69 6e  nit() when it in
1d80: 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 76 66  vokes sqlite3_vf
1d90: 73 5f 72 65 67 69 73 74 65 72 28 29 2c 20 62 75  s_register(), bu
1da0: 74 20 6f 74 68 65 72 0a 20 20 2a 2a 20 72 65 63  t other.  ** rec
1db0: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6d 69 67  ursive calls mig
1dc0: 68 74 20 61 6c 73 6f 20 62 65 20 70 6f 73 73 69  ht also be possi
1dd0: 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
1de0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
1df0: 3a 20 52 2d 30 30 31 34 30 2d 33 37 34 34 35 20  : R-00140-37445 
1e00: 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69 63  SQLite automatic
1e10: 61 6c 6c 79 20 73 65 72 69 61 6c 69 7a 65 73 20  ally serializes 
1e20: 63 61 6c 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68  calls.  ** to th
1e30: 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20  e xInit method, 
1e40: 73 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65 74  so the xInit met
1e50: 68 6f 64 20 6e 65 65 64 20 6e 6f 74 20 62 65 20  hod need not be 
1e60: 74 68 72 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a  threadsafe..  **
1e70: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
1e80: 69 6e 67 20 6d 75 74 65 78 20 69 73 20 77 68 61  ing mutex is wha
1e90: 74 20 73 65 72 69 61 6c 69 7a 65 73 20 61 63 63  t serializes acc
1ea0: 65 73 73 20 74 6f 20 74 68 65 20 61 70 70 64 65  ess to the appde
1eb0: 66 20 70 63 61 63 68 65 20 78 49 6e 69 74 0a 20  f pcache xInit. 
1ec0: 20 2a 2a 20 6d 65 74 68 6f 64 73 2e 20 20 54 68   ** methods.  Th
1ed0: 65 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  e sqlite3_pcache
1ee0: 5f 6d 65 74 68 6f 64 73 2e 78 49 6e 69 74 28 29  _methods.xInit()
1ef0: 20 61 6c 6c 20 69 73 20 65 6d 62 65 64 64 65 64   all is embedded
1f00: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c   in the.  ** cal
1f10: 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63  l to sqlite3Pcac
1f20: 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a  heInitialize()..
1f30: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
1f40: 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
1f50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1f60: 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 69 66  InitMutex);.  if
1f70: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1f80: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20  onfig.isInit==0 
1f90: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
1fa0: 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73  Config.inProgres
1fb0: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  s==0 ){.    sqli
1fc0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1fd0: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a  inProgress = 1;.
1fe0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1ff0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20  ABLE_SQLLOG.    
2000: 7b 0a 20 20 20 20 20 20 65 78 74 65 72 6e 20 76  {.      extern v
2010: 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  oid sqlite3_init
2020: 5f 73 71 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20  _sqllog(void);. 
2030: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 69       sqlite3_ini
2040: 74 5f 73 71 6c 6c 6f 67 28 29 3b 0a 20 20 20 20  t_sqllog();.    
2050: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d  }.#endif.    mem
2060: 73 65 74 28 26 73 71 6c 69 74 65 33 42 75 69 6c  set(&sqlite3Buil
2070: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 2c 20 30 2c  tinFunctions, 0,
2080: 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 42   sizeof(sqlite3B
2090: 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 29  uiltinFunctions)
20a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
20b0: 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e  gisterBuiltinFun
20c0: 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66  ctions();.    if
20d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
20e0: 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e  onfig.isPCacheIn
20f0: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
2100: 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
2110: 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  eInitialize();. 
2120: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2130: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2140: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2150: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
2160: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Init = 1;.      
2170: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e  rc = sqlite3OsIn
2180: 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  it();.    }.    
2190: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21a0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
21b0: 65 33 50 43 61 63 68 65 42 75 66 66 65 72 53 65  e3PCacheBufferSe
21c0: 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  tup( sqlite3Glob
21d0: 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20  alConfig.pPage, 
21e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
21f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
2200: 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47 6c  zPage, sqlite3Gl
2210: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65  obalConfig.nPage
2220: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2230: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2240: 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  nit = 1;.#ifdef 
2250: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2260: 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78 74 72  T.      bRunExtr
2270: 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e 64 69  aInit = 1;.#endi
2280: 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  f.    }.    sqli
2290: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
22a0: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  inProgress = 0;.
22b0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
22c0: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
22d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
22e0: 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  nitMutex);..  /*
22f0: 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72 20 74   Go back under t
2300: 68 65 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  he static mutex 
2310: 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74 68 65  and clean up the
2320: 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a 2a 20   recursive.  ** 
2330: 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65 6e 74  mutex to prevent
2340: 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65 61 6b   a resource leak
2350: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
2360: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
2370: 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ster);.  sqlite3
2380: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65  GlobalConfig.nRe
2390: 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20  fInitMutex--;.  
23a0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
23b0: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
23c0: 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20  Mutex<=0 ){.    
23d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 47  assert( sqlite3G
23e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
23f0: 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a  InitMutex==0 );.
2400: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
2410: 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33 47 6c  x_free(sqlite3Gl
2420: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
2430: 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Mutex);.    sqli
2440: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2450: 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a  pInitMutex = 0;.
2460: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
2470: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
2480: 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  r);..  /* The fo
2490: 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73 74 20  llowing is just 
24a0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 74  a sanity check t
24b0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69  o make sure SQLi
24c0: 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e  te has.  ** been
24d0: 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72 65 63   compiled correc
24e0: 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d 70 6f  tly.  It is impo
24f0: 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 69  rtant to run thi
2500: 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a  s code, but.  **
2510: 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
2520: 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74  o run it too oft
2530: 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70 20 43  en and soak up C
2540: 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f  PU cycles for no
2550: 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53  .  ** reason.  S
2560: 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e 63 65  o we run it once
2570: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
2580: 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  zation..  */.#if
2590: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69 66 6e  ndef NDEBUG.#ifn
25a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25b0: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
25c0: 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   /* This section
25d0: 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20   of code's only 
25e0: 22 6f 75 74 70 75 74 22 20 69 73 20 76 69 61 20  "output" is via 
25f0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
2600: 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72  nts. */.  if ( r
2610: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2620: 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 75      u64 x = (((u
2630: 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20  64)1)<<63)-1;.  
2640: 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20    double y;.    
2650: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
2660: 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ==8);.    assert
2670: 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65  (sizeof(x)==size
2680: 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63  of(y));.    memc
2690: 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20  py(&y, &x, 8);. 
26a0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
26b0: 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20  e3IsNaN(y) );.  
26c0: 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  }.#endif.#endif.
26d0: 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 69  .  /* Do extra i
26e0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 74  nitialization st
26f0: 65 70 73 20 72 65 71 75 65 73 74 65 64 20 62 79  eps requested by
2700: 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58 54 52   the SQLITE_EXTR
2710: 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d 70  A_INIT.  ** comp
2720: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e  ile-time option.
2730: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
2740: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20  ITE_EXTRA_INIT. 
2750: 20 69 66 28 20 62 52 75 6e 45 78 74 72 61 49 6e   if( bRunExtraIn
2760: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 53 51  it ){.    int SQ
2770: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28  LITE_EXTRA_INIT(
2780: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20  const char*);.  
2790: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 58    rc = SQLITE_EX
27a0: 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20 20 7d  TRA_INIT(0);.  }
27b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
27c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
27d0: 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74 73 20  ndo the effects 
27e0: 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  of sqlite3_initi
27f0: 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e  alize().  Must n
2800: 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69  ot be called whi
2810: 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  le.** there are 
2820: 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61 74 61  outstanding data
2830: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
2840: 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   or memory alloc
2850: 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69  ations or.** whi
2860: 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66 20 53  le any part of S
2870: 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72 77 69  QLite is otherwi
2880: 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61 6e 79  se in use in any
2890: 20 74 68 72 65 61 64 2e 20 20 54 68 69 73 0a 2a   thread.  This.*
28a0: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  * routine is not
28b0: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 42 75   threadsafe.  Bu
28c0: 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
28d0: 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
28e0: 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20 53  ine.** on when S
28f0: 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64 79  QLite is already
2900: 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49 66 20   shut down.  If 
2910: 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64  SQLite is alread
2920: 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a 20 77  y shut down.** w
2930: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2940: 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65   is invoked, the
2950: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
2960: 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
2970: 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
2980: 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f 69 64  e3_shutdown(void
2990: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
29a0: 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e 74 20  _OMIT_WSD.  int 
29b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64  rc = sqlite3_wsd
29c0: 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b  _init(4096, 24);
29d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
29e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
29f0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
2a00: 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  f..  if( sqlite3
2a10: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2a20: 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51  nit ){.#ifdef SQ
2a30: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
2a40: 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53 51 4c  OWN.    void SQL
2a50: 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f  ITE_EXTRA_SHUTDO
2a60: 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20 53 51  WN(void);.    SQ
2a70: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
2a80: 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  OWN();.#endif.  
2a90: 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64    sqlite3_os_end
2aa0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
2ab0: 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e  reset_auto_exten
2ac0: 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69  sion();.    sqli
2ad0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2ae0: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
2af0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2b00: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
2b10: 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  heInit ){.    sq
2b20: 6c 69 74 65 33 50 63 61 63 68 65 53 68 75 74 64  lite3PcacheShutd
2b30: 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  own();.    sqlit
2b40: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2b50: 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 30 3b  sPCacheInit = 0;
2b60: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2b70: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2b80: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
2b90: 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63     sqlite3Malloc
2ba0: 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  End();.    sqlit
2bb0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2bc0: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b  sMallocInit = 0;
2bd0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2be0: 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e 5f 44  _OMIT_SHUTDOWN_D
2bf0: 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20 20 2f  IRECTORIES.    /
2c00: 2a 20 54 68 65 20 68 65 61 70 20 73 75 62 73 79  * The heap subsy
2c10: 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62 65 65  stem has now bee
2c20: 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64 20 74  n shutdown and t
2c30: 68 65 73 65 20 76 61 6c 75 65 73 20 61 72 65 20  hese values are 
2c40: 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a 2a 20  supposed.    ** 
2c50: 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20 70 6f  to be NULL or po
2c60: 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20 74 68  int to memory th
2c70: 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  at was obtained 
2c80: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
2c90: 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20 77 68  loc(),.    ** wh
2ca0: 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79 20 6f  ich would rely o
2cb0: 6e 20 74 68 61 74 20 68 65 61 70 20 73 75 62 73  n that heap subs
2cc0: 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f 72 65  ystem; therefore
2cd0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 73  , make sure thes
2ce0: 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
2cf0: 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74 6f 20  cannot refer to 
2d00: 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68 61 74  heap memory that
2d10: 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61 6c 69   was just invali
2d20: 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 0a 20  dated when the. 
2d30: 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62 73 79     ** heap subsy
2d40: 73 74 65 6d 20 77 61 73 20 73 68 75 74 64 6f 77  stem was shutdow
2d50: 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  n.  This is only
2d60: 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72   done if the cur
2d70: 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  rent call to.   
2d80: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
2d90: 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20 74 68  n resulted in th
2da0: 65 20 68 65 61 70 20 73 75 62 73 79 73 74 65 6d  e heap subsystem
2db0: 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
2dc0: 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20 2a 2f  shutdown..    */
2dd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74  .    sqlite3_dat
2de0: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
2df0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d  .    sqlite3_tem
2e00: 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  p_directory = 0;
2e10: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
2e20: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2e30: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2e40: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2e50: 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20 20 20  MutexEnd();.    
2e60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2e70: 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20  fig.isMutexInit 
2e80: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
2e90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2ea0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50 49 20  ./*.** This API 
2eb0: 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61 74 69  allows applicati
2ec0: 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ons to modify th
2ed0: 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75  e global configu
2ee0: 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65  ration of.** the
2ef0: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
2f00: 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a  at run-time..**.
2f10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2f20: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2f30: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
2f40: 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
2f50: 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
2f60: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d  connections or m
2f70: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2f80: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
2f90: 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61   is not.** threa
2fa0: 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72 65 20  dsafe.  Failure 
2fb0: 74 6f 20 68 65 65 64 20 74 68 65 73 65 20 77 61  to heed these wa
2fc0: 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61 64 20  rnings can lead 
2fd0: 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62 6c 65  to unpredictable
2fe0: 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  .** behavior..*/
2ff0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e  .int sqlite3_con
3000: 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  fig(int op, ...)
3010: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
3020: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
3030: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  E_OK;..  /* sqli
3040: 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73 68 61  te3_config() sha
3050: 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ll return SQLITE
3060: 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20 69 73  _MISUSE if it is
3070: 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65 0a 20   invoked while. 
3080: 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c   ** the SQLite l
3090: 69 62 72 61 72 79 20 69 73 20 69 6e 20 75 73 65  ibrary is in use
30a0: 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  . */.  if( sqlit
30b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
30c0: 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53  sInit ) return S
30d0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
30e0: 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61  T;..  va_start(a
30f0: 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
3100: 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  ( op ){..    /* 
3110: 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72 61 74  Mutex configurat
3120: 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72 65 20  ion options are 
3130: 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69  only available i
3140: 6e 20 61 20 74 68 72 65 61 64 73 61 66 65 0a 20  n a threadsafe. 
3150: 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e 0a 20     ** compile.. 
3160: 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65     */.#if define
3170: 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  d(SQLITE_THREADS
3180: 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  AFE) && SQLITE_T
3190: 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f 2a 20  HREADSAFE>0  /* 
31a0: 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34 36 37  IMP: R-54466-467
31b0: 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  56 */.    case S
31c0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e  QLITE_CONFIG_SIN
31d0: 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20 20 20  GLETHREAD: {.   
31e0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
31f0: 46 3a 20 52 2d 30 32 37 34 38 2d 31 39 30 39 36  F: R-02748-19096
3200: 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73 65 74   This option set
3210: 73 20 74 68 65 20 74 68 72 65 61 64 69 6e 67 20  s the threading 
3220: 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  mode to.      **
3230: 20 53 69 6e 67 6c 65 2d 74 68 72 65 61 64 2e 20   Single-thread. 
3240: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3250: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
3260: 72 65 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a  reMutex = 0;  /*
3270: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20 6f   Disable mutex o
3280: 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20  n core */.      
3290: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
32a0: 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d  fig.bFullMutex =
32b0: 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 20   0;  /* Disable 
32c0: 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74  mutex on connect
32d0: 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  ions */.      br
32e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
32f0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
3300: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 29  LITE_THREADSAFE)
3310: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
3320: 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20  DSAFE>0 /* IMP: 
3330: 52 2d 32 30 35 32 30 2d 35 34 30 38 36 20 2a 2f  R-20520-54086 */
3340: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3350: 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52  _CONFIG_MULTITHR
3360: 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  EAD: {.      /* 
3370: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
3380: 34 33 37 34 2d 34 32 34 36 38 20 54 68 69 73 20  4374-42468 This 
3390: 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  option sets the 
33a0: 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74  threading mode t
33b0: 6f 0a 20 20 20 20 20 20 2a 2a 20 4d 75 6c 74 69  o.      ** Multi
33c0: 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20  -thread. */.    
33d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
33e0: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
33f0: 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65   = 1;  /* Enable
3400: 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a   mutex on core *
3410: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3420: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
3430: 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a 20  lMutex = 0;  /* 
3440: 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e  Disable mutex on
3450: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
3460: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3470: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
3480: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52  fined(SQLITE_THR
3490: 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49  EADSAFE) && SQLI
34a0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20  TE_THREADSAFE>0 
34b0: 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39 33 2d  /* IMP: R-59593-
34c0: 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63 61 73  21810 */.    cas
34d0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
34e0: 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20  SERIALIZED: {.  
34f0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
3500: 4f 46 3a 20 52 2d 34 31 32 32 30 2d 35 31 38 30  OF: R-41220-5180
3510: 30 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73 65  0 This option se
3520: 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e 67  ts the threading
3530: 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20 2a   mode to.      *
3540: 2a 20 53 65 72 69 61 6c 69 7a 65 64 2e 20 2a 2f  * Serialized. */
3550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3560: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
3570: 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45  Mutex = 1;  /* E
3580: 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63  nable mutex on c
3590: 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ore */.      sql
35a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
35b0: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b  .bFullMutex = 1;
35c0: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65    /* Enable mute
35d0: 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  x on connections
35e0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
35f0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
3600: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3610: 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20  _THREADSAFE) && 
3620: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3630: 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 33  E>0 /* IMP: R-63
3640: 36 36 36 2d 34 38 37 35 35 20 2a 2f 0a 20 20 20  666-48755 */.   
3650: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3660: 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20 20  FIG_MUTEX: {.   
3670: 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e     /* Specify an
3680: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 75 74   alternative mut
3690: 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ex implementatio
36a0: 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  n */.      sqlit
36b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
36c0: 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67 28 61  utex = *va_arg(a
36d0: 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  p, sqlite3_mutex
36e0: 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20  _methods*);.    
36f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
3700: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
3710: 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  d(SQLITE_THREADS
3720: 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  AFE) && SQLITE_T
3730: 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49  HREADSAFE>0 /* I
3740: 4d 50 3a 20 52 2d 31 34 34 35 30 2d 33 37 35 39  MP: R-14450-3759
3750: 37 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51  7 */.    case SQ
3760: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d  LITE_CONFIG_GETM
3770: 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  UTEX: {.      /*
3780: 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75   Retrieve the cu
3790: 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c  rrent mutex impl
37a0: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
37b0: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
37c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65  sqlite3_mutex_me
37d0: 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65  thods*) = sqlite
37e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75  3GlobalConfig.mu
37f0: 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  tex;.      break
3800: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
3810: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3820: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b  CONFIG_MALLOC: {
3830: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
3840: 43 45 2d 4f 46 3a 20 52 2d 35 35 35 39 34 2d 32  CE-OF: R-55594-2
3850: 31 30 33 30 20 54 68 65 20 53 51 4c 49 54 45 5f  1030 The SQLITE_
3860: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20 6f 70  CONFIG_MALLOC op
3870: 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20  tion takes a.   
3880: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
3890: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61  ument which is a
38a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
38b0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 20  nstance of the. 
38c0: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
38d0: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75  mem_methods stru
38e0: 63 74 75 72 65 2e 20 54 68 65 20 61 72 67 75 6d  cture. The argum
38f0: 65 6e 74 20 73 70 65 63 69 66 69 65 73 20 61 6c  ent specifies al
3900: 74 65 72 6e 61 74 69 76 65 0a 20 20 20 20 20 20  ternative.      
3910: 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d  ** low-level mem
3920: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72  ory allocation r
3930: 6f 75 74 69 6e 65 73 20 74 6f 20 62 65 20 75 73  outines to be us
3940: 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ed in place of t
3950: 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20 20 20  he memory.      
3960: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f  ** allocation ro
3970: 75 74 69 6e 65 73 20 62 75 69 6c 74 20 69 6e 74  utines built int
3980: 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a 20 20 20  o SQLite. */.   
3990: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
39a0: 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61  Config.m = *va_a
39b0: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d  rg(ap, sqlite3_m
39c0: 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20  em_methods*);.  
39d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
39e0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
39f0: 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f  _CONFIG_GETMALLO
3a00: 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  C: {.      /* EV
3a10: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 32  IDENCE-OF: R-512
3a20: 31 33 2d 34 36 34 31 34 20 54 68 65 20 53 51 4c  13-46414 The SQL
3a30: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41  ITE_CONFIG_GETMA
3a40: 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61 6b 65  LLOC option take
3a50: 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e  s a.      ** sin
3a60: 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69  gle argument whi
3a70: 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ch is a pointer 
3a80: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
3a90: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  f the.      ** s
3aa0: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
3ab0: 64 73 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  ds structure. Th
3ac0: 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  e sqlite3_mem_me
3ad0: 74 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 20  thods structure 
3ae0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c  is.      ** fill
3af0: 65 64 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ed with the curr
3b00: 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 6d 65  ently defined me
3b10: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3b20: 72 6f 75 74 69 6e 65 73 2e 20 2a 2f 0a 20 20 20  routines. */.   
3b30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
3b40: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61  obalConfig.m.xMa
3b50: 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65  lloc==0 ) sqlite
3b60: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29  3MemSetDefault()
3b70: 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28  ;.      *va_arg(
3b80: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  ap, sqlite3_mem_
3b90: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
3ba0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3bb0: 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  m;.      break;.
3bc0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
3bd0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d  QLITE_CONFIG_MEM
3be0: 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20  STATUS: {.      
3bf0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
3c00: 52 2d 36 31 32 37 35 2d 33 35 31 35 37 20 54 68  R-61275-35157 Th
3c10: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3c20: 4d 45 4d 53 54 41 54 55 53 20 6f 70 74 69 6f 6e  MEMSTATUS option
3c30: 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a 2a 20   takes.      ** 
3c40: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
3c50: 6f 66 20 74 79 70 65 20 69 6e 74 2c 20 69 6e 74  of type int, int
3c60: 65 72 70 72 65 74 65 64 20 61 73 20 61 20 62 6f  erpreted as a bo
3c70: 6f 6c 65 61 6e 2c 20 77 68 69 63 68 20 65 6e 61  olean, which ena
3c80: 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 72  bles.      ** or
3c90: 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f   disables the co
3ca0: 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 6d 65 6d 6f  llection of memo
3cb0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 74  ry allocation st
3cc0: 61 74 69 73 74 69 63 73 2e 20 2a 2f 0a 20 20 20  atistics. */.   
3cd0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3ce0: 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20  Config.bMemstat 
3cf0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3d00: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3d10: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
3d20: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52  QLITE_CONFIG_SCR
3d30: 41 54 43 48 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ATCH: {.      /*
3d40: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
3d50: 30 38 34 30 34 2d 36 30 38 38 37 20 54 68 65 72  08404-60887 Ther
3d60: 65 20 61 72 65 20 74 68 72 65 65 20 61 72 67 75  e are three argu
3d70: 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a  ments to.      *
3d80: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  * SQLITE_CONFIG_
3d90: 53 43 52 41 54 43 48 3a 20 41 20 70 6f 69 6e 74  SCRATCH: A point
3da0: 65 72 20 61 6e 20 38 2d 62 79 74 65 20 61 6c 69  er an 8-byte ali
3db0: 67 6e 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66  gned memory buff
3dc0: 65 72 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  er from.      **
3dd0: 20 77 68 69 63 68 20 74 68 65 20 73 63 72 61 74   which the scrat
3de0: 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 77  ch allocations w
3df0: 69 6c 6c 20 62 65 20 64 72 61 77 6e 2c 20 74 68  ill be drawn, th
3e00: 65 20 73 69 7a 65 20 6f 66 20 65 61 63 68 20 73  e size of each s
3e10: 63 72 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20  cratch.      ** 
3e20: 61 6c 6c 6f 63 61 74 69 6f 6e 20 28 73 7a 29 2c  allocation (sz),
3e30: 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d   and the maximum
3e40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 63 72 61 74   number of scrat
3e50: 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 28  ch allocations (
3e60: 4e 29 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  N). */.      sql
3e70: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3e80: 2e 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61  .pScratch = va_a
3e90: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20  rg(ap, void*);. 
3ea0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3eb0: 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74  alConfig.szScrat
3ec0: 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ch = va_arg(ap, 
3ed0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
3ee0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3ef0: 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72  nScratch = va_ar
3f00: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3f10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3f20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3f30: 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a  ONFIG_PAGECACHE:
3f40: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3f50: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 37 36 31  ENCE-OF: R-18761
3f60: 2d 33 36 36 30 31 20 54 68 65 72 65 20 61 72 65  -36601 There are
3f70: 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73   three arguments
3f80: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   to.      ** SQL
3f90: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43  ITE_CONFIG_PAGEC
3fa0: 41 43 48 45 3a 20 41 20 70 6f 69 6e 74 65 72 20  ACHE: A pointer 
3fb0: 74 6f 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  to 8-byte aligne
3fc0: 64 20 6d 65 6d 6f 72 79 20 28 70 4d 65 6d 29 2c  d memory (pMem),
3fd0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69  .      ** the si
3fe0: 7a 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  ze of each page 
3ff0: 63 61 63 68 65 20 6c 69 6e 65 20 28 73 7a 29 2c  cache line (sz),
4000: 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
4010: 6f 66 20 63 61 63 68 65 20 6c 69 6e 65 73 0a 20  of cache lines. 
4020: 20 20 20 20 20 2a 2a 20 28 4e 29 2e 20 2a 2f 0a       ** (N). */.
4030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4040: 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 20  balConfig.pPage 
4050: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
4060: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
4070: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
4080: 7a 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  zPage = va_arg(a
4090: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  p, int);.      s
40a0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
40b0: 69 67 2e 6e 50 61 67 65 20 3d 20 76 61 5f 61 72  ig.nPage = va_ar
40c0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
40d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
40e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
40f0: 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f 48 44 52  ONFIG_PCACHE_HDR
4100: 53 5a 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  SZ: {.      /* E
4110: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39  VIDENCE-OF: R-39
4120: 31 30 30 2d 32 37 33 31 37 20 54 68 65 20 53 51  100-27317 The SQ
4130: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43  LITE_CONFIG_PCAC
4140: 48 45 5f 48 44 52 53 5a 20 6f 70 74 69 6f 6e 20  HE_HDRSZ option 
4150: 74 61 6b 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  takes.      ** a
4160: 20 73 69 6e 67 6c 65 20 70 61 72 61 6d 65 74 65   single paramete
4170: 72 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69  r which is a poi
4180: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67  nter to an integ
4190: 65 72 20 61 6e 64 20 77 72 69 74 65 73 20 69 6e  er and writes in
41a0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  to.      ** that
41b0: 20 69 6e 74 65 67 65 72 20 74 68 65 20 6e 75 6d   integer the num
41c0: 62 65 72 20 6f 66 20 65 78 74 72 61 20 62 79 74  ber of extra byt
41d0: 65 73 20 70 65 72 20 70 61 67 65 20 72 65 71 75  es per page requ
41e0: 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 70 61  ired for each pa
41f0: 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 53  ge.      ** in S
4200: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47  QLITE_CONFIG_PAG
4210: 45 43 41 43 48 45 2e 20 2a 2f 0a 20 20 20 20 20  ECACHE. */.     
4220: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74   *va_arg(ap, int
4230: 2a 29 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  *) = .          
4240: 73 71 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a  sqlite3HeaderSiz
4250: 65 42 74 72 65 65 28 29 20 2b 0a 20 20 20 20 20  eBtree() +.     
4260: 20 20 20 20 20 73 71 6c 69 74 65 33 48 65 61 64       sqlite3Head
4270: 65 72 53 69 7a 65 50 63 61 63 68 65 28 29 20 2b  erSizePcache() +
4280: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4290: 65 33 48 65 61 64 65 72 53 69 7a 65 50 63 61 63  e3HeaderSizePcac
42a0: 68 65 31 28 29 3b 0a 20 20 20 20 20 20 62 72 65  he1();.      bre
42b0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
42c0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
42d0: 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  G_PCACHE: {.    
42e0: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
42f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4300: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4310: 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48  _CONFIG_GETPCACH
4320: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  E: {.      /* no
4330: 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  w an error */.  
4340: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4350: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
4360: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
4370: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
4380: 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20  G_PCACHE2: {.   
4390: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
43a0: 46 3a 20 52 2d 36 33 33 32 35 2d 34 38 33 37 38  F: R-63325-48378
43b0: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
43c0: 49 47 5f 50 43 41 43 48 45 32 20 6f 70 74 69 6f  IG_PCACHE2 optio
43d0: 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20  n takes a.      
43e0: 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65  ** single argume
43f0: 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70 6f  nt which is a po
4400: 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
4410: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
4420: 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a  ds2.      ** obj
4430: 65 63 74 2e 20 54 68 69 73 20 6f 62 6a 65 63 74  ect. This object
4440: 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 69   specifies the i
4450: 6e 74 65 72 66 61 63 65 20 74 6f 20 61 20 63 75  nterface to a cu
4460: 73 74 6f 6d 20 70 61 67 65 20 63 61 63 68 65 0a  stom page cache.
4470: 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
4480: 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ntation. */.    
4490: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
44a0: 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 20 3d 20  onfig.pcache2 = 
44b0: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
44c0: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
44d0: 64 73 32 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ds2*);.      bre
44e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
44f0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
4500: 5f 47 45 54 50 43 41 43 48 45 32 3a 20 7b 0a 20  _GETPCACHE2: {. 
4510: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
4520: 2d 4f 46 3a 20 52 2d 32 32 30 33 35 2d 34 36 31  -OF: R-22035-461
4530: 38 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  82 The SQLITE_CO
4540: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 32 20  NFIG_GETPCACHE2 
4550: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20  option takes a. 
4560: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61       ** single a
4570: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
4580: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
4590: 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
45a0: 6d 65 74 68 6f 64 73 32 0a 20 20 20 20 20 20 2a  methods2.      *
45b0: 2a 20 6f 62 6a 65 63 74 2e 20 53 51 4c 69 74 65  * object. SQLite
45c0: 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 63   copies of the c
45d0: 75 72 72 65 6e 74 20 70 61 67 65 20 63 61 63 68  urrent page cach
45e0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
45f0: 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74   into.      ** t
4600: 68 61 74 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  hat object. */. 
4610: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
4620: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61  GlobalConfig.pca
4630: 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b  che2.xInit==0 ){
4640: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4650: 50 43 61 63 68 65 53 65 74 44 65 66 61 75 6c 74  PCacheSetDefault
4660: 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
4670: 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71    *va_arg(ap, sq
4680: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
4690: 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c 69 74 65  hods2*) = sqlite
46a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63  3GlobalConfig.pc
46b0: 61 63 68 65 32 3b 0a 20 20 20 20 20 20 62 72 65  ache2;.      bre
46c0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 2f 2a 20 45 56  ak;.    }../* EV
46d0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 36  IDENCE-OF: R-066
46e0: 32 36 2d 31 32 39 31 31 20 54 68 65 20 53 51 4c  26-12911 The SQL
46f0: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 20  ITE_CONFIG_HEAP 
4700: 6f 70 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a  option is only.*
4710: 2a 20 61 76 61 69 6c 61 62 6c 65 20 69 66 20 53  * available if S
4720: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
4730: 64 20 77 69 74 68 20 65 69 74 68 65 72 20 53 51  d with either SQ
4740: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
4750: 59 53 33 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45  YS3 or.** SQLITE
4760: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20  _ENABLE_MEMSYS5 
4770: 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49  and returns SQLI
4780: 54 45 5f 45 52 52 4f 52 20 69 66 20 69 6e 76 6f  TE_ERROR if invo
4790: 6b 65 64 20 6f 74 68 65 72 77 69 73 65 2e 20 2a  ked otherwise. *
47a0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
47b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
47c0: 59 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  YS3) || defined(
47d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
47e0: 4d 53 59 53 35 29 0a 20 20 20 20 63 61 73 65 20  MSYS5).    case 
47f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45  SQLITE_CONFIG_HE
4800: 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  AP: {.      /* E
4810: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39  VIDENCE-OF: R-19
4820: 38 35 34 2d 34 32 31 32 36 20 54 68 65 72 65 20  854-42126 There 
4830: 61 72 65 20 74 68 72 65 65 20 61 72 67 75 6d 65  are three argume
4840: 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  nts to.      ** 
4850: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45  SQLITE_CONFIG_HE
4860: 41 50 3a 20 41 6e 20 38 2d 62 79 74 65 20 61 6c  AP: An 8-byte al
4870: 69 67 6e 65 64 20 70 6f 69 6e 74 65 72 20 74 6f  igned pointer to
4880: 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65   the memory, the
4890: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
48a0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
48b0: 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2c 20   memory buffer, 
48c0: 61 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20  and the minimum 
48d0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e  allocation size.
48e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
48f0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4900: 66 69 67 2e 70 48 65 61 70 20 3d 20 76 61 5f 61  fig.pHeap = va_a
4910: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20  rg(ap, void*);. 
4920: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4930: 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d  alConfig.nHeap =
4940: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4950: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4960: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65  lobalConfig.mnRe
4970: 71 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  q = va_arg(ap, i
4980: 6e 74 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  nt);..      if( 
4990: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
49a0: 66 69 67 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20  fig.mnReq<1 ){. 
49b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
49c0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71  obalConfig.mnReq
49d0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
49e0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f  e if( sqlite3Glo
49f0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e  balConfig.mnReq>
4a00: 28 31 3c 3c 31 32 29 20 29 7b 0a 20 20 20 20 20  (1<<12) ){.     
4a10: 20 20 20 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65     /* cap min re
4a20: 71 75 65 73 74 20 73 69 7a 65 20 61 74 20 32 5e  quest size at 2^
4a30: 31 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  12 */.        sq
4a40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4a50: 67 2e 6d 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32  g.mnReq = (1<<12
4a60: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
4a70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
4a80: 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d  balConfig.pHeap=
4a90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
4aa0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
4ab0: 34 39 39 32 30 2d 36 30 31 38 39 20 49 66 20 74  49920-60189 If t
4ac0: 68 65 20 66 69 72 73 74 20 70 6f 69 6e 74 65 72  he first pointer
4ad0: 20 28 74 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69   (the memory poi
4ae0: 6e 74 65 72 29 0a 20 20 20 20 20 20 20 20 2a 2a  nter).        **
4af0: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53   is NULL, then S
4b00: 51 4c 69 74 65 20 72 65 76 65 72 74 73 20 74 6f  QLite reverts to
4b10: 20 75 73 69 6e 67 20 69 74 73 20 64 65 66 61 75   using its defau
4b20: 6c 74 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  lt memory alloca
4b30: 74 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  tor.        ** (
4b40: 74 68 65 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f  the system mallo
4b50: 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  c() implementati
4b60: 6f 6e 29 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79  on), undoing any
4b70: 20 70 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f   prior invocatio
4b80: 6e 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  n of.        ** 
4b90: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41  SQLITE_CONFIG_MA
4ba0: 4c 4c 4f 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a  LLOC..        **
4bb0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 65 74 74  .        ** Sett
4bc0: 69 6e 67 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ing sqlite3Globa
4bd0: 6c 43 6f 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c  lConfig.m to all
4be0: 20 7a 65 72 6f 73 20 77 69 6c 6c 20 63 61 75 73   zeros will caus
4bf0: 65 20 6d 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20  e malloc to.    
4c00: 20 20 20 20 2a 2a 20 72 65 76 65 72 74 20 74 6f      ** revert to
4c10: 20 69 74 73 20 64 65 66 61 75 6c 74 20 69 6d 70   its default imp
4c20: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e  lementation when
4c30: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
4c40: 69 7a 65 28 29 20 69 73 20 72 75 6e 0a 20 20 20  ize() is run.   
4c50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
4c60: 6d 65 6d 73 65 74 28 26 73 71 6c 69 74 65 33 47  memset(&sqlite3G
4c70: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30  lobalConfig.m, 0
4c80: 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  , sizeof(sqlite3
4c90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29  GlobalConfig.m))
4ca0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4cb0: 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
4cc0: 43 45 2d 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30  CE-OF: R-61006-0
4cd0: 38 39 31 38 20 49 66 20 74 68 65 20 6d 65 6d 6f  8918 If the memo
4ce0: 72 79 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  ry pointer is no
4cf0: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a  t NULL then the.
4d00: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 74 65 72          ** alter
4d10: 6e 61 74 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c  native memory al
4d20: 6c 6f 63 61 74 6f 72 20 69 73 20 65 6e 67 61 67  locator is engag
4d30: 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c  ed to handle all
4d40: 20 6f 66 20 53 51 4c 69 74 65 73 0a 20 20 20 20   of SQLites.    
4d50: 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c      ** memory al
4d60: 6c 6f 63 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20  location needs. 
4d70: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4d80: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a  _ENABLE_MEMSYS3.
4d90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
4da0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20  lobalConfig.m = 
4db0: 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65  *sqlite3MemGetMe
4dc0: 6d 73 79 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a  msys3();.#endif.
4dd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4de0: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20  ABLE_MEMSYS5.   
4df0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4e00: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
4e10: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
4e20: 73 35 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  s5();.#endif.   
4e30: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
4e40: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
4e50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4e60: 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45  CONFIG_LOOKASIDE
4e70: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4e80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
4e90: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61  Lookaside = va_a
4ea0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
4eb0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4ec0: 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64  Config.nLookasid
4ed0: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
4ee0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
4ef0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20  ;.    }.    .   
4f00: 20 2f 2a 20 52 65 63 6f 72 64 20 61 20 70 6f 69   /* Record a poi
4f10: 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 6f 67 67  nter to the logg
4f20: 65 72 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  er function and 
4f30: 69 74 73 20 66 69 72 73 74 20 61 72 67 75 6d 65  its first argume
4f40: 6e 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 64  nt..    ** The d
4f50: 65 66 61 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20  efault is NULL. 
4f60: 20 4c 6f 67 67 69 6e 67 20 69 73 20 64 69 73 61   Logging is disa
4f70: 62 6c 65 64 20 69 66 20 74 68 65 20 66 75 6e 63  bled if the func
4f80: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a  tion pointer is.
4f90: 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20      ** NULL..   
4fa0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
4fb0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20  ITE_CONFIG_LOG: 
4fc0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20  {.      /* MSVC 
4fd0: 69 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70  is picky about p
4fe0: 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73  ulling func ptrs
4ff0: 20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a   from va lists..
5000: 20 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f        ** http://
5010: 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66  support.microsof
5020: 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20  t.com/kb/47961. 
5030: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47       ** sqlite3G
5040: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
5050: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
5060: 69 64 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  id(*)(void*,int,
5070: 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20  const char*));. 
5080: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79       */.      ty
5090: 70 65 64 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46  pedef void(*LOGF
50a0: 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74  UNC_t)(void*,int
50b0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20  ,const char*);. 
50c0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
50d0: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20  alConfig.xLog = 
50e0: 76 61 5f 61 72 67 28 61 70 2c 20 4c 4f 47 46 55  va_arg(ap, LOGFU
50f0: 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  NC_t);.      sql
5100: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5110: 2e 70 4c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72  .pLogArg = va_ar
5120: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
5130: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5140: 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ..    /* EVIDENC
5150: 45 2d 4f 46 3a 20 52 2d 35 35 35 34 38 2d 33 33  E-OF: R-55548-33
5160: 38 31 37 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d  817 The compile-
5170: 74 69 6d 65 20 73 65 74 74 69 6e 67 20 66 6f 72  time setting for
5180: 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20   URI filenames. 
5190: 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 63 68 61     ** can be cha
51a0: 6e 67 65 64 20 61 74 20 73 74 61 72 74 2d 74 69  nged at start-ti
51b0: 6d 65 20 75 73 69 6e 67 20 74 68 65 0a 20 20 20  me using the.   
51c0: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66   ** sqlite3_conf
51d0: 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
51e0: 5f 55 52 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a  _URI,1) or.    *
51f0: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
5200: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55  (SQLITE_CONFIG_U
5210: 52 49 2c 30 29 20 63 6f 6e 66 69 67 75 72 61 74  RI,0) configurat
5220: 69 6f 6e 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a  ion calls..    *
5230: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
5240: 45 5f 43 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a  E_CONFIG_URI: {.
5250: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
5260: 45 2d 4f 46 3a 20 52 2d 32 35 34 35 31 2d 36 31  E-OF: R-25451-61
5270: 31 32 35 20 54 68 65 20 53 51 4c 49 54 45 5f 43  125 The SQLITE_C
5280: 4f 4e 46 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e  ONFIG_URI option
5290: 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a   takes a single.
52a0: 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e        ** argumen
52b0: 74 20 6f 66 20 74 79 70 65 20 69 6e 74 2e 20 49  t of type int. I
52c0: 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  f non-zero, then
52d0: 20 55 52 49 20 68 61 6e 64 6c 69 6e 67 20 69 73   URI handling is
52e0: 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20   globally.      
52f0: 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74  ** enabled. If t
5300: 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
5310: 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52 49 20 68  zero, then URI h
5320: 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61  andling is globa
5330: 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 73  lly.      ** dis
5340: 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  abled. */.      
5350: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
5360: 66 69 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76  fig.bOpenUri = v
5370: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
5380: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5390: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
53a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52  ITE_CONFIG_COVER
53b0: 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20  ING_INDEX_SCAN: 
53c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
53d0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d  NCE-OF: R-36592-
53e0: 30 32 37 37 32 20 54 68 65 20 53 51 4c 49 54 45  02772 The SQLITE
53f0: 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47  _CONFIG_COVERING
5400: 5f 49 4e 44 45 58 5f 53 43 41 4e 0a 20 20 20 20  _INDEX_SCAN.    
5410: 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65    ** option take
5420: 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 67  s a single integ
5430: 65 72 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  er argument whic
5440: 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
5450: 20 61 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 62   as a.      ** b
5460: 6f 6f 6c 65 61 6e 20 69 6e 20 6f 72 64 65 72 20  oolean in order 
5470: 74 6f 20 65 6e 61 62 6c 65 20 6f 72 20 64 69 73  to enable or dis
5480: 61 62 6c 65 20 74 68 65 20 75 73 65 20 6f 66 20  able the use of 
5490: 63 6f 76 65 72 69 6e 67 20 69 6e 64 69 63 65 73  covering indices
54a0: 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 66 75   for.      ** fu
54b0: 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 73 20 69  ll table scans i
54c0: 6e 20 74 68 65 20 71 75 65 72 79 20 6f 70 74 69  n the query opti
54d0: 6d 69 7a 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  mizer. */.      
54e0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
54f0: 66 69 67 2e 62 55 73 65 43 69 73 20 3d 20 76 61  fig.bUseCis = va
5500: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
5510: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5520: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
5530: 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20  _ENABLE_SQLLOG. 
5540: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5550: 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a  ONFIG_SQLLOG: {.
5560: 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
5570: 69 64 28 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74  id(*SQLLOGFUNC_t
5580: 29 28 76 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33  )(void*, sqlite3
5590: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  *, const char*, 
55a0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
55b0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
55c0: 78 53 71 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67  xSqllog = va_arg
55d0: 28 61 70 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f  (ap, SQLLOGFUNC_
55e0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
55f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
5600: 71 6c 6c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72  qllogArg = va_ar
5610: 67 28 61 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20  g(ap, void *);. 
5620: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5630: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61  }.#endif..    ca
5640: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5650: 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20  _MMAP_SIZE: {.  
5660: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5670: 4f 46 3a 20 52 2d 35 38 30 36 33 2d 33 38 32 35  OF: R-58063-3825
5680: 38 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  8 SQLITE_CONFIG_
5690: 4d 4d 41 50 5f 53 49 5a 45 20 74 61 6b 65 73 20  MMAP_SIZE takes 
56a0: 74 77 6f 20 36 34 2d 62 69 74 0a 20 20 20 20 20  two 64-bit.     
56b0: 20 2a 2a 20 69 6e 74 65 67 65 72 20 28 73 71 6c   ** integer (sql
56c0: 69 74 65 33 5f 69 6e 74 36 34 29 20 76 61 6c 75  ite3_int64) valu
56d0: 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65 20  es that are the 
56e0: 64 65 66 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a  default mmap siz
56f0: 65 20 6c 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a  e limit.      **
5700: 20 28 74 68 65 20 64 65 66 61 75 6c 74 20 73 65   (the default se
5710: 74 74 69 6e 67 20 66 6f 72 20 50 52 41 47 4d 41  tting for PRAGMA
5720: 20 6d 6d 61 70 5f 73 69 7a 65 29 20 61 6e 64 20   mmap_size) and 
5730: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  the maximum allo
5740: 77 65 64 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61  wed.      ** mma
5750: 70 20 73 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f  p size limit. */
5760: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
5770: 6e 74 36 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61  nt64 szMmap = va
5780: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
5790: 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20 20 20 73  _int64);.      s
57a0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d  qlite3_int64 mxM
57b0: 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  map = va_arg(ap,
57c0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b   sqlite3_int64);
57d0: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
57e0: 43 45 2d 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34  CE-OF: R-53367-4
57f0: 33 31 39 30 20 49 66 20 65 69 74 68 65 72 20 61  3190 If either a
5800: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
5810: 6f 70 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  option is.      
5820: 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  ** negative, the
5830: 6e 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20  n that argument 
5840: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 69 74  is changed to it
5850: 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64  s compile-time d
5860: 65 66 61 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a  efault..      **
5870: 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
5880: 43 45 2d 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34  CE-OF: R-34993-4
5890: 35 30 33 31 20 54 68 65 20 6d 61 78 69 6d 75 6d  5031 The maximum
58a0: 20 61 6c 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69   allowed mmap si
58b0: 7a 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  ze will be.     
58c0: 20 2a 2a 20 73 69 6c 65 6e 74 6c 79 20 74 72 75   ** silently tru
58d0: 6e 63 61 74 65 64 20 69 66 20 6e 65 63 65 73 73  ncated if necess
58e0: 61 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 64  ary so that it d
58f0: 6f 65 73 20 6e 6f 74 20 65 78 63 65 65 64 20 74  oes not exceed t
5900: 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  he.      ** comp
5910: 69 6c 65 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile-time maximum
5920: 20 6d 6d 61 70 20 73 69 7a 65 20 73 65 74 20 62   mmap size set b
5930: 79 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 58  y the SQLITE_MAX
5940: 5f 4d 4d 41 50 5f 53 49 5a 45 0a 20 20 20 20 20  _MMAP_SIZE.     
5950: 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   ** compile-time
5960: 20 6f 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a   option..      *
5970: 2f 0a 20 20 20 20 20 20 69 66 28 20 6d 78 4d 6d  /.      if( mxMm
5980: 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53  ap<0 || mxMmap>S
5990: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
59a0: 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  IZE ){.        m
59b0: 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 4d  xMmap = SQLITE_M
59c0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20  AX_MMAP_SIZE;.  
59d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
59e0: 73 7a 4d 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61  szMmap<0 ) szMma
59f0: 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  p = SQLITE_DEFAU
5a00: 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20  LT_MMAP_SIZE;.  
5a10: 20 20 20 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d      if( szMmap>m
5a20: 78 4d 6d 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20  xMmap) szMmap = 
5a30: 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73 71  mxMmap;.      sq
5a40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5a50: 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61  g.mxMmap = mxMma
5a60: 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
5a70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d  GlobalConfig.szM
5a80: 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20  map = szMmap;.  
5a90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5aa0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
5ab0: 57 49 4e 20 26 26 20 64 65 66 69 6e 65 64 28 53  WIN && defined(S
5ac0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
5ad0: 4f 43 29 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34  OC) /* IMP: R-04
5ae0: 37 38 30 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20  780-55815 */.   
5af0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
5b00: 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53 49  FIG_WIN32_HEAPSI
5b10: 5a 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ZE: {.      /* E
5b20: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34  VIDENCE-OF: R-34
5b30: 39 32 36 2d 30 33 33 36 30 20 53 51 4c 49 54 45  926-03360 SQLITE
5b40: 5f 43 4f 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45  _CONFIG_WIN32_HE
5b50: 41 50 53 49 5a 45 20 74 61 6b 65 73 20 61 20 33  APSIZE takes a 3
5b60: 32 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 75  2-bit.      ** u
5b70: 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
5b80: 76 61 6c 75 65 20 74 68 61 74 20 73 70 65 63 69  value that speci
5b90: 66 69 65 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  fies the maximum
5ba0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 72 65   size of the cre
5bb0: 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 68 65  ated.      ** he
5bc0: 61 70 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ap. */.      sql
5bd0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5be0: 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .nHeap = va_arg(
5bf0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
5c00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
5c10: 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51  dif..    case SQ
5c20: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53  LITE_CONFIG_PMAS
5c30: 5a 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Z: {.      sqlit
5c40: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
5c50: 7a 50 6d 61 20 3d 20 76 61 5f 61 72 67 28 61 70  zPma = va_arg(ap
5c60: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b  , unsigned int);
5c70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5c80: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51    }..    case SQ
5c90: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 54 4d 54  LITE_CONFIG_STMT
5ca0: 4a 52 4e 4c 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20  JRNL_SPILL: {.  
5cb0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5cc0: 6c 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69  lConfig.nStmtSpi
5cd0: 6c 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ll = va_arg(ap, 
5ce0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
5cf0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65  k;.    }..    de
5d00: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
5d10: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
5d20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5d30: 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e     }.  }.  va_en
5d40: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
5d50: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
5d60: 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64   up the lookasid
5d70: 65 20 62 75 66 66 65 72 73 20 66 6f 72 20 61 20  e buffers for a 
5d80: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
5d90: 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ion..** Return S
5da0: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
5db0: 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f  ess.  .** If loo
5dc0: 6b 61 73 69 64 65 20 69 73 20 61 6c 72 65 61 64  kaside is alread
5dd0: 79 20 61 63 74 69 76 65 2c 20 72 65 74 75 72 6e  y active, return
5de0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a   SQLITE_BUSY..**
5df0: 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61 72 61 6d  .** The sz param
5e00: 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62  eter is the numb
5e10: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 65  er of bytes in e
5e20: 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c  ach lookaside sl
5e30: 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70  ot..** The cnt p
5e40: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
5e50: 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e  number of slots.
5e60: 20 20 49 66 20 70 53 74 61 72 74 20 69 73 20 4e    If pStart is N
5e70: 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65  ULL the.** space
5e80: 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69   for the lookasi
5e90: 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74  de memory is obt
5ea0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
5eb0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
5ec0: 49 66 20 70 53 74 61 72 74 20 69 73 20 6e 6f 74  If pStart is not
5ed0: 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73   NULL then it is
5ee0: 20 73 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f 66   sz*cnt bytes of
5ef0: 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73 65 20 66   memory to use f
5f00: 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73  or.** the lookas
5f10: 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ide memory..*/.s
5f20: 74 61 74 69 63 20 69 6e 74 20 73 65 74 75 70 4c  tatic int setupL
5f30: 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69 74 65 33  ookaside(sqlite3
5f40: 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 42 75 66   *db, void *pBuf
5f50: 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e  , int sz, int cn
5f60: 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
5f70: 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44  TE_OMIT_LOOKASID
5f80: 45 0a 20 20 76 6f 69 64 20 2a 70 53 74 61 72 74  E.  void *pStart
5f90: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  ;.  if( db->look
5fa0: 61 73 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20 20  aside.nOut ){.  
5fb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5fc0: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46  BUSY;.  }.  /* F
5fd0: 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ree any existing
5fe0: 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65   lookaside buffe
5ff0: 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64 6c  r for this handl
6000: 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6c  e before.  ** al
6010: 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f  locating a new o
6020: 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 68  ne so we don't h
6030: 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61 63  ave to have spac
6040: 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74 68  e for .  ** both
6050: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
6060: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  e..  */.  if( db
6070: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
6080: 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  loced ){.    sql
6090: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f  ite3_free(db->lo
60a0: 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b  okaside.pStart);
60b0: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 69  .  }.  /* The si
60c0: 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69 64  ze of a lookasid
60d0: 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f 55  e slot after ROU
60e0: 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74 6f  NDDOWN8 needs to
60f0: 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a 20   be larger.  ** 
6100: 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  than a pointer t
6110: 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20 2a  o be useful..  *
6120: 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f  /.  sz = ROUNDDO
6130: 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d 50  WN8(sz);  /* IMP
6140: 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32 20  : R-33038-09382 
6150: 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69 6e  */.  if( sz<=(in
6160: 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69  t)sizeof(Lookasi
6170: 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d 20  deSlot*) ) sz = 
6180: 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20 29  0;.  if( cnt<0 )
6190: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20   cnt = 0;.  if( 
61a0: 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30 20  sz==0 || cnt==0 
61b0: 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20  ){.    sz = 0;. 
61c0: 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20     pStart = 0;. 
61d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66 3d   }else if( pBuf=
61e0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
61f0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
6200: 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72 74  oc();.    pStart
6210: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
6220: 28 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a 20  ( sz*cnt );  /* 
6230: 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35 37  IMP: R-61949-357
6240: 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  27 */.    sqlite
6250: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
6260: 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  ();.    if( pSta
6270: 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69 74  rt ) cnt = sqlit
6280: 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53 74  e3MallocSize(pSt
6290: 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65  art)/sz;.  }else
62a0: 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  {.    pStart = p
62b0: 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c  Buf;.  }.  db->l
62c0: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
62d0: 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e  = pStart;.  db->
62e0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20  lookaside.pFree 
62f0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  = 0;.  db->looka
6300: 73 69 64 65 2e 73 7a 20 3d 20 28 75 31 36 29 73  side.sz = (u16)s
6310: 7a 3b 0a 20 20 69 66 28 20 70 53 74 61 72 74 20  z;.  if( pStart 
6320: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
6330: 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20    LookasideSlot 
6340: 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  *p;.    assert( 
6350: 73 7a 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f 66  sz > (int)sizeof
6360: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
6370: 20 29 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f 6f   );.    p = (Loo
6380: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70 53 74 61  kasideSlot*)pSta
6390: 72 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e  rt;.    for(i=cn
63a0: 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  t-1; i>=0; i--){
63b0: 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  .      p->pNext 
63c0: 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  = db->lookaside.
63d0: 70 46 72 65 65 3b 0a 20 20 20 20 20 20 64 62 2d  pFree;.      db-
63e0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65  >lookaside.pFree
63f0: 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 3d 20   = p;.      p = 
6400: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
6410: 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20  &((u8*)p)[sz];. 
6420: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f     }.    db->loo
6430: 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 70 3b  kaside.pEnd = p;
6440: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
6450: 64 65 2e 62 44 69 73 61 62 6c 65 20 3d 20 30 3b  de.bDisable = 0;
6460: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
6470: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 70  de.bMalloced = p
6480: 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d  Buf==0 ?1:0;.  }
6490: 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f  else{.    db->lo
64a0: 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20 3d  okaside.pStart =
64b0: 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f   db;.    db->loo
64c0: 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 64 62  kaside.pEnd = db
64d0: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
64e0: 69 64 65 2e 62 44 69 73 61 62 6c 65 20 3d 20 31  ide.bDisable = 1
64f0: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
6500: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20  ide.bMalloced = 
6510: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  0;.  }.#endif /*
6520: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f   SQLITE_OMIT_LOO
6530: 4b 41 53 49 44 45 20 2a 2f 0a 20 20 72 65 74 75  KASIDE */.  retu
6540: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6550: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
6560: 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74  e mutex associat
6570: 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
6580: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
6590: 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  /.sqlite3_mutex 
65a0: 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65  *sqlite3_db_mute
65b0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  x(sqlite3 *db){.
65c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
65d0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
65e0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
65f0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
6600: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
6610: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
6620: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6630: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
6640: 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a  n db->mutex;.}..
6650: 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61 73  /*.** Free up as
6660: 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
6670: 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65 20  we can from the 
6680: 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a 2a  given database.*
6690: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  * connection..*/
66a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f  .int sqlite3_db_
66b0: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73  release_memory(s
66c0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
66d0: 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53 51  nt i;..#ifdef SQ
66e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
66f0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
6700: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
6710: 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
6720: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
6730: 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
6740: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
6750: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
6760: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
6770: 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d  ll(db);.  for(i=
6780: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
6790: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
67a0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
67b0: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
67c0: 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20   ){.      Pager 
67d0: 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  *pPager = sqlite
67e0: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
67f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
6800: 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67 65  agerShrink(pPage
6810: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
6820: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
6830: 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69  eAll(db);.  sqli
6840: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
6850: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
6860: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6870: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
6880: 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20 69  ny dirty pages i
6890: 6e 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  n the pager-cach
68a0: 65 20 66 6f 72 20 61 6e 79 20 61 74 74 61 63 68  e for any attach
68b0: 65 64 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ed database.** t
68c0: 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  o disk..*/.int s
68d0: 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65 66  qlite3_db_cachef
68e0: 6c 75 73 68 28 73 71 6c 69 74 65 33 20 2a 64 62  lush(sqlite3 *db
68f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
6900: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
6910: 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e 42 75 73  ;.  int bSeenBus
6920: 79 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  y = 0;..#ifdef S
6930: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
6940: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
6950: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
6960: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
6970: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
6980: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
6990: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
69a0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
69b0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
69c0: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
69d0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
69e0: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
69f0: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
6a00: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
6a10: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
6a20: 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  Bt && sqlite3Btr
6a30: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
6a40: 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20   ){.      Pager 
6a50: 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  *pPager = sqlite
6a60: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
6a70: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
6a80: 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28 70  ite3PagerFlush(p
6a90: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
6aa0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
6ab0: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53 65  Y ){.        bSe
6ac0: 65 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20  enBusy = 1;.    
6ad0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6ae0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
6af0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
6b00: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
6b10: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
6b20: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
6b30: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 72  x);.  return ((r
6b40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
6b50: 62 53 65 65 6e 42 75 73 79 29 20 3f 20 53 51 4c  bSeenBusy) ? SQL
6b60: 49 54 45 5f 42 55 53 59 20 3a 20 72 63 29 3b 0a  ITE_BUSY : rc);.
6b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
6b80: 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20  ration settings 
6b90: 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61  for an individua
6ba0: 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  l database conne
6bb0: 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ction.*/.int sql
6bc0: 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73  ite3_db_config(s
6bd0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
6be0: 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  op, ...){.  va_l
6bf0: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63  ist ap;.  int rc
6c00: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
6c10: 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20   op);.  switch( 
6c20: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
6c30: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d  QLITE_DBCONFIG_M
6c40: 41 49 4e 44 42 4e 41 4d 45 3a 20 7b 0a 20 20 20  AINDBNAME: {.   
6c50: 20 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44     db->aDb[0].zD
6c60: 62 53 4e 61 6d 65 20 3d 20 76 61 5f 61 72 67 28  bSName = va_arg(
6c70: 61 70 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  ap,char*);.     
6c80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6c90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6ca0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
6cb0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f  ITE_DBCONFIG_LOO
6cc0: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
6cd0: 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f  void *pBuf = va_
6ce0: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20  arg(ap, void*); 
6cf0: 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d  /* IMP: R-26835-
6d00: 31 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69  10964 */.      i
6d10: 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
6d20: 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f  p, int);       /
6d30: 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32  * IMP: R-47871-2
6d40: 35 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e  5994 */.      in
6d50: 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61  t cnt = va_arg(a
6d60: 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a  p, int);      /*
6d70: 20 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33   IMP: R-04460-53
6d80: 33 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  386 */.      rc 
6d90: 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65  = setupLookaside
6da0: 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63  (db, pBuf, sz, c
6db0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
6dc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
6dd0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61  ult: {.      sta
6de0: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
6df0: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f   {.        int o
6e00: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  p;      /* The o
6e10: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20  pcode */.       
6e20: 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a   u32 mask;    /*
6e30: 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74   Mask of the bit
6e40: 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67   in sqlite3.flag
6e50: 73 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a  s to set/clear *
6e60: 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f  /.      } aFlagO
6e70: 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  p[] = {.        
6e80: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
6e90: 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20  G_ENABLE_FKEY,  
6ea0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6eb0: 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d  ForeignKeys    }
6ec0: 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  ,.        { SQLI
6ed0: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
6ee0: 4c 45 5f 54 52 49 47 47 45 52 2c 20 20 20 20 20  LE_TRIGGER,     
6ef0: 20 20 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65     SQLITE_Enable
6f00: 54 72 69 67 67 65 72 20 20 7d 2c 0a 20 20 20 20  Trigger  },.    
6f10: 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43      { SQLITE_DBC
6f20: 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53  ONFIG_ENABLE_FTS
6f30: 33 5f 54 4f 4b 45 4e 49 5a 45 52 2c 20 53 51 4c  3_TOKENIZER, SQL
6f40: 49 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65  ITE_Fts3Tokenize
6f50: 72 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  r  },.        { 
6f60: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
6f70: 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
6f80: 4e 53 49 4f 4e 2c 20 53 51 4c 49 54 45 5f 4c 6f  NSION, SQLITE_Lo
6f90: 61 64 45 78 74 65 6e 73 69 6f 6e 20 20 7d 2c 0a  adExtension  },.
6fa0: 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45          { SQLITE
6fb0: 5f 44 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50  _DBCONFIG_NO_CKP
6fc0: 54 5f 4f 4e 5f 43 4c 4f 53 45 2c 20 20 20 20 20  T_ON_CLOSE,     
6fd0: 20 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e   SQLITE_NoCkptOn
6fe0: 43 6c 6f 73 65 20 20 7d 2c 0a 20 20 20 20 20 20  Close  },.      
6ff0: 7d 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65  };.      unsigne
7000: 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 72  d int i;.      r
7010: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
7020: 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39  ; /* IMP: R-4279
7030: 30 2d 32 33 33 37 32 20 2a 2f 0a 20 20 20 20 20  0-23372 */.     
7040: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
7050: 79 53 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20  ySize(aFlagOp); 
7060: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
7070: 28 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d  ( aFlagOp[i].op=
7080: 3d 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =op ){.         
7090: 20 69 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f   int onoff = va_
70a0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
70b0: 20 20 20 20 20 20 20 20 69 6e 74 20 2a 70 52 65          int *pRe
70c0: 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  s = va_arg(ap, i
70d0: 6e 74 2a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nt*);.          
70e0: 69 6e 74 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64  int oldFlags = d
70f0: 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20  b->flags;.      
7100: 20 20 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20      if( onoff>0 
7110: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ){.            d
7120: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61  b->flags |= aFla
7130: 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20  gOp[i].mask;.   
7140: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
7150: 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20   onoff==0 ){.   
7160: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
7170: 67 73 20 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69  gs &= ~aFlagOp[i
7180: 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  ].mask;.        
7190: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
71a0: 28 20 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e  ( oldFlags!=db->
71b0: 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20  flags ){.       
71c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69       sqlite3Expi
71d0: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
71e0: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ents(db);.      
71f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7200: 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20  if( pRes ){.    
7210: 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
7220: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c  (db->flags & aFl
7230: 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30  agOp[i].mask)!=0
7240: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
7250: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
7260: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
7270: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
7280: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
7290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
72a0: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
72b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
72c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
72d0: 75 65 20 69 66 20 74 68 65 20 62 75 66 66 65 72  ue if the buffer
72e0: 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61   z[0..n-1] conta
72f0: 69 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a  ins all spaces..
7300: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
7310: 6c 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63 68  lSpaces(const ch
7320: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
7330: 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
7340: 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d  [n-1]==' ' ){ n-
7350: 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d  -; }.  return n=
7360: 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  =0;.}../*.** Thi
7370: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
7380: 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
7390: 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41 52  ion named "BINAR
73a0: 59 22 20 77 68 69 63 68 20 69 73 20 61 6c 77 61  Y" which is alwa
73b0: 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e  ys.** available.
73c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
73d0: 64 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  dFlag argument i
73e0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
73f0: 73 70 61 63 65 20 70 61 64 64 69 6e 67 20 61 74  space padding at
7400: 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73   the end.** of s
7410: 74 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72 65  trings is ignore
7420: 64 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65  d.  This impleme
7430: 6e 74 73 20 74 68 65 20 52 54 52 49 4d 20 63 6f  nts the RTRIM co
7440: 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  llation..*/.stat
7450: 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75  ic int binCollFu
7460: 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64 46  nc(.  void *padF
7470: 6c 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  lag,.  int nKey1
7480: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
7490: 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32  ey1,.  int nKey2
74a0: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
74b0: 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c  ey2.){.  int rc,
74c0: 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c   n;.  n = nKey1<
74d0: 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20  nKey2 ? nKey1 : 
74e0: 6e 4b 65 79 32 3b 0a 20 20 2f 2a 20 45 56 49 44  nKey2;.  /* EVID
74f0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 30 33 33  ENCE-OF: R-65033
7500: 2d 32 38 34 34 39 20 54 68 65 20 62 75 69 6c 74  -28449 The built
7510: 2d 69 6e 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61  -in BINARY colla
7520: 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 0a 20 20  tion compares.  
7530: 2a 2a 20 73 74 72 69 6e 67 73 20 62 79 74 65 20  ** strings byte 
7540: 62 79 20 62 79 74 65 20 75 73 69 6e 67 20 74 68  by byte using th
7550: 65 20 6d 65 6d 63 6d 70 28 29 20 66 75 6e 63 74  e memcmp() funct
7560: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ion from the sta
7570: 6e 64 61 72 64 20 43 0a 20 20 2a 2a 20 6c 69 62  ndard C.  ** lib
7580: 72 61 72 79 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  rary. */.  rc = 
7590: 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b  memcmp(pKey1, pK
75a0: 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72  ey2, n);.  if( r
75b0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
75c0: 70 61 64 46 6c 61 67 0a 20 20 20 20 20 26 26 20  padFlag.     && 
75d0: 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72  allSpaces(((char
75e0: 2a 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79  *)pKey1)+n, nKey
75f0: 31 2d 6e 29 0a 20 20 20 20 20 26 26 20 61 6c 6c  1-n).     && all
7600: 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70  Spaces(((char*)p
7610: 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e  Key2)+n, nKey2-n
7620: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
7630: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
7640: 2d 33 31 36 32 34 2d 32 34 37 33 37 20 52 54 52  -31624-24737 RTR
7650: 49 4d 20 69 73 20 6c 69 6b 65 20 42 49 4e 41 52  IM is like BINAR
7660: 59 20 65 78 63 65 70 74 20 74 68 61 74 20 65 78  Y except that ex
7670: 74 72 61 0a 20 20 20 20 20 20 2a 2a 20 73 70 61  tra.      ** spa
7680: 63 65 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ces at the end o
7690: 66 20 65 69 74 68 65 72 20 73 74 72 69 6e 67 20  f either string 
76a0: 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68  do not change th
76b0: 65 20 72 65 73 75 6c 74 2e 20 49 6e 20 6f 74 68  e result. In oth
76c0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72 64  er.      ** word
76d0: 73 2c 20 73 74 72 69 6e 67 73 20 77 69 6c 6c 20  s, strings will 
76e0: 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
76f0: 20 6f 6e 65 20 61 6e 6f 74 68 65 72 20 61 73 20   one another as 
7700: 6c 6f 6e 67 20 61 73 20 74 68 65 79 0a 20 20 20  long as they.   
7710: 20 20 20 2a 2a 20 64 69 66 66 65 72 20 6f 6e 6c     ** differ onl
7720: 79 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  y in the number 
7730: 6f 66 20 73 70 61 63 65 73 20 61 74 20 74 68 65  of spaces at the
7740: 20 65 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   end..      */. 
7750: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7760: 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65  rc = nKey1 - nKe
7770: 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  y2;.    }.  }.  
7780: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7790: 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75 69 6c  .** Another buil
77a0: 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73  t-in collating s
77b0: 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e  equence: NOCASE.
77c0: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c   .**.** This col
77d0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
77e0: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
77f0: 65 20 75 73 65 64 20 66 6f 72 20 22 63 61 73 65  e used for "case
7800: 20 69 6e 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20   independent.** 
7810: 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c  comparison". SQL
7820: 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20  ite's knowledge 
7830: 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77  of upper and low
7840: 65 72 20 63 61 73 65 20 65 71 75 69 76 61 6c 65  er case equivale
7850: 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f  nts.** extends o
7860: 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20 63 68  nly to the 26 ch
7870: 61 72 61 63 74 65 72 73 20 75 73 65 64 20 69 6e  aracters used in
7880: 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e   the English lan
7890: 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20  guage..**.** At 
78a0: 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65  the moment there
78b0: 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38   is only a UTF-8
78c0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
78d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
78e0: 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75  ocaseCollatingFu
78f0: 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nc(.  void *NotU
7900: 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  sed,.  int nKey1
7910: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
7920: 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32  ey1,.  int nKey2
7930: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
7940: 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d  ey2.){.  int r =
7950: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
7960: 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63  (.      (const c
7970: 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f  har *)pKey1, (co
7980: 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 32  nst char *)pKey2
7990: 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f  , (nKey1<nKey2)?
79a0: 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20  nKey1:nKey2);.  
79b0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
79c0: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  (NotUsed);.  if(
79d0: 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d   0==r ){.    r =
79e0: 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20   nKey1-nKey2;.  
79f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
7a00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
7a10: 65 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d  e ROWID of the m
7a20: 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72  ost recent inser
7a30: 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36  t.*/.sqlite_int6
7a40: 34 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  4 sqlite3_last_i
7a50: 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69  nsert_rowid(sqli
7a60: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
7a70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
7a80: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
7a90: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
7aa0: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
7ab0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
7ac0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
7ad0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
7ae0: 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  if.  return db->
7af0: 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  lastRowid;.}../*
7b00: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
7b10: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
7b20: 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   in the most rec
7b30: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
7b40: 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69  te3_exec()..*/.i
7b50: 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  nt sqlite3_chang
7b60: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
7b70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7b80: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
7b90: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
7ba0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
7bb0: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
7bc0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
7bd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7be0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
7bf0: 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a  rn db->nChange;.
7c00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7c10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
7c20: 61 6e 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  anges since the 
7c30: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
7c40: 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69  was opened..*/.i
7c50: 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  nt sqlite3_total
7c60: 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  _changes(sqlite3
7c70: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
7c80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
7c90: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
7ca0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
7cb0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
7cc0: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
7cd0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
7ce0: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
7cf0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f    return db->nTo
7d00: 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  talChange;.}../*
7d10: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70  .** Close all op
7d20: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54  en savepoints. T
7d30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c  his function onl
7d40: 79 20 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69  y manipulates fi
7d50: 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64  elds of the.** d
7d60: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f  atabase handle o
7d70: 62 6a 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e  bject, it does n
7d80: 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76  ot close any sav
7d90: 65 70 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79  epoints that may
7da0: 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74   be open.** at t
7db0: 68 65 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20  he b-tree/pager 
7dc0: 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  level..*/.void s
7dd0: 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
7de0: 6f 69 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  oints(sqlite3 *d
7df0: 62 29 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d  b){.  while( db-
7e00: 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  >pSavepoint ){. 
7e10: 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54     Savepoint *pT
7e20: 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f  mp = db->pSavepo
7e30: 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61  int;.    db->pSa
7e40: 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e  vepoint = pTmp->
7e50: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
7e60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d  e3DbFree(db, pTm
7e70: 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53  p);.  }.  db->nS
7e80: 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
7e90: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d  db->nStatement =
7ea0: 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e   0;.  db->isTran
7eb0: 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74  sactionSavepoint
7ec0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
7ed0: 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
7ee0: 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73  ctor function as
7ef0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 75  sociated with Fu
7f00: 6e 63 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e  ncDef p, if any.
7f10: 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74   Except,.** if t
7f20: 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  his is not the l
7f30: 61 73 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20  ast copy of the 
7f40: 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74  function, do not
7f50: 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74   invoke it. Mult
7f60: 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f  iple.** copies o
7f70: 66 20 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74  f a single funct
7f80: 69 6f 6e 20 61 72 65 20 63 72 65 61 74 65 64 20  ion are created 
7f90: 77 68 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63  when create_func
7fa0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
7fb0: 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f  .** with SQLITE_
7fc0: 41 4e 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ANY as the encod
7fd0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
7fe0: 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74  oid functionDest
7ff0: 72 6f 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  roy(sqlite3 *db,
8000: 20 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20   FuncDef *p){.  
8010: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
8020: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d  pDestructor = p-
8030: 3e 75 2e 70 44 65 73 74 72 75 63 74 6f 72 3b 0a  >u.pDestructor;.
8040: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
8050: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
8060: 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ctor->nRef--;.  
8070: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
8080: 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  r->nRef==0 ){.  
8090: 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d      pDestructor-
80a0: 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73 74 72  >xDestroy(pDestr
80b0: 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61 74 61  uctor->pUserData
80c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
80d0: 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 73 74  DbFree(db, pDest
80e0: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  ructor);.    }. 
80f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63   }.}../*.** Disc
8100: 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c 69 74  onnect all sqlit
8110: 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 73 20  e3_vtab objects 
8120: 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 64  that belong to d
8130: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
8140: 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73 20 69  on.** db. This i
8150: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 64 62  s called when db
8160: 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73 65 64   is being closed
8170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8180: 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74   disconnectAllVt
8190: 61 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ab(sqlite3 *db){
81a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
81b0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
81c0: 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20 48 61 73  E.  int i;.  Has
81d0: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 73 71 6c 69  hElem *p;.  sqli
81e0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
81f0: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
8200: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
8210: 7b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  {.    Schema *pS
8220: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
8230: 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  i].pSchema;.    
8240: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
8250: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
8260: 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68  for(p=sqliteHash
8270: 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e  First(&pSchema->
8280: 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73  tblHash); p; p=s
8290: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29  qliteHashNext(p)
82a0: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
82b0: 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20   *pTab = (Table 
82c0: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
82d0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
82e0: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
82f0: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 44 69   ) sqlite3VtabDi
8300: 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61  sconnect(db, pTa
8310: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
8320: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 3d 73 71  }.  }.  for(p=sq
8330: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
8340: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 70 3b 20  b->aModule); p; 
8350: 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  p=sqliteHashNext
8360: 28 70 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65  (p)){.    Module
8370: 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65   *pMod = (Module
8380: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
8390: 61 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  a(p);.    if( pM
83a0: 6f 64 2d 3e 70 45 70 6f 54 61 62 20 29 7b 0a 20  od->pEpoTab ){. 
83b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
83c0: 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70  Disconnect(db, p
83d0: 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 29 3b 0a 20  Mod->pEpoTab);. 
83e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
83f0: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74  e3VtabUnlockList
8400: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  (db);.  sqlite3B
8410: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
8420: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
8430: 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
8440: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
8450: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 64  Return TRUE if d
8460: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
8470: 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61  on db has unfina
8480: 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a  lized prepared.*
8490: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20  * statements or 
84a0: 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74  unfinished sqlit
84b0: 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  e3_backup object
84c0: 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s.  .*/.static i
84d0: 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  nt connectionIsB
84e0: 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29  usy(sqlite3 *db)
84f0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
8500: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
8510: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
8520: 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  x) );.  if( db->
8530: 70 56 64 62 65 20 29 20 72 65 74 75 72 6e 20 31  pVdbe ) return 1
8540: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  ;.  for(j=0; j<d
8550: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
8560: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
8570: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20  b->aDb[j].pBt;. 
8580: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
8590: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61  lite3BtreeIsInBa
85a0: 63 6b 75 70 28 70 42 74 29 20 29 20 72 65 74 75  ckup(pBt) ) retu
85b0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
85c0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
85d0: 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  lose an existing
85e0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
85f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
8600: 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69  qlite3Close(sqli
8610: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72  te3 *db, int for
8620: 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28  ceZombie){.  if(
8630: 20 21 64 62 20 29 7b 0a 20 20 20 20 2f 2a 20 45   !db ){.    /* E
8640: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33  VIDENCE-OF: R-63
8650: 32 35 37 2d 31 31 37 34 30 20 43 61 6c 6c 69 6e  257-11740 Callin
8660: 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  g sqlite3_close(
8670: 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  ) or.    ** sqli
8680: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 20 77  te3_close_v2() w
8690: 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  ith a NULL point
86a0: 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  er argument is a
86b0: 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
86c0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
86d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
86e0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
86f0: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
8700: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
8710: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
8720: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
8730: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
8740: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
8750: 28 20 64 62 2d 3e 6d 54 72 61 63 65 20 26 20 53  ( db->mTrace & S
8760: 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53  QLITE_TRACE_CLOS
8770: 45 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 54 72  E ){.    db->xTr
8780: 61 63 65 28 53 51 4c 49 54 45 5f 54 52 41 43 45  ace(SQLITE_TRACE
8790: 5f 43 4c 4f 53 45 2c 20 64 62 2d 3e 70 54 72 61  _CLOSE, db->pTra
87a0: 63 65 41 72 67 2c 20 64 62 2c 20 30 29 3b 0a 20  ceArg, db, 0);. 
87b0: 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78   }..  /* Force x
87c0: 44 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73  Disconnect calls
87d0: 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20   on all virtual 
87e0: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63  tables */.  disc
87f0: 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 64 62  onnectAllVtab(db
8800: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72  );..  /* If a tr
8810: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
8820: 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e 65 63  n, the disconnec
8830: 74 41 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c 20  tAllVtab() call 
8840: 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  above.  ** will 
8850: 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20  not have called 
8860: 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28  the xDisconnect(
8870: 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20  ) method on any 
8880: 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62  virtual.  ** tab
8890: 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61  les in the db->a
88a0: 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20  VTrans[] array. 
88b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  The following sq
88c0: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
88d0: 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69  k().  ** call wi
88e0: 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65  ll do so. We nee
88f0: 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66  d to do this bef
8900: 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f  ore the check fo
8910: 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51  r active.  ** SQ
8920: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c  L statements bel
8930: 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62  ow, as the v-tab
8940: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
8950: 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67  n may be storing
8960: 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61  .  ** some prepa
8970: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69  red statements i
8980: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
8990: 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c    sqlite3VtabRol
89a0: 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a  lback(db);..  /*
89b0: 20 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f 72   Legacy behavior
89c0: 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28   (sqlite3_close(
89d0: 29 20 62 65 68 61 76 69 6f 72 29 20 69 73 20 74  ) behavior) is t
89e0: 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  o return.  ** SQ
89f0: 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74 68 65  LITE_BUSY if the
8a00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20   connection can 
8a10: 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d  not be closed im
8a20: 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  mediately..  */.
8a30: 20 20 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62    if( !forceZomb
8a40: 69 65 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e  ie && connection
8a50: 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20  IsBusy(db) ){.  
8a60: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
8a70: 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
8a80: 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c 65 20 74  _BUSY, "unable t
8a90: 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75  o close due to u
8aa0: 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20  nfinalized ".   
8ab0: 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74 73 20      "statements 
8ac0: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61  or unfinished ba
8ad0: 63 6b 75 70 73 22 29 3b 0a 20 20 20 20 73 71 6c  ckups");.    sql
8ae0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
8af0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
8b00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
8b10: 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  USY;.  }..#ifdef
8b20: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
8b30: 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69  QLLOG.  if( sqli
8b40: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
8b50: 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f  xSqllog ){.    /
8b60: 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65 20 68 61  * Closing the ha
8b70: 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72  ndle. Fourth par
8b80: 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64  ameter is passed
8b90: 20 74 68 65 20 76 61 6c 75 65 20 32 2e 20 2a 2f   the value 2. */
8ba0: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
8bb0: 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
8bc0: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
8bd0: 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c  nfig.pSqllogArg,
8be0: 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d 0a   db, 0, 2);.  }.
8bf0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e  #endif..  /* Con
8c00: 76 65 72 74 20 74 68 65 20 63 6f 6e 6e 65 63 74  vert the connect
8c10: 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69  ion into a zombi
8c20: 65 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65  e and then close
8c30: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e   it..  */.  db->
8c40: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
8c50: 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73  AGIC_ZOMBIE;.  s
8c60: 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78  qlite3LeaveMutex
8c70: 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64  AndCloseZombie(d
8c80: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  b);.  return SQL
8c90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
8ca0: 20 54 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20   Two variations 
8cb0: 6f 6e 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e  on the public in
8cc0: 74 65 72 66 61 63 65 20 66 6f 72 20 63 6c 6f 73  terface for clos
8cd0: 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ing a database.*
8ce0: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68  * connection. Th
8cf0: 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  e sqlite3_close(
8d00: 29 20 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e  ) version return
8d10: 73 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  s SQLITE_BUSY an
8d20: 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68 65 20  d.** leaves the 
8d30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f  connection optio
8d40: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 75  n if there are u
8d50: 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61  nfinalized prepa
8d60: 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  red.** statement
8d70: 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20  s or unfinished 
8d80: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 73 2e  sqlite3_backups.
8d90: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c    The sqlite3_cl
8da0: 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73  ose_v2().** vers
8db0: 69 6f 6e 20 66 6f 72 63 65 73 20 74 68 65 20 63  ion forces the c
8dc0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 63  onnection to bec
8dd0: 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69 66 20  ome a zombie if 
8de0: 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63  there are.** unc
8df0: 6c 6f 73 65 64 20 72 65 73 6f 75 72 63 65 73 2c  losed resources,
8e00: 20 61 6e 64 20 61 72 72 61 6e 67 65 73 20 66 6f   and arranges fo
8e10: 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77  r deallocation w
8e20: 68 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  hen the last.** 
8e30: 70 72 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e  prepare statemen
8e40: 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63  t or sqlite3_bac
8e50: 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69  kup closes..*/.i
8e60: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  nt sqlite3_close
8e70: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72  (sqlite3 *db){ r
8e80: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f  eturn sqlite3Clo
8e90: 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20  se(db,0); }.int 
8ea0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
8eb0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72  (sqlite3 *db){ r
8ec0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f  eturn sqlite3Clo
8ed0: 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a  se(db,1); }.../*
8ee0: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d 75  .** Close the mu
8ef0: 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20  tex on database 
8f00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a  connection db..*
8f10: 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65  *.** Furthermore
8f20: 2c 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f  , if database co
8f30: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20 61  nnection db is a
8f40: 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67   zombie (meaning
8f50: 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 68   that there.** h
8f60: 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f 72 20  as been a prior 
8f70: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
8f80: 63 6c 6f 73 65 28 64 62 29 20 6f 72 20 73 71 6c  close(db) or sql
8f90: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62  ite3_close_v2(db
8fa0: 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20  )) and.** every 
8fb0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 61 73  sqlite3_stmt has
8fc0: 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c 69   now been finali
8fd0: 7a 65 64 20 61 6e 64 20 65 76 65 72 79 20 73 71  zed and every sq
8fe0: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 68 61 73  lite3_backup has
8ff0: 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 74 68  .** finished, th
9000: 65 6e 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f  en free all reso
9010: 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  urces..*/.void s
9020: 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78  qlite3LeaveMutex
9030: 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73  AndCloseZombie(s
9040: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48  qlite3 *db){.  H
9050: 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20  ashElem *i;     
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9070: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69 74 65  * Hash table ite
9080: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a  rator */.  int j
9090: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
90a0: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
90b0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72   sqlite3_stmt or
90c0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
90d0: 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20  objects.  ** or 
90e0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
90f0: 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  n has not yet be
9100: 65 6e 20 63 6c 6f 73 65 64 20 62 79 20 73 71 6c  en closed by sql
9110: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c  ite3_close_v2(),
9120: 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20  .  ** then just 
9130: 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78 20  leave the mutex 
9140: 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
9150: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63  .  if( db->magic
9160: 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a  !=SQLITE_MAGIC_Z
9170: 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74  OMBIE || connect
9180: 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b  ionIsBusy(db) ){
9190: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
91a0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
91b0: 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ex);.    return;
91c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
91d0: 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
91e0: 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
91f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
9200: 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a  nnection has.  *
9210: 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c  * closed all sql
9220: 69 74 65 33 5f 73 74 6d 74 20 61 6e 64 20 73 71  ite3_stmt and sq
9230: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a  lite3_backup obj
9240: 65 63 74 73 20 61 6e 64 20 68 61 73 20 62 65 65  ects and has bee
9250: 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f  n.  ** passed to
9260: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28   sqlite3_close (
9270: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20  meaning that it 
9280: 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54  is a zombie).  T
9290: 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67  herefore,.  ** g
92a0: 6f 20 61 68 65 61 64 20 61 6e 64 20 66 72 65 65  o ahead and free
92b0: 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a   all resources..
92c0: 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 20    */..  /* If a 
92d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
92e0: 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63  pen, roll it bac
92f0: 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20 65 6e 73  k. This also ens
9300: 75 72 65 73 20 74 68 61 74 20 69 66 0a 20 20 2a  ures that if.  *
9310: 2a 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 73  * any database s
9320: 63 68 65 6d 61 73 20 68 61 76 65 20 62 65 65 6e  chemas have been
9330: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61 6e 20   modified by an 
9340: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  uncommitted tran
9350: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 65  saction.  ** the
9360: 79 20 61 72 65 20 72 65 73 65 74 2e 20 41 6e 64  y are reset. And
9370: 20 74 68 61 74 20 74 68 65 20 72 65 71 75 69 72   that the requir
9380: 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  ed b-tree mutex 
9390: 69 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65 0a  is held to make.
93a0: 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 72    ** the pager r
93b0: 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65  ollback and sche
93c0: 6d 61 20 72 65 73 65 74 20 61 6e 20 61 74 6f 6d  ma reset an atom
93d0: 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f  ic operation. */
93e0: 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  .  sqlite3Rollba
93f0: 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
9400: 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  _OK);..  /* Free
9410: 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   any outstanding
9420: 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63   Savepoint struc
9430: 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  tures. */.  sqli
9440: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
9450: 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c  ts(db);..  /* Cl
9460: 6f 73 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ose all database
9470: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
9480: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d    for(j=0; j<db-
9490: 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nDb; j++){.    
94a0: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
94b0: 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20   &db->aDb[j];.  
94c0: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
94d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
94e0: 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70  treeClose(pDb->p
94f0: 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  Bt);.      pDb->
9500: 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  pBt = 0;.      i
9510: 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20  f( j!=1 ){.     
9520: 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20     pDb->pSchema 
9530: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
9540: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61   }.  }.  /* Clea
9550: 72 20 74 68 65 20 54 45 4d 50 20 73 63 68 65 6d  r the TEMP schem
9560: 61 20 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64  a separately and
9570: 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28 20 64   last */.  if( d
9580: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
9590: 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  a ){.    sqlite3
95a0: 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e  SchemaClear(db->
95b0: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
95c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
95d0: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
95e0: 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 75 70 20  ;..  /* Free up 
95f0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 75 78  the array of aux
9600: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
9610: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   */.  sqlite3Col
9620: 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72  lapseDatabaseArr
9630: 61 79 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  ay(db);.  assert
9640: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a  ( db->nDb<=2 );.
9650: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
9660: 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63  b==db->aDbStatic
9670: 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74   );..  /* Tell t
9680: 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66  he code in notif
9690: 79 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e  y.c that the con
96a0: 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65  nection no longe
96b0: 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a  r holds any.  **
96c0: 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20   locks and does 
96d0: 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20  not require any 
96e0: 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e  further unlock-n
96f0: 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e  otify callbacks.
9700: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  .  */.  sqlite3C
9710: 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28  onnectionClosed(
9720: 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 73 71  db);..  for(i=sq
9730: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
9740: 62 2d 3e 61 46 75 6e 63 29 3b 20 69 3b 20 69 3d  b->aFunc); i; i=
9750: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
9760: 29 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20  )){.    FuncDef 
9770: 2a 70 4e 65 78 74 2c 20 2a 70 3b 0a 20 20 20 20  *pNext, *p;.    
9780: 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  p = sqliteHashDa
9790: 74 61 28 69 29 3b 0a 20 20 20 20 64 6f 7b 0a 20  ta(i);.    do{. 
97a0: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73       functionDes
97b0: 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20  troy(db, p);.   
97c0: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
97d0: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
97e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
97f0: 0a 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74  .      p = pNext
9800: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 20  ;.    }while( p 
9810: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
9820: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61  HashClear(&db->a
9830: 46 75 6e 63 29 3b 0a 20 20 66 6f 72 28 69 3d 73  Func);.  for(i=s
9840: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
9850: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69  db->aCollSeq); i
9860: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
9870: 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c  xt(i)){.    Coll
9880: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f  Seq *pColl = (Co
9890: 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61  llSeq *)sqliteHa
98a0: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f  shData(i);.    /
98b0: 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73  * Invoke any des
98c0: 74 72 75 63 74 6f 72 73 20 72 65 67 69 73 74 65  tructors registe
98d0: 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f  red for collatio
98e0: 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 72 20  n sequence user 
98f0: 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  data. */.    for
9900: 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
9910: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  .      if( pColl
9920: 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20  [j].xDel ){.    
9930: 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65      pColl[j].xDe
9940: 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72  l(pColl[j].pUser
9950: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9960: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
9970: 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20  ee(db, pColl);. 
9980: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
9990: 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c  Clear(&db->aColl
99a0: 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Seq);.#ifndef SQ
99b0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
99c0: 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73  LTABLE.  for(i=s
99d0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
99e0: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b  db->aModule); i;
99f0: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
9a00: 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c  t(i)){.    Modul
9a10: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
9a20: 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  e *)sqliteHashDa
9a30: 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
9a40: 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b  Mod->xDestroy ){
9a50: 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65  .      pMod->xDe
9a60: 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78  stroy(pMod->pAux
9a70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
9a80: 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75  ite3VtabEponymou
9a90: 73 54 61 62 6c 65 43 6c 65 61 72 28 64 62 2c 20  sTableClear(db, 
9aa0: 70 4d 6f 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  pMod);.    sqlit
9ab0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f  e3DbFree(db, pMo
9ac0: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
9ad0: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
9ae0: 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
9af0: 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ..  sqlite3Error
9b00: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
9b10: 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20   /* Deallocates 
9b20: 61 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f 72  any cached error
9b30: 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73   strings. */.  s
9b40: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
9b50: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c  db->pErr);.  sql
9b60: 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69  ite3CloseExtensi
9b70: 6f 6e 73 28 64 62 29 3b 0a 23 69 66 20 53 51 4c  ons(db);.#if SQL
9b80: 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
9b90: 49 43 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65  ICATION.  sqlite
9ba0: 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e  3_free(db->auth.
9bb0: 7a 41 75 74 68 55 73 65 72 29 3b 0a 20 20 73 71  zAuthUser);.  sq
9bc0: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61  lite3_free(db->a
9bd0: 75 74 68 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65  uth.zAuthPW);.#e
9be0: 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69  ndif..  db->magi
9bf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
9c00: 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68  _ERROR;..  /* Th
9c10: 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20  e temp-database 
9c20: 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61  schema is alloca
9c30: 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  ted differently 
9c40: 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73  from the other s
9c50: 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63  chema.  ** objec
9c60: 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65  ts (using sqlite
9c70: 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c  Malloc() directl
9c80: 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71  y, instead of sq
9c90: 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
9ca0: 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20  ())..  ** So it 
9cb0: 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
9cc0: 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68  d here. Todo: Wh
9cd0: 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74  y not roll the t
9ce0: 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a  emp schema into.
9cf0: 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71    ** the same sq
9d00: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20  liteMalloc() as 
9d10: 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c  the one that all
9d20: 6f 63 61 74 65 73 20 74 68 65 20 64 61 74 61 62  ocates the datab
9d30: 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74  ase .  ** struct
9d40: 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ure?.  */.  sqli
9d50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62  te3DbFree(db, db
9d60: 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
9d70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
9d80: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
9d90: 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63  ex);.  db->magic
9da0: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
9db0: 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65  CLOSED;.  sqlite
9dc0: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d  3_mutex_free(db-
9dd0: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
9de0: 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
9df0: 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20  .nOut==0 );  /* 
9e00: 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61  Fails on a looka
9e10: 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  side memory leak
9e20: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f   */.  if( db->lo
9e30: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
9e40: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
9e50: 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73  _free(db->lookas
9e60: 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d  ide.pStart);.  }
9e70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
9e80: 4e 41 42 4c 45 5f 53 51 4c 52 52 0a 20 20 53 52  NABLE_SQLRR.  SR
9e90: 52 65 63 43 6c 6f 73 65 28 64 62 29 3b 0a 23 65  RecClose(db);.#e
9ea0: 6e 64 69 66 0a 20 20 0a 20 20 73 71 6c 69 74 65  ndif.  .  sqlite
9eb0: 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f  3_free(db);.}../
9ec0: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
9ed0: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  l database files
9ee0: 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65 20 69  .  If tripCode i
9ef0: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c  s not SQLITE_OK,
9f00: 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77 72 69   then.** any wri
9f10: 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 69  te cursors are i
9f20: 6e 76 61 6c 69 64 61 74 65 64 20 28 22 74 72 69  nvalidated ("tri
9f30: 70 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74  pped" - as in "t
9f40: 72 69 70 70 69 6e 67 20 61 20 63 69 72 63 75 69  ripping a circui
9f50: 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61  t.** breaker") a
9f60: 6e 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72  nd made to retur
9f70: 6e 20 74 72 69 70 43 6f 64 65 20 69 66 20 74 68  n tripCode if th
9f80: 65 72 65 20 61 72 65 20 61 6e 79 20 66 75 72 74  ere are any furt
9f90: 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  her.** attempts 
9fa0: 74 6f 20 75 73 65 20 74 68 61 74 20 63 75 72 73  to use that curs
9fb0: 6f 72 2e 20 20 52 65 61 64 20 63 75 72 73 6f 72  or.  Read cursor
9fc0: 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20 61 6e  s remain open an
9fd0: 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74 20 61  d valid.** but a
9fe0: 72 65 20 22 73 61 76 65 64 22 20 69 6e 20 63 61  re "saved" in ca
9ff0: 73 65 20 74 68 65 20 74 61 62 6c 65 20 70 61 67  se the table pag
a000: 65 73 20 61 72 65 20 6d 6f 76 65 64 20 61 72 6f  es are moved aro
a010: 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  und..*/.void sql
a020: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
a030: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
a040: 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e   tripCode){.  in
a050: 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61  t i;.  int inTra
a060: 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 63  ns = 0;.  int sc
a070: 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 61 73  hemaChange;.  as
a080: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a090: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
a0a0: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
a0b0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
a0c0: 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69  c();..  /* Obtai
a0d0: 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d 75 74  n all b-tree mut
a0e0: 65 78 65 73 20 62 65 66 6f 72 65 20 6d 61 6b 69  exes before maki
a0f0: 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f 20  ng any calls to 
a100: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 2e  BtreeRollback().
a110: 20 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 69   .  ** This is i
a120: 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63 61 73 65  mportant in case
a130: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
a140: 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
a150: 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f 64 69  ck has.  ** modi
a160: 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73  fied the databas
a170: 65 20 73 63 68 65 6d 61 2e 20 49 66 20 74 68 65  e schema. If the
a180: 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20   b-tree mutexes 
a190: 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a 20 20  are not taken.  
a1a0: 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e 20 61 6e  ** here, then an
a1b0: 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
a1c0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69  he connection mi
a1d0: 67 68 74 20 73 6e 65 61 6b 20 69 6e 20 62 65 74  ght sneak in bet
a1e0: 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 64 61  ween.  ** the da
a1f0: 74 61 62 61 73 65 20 72 6f 6c 6c 62 61 63 6b 20  tabase rollback 
a200: 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65 74  and schema reset
a210: 2c 20 77 68 69 63 68 20 63 61 6e 20 63 61 75 73  , which can caus
a220: 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63 6f 72  e false.  ** cor
a230: 72 75 70 74 69 6f 6e 20 72 65 70 6f 72 74 73 20  ruption reports 
a240: 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e 20 20  in some cases.  
a250: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
a260: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
a270: 20 73 63 68 65 6d 61 43 68 61 6e 67 65 20 3d 20   schemaChange = 
a280: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
a290: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
a2a0: 73 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69  s)!=0 && db->ini
a2b0: 74 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20 20 66 6f  t.busy==0;..  fo
a2c0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
a2d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65  ; i++){.    Btre
a2e0: 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69  e *p = db->aDb[i
a2f0: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
a300: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
a310: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
a320: 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20  ans(p) ){.      
a330: 20 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20    inTrans = 1;. 
a340: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
a350: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
a360: 6b 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 21  k(p, tripCode, !
a370: 73 63 68 65 6d 61 43 68 61 6e 67 65 29 3b 0a 20  schemaChange);. 
a380: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
a390: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64  e3VtabRollback(d
a3a0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64  b);.  sqlite3End
a3b0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
a3c0: 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67  .  if( (db->flag
a3d0: 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  s&SQLITE_InternC
a3e0: 68 61 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62  hanges)!=0 && db
a3f0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
a400: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
a410: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
a420: 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73  ments(db);.    s
a430: 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63  qlite3ResetAllSc
a440: 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f  hemasOfConnectio
a450: 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  n(db);.  }.  sql
a460: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
a470: 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79  l(db);..  /* Any
a480: 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
a490: 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20  aint violations 
a4a0: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
a4b0: 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d  solved. */.  db-
a4c0: 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
a4d0: 20 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72   0;.  db->nDefer
a4e0: 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a  redImmCons = 0;.
a4f0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
a500: 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b  SQLITE_DeferFKs;
a510: 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61  ..  /* If one ha
a520: 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65  s been configure
a530: 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f  d, invoke the ro
a540: 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c  llback-hook call
a550: 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62  back */.  if( db
a560: 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
a570: 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20  ack && (inTrans 
a580: 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  || !db->autoComm
a590: 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78  it) ){.    db->x
a5a0: 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
a5b0: 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72  (db->pRollbackAr
a5c0: 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  g);.  }.}../*.**
a5d0: 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63   Return a static
a5e0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
a5f0: 6e 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72  ng the name corr
a600: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
a610: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73   error code.** s
a620: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
a630: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66  argument..*/.#if
a640: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
a650: 4e 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29 0a 63  NEED_ERR_NAME).c
a660: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
a670: 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 20 72 63  e3ErrName(int rc
a680: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
a690: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  *zName = 0;.  in
a6a0: 74 20 69 2c 20 6f 72 69 67 52 63 20 3d 20 72 63  t i, origRc = rc
a6b0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32  ;.  for(i=0; i<2
a6c0: 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b   && zName==0; i+
a6d0: 2b 2c 20 72 63 20 26 3d 20 30 78 66 66 29 7b 0a  +, rc &= 0xff){.
a6e0: 20 20 20 20 73 77 69 74 63 68 28 20 72 63 20 29      switch( rc )
a6f0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  {.      case SQL
a700: 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20  ITE_OK:         
a710: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a720: 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20  "SQLITE_OK";    
a730: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a740: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a750: 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20  LITE_ERROR:     
a760: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
a770: 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b   "SQLITE_ERROR";
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
a790: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a7a0: 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20  QLITE_INTERNAL: 
a7b0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a7c0: 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  = "SQLITE_INTERN
a7d0: 41 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  AL";          br
a7e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a7f0: 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20 20  SQLITE_PERM:    
a800: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a810: 20 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d 22   = "SQLITE_PERM"
a820: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
a830: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a840: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20   SQLITE_ABORT:  
a850: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
a860: 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52  e = "SQLITE_ABOR
a870: 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  T";             
a880: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a890: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  e SQLITE_ABORT_R
a8a0: 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e 61  OLLBACK:     zNa
a8b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f  me = "SQLITE_ABO
a8c0: 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20 20  RT_ROLLBACK";   
a8d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a8e0: 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20  se SQLITE_BUSY: 
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
a900: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55  ame = "SQLITE_BU
a910: 53 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  SY";            
a920: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a930: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ase SQLITE_BUSY_
a940: 52 45 43 4f 56 45 52 59 3a 20 20 20 20 20 20 7a  RECOVERY:      z
a950: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
a960: 55 53 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 20  USY_RECOVERY";  
a970: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a980: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
a990: 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20 20  _SNAPSHOT:      
a9a0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a9b0: 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b 20  BUSY_SNAPSHOT"; 
a9c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a9d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43   case SQLITE_LOC
a9e0: 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20 20 20  KED:            
a9f0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
aa00: 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 20  _LOCKED";       
aa10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aa20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f    case SQLITE_LO
aa30: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
aa40: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
aa50: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
aa60: 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20 20  ACHE";break;.   
aa70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
aa80: 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20 20  OMEM:           
aa90: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
aaa0: 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20  TE_NOMEM";      
aab0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
aac0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
aad0: 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20  READONLY:       
aae0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
aaf0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20  ITE_READONLY";  
ab00: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ab10: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ab20: 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45  _READONLY_RECOVE
ab30: 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  RY:  zName = "SQ
ab40: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45  LITE_READONLY_RE
ab50: 43 4f 56 45 52 59 22 3b 20 62 72 65 61 6b 3b 0a  COVERY"; break;.
ab60: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ab70: 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c  E_READONLY_CANTL
ab80: 4f 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  OCK:  zName = "S
ab90: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43  QLITE_READONLY_C
aba0: 41 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b  ANTLOCK"; break;
abb0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
abc0: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c  TE_READONLY_ROLL
abd0: 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  BACK:  zName = "
abe0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
abf0: 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b  ROLLBACK"; break
ac00: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ac10: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
ac20: 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20  OVED:   zName = 
ac30: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
ac40: 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62 72 65 61  _DBMOVED";  brea
ac50: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ac60: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20  LITE_INTERRUPT: 
ac70: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
ac80: 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55   "SQLITE_INTERRU
ac90: 50 54 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  PT";         bre
aca0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
acb0: 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20  QLITE_IOERR:    
acc0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
acd0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 22  = "SQLITE_IOERR"
ace0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
acf0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ad00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
ad10: 44 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  D:         zName
ad20: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ad30: 5f 52 45 41 44 22 3b 20 20 20 20 20 20 20 20 62  _READ";        b
ad40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ad50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
ad60: 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d  ORT_READ:   zNam
ad70: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
ad80: 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b 20 20  R_SHORT_READ";  
ad90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ada0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  e SQLITE_IOERR_W
adb0: 52 49 54 45 3a 20 20 20 20 20 20 20 20 7a 4e 61  RITE:        zNa
adc0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
add0: 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20 20 20  RR_WRITE";      
ade0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
adf0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
ae00: 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e  FSYNC:        zN
ae10: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
ae20: 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20 20 20  ERR_FSYNC";     
ae30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ae40: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
ae50: 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a  _DIR_FSYNC:    z
ae60: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
ae70: 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b  OERR_DIR_FSYNC";
ae80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ae90: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
aea0: 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20 20 20  R_TRUNCATE:     
aeb0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
aec0: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 22 3b  IOERR_TRUNCATE";
aed0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
aee0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
aef0: 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20 20 20  RR_FSTAT:       
af00: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
af10: 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b 20 20  _IOERR_FSTAT";  
af20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
af30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
af40: 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20  ERR_UNLOCK:     
af50: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
af60: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b  E_IOERR_UNLOCK";
af70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
af80: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
af90: 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20  OERR_RDLOCK:    
afa0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
afb0: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22  TE_IOERR_RDLOCK"
afc0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
afd0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
afe0: 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20 20 20  IOERR_DELETE:   
aff0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b000: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
b010: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
b020: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b030: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20  _IOERR_NOMEM:   
b040: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b050: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
b060: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
b070: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b080: 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3a 20  E_IOERR_ACCESS: 
b090: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b0a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
b0b0: 53 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  SS";      break;
b0c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b0d0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
b0e0: 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20  SERVEDLOCK:.    
b0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b100: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b110: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b120: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
b130: 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  OCK"; break;.   
b140: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b150: 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20  OERR_LOCK:      
b160: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b170: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20  TE_IOERR_LOCK"; 
b180: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b190: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b1a0: 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20  IOERR_CLOSE:    
b1b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b1c0: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22  ITE_IOERR_CLOSE"
b1d0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
b1e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b1f0: 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45  _IOERR_DIR_CLOSE
b200: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
b210: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43  LITE_IOERR_DIR_C
b220: 4c 4f 53 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a  LOSE";   break;.
b230: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b240: 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a  E_IOERR_SHMOPEN:
b250: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b260: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
b270: 50 45 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  PEN";     break;
b280: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b290: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
b2a0: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
b2b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b2c0: 53 49 5a 45 22 3b 20 20 20 20 20 62 72 65 61 6b  SIZE";     break
b2d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b2e0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43  ITE_IOERR_SHMLOC
b2f0: 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  K:      zName = 
b300: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
b310: 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72 65 61  MLOCK";     brea
b320: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b330: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
b340: 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  P:       zName =
b350: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b360: 48 4d 4d 41 50 22 3b 20 20 20 20 20 20 62 72 65  HMMAP";      bre
b370: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b380: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
b390: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
b3a0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b3b0: 53 45 45 4b 22 3b 20 20 20 20 20 20 20 20 62 72  SEEK";        br
b3c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b3d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
b3e0: 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65  ETE_NOENT: zName
b3f0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b400: 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62  _DELETE_NOENT";b
b410: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b420: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d   SQLITE_IOERR_MM
b430: 41 50 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  AP:         zNam
b440: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b450: 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20 20 20  R_MMAP";        
b460: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b470: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  e SQLITE_IOERR_G
b480: 45 54 54 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61  ETTEMPPATH:  zNa
b490: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b4a0: 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 22 3b  RR_GETTEMPPATH";
b4b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b4c0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b4d0: 43 4f 4e 56 50 41 54 48 3a 20 20 20 20 20 7a 4e  CONVPATH:     zN
b4e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b4f0: 45 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20  ERR_CONVPATH";  
b500: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b510: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ase SQLITE_CORRU
b520: 50 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a  PT:            z
b530: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b540: 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20  ORRUPT";        
b550: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b560: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52  case SQLITE_CORR
b570: 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20 20 20  UPT_VTAB:       
b580: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b590: 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b 20 20  CORRUPT_VTAB";  
b5a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b5b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
b5c0: 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20 20  FOUND:          
b5d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b5e0: 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20 20  _NOTFOUND";     
b5f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b600: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55    case SQLITE_FU
b610: 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  LL:             
b620: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b630: 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20 20  E_FULL";        
b640: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b650: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b660: 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20 20  ANTOPEN:        
b670: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b680: 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20  TE_CANTOPEN";   
b690: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b6a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b6b0: 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44  CANTOPEN_NOTEMPD
b6c0: 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  IR: zName = "SQL
b6d0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54  ITE_CANTOPEN_NOT
b6e0: 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20  EMPDIR";break;. 
b6f0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b700: 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a  _CANTOPEN_ISDIR:
b710: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b720: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53  LITE_CANTOPEN_IS
b730: 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  DIR";    break;.
b740: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b750: 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
b760: 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ATH:  zName = "S
b770: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
b780: 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61 6b 3b  ULLPATH"; break;
b790: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b7a0: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56  TE_CANTOPEN_CONV
b7b0: 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  PATH:  zName = "
b7c0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
b7d0: 43 4f 4e 56 50 41 54 48 22 3b 20 62 72 65 61 6b  CONVPATH"; break
b7e0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b7f0: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20  ITE_PROTOCOL:   
b800: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b810: 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  "SQLITE_PROTOCOL
b820: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
b830: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b840: 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20  LITE_EMPTY:     
b850: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b860: 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b   "SQLITE_EMPTY";
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
b880: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b890: 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20  QLITE_SCHEMA:   
b8a0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b8b0: 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  = "SQLITE_SCHEMA
b8c0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
b8d0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b8e0: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20  SQLITE_TOOBIG:  
b8f0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b900: 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49   = "SQLITE_TOOBI
b910: 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  G";            b
b920: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b930: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
b940: 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  NT:         zNam
b950: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
b960: 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20 20 20  TRAINT";        
b970: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b980: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
b990: 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61  INT_UNIQUE:  zNa
b9a0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
b9b0: 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b  STRAINT_UNIQUE";
b9c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b9d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b9e0: 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e  AINT_TRIGGER: zN
b9f0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
ba00: 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
ba10: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
ba20: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
ba30: 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
ba40: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba60: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ba70: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
ba80: 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72 65 61  EIGNKEY";   brea
ba90: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
baa0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
bab0: 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d  CHECK:   zName =
bac0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
bad0: 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62 72 65  INT_CHECK";  bre
bae0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
baf0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bb00: 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20  _PRIMARYKEY:.   
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
bb30: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
bb40: 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
bb50: 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  EY";   break;.  
bb60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bb70: 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55  CONSTRAINT_NOTNU
bb80: 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  LL: zName = "SQL
bb90: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e  ITE_CONSTRAINT_N
bba0: 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20  OTNULL";break;. 
bbb0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bbc0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
bbd0: 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20  ITHOOK:.        
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbf0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bc00: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
bc10: 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20  NT_COMMITHOOK"; 
bc20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bc30: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
bc40: 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a  RAINT_VTAB:    z
bc50: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
bc60: 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 22 3b  ONSTRAINT_VTAB";
bc70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bc80: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
bc90: 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a  TRAINT_FUNCTION:
bca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcc0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bcd0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43  _CONSTRAINT_FUNC
bce0: 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65 61 6b  TION";     break
bcf0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bd00: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52  ITE_CONSTRAINT_R
bd10: 4f 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20  OWID:   zName = 
bd20: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
bd30: 4e 54 5f 52 4f 57 49 44 22 3b 20 20 62 72 65 61  NT_ROWID";  brea
bd40: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bd50: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20  LITE_MISMATCH:  
bd60: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bd70: 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43   "SQLITE_MISMATC
bd80: 48 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  H";          bre
bd90: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bda0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20  QLITE_MISUSE:   
bdb0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bdc0: 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  = "SQLITE_MISUSE
bdd0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
bde0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bdf0: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20  SQLITE_NOLFS:   
be00: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
be10: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53   = "SQLITE_NOLFS
be20: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
be30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
be40: 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20   SQLITE_AUTH:   
be50: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
be60: 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55 54 48  e = "SQLITE_AUTH
be70: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
be80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
be90: 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a  e SQLITE_FORMAT:
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
beb0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52  me = "SQLITE_FOR
bec0: 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  MAT";           
bed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bee0: 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a  se SQLITE_RANGE:
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
bf00: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41  ame = "SQLITE_RA
bf10: 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20 20 20  NGE";           
bf20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bf30: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  ase SQLITE_NOTAD
bf40: 42 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  B:             z
bf50: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
bf60: 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20 20 20  OTADB";         
bf70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bf80: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a  case SQLITE_ROW:
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bfb0: 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20 20 20  ROW";           
bfc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bfd0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
bfe0: 49 43 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  ICE:            
bff0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c000: 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20 20 20 20  _NOTICE";       
c010: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c020: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
c030: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c  TICE_RECOVER_WAL
c040: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
c050: 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52  E_NOTICE_RECOVER
c060: 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20  _WAL";break;.   
c070: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
c080: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
c090: 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20 20  LLBACK:.        
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c0c0: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52  "SQLITE_NOTICE_R
c0d0: 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22  ECOVER_ROLLBACK"
c0e0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
c0f0: 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49  ase SQLITE_WARNI
c100: 4e 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a  NG:            z
c110: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57  Name = "SQLITE_W
c120: 41 52 4e 49 4e 47 22 3b 20 20 20 20 20 20 20 20  ARNING";        
c130: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c140: 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e  case SQLITE_WARN
c150: 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20  ING_AUTOINDEX:  
c160: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c170: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
c180: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  X"; break;.     
c190: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e   case SQLITE_DON
c1a0: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E:              
c1b0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c1c0: 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20 20  _DONE";         
c1d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c1e0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d  }.  }.  if( zNam
c1f0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  e==0 ){.    stat
c200: 69 63 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  ic char zBuf[50]
c210: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
c220: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
c230: 75 66 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49  uf), zBuf, "SQLI
c240: 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c  TE_UNKNOWN(%d)",
c250: 20 6f 72 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e   origRc);.    zN
c260: 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a  ame = zBuf;.  }.
c270: 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
c280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
c290: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
c2a0: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
c2b0: 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f  ribes the kind o
c2c0: 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65  f error specifie
c2d0: 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75  d in the.** argu
c2e0: 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  ment..*/.const c
c2f0: 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53  har *sqlite3ErrS
c300: 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74  tr(int rc){.  st
c310: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a  atic const char*
c320: 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20   const aMsg[] = 
c330: 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  {.    /* SQLITE_
c340: 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22  OK          */ "
c350: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20  not an error",. 
c360: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52     /* SQLITE_ERR
c370: 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c  OR       */ "SQL
c380: 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20   logic error or 
c390: 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61 73 65  missing database
c3a0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c3b0: 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20  _INTERNAL    */ 
c3c0: 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  0,.    /* SQLITE
c3d0: 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20  _PERM        */ 
c3e0: 22 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69  "access permissi
c3f0: 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20  on denied",.    
c400: 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  /* SQLITE_ABORT 
c410: 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61        */ "callba
c420: 63 6b 20 72 65 71 75 65 73 74 65 64 20 71 75 65  ck requested que
c430: 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f  ry abort",.    /
c440: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20  * SQLITE_BUSY   
c450: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
c460: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
c470: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b    /* SQLITE_LOCK
c480: 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61  ED      */ "data
c490: 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f  base table is lo
c4a0: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
c4b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20  LITE_NOMEM      
c4c0: 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f   */ "out of memo
c4d0: 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ry",.    /* SQLI
c4e0: 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a  TE_READONLY    *
c4f0: 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72  / "attempt to wr
c500: 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64  ite a readonly d
c510: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
c520: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
c530: 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70  T   */ "interrup
c540: 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ted",.    /* SQL
c550: 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20  ITE_IOERR       
c560: 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72  */ "disk I/O err
c570: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
c580: 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a  TE_CORRUPT     *
c590: 2f 20 22 64 61 74 61 62 61 73 65 20 64 69 73 6b  / "database disk
c5a0: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
c5b0: 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  med",.    /* SQL
c5c0: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20  ITE_NOTFOUND    
c5d0: 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72  */ "unknown oper
c5e0: 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53  ation",.    /* S
c5f0: 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20  QLITE_FULL      
c600: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f    */ "database o
c610: 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c  r disk is full",
c620: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
c630: 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75  ANTOPEN    */ "u
c640: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
c650: 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20  tabase file",.  
c660: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54    /* SQLITE_PROT
c670: 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b  OCOL    */ "lock
c680: 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20  ing protocol",. 
c690: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50     /* SQLITE_EMP
c6a0: 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62  TY       */ "tab
c6b0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  le contains no d
c6c0: 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ata",.    /* SQL
c6d0: 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20  ITE_SCHEMA      
c6e0: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73 63 68  */ "database sch
c6f0: 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 22  ema has changed"
c700: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c710: 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22  TOOBIG      */ "
c720: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74  string or blob t
c730: 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20  oo big",.    /* 
c740: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c750: 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e  T  */ "constrain
c760: 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f  t failed",.    /
c770: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  * SQLITE_MISMATC
c780: 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70  H    */ "datatyp
c790: 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20  e mismatch",.   
c7a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53   /* SQLITE_MISUS
c7b0: 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61  E      */ "libra
c7c0: 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65  ry routine calle
c7d0: 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63  d out of sequenc
c7e0: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
c7f0: 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f  E_NOLFS       */
c800: 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70   "large file sup
c810: 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64  port is disabled
c820: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c830: 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20  _AUTH        */ 
c840: 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64  "authorization d
c850: 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  enied",.    /* S
c860: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20  QLITE_FORMAT    
c870: 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20    */ "auxiliary 
c880: 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20  database format 
c890: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
c8a0: 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20  QLITE_RANGE     
c8b0: 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f    */ "bind or co
c8c0: 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f  lumn index out o
c8d0: 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a  f range",.    /*
c8e0: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20   SQLITE_NOTADB  
c8f0: 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20      */ "file is 
c900: 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69 73 20  encrypted or is 
c910: 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65 22 2c  not a database",
c920: 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  .  };.  const ch
c930: 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e  ar *zErr = "unkn
c940: 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77  own error";.  sw
c950: 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20  itch( rc ){.    
c960: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
c970: 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20  T_ROLLBACK: {.  
c980: 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72      zErr = "abor
c990: 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43  t due to ROLLBAC
c9a0: 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  K";.      break;
c9b0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
c9c0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26  lt: {.      rc &
c9d0: 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66  = 0xff;.      if
c9e0: 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20  ( ALWAYS(rc>=0) 
c9f0: 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28  && rc<ArraySize(
ca00: 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63  aMsg) && aMsg[rc
ca10: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
ca20: 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b  zErr = aMsg[rc];
ca30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
ca40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
ca50: 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d    return zErr;.}
ca60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
ca70: 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
ca80: 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  a busy callback 
ca90: 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20  that sleeps and 
caa0: 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75  tries.** again u
cab0: 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76  ntil a timeout v
cac0: 61 6c 75 65 20 69 73 20 72 65 61 63 68 65 64 2e  alue is reached.
cad0: 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61    The timeout va
cae0: 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74  lue is.** an int
caf0: 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d  eger number of m
cb00: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73  illiseconds pass
cb10: 65 64 20 69 6e 20 61 73 20 74 68 65 20 66 69 72  ed in as the fir
cb20: 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  st.** argument..
cb30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
cb40: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
cb50: 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a  allback(. void *
cb60: 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ptr,            
cb70: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
cb80: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e  onnection */. in
cb90: 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20  t count         
cba0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cbb0: 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20   of times table 
cbc0: 68 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f  has been busy */
cbd0: 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .){.#if SQLITE_O
cbe0: 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f 55 53  S_WIN || HAVE_US
cbf0: 4c 45 45 50 0a 20 20 73 74 61 74 69 63 20 63 6f  LEEP.  static co
cc00: 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20  nst u8 delays[] 
cc10: 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35  =.     { 1, 2, 5
cc20: 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35  , 10, 15, 20, 25
cc30: 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20  , 25,  25,  50, 
cc40: 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74   50, 100 };.  st
cc50: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f  atic const u8 to
cc60: 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20  tals[] =.     { 
cc70: 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c  0, 1, 3,  8, 18,
cc80: 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33   33, 53, 78, 103
cc90: 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20  , 128, 178, 228 
cca0: 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c  };.# define NDEL
ccb0: 41 59 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c  AY ArraySize(del
ccc0: 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a  ays).  sqlite3 *
ccd0: 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29  db = (sqlite3 *)
cce0: 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f  ptr;.  int timeo
ccf0: 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d  ut = db->busyTim
cd00: 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61  eout;.  int dela
cd10: 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73  y, prior;..  ass
cd20: 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b  ert( count>=0 );
cd30: 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e  .  if( count < N
cd40: 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c  DELAY ){.    del
cd50: 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e  ay = delays[coun
cd60: 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20  t];.    prior = 
cd70: 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20  totals[count];. 
cd80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61   }else{.    dela
cd90: 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41  y = delays[NDELA
cda0: 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  Y-1];.    prior 
cdb0: 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d  = totals[NDELAY-
cdc0: 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e  1] + delay*(coun
cdd0: 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20  t-(NDELAY-1));. 
cde0: 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b   }.  if( prior +
cdf0: 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74   delay > timeout
ce00: 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20   ){.    delay = 
ce10: 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b  timeout - prior;
ce20: 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d  .    if( delay<=
ce30: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
ce40: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
ce50: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c  ep(db->pVfs, del
ce60: 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75  ay*1000);.  retu
ce70: 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71  rn 1;.#else.  sq
ce80: 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c  lite3 *db = (sql
ce90: 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e  ite3 *)ptr;.  in
cea0: 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71  t timeout = ((sq
ceb0: 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75  lite3 *)ptr)->bu
cec0: 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28  syTimeout;.  if(
ced0: 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20   (count+1)*1000 
cee0: 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20  > timeout ){.   
cef0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
cf00: 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28   sqlite3OsSleep(
cf10: 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30  db->pVfs, 100000
cf20: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  0);.  return 1;.
cf30: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
cf40: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
cf50: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a   busy handler..*
cf60: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
cf70: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
cf80: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61   an operation fa
cf90: 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b  iled with a lock
cfa0: 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  ..** If this rou
cfb0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tine returns non
cfc0: 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
cfd0: 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20  is retried.  If 
cfe0: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c  it.** returns 0,
cff0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61   the operation a
d000: 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51  borts with an SQ
d010: 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e  LITE_BUSY error.
d020: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
d030: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
d040: 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29  (BusyHandler *p)
d050: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
d060: 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c  ( NEVER(p==0) ||
d070: 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20   p->xFunc==0 || 
d080: 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74  p->nBusy<0 ) ret
d090: 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d  urn 0;.  rc = p-
d0a0: 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20  >xFunc(p->pArg, 
d0b0: 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28  p->nBusy);.  if(
d0c0: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d   rc==0 ){.    p-
d0d0: 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d  >nBusy = -1;.  }
d0e0: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75  else{.    p->nBu
d0f0: 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sy++;.  }.  retu
d100: 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn rc; .}../*.**
d110: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
d120: 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ts the busy call
d130: 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69  back for an Sqli
d140: 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  te database to t
d150: 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c  he.** given call
d160: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69  back function wi
d170: 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67  th the given arg
d180: 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
d190: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
d1a0: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  er(.  sqlite3 *d
d1b0: 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  b,.  int (*xBusy
d1c0: 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20  )(void*,int),.  
d1d0: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69  void *pArg.){.#i
d1e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d1f0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
d200: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
d210: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
d220: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
d230: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
d240: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
d250: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
d260: 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  );.  db->busyHan
d270: 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75  dler.xFunc = xBu
d280: 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  sy;.  db->busyHa
d290: 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72  ndler.pArg = pAr
d2a0: 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  g;.  db->busyHan
d2b0: 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
d2c0: 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75    db->busyTimeou
d2d0: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
d2e0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
d2f0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
d300: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d310: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d320: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
d330: 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LBACK./*.** This
d340: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
d350: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
d360: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
d370: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
d380: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
d390: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
d3a0: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
d3b0: 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65  ment. The progre
d3c0: 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c  ss callback will
d3d0: 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65  .** be invoked e
d3e0: 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65  very nOps opcode
d3f0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
d400: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
d410: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
d420: 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c  db, .  int nOps,
d430: 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65  .  int (*xProgre
d440: 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76  ss)(void*), .  v
d450: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66  oid *pArg.){.#if
d460: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d470: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
d480: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
d490: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
d4a0: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
d4b0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
d4c0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
d4d0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
d4e0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
d4f0: 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73  tex);.  if( nOps
d500: 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50  >0 ){.    db->xP
d510: 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72  rogress = xProgr
d520: 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  ess;.    db->nPr
d530: 6f 67 72 65 73 73 4f 70 73 20 3d 20 28 75 6e 73  ogressOps = (uns
d540: 69 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20 20  igned)nOps;.    
d550: 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67  db->pProgressArg
d560: 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65   = pArg;.  }else
d570: 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72  {.    db->xProgr
d580: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  ess = 0;.    db-
d590: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20  >nProgressOps = 
d5a0: 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67  0;.    db->pProg
d5b0: 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d  ressArg = 0;.  }
d5c0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
d5d0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
d5e0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  );.}.#endif.../*
d5f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d600: 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61   installs a defa
d610: 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ult busy handler
d620: 20 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20   that waits for 
d630: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  the.** specified
d640: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
d650: 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72  seconds before r
d660: 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69  eturning 0..*/.i
d670: 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  nt sqlite3_busy_
d680: 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20  timeout(sqlite3 
d690: 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 23 69  *db, int ms){.#i
d6a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d6b0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
d6c0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
d6d0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
d6e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
d6f0: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
d700: 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20  .  if( ms>0 ){. 
d710: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
d720: 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69  handler(db, sqli
d730: 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c  teDefaultBusyCal
d740: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62  lback, (void*)db
d750: 29 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54  );.    db->busyT
d760: 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 7d  imeout = ms;.  }
d770: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
d780: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64  3_busy_handler(d
d790: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  b, 0, 0);.  }.  
d7a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d7b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65  ;.}../*.** Cause
d7c0: 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65   any pending ope
d7d0: 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61  ration to stop a
d7e0: 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f  t its earliest o
d7f0: 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76  pportunity..*/.v
d800: 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  oid sqlite3_inte
d810: 72 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64  rrupt(sqlite3 *d
d820: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
d830: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
d840: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
d850: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
d860: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
d870: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
d880: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
d890: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d    }.#endif.  db-
d8a0: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
d8b0: 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  d = 1;.}.../*.**
d8c0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
d8d0: 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61  s exactly the sa
d8e0: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72  me as sqlite3_cr
d8f0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c  eate_function(),
d900: 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20   except.** that 
d910: 69 74 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  it is designed t
d920: 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69  o be called by i
d930: 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68  nternal code. Th
d940: 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a  e difference is.
d950: 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c  ** that if a mal
d960: 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73  loc() fails in s
d970: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
d980: 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72  nction(), an err
d990: 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65  or code.** is re
d9a0: 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d  turned and the m
d9b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
d9c0: 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e   cleared. .*/.in
d9d0: 74 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  t sqlite3CreateF
d9e0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  unc(.  sqlite3 *
d9f0: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
da00: 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c   *zFunctionName,
da10: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
da20: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
da30: 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69  pUserData,.  voi
da40: 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69  d (*xSFunc)(sqli
da50: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
da60: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
da70: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
da80: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
da90: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
daa0: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
dab0: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
dac0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a  ite3_context*),.
dad0: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
dae0: 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b   *pDestructor.){
daf0: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20  .  FuncDef *p;. 
db00: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e   int nName;.  in
db10: 74 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20  t extraFlags;.. 
db20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
db30: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
db40: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
db50: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30  zFunctionName==0
db60: 20 7c 7c 0a 20 20 20 20 20 20 28 78 53 46 75 6e   ||.      (xSFun
db70: 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20  c && (xFinal || 
db80: 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20  xStep)) || .    
db90: 20 20 28 21 78 53 46 75 6e 63 20 26 26 20 28 78    (!xSFunc && (x
dba0: 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29  Final && !xStep)
dbb0: 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 53 46  ) ||.      (!xSF
dbc0: 75 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20  unc && (!xFinal 
dbd0: 26 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20  && xStep)) ||.  
dbe0: 20 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20      (nArg<-1 || 
dbf0: 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  nArg>SQLITE_MAX_
dc00: 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c  FUNCTION_ARG) ||
dc10: 0a 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61  .      (255<(nNa
dc20: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
dc30: 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e  en30( zFunctionN
dc40: 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65  ame))) ){.    re
dc50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
dc60: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  SE_BKPT;.  }..  
dc70: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
dc80: 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51  UNC_CONSTANT==SQ
dc90: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
dca0: 49 43 20 29 3b 0a 20 20 65 78 74 72 61 46 6c 61  IC );.  extraFla
dcb0: 67 73 20 3d 20 65 6e 63 20 26 20 20 53 51 4c 49  gs = enc &  SQLI
dcc0: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
dcd0: 3b 0a 20 20 65 6e 63 20 26 3d 20 28 53 51 4c 49  ;.  enc &= (SQLI
dce0: 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c  TE_FUNC_ENCMASK|
dcf0: 53 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a  SQLITE_ANY);.  .
dd00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
dd10: 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49  MIT_UTF16.  /* I
dd20: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  f SQLITE_UTF16 i
dd30: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74  s specified as t
dd40: 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65  he encoding type
dd50: 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73  , transform this
dd60: 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20  .  ** to one of 
dd70: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f  SQLITE_UTF16LE o
dd80: 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  r SQLITE_UTF16BE
dd90: 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
dda0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
ddb0: 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45  VE macro. SQLITE
ddc0: 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73  _UTF16 is not us
ddd0: 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ed internally.. 
dde0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49   **.  ** If SQLI
ddf0: 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66  TE_ANY is specif
de00: 69 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76  ied, add three v
de10: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  ersions of the f
de20: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20  unction.  ** to 
de30: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a  the hash table..
de40: 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d    */.  if( enc==
de50: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a  SQLITE_UTF16 ){.
de60: 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45      enc = SQLITE
de70: 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
de80: 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53  }else if( enc==S
de90: 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20  QLITE_ANY ){.   
dea0: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20   int rc;.    rc 
deb0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
dec0: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  unc(db, zFunctio
ded0: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  nName, nArg, SQL
dee0: 49 54 45 5f 55 54 46 38 7c 65 78 74 72 61 46 6c  ITE_UTF8|extraFl
def0: 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 70 55  ags,.         pU
df00: 73 65 72 44 61 74 61 2c 20 78 53 46 75 6e 63 2c  serData, xSFunc,
df10: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20   xStep, xFinal, 
df20: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
df30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
df40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
df50: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
df60: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  unc(db, zFunctio
df70: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  nName, nArg, SQL
df80: 49 54 45 5f 55 54 46 31 36 4c 45 7c 65 78 74 72  ITE_UTF16LE|extr
df90: 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  aFlags,.        
dfa0: 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 53 46    pUserData, xSF
dfb0: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
dfc0: 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  al, pDestructor)
dfd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
dfe0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
dff0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
e000: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20  ;.    }.    enc 
e010: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  = SQLITE_UTF16BE
e020: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e  ;.  }.#else.  en
e030: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
e040: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20  .#endif.  .  /* 
e050: 43 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73  Check if an exis
e060: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73  ting function is
e070: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
e080: 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66  n or deleted. If
e090: 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68   so,.  ** and th
e0a0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
e0b0: 4d 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  Ms, then return 
e0c0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20  SQLITE_BUSY. If 
e0d0: 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  a function.  ** 
e0e0: 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64  is being overrid
e0f0: 64 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20  den/deleted but 
e100: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74  there are no act
e110: 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74  ive VMs, allow t
e120: 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  he.  ** operatio
e130: 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75  n to continue bu
e140: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  t invalidate all
e150: 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61   precompiled sta
e160: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
e170: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
e180: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
e190: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
e1a0: 20 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20   (u8)enc, 0);.  
e1b0: 69 66 28 20 70 20 26 26 20 28 70 2d 3e 66 75 6e  if( p && (p->fun
e1c0: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
e1d0: 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65  FUNC_ENCMASK)==e
e1e0: 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e  nc && p->nArg==n
e1f0: 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Arg ){.    if( d
e200: 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29  b->nVdbeActive )
e210: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
e220: 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
e230: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
e240: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
e250: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75   delete/modify u
e260: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65  ser-function due
e270: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
e280: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61  ments");.      a
e290: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
e2a0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
e2b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e2c0: 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
e2d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
e2e0: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
e2f0: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
e300: 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  }.  }..  p = sql
e310: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
e320: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
e330: 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e  me, nArg, (u8)en
e340: 63 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28  c, 1);.  assert(
e350: 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  p || db->mallocF
e360: 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70  ailed);.  if( !p
e370: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e380: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
e390: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
e3a0: 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20  n older version 
e3b0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
e3c0: 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65  with a configure
e3d0: 64 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a  d destructor is.
e3e0: 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61    ** being repla
e3f0: 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64  ced invoke the d
e400: 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69  estructor functi
e410: 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75  on here. */.  fu
e420: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
e430: 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65  , p);..  if( pDe
e440: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
e450: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
e460: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 75 2e  f++;.  }.  p->u.
e470: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44  pDestructor = pD
e480: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e  estructor;.  p->
e490: 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e  funcFlags = (p->
e4a0: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
e4b0: 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29  TE_FUNC_ENCMASK)
e4c0: 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 20   | extraFlags;. 
e4d0: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 75   testcase( p->fu
e4e0: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
e4f0: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29  _DETERMINISTIC )
e500: 3b 0a 20 20 70 2d 3e 78 53 46 75 6e 63 20 3d 20  ;.  p->xSFunc = 
e510: 78 53 46 75 6e 63 20 3f 20 78 53 46 75 6e 63 20  xSFunc ? xSFunc 
e520: 3a 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46  : xStep;.  p->xF
e530: 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c  inalize = xFinal
e540: 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61  ;.  p->pUserData
e550: 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20   = pUserData;.  
e560: 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e  p->nArg = (u16)n
e570: 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Arg;.  return SQ
e580: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
e590: 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73 65  * Create new use
e5a0: 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  r functions..*/.
e5b0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
e5c0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73  te_function(.  s
e5d0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
e5e0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
e5f0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
e600: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
e610: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75  p,.  void (*xSFu
e620: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
e630: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
e640: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
e650: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
e660: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
e670: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
e680: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
e690: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
e6a0: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75  text*).){.  retu
e6b0: 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
e6c0: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
e6d0: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
e6e0: 6e 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20 78  nc, p, xSFunc, x
e6f0: 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Step,.          
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c            xFinal
e720: 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  , 0);.}..int sql
e730: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
e740: 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74  tion_v2(.  sqlit
e750: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
e760: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69  char *zFunc,.  i
e770: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
e780: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20  nc,.  void *p,. 
e790: 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28   void (*xSFunc)(
e7a0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
e7b0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
e7c0: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
e7d0: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
e7e0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
e7f0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
e800: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
e810: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e820: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  *),.  void (*xDe
e830: 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29  stroy)(void *).)
e840: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
e850: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e  ITE_ERROR;.  Fun
e860: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72  cDestructor *pAr
e870: 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  g = 0;..#ifdef S
e880: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e890: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
e8a0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
e8b0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
e8c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
e8d0: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e  SE_BKPT;.  }.#en
e8e0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
e8f0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
e900: 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73  tex);.  if( xDes
e910: 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67  troy ){.    pArg
e920: 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63 74   = (FuncDestruct
e930: 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  or *)sqlite3DbMa
e940: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
e950: 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63 74  eof(FuncDestruct
e960: 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  or));.    if( !p
e970: 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44 65  Arg ){.      xDe
e980: 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20  stroy(p);.      
e990: 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a  goto out;.    }.
e9a0: 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74 72      pArg->xDestr
e9b0: 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20  oy = xDestroy;. 
e9c0: 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44 61     pArg->pUserDa
e9d0: 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 63  ta = p;.  }.  rc
e9e0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
e9f0: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c 20  Func(db, zFunc, 
ea00: 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 53  nArg, enc, p, xS
ea10: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
ea20: 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66  nal, pArg);.  if
ea30: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
ea40: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nRef==0 ){.    a
ea50: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
ea60: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73  E_OK );.    xDes
ea70: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c  troy(p);.    sql
ea80: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
ea90: 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a  Arg);.  }.. out:
eaa0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
eab0: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
eac0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ead0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
eae0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
eaf0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
eb00: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20  _OMIT_UTF16.int 
eb10: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
eb20: 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  unction16(.  sql
eb30: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
eb40: 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f  t void *zFunctio
eb50: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
eb60: 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  g,.  int eTextRe
eb70: 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  p,.  void *p,.  
eb80: 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73  void (*xSFunc)(s
eb90: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
eba0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
ebb0: 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  e**),.  void (*x
ebc0: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
ebd0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
ebe0: 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76  e3_value**),.  v
ebf0: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
ec00: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a  lite3_context*).
ec10: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
ec20: 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69  har *zFunc8;..#i
ec30: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ec40: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
ec50: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
ec60: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20  yCheckOk(db) || 
ec70: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30  zFunctionName==0
ec80: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ec90: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
eca0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
ecb0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
ecc0: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
ecd0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
ece0: 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d  ed );.  zFunc8 =
ecf0: 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38   sqlite3Utf16to8
ed00: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
ed10: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
ed20: 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72  TF16NATIVE);.  r
ed30: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
ed40: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38  eFunc(db, zFunc8
ed50: 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70  , nArg, eTextRep
ed60: 2c 20 70 2c 20 78 53 46 75 6e 63 2c 78 53 74 65  , p, xSFunc,xSte
ed70: 70 2c 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73  p,xFinal,0);.  s
ed80: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
ed90: 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d   zFunc8);.  rc =
eda0: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
edb0: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
edc0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
edd0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
ede0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
edf0: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  .../*.** Declare
ee00: 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e   that a function
ee10: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f   has been overlo
ee20: 61 64 65 64 20 62 79 20 61 20 76 69 72 74 75 61  aded by a virtua
ee30: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  l table..**.** I
ee40: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61  f the function a
ee50: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 73  lready exists as
ee60: 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61   a regular globa
ee70: 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e  l function, then
ee80: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
ee90: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
eea0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
eeb0: 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
eec0: 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e  en create.** a n
eed0: 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61  ew one that alwa
eee0: 79 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d  ys throws a run-
eef0: 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a  time error.  .**
ef00: 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c  .** When virtual
ef10: 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74   tables intend t
ef20: 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65  o provide an ove
ef30: 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e  rloaded function
ef40: 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64  , they.** should
ef50: 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
ef60: 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
ef70: 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  the global funct
ef80: 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41  ion exists..** A
ef90: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
efa0: 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f   must exist in o
efb0: 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65  rder for name re
efc0: 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b  solution to work
efd0: 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  .** properly..*/
efe0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65  .int sqlite3_ove
eff0: 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a  rload_function(.
f000: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
f010: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
f020: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29  me,.  int nArg.)
f030: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
f040: 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20  ITE_OK;..#ifdef 
f050: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
f060: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
f070: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
f080: 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65  kOk(db) || zName
f090: 3d 3d 30 20 7c 7c 20 6e 41 72 67 3c 2d 32 20 29  ==0 || nArg<-2 )
f0a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
f0b0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
f0c0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
f0d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
f0e0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
f0f0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46  if( sqlite3FindF
f100: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  unction(db, zNam
f110: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
f120: 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  UTF8, 0)==0 ){. 
f130: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
f140: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e  reateFunc(db, zN
f150: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
f160: 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20  E_UTF8,.        
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e 76     0, sqlite3Inv
f190: 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  alidFunction, 0,
f1a0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63   0, 0);.  }.  rc
f1b0: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
f1c0: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
f1d0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f1e0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
f1f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
f200: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f210: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67  _TRACE./*.** Reg
f220: 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66 75  ister a trace fu
f230: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72  nction.  The pAr
f240: 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  g from the previ
f250: 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
f260: 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65 74   trace.** is ret
f270: 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  urned.  .**.** A
f280: 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e 63   NULL trace func
f290: 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  tion means that 
f2a0: 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65 78  no tracing is ex
f2b0: 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e  ecutes.  A non-N
f2c0: 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73 20  ULL.** trace is 
f2d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
f2e0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
f2f0: 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 73  invoked at the s
f300: 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  tart of each.** 
f310: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
f320: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
f330: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
f340: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 74  .void *sqlite3_t
f350: 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a 64 62  race(sqlite3 *db
f360: 2c 20 76 6f 69 64 28 2a 78 54 72 61 63 65 29 28  , void(*xTrace)(
f370: 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
f380: 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  *), void *pArg){
f390: 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a  .  void *pOld;..
f3a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f3b0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
f3c0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
f3d0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
f3e0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
f3f0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
f400: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f410: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
f420: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
f430: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
f440: 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72  d = db->pTraceAr
f450: 67 3b 0a 20 20 64 62 2d 3e 6d 54 72 61 63 65 20  g;.  db->mTrace 
f460: 3d 20 78 54 72 61 63 65 20 3f 20 53 51 4c 49 54  = xTrace ? SQLIT
f470: 45 5f 54 52 41 43 45 5f 4c 45 47 41 43 59 20 3a  E_TRACE_LEGACY :
f480: 20 30 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65   0;.  db->xTrace
f490: 20 3d 20 28 69 6e 74 28 2a 29 28 75 33 32 2c 76   = (int(*)(u32,v
f4a0: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a  oid*,void*,void*
f4b0: 29 29 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e  ))xTrace;.  db->
f4c0: 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67  pTraceArg = pArg
f4d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
f4e0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
f4f0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
f500: 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  d;.}.#endif /* S
f510: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
f520: 43 41 54 45 44 20 2a 2f 0a 0a 2f 2a 20 52 65 67  CATED */../* Reg
f530: 69 73 74 65 72 20 61 20 74 72 61 63 65 20 63 61  ister a trace ca
f540: 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20 74 68 65  llback using the
f550: 20 76 65 72 73 69 6f 6e 2d 32 20 69 6e 74 65 72   version-2 inter
f560: 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  face..*/.int sql
f570: 69 74 65 33 5f 74 72 61 63 65 5f 76 32 28 0a 20  ite3_trace_v2(. 
f580: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f5b0: 72 61 63 65 20 74 68 69 73 20 63 6f 6e 6e 65 63  race this connec
f5c0: 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  tion */.  unsign
f5d0: 65 64 20 6d 54 72 61 63 65 2c 20 20 20 20 20 20  ed mTrace,      
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
f600: 65 76 65 6e 74 73 20 74 6f 20 62 65 20 74 72 61  events to be tra
f610: 63 65 64 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 54  ced */.  int(*xT
f620: 72 61 63 65 29 28 75 6e 73 69 67 6e 65 64 2c 76  race)(unsigned,v
f630: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a  oid*,void*,void*
f640: 29 2c 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20  ),  /* Callback 
f650: 74 6f 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20 76  to invoke */.  v
f660: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
f670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
f690: 74 65 78 74 20 2a 2f 0a 29 7b 0a 23 69 66 64 65  text */.){.#ifde
f6a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
f6b0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
f6c0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
f6d0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
f6e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
f6f0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
f700: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
f710: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
f720: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6d  >mutex);.  if( m
f730: 54 72 61 63 65 3d 3d 30 20 29 20 78 54 72 61 63  Trace==0 ) xTrac
f740: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 78 54 72  e = 0;.  if( xTr
f750: 61 63 65 3d 3d 30 20 29 20 6d 54 72 61 63 65 20  ace==0 ) mTrace 
f760: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6d 54 72 61 63  = 0;.  db->mTrac
f770: 65 20 3d 20 6d 54 72 61 63 65 3b 0a 20 20 64 62  e = mTrace;.  db
f780: 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63  ->xTrace = xTrac
f790: 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
f7a0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
f7b0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f7c0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
f7d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f7e0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
f7f0: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
f800: 45 44 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  ED./*.** Registe
f810: 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  r a profile func
f820: 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20  tion.  The pArg 
f830: 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
f840: 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 0a  sly registered .
f850: 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74  ** profile funct
f860: 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ion is returned.
f870: 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20    .**.** A NULL 
f880: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
f890: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 70   means that no p
f8a0: 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65 63  rofiling is exec
f8b0: 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c  utes.  A non-NUL
f8c0: 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73 20  L.** profile is 
f8d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
f8e0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
f8f0: 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63  invoked at the c
f900: 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20  onclusion of.** 
f910: 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
f920: 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e 0a  nt that is run..
f930: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
f940: 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69  _profile(.  sqli
f950: 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20  te3 *db,.  void 
f960: 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 64  (*xProfile)(void
f970: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71  *,const char*,sq
f980: 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20  lite_uint64),.  
f990: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20  void *pArg.){.  
f9a0: 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66  void *pOld;..#if
f9b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
f9c0: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
f9d0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
f9e0: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
f9f0: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
fa00: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
fa10: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
fa20: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
fa30: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
fa40: 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d  mutex);.  pOld =
fa50: 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67   db->pProfileArg
fa60: 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65  ;.  db->xProfile
fa70: 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64   = xProfile;.  d
fa80: 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20 3d  b->pProfileArg =
fa90: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
faa0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
fab0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
fac0: 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66  n pOld;.}.#endif
fad0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
fae0: 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 23 65  DEPRECATED */.#e
faf0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
fb00: 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  MIT_TRACE */../*
fb10: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 66  .** Register a f
fb20: 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  unction to be in
fb30: 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72 61  voked when a tra
fb40: 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73  nsaction commits
fb50: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f  ..** If the invo
fb60: 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  ked function ret
fb70: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
fb80: 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62  hen the commit b
fb90: 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c  ecomes a.** roll
fba0: 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  back..*/.void *s
fbb0: 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f  qlite3_commit_ho
fbc0: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
fbd0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
fbe0: 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
fbf0: 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ok to this datab
fc00: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ase */.  int (*x
fc10: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29  Callback)(void*)
fc20: 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  ,  /* Function t
fc30: 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68  o invoke on each
fc40: 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69   commit */.  voi
fc50: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
fc60: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
fc70: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
fc80: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
fc90: 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53  *pOld;..#ifdef S
fca0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
fcb0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
fcc0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
fcd0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
fce0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
fcf0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
fd00: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
fd10: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
fd20: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
fd30: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
fd40: 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62  pCommitArg;.  db
fd50: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
fd60: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
fd70: 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20   db->pCommitArg 
fd80: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
fd90: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
fda0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
fdb0: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pOld;.}../*.*
fdc0: 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
fdd0: 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
fde0: 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
fdf0: 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a  row is updated,.
fe00: 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64  ** inserted or d
fe10: 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 69  eleted using thi
fe20: 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
fe30: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
fe40: 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68  sqlite3_update_h
fe50: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
fe60: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
fe70: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
fe80: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
fe90: 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  base */.  void (
fea0: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
feb0: 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74  *,int,char const
fec0: 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c   *,char const *,
fed0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20  sqlite_int64),. 
fee0: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
fef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
ff00: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
ff10: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
ff20: 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64  oid *pRet;..#ifd
ff30: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ff40: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
ff50: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
ff60: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
ff70: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
ff80: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
ff90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
ffa0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
ffb0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
ffc0: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
ffd0: 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a  db->pUpdateArg;.
ffe0: 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c    db->xUpdateCal
fff0: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
10000 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65  k;.  db->pUpdate
10010 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
10020 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
10030 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
10040 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
10050 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
10060 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
10070 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
10080 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
10090 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  is rolled.** bac
100a0 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  k by this databa
100b0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
100c0 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
100d0 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20  rollback_hook(. 
100e0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
100f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
10100 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
10110 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
10120 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
10130 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a  back)(void*), /*
10140 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   Callback functi
10150 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  on */.  void *pA
10160 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
10170 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
10180 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
10190 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
101a0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
101b0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
101c0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
101d0 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
101e0 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
101f0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
10200 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
10210 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
10220 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
10230 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
10240 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c  pRet = db->pRoll
10250 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78  backArg;.  db->x
10260 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
10270 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
10280 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
10290 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
102a0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
102b0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
102c0 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66  urn pRet;.}..#if
102d0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
102e0 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
102f0 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
10300 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
10310 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
10320 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70 64 61  me a row is upda
10330 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64  ted,.** inserted
10340 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e   or deleted usin
10350 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  g this database 
10360 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
10370 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 65  oid *sqlite3_pre
10380 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73  update_hook(.  s
10390 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
103a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
103b0 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
103c0 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
103d0 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63    void(*xCallbac
103e0 6b 29 28 20 20 20 20 20 20 20 20 20 2f 2a 20 43  k)(         /* C
103f0 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
10400 20 2a 2f 0a 20 20 20 20 76 6f 69 64 2a 2c 73 71   */.    void*,sq
10410 6c 69 74 65 33 2a 2c 69 6e 74 2c 63 68 61 72 20  lite3*,int,char 
10420 63 6f 6e 73 74 2a 2c 63 68 61 72 20 63 6f 6e 73  const*,char cons
10430 74 2a 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  t*,sqlite3_int64
10440 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 2c  ,sqlite3_int64),
10450 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10470 46 69 72 73 74 20 63 61 6c 6c 62 61 63 6b 20 61  First callback a
10480 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
10490 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71  void *pRet;.  sq
104a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
104b0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
104c0 70 52 65 74 20 3d 20 64 62 2d 3e 70 50 72 65 55  pRet = db->pPreU
104d0 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e  pdateArg;.  db->
104e0 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61  xPreUpdateCallba
104f0 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
10500 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65    db->pPreUpdate
10510 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
10520 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
10530 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
10540 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
10550 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10560 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
10570 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  _HOOK */..#ifnde
10580 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
10590 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  L./*.** The sqli
105a0 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63  te3_wal_hook() c
105b0 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72  allback register
105c0 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77 61  ed by sqlite3_wa
105d0 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
105e0 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71  ()..** Invoke sq
105f0 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
10600 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75 6d 62  oint if the numb
10610 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20  er of frames in 
10620 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20  the log file.** 
10630 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
10640 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72 67 20  sqlite3.pWalArg 
10650 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67  cast to an integ
10660 65 72 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f  er (the value co
10670 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a 20 77  nfigured by.** w
10680 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
10690 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  t())..*/ .int sq
106a0 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48  lite3WalDefaultH
106b0 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c  ook(.  void *pCl
106c0 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a  ientData,     /*
106d0 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73   Argument */.  s
106e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
106f0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
10700 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
10710 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
10720 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20  /* Database */. 
10730 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20 20 20   int nFrame     
10740 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10750 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69  of WAL */.){.  i
10760 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54  f( nFrame>=SQLIT
10770 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c  E_PTR_TO_INT(pCl
10780 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20 20 20  ientData) ){.   
10790 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
107a0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
107b0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
107c0 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29  ckpoint(db, zDb)
107d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
107e0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
107f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
10800 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
10810 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10820 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  WAL */../*.** Co
10830 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c 69 74  nfigure an sqlit
10840 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61  e3_wal_hook() ca
10850 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61  llback to automa
10860 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69  tically checkpoi
10870 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  nt.** a database
10880 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e   after committin
10890 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
108a0 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 46 72  if there are nFr
108b0 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66  ame or.** more f
108c0 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
108d0 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a   file. Passing z
108e0 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74 69 76  ero or a negativ
108f0 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 2a  e value as the.*
10900 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d 65 74  * nFrame paramet
10910 65 72 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f  er disables auto
10920 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74  matic checkpoint
10930 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a  s entirely..**.*
10940 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  * The callback r
10950 65 67 69 73 74 65 72 65 64 20 62 79 20 74 68 69  egistered by thi
10960 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61  s function repla
10970 63 65 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ces any existing
10980 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67   callback.** reg
10990 69 73 74 65 72 65 64 20 75 73 69 6e 67 20 73 71  istered using sq
109a0 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
109b0 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69  . Likewise, regi
109c0 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61  stering a callba
109d0 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69  ck.** using sqli
109e0 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64  te3_wal_hook() d
109f0 69 73 61 62 6c 65 73 20 74 68 65 20 61 75 74 6f  isables the auto
10a00 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74  matic checkpoint
10a10 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f   mechanism.** co
10a20 6e 66 69 67 75 72 65 64 20 62 79 20 74 68 69 73  nfigured by this
10a30 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
10a40 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75  t sqlite3_wal_au
10a50 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  tocheckpoint(sql
10a60 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46  ite3 *db, int nF
10a70 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51  rame){.#ifdef SQ
10a80 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
10a90 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
10aa0 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (db);.  UNUSED_P
10ab0 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d 65 29  ARAMETER(nFrame)
10ac0 3b 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 53  ;.#else.#ifdef S
10ad0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
10ae0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
10af0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
10b00 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
10b10 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
10b20 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  PT;.#endif.  if(
10b30 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20   nFrame>0 ){.   
10b40 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
10b50 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c  k(db, sqlite3Wal
10b60 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c  DefaultHook, SQL
10b70 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e  ITE_INT_TO_PTR(n
10b80 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65  Frame));.  }else
10b90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  {.    sqlite3_wa
10ba0 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29  l_hook(db, 0, 0)
10bb0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
10bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10bd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
10be0 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
10bf0 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
10c00 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74   time a transact
10c10 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ion is written.*
10c20 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65  * into the write
10c30 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68  -ahead-log by th
10c40 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
10c50 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
10c60 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f  *sqlite3_wal_hoo
10c70 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
10c80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10c90 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
10ca0 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
10cb0 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
10cc0 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  nt(*xCallback)(v
10cd0 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c  oid *, sqlite3*,
10ce0 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
10cf0 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  t),.  void *pArg
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d10 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
10d20 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
10d30 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f  o xCallback() */
10d40 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
10d50 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f  TE_OMIT_WAL.  vo
10d60 69 64 20 2a 70 52 65 74 3b 0a 23 69 66 64 65 66  id *pRet;.#ifdef
10d70 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
10d80 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
10d90 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
10da0 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
10db0 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
10dc0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
10dd0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
10de0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
10df0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
10e00 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
10e10 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d  ->pWalArg;.  db-
10e20 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20  >xWalCallback = 
10e30 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
10e40 3e 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b  >pWalArg = pArg;
10e50 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10e60 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
10e70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
10e80 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
10e90 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
10ea0 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64  .** Checkpoint d
10eb0 61 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a  atabase zDb..*/.
10ec0 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
10ed0 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20  checkpoint_v2(. 
10ee0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f00 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
10f10 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
10f20 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
10f30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
10f40 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74   of attached dat
10f50 61 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20  abase (or NULL) 
10f60 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20  */.  int eMode, 
10f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f80 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43       /* SQLITE_C
10f90 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75  HECKPOINT_* valu
10fa0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f  e */.  int *pnLo
10fb0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
10fc0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
10fd0 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69  ize of WAL log i
10fe0 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e  n frames */.  in
10ff0 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20  t *pnCkpt       
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11010 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62   OUT: Total numb
11020 65 72 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65  er of frames che
11030 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a  ckpointed */.){.
11040 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
11050 49 54 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20  IT_WAL.  return 
11060 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
11070 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11090 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
110a0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d  e */.  int iDb =
110b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
110c0 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65  CHED;  /* sqlite
110d0 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66  3.aDb[] index of
110e0 20 64 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e   db to checkpoin
110f0 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  t */..#ifdef SQL
11100 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
11110 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
11120 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
11130 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
11140 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
11150 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
11160 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75  nitialize the ou
11170 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 74  tput variables t
11180 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61 6e 20  o -1 in case an 
11190 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
111a0 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a  .  if( pnLog ) *
111b0 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66  pnLog = -1;.  if
111c0 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b  ( pnCkpt ) *pnCk
111d0 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65  pt = -1;..  asse
111e0 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
111f0 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30  POINT_PASSIVE==0
11200 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
11210 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
11220 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73  FULL==1 );.  ass
11230 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
11240 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d  KPOINT_RESTART==
11250 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
11260 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
11270 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a  _TRUNCATE==3 );.
11280 20 20 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49    if( eMode<SQLI
11290 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
112a0 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53  SSIVE || eMode>S
112b0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
112c0 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20  _TRUNCATE ){.   
112d0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
112e0 20 52 2d 30 33 39 39 36 2d 31 32 30 38 38 20 54   R-03996-12088 T
112f0 68 65 20 4d 20 70 61 72 61 6d 65 74 65 72 20 6d  he M parameter m
11300 75 73 74 20 62 65 20 61 20 76 61 6c 69 64 20 63  ust be a valid c
11310 68 65 63 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a  heckpoint.    **
11320 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20 20 72 65   mode: */.    re
11330 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
11340 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
11350 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
11360 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
11370 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29   zDb && zDb[0] )
11380 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  {.    iDb = sqli
11390 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
113a0 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66  , zDb);.  }.  if
113b0 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72  ( iDb<0 ){.    r
113c0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
113d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
113e0 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
113f0 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b  LITE_ERROR, "unk
11400 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25  nown database: %
11410 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73  s", zDb);.  }els
11420 65 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 48  e{.    db->busyH
11430 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
11440 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
11450 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  e3Checkpoint(db,
11460 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c   iDb, eMode, pnL
11470 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20  og, pnCkpt);.   
11480 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
11490 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20  , rc);.  }.  rc 
114a0 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
114b0 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20  (db, rc);..  /* 
114c0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
114d0 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
114e0 73 2c 20 63 6c 65 61 72 20 74 68 65 20 69 6e 74  s, clear the int
114f0 65 72 72 75 70 74 20 66 6c 61 67 20 61 74 20 74  errupt flag at t
11500 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20  his.  ** point. 
11510 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 56   */.  if( db->nV
11520 64 62 65 41 63 74 69 76 65 3d 3d 30 20 29 7b 0a  dbeActive==0 ){.
11530 20 20 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74      db->u1.isInt
11540 65 72 72 75 70 74 65 64 20 3d 20 30 3b 0a 20 20  errupted = 0;.  
11550 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  }..  sqlite3_mut
11560 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
11570 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
11580 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
11590 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61  ** Checkpoint da
115a0 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66 20 7a  tabase zDb. If z
115b0 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69  Db is NULL, or i
115c0 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 44 62  f the buffer zDb
115d0 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f   points.** to co
115e0 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65  ntains a zero-le
115f0 6e 67 74 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c  ngth string, all
11600 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
11610 73 65 73 20 61 72 65 20 0a 2a 2a 20 63 68 65 63  ses are .** chec
11620 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74  kpointed..*/.int
11630 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
11640 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20  ckpoint(sqlite3 
11650 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
11660 2a 7a 44 62 29 7b 0a 20 20 2f 2a 20 45 56 49 44  *zDb){.  /* EVID
11670 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 36 31 33  ENCE-OF: R-41613
11680 2d 32 30 35 35 33 20 54 68 65 20 73 71 6c 69 74  -20553 The sqlit
11690 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
116a0 74 28 44 2c 58 29 20 69 73 20 65 71 75 69 76 61  t(D,X) is equiva
116b0 6c 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 73 71 6c  lent to.  ** sql
116c0 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
116d0 69 6e 74 5f 76 32 28 44 2c 58 2c 53 51 4c 49 54  int_v2(D,X,SQLIT
116e0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
116f0 53 49 56 45 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20  SIVE,0,0). */.  
11700 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 77  return sqlite3_w
11710 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
11720 28 64 62 2c 7a 44 62 2c 53 51 4c 49 54 45 5f 43  (db,zDb,SQLITE_C
11730 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
11740 45 2c 30 2c 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64  E,0,0);.}..#ifnd
11750 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
11760 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63  AL./*.** Run a c
11770 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74  heckpoint on dat
11780 61 62 61 73 65 20 69 44 62 2e 20 54 68 69 73 20  abase iDb. This 
11790 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61  is a no-op if da
117a0 74 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a  tabase iDb is.**
117b0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f   not currently o
117c0 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e  pen in WAL mode.
117d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
117e0 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20  saction is open 
117f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
11800 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74  being checkpoint
11810 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  ed, this .** fun
11820 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
11830 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20  LITE_LOCKED and 
11840 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  a checkpoint is 
11850 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49  not attempted. I
11860 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  f .** an error o
11870 63 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e  ccurs while runn
11880 69 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ing the checkpoi
11890 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  nt, an SQLite er
118a0 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
118b0 72 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53  returned (i.e. S
118c0 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74  QLITE_IOERR). Ot
118d0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
118e0 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  OK..**.** The mu
118f0 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20  tex on database 
11900 68 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64  handle db should
11910 20 62 65 20 68 65 6c 64 20 62 79 20 74 68 65 20   be held by the 
11920 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65  caller. The mute
11930 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  x.** associated 
11940 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
11950 63 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63  c b-tree being c
11960 68 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74  heckpointed is t
11970 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20  aken by.** this 
11980 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74  function while t
11990 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73  he checkpoint is
119a0 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   running..**.** 
119b0 49 66 20 69 44 62 20 69 73 20 70 61 73 73 65 64  If iDb is passed
119c0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
119d0 43 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61  CHED, then all a
119e0 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
119f0 73 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f  s are.** checkpo
11a00 69 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72  inted. If an err
11a10 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
11a20 64 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  d it is returned
11a30 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a   immediately -.*
11a40 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20  * no attempt is 
11a50 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69  made to checkpoi
11a60 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67  nt any remaining
11a70 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a   databases..**.*
11a80 2a 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  * Parameter eMod
11a90 65 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49  e is one of SQLI
11aa0 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
11ab0 53 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52  SSIVE, FULL or R
11ac0 45 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73  ESTART..*/.int s
11ad0 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74  qlite3Checkpoint
11ae0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
11af0 74 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65  t iDb, int eMode
11b00 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e  , int *pnLog, in
11b10 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e  t *pnCkpt){.  in
11b20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11b30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11b40 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
11b50 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
11b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b70 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
11b80 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74  rate through att
11b90 61 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69  ached dbs */.  i
11ba0 6e 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20  nt bBusy = 0;   
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11bc0 2a 20 54 72 75 65 20 69 66 20 53 51 4c 49 54 45  * True if SQLITE
11bd0 5f 42 55 53 59 20 68 61 73 20 62 65 65 6e 20 65  _BUSY has been e
11be0 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20  ncountered */.. 
11bf0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11c00 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
11c10 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11c20 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70  rt( !pnLog || *p
11c30 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73  nLog==-1 );.  as
11c40 73 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c  sert( !pnCkpt ||
11c50 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a   *pnCkpt==-1 );.
11c60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
11c70 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c  ->nDb && rc==SQL
11c80 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
11c90 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20    if( i==iDb || 
11ca0 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  iDb==SQLITE_MAX_
11cb0 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20  ATTACHED ){.    
11cc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
11cd0 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62  reeCheckpoint(db
11ce0 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d  ->aDb[i].pBt, eM
11cf0 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
11d00 70 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67  pt);.      pnLog
11d10 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b   = 0;.      pnCk
11d20 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  pt = 0;.      if
11d30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
11d40 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75  Y ){.        bBu
11d50 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  sy = 1;.        
11d60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11d70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11d80 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  }..  return (rc=
11d90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42  =SQLITE_OK && bB
11da0 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55  usy) ? SQLITE_BU
11db0 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  SY : rc;.}.#endi
11dc0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
11dd0 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  _WAL */../*.** T
11de0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
11df0 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69  urns true if mai
11e00 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20  n-memory should 
11e10 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  be used instead 
11e20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  of.** a temporar
11e30 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73  y file for trans
11e40 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73  ient pager files
11e50 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a   and statement j
11e60 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20  ournals..** The 
11e70 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64  value returned d
11e80 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
11e90 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f  lue of db->temp_
11ea0 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a  store (runtime.*
11eb0 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64  * parameter) and
11ec0 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d   the compile tim
11ed0 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54  e value of SQLIT
11ee0 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68  E_TEMP_STORE. Th
11ef0 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  e.** following t
11f00 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
11f10 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  he relationship 
11f20 62 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77  between these tw
11f30 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20  o values.** and 
11f40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72  this functions r
11f50 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a  eturn value..**.
11f60 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50  **   SQLITE_TEMP
11f70 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74  _STORE     db->t
11f80 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f  emp_store     Lo
11f90 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72  cation of tempor
11fa0 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
11fb0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
11fc0 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
11fd0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
11fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
12000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12010 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20       any        
12020 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
12030 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
12040 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
12050 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
12060 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
12070 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
12080 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20  **   1          
12090 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
120b0 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
120c0 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  1).**   1       
120d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
12100 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 0).**   2    
12110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12120 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
12130 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
12140 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20  eturn 0).**   2 
12150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12160 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
12170 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
12180 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
12190 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
121a0 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
121b0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
121c0 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
121d0 2a 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20  *   3           
121e0 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20            any   
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
12200 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
12210 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ).*/.int sqlite3
12220 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e  TempInMemory(con
12230 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  st sqlite3 *db){
12240 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
12250 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75  _STORE==1.  retu
12260 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74  rn ( db->temp_st
12270 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66  ore==2 );.#endif
12280 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
12290 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75  _STORE==2.  retu
122a0 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74  rn ( db->temp_st
122b0 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66  ore!=1 );.#endif
122c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
122d0 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 55 4e 55 53  _STORE==3.  UNUS
122e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
122f0 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
12300 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
12310 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20  TEMP_STORE<1 || 
12320 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
12330 45 3e 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  E>3.  UNUSED_PAR
12340 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65  AMETER(db);.  re
12350 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
12360 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  ../*.** Return U
12370 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67  TF-8 encoded Eng
12380 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
12390 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  planation of the
123a0 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
123b0 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  error..*/.const 
123c0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72  char *sqlite3_er
123d0 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62  rmsg(sqlite3 *db
123e0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
123f0 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  *z;.  if( !db ){
12400 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
12410 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
12420 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20  _NOMEM_BKPT);.  
12430 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
12440 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
12450 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
12460 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
12470 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53  Str(SQLITE_MISUS
12480 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73  E_BKPT);.  }.  s
12490 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
124a0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
124b0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
124c0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d  ailed ){.    z =
124d0 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
124e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
124f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12500 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 70 45  testcase( db->pE
12510 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d  rr==0 );.    z =
12520 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
12530 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70  value_text(db->p
12540 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Err);.    assert
12550 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
12560 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  led );.    if( z
12570 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  ==0 ){.      z =
12580 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
12590 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20  b->errCode);.   
125a0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
125b0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
125c0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
125d0 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n z;.}..#ifndef 
125e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
125f0 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  6./*.** Return U
12600 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e  TF-16 encoded En
12610 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
12620 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
12630 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
12640 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
12650 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65   void *sqlite3_e
12660 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20  rrmsg16(sqlite3 
12670 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63  *db){.  static c
12680 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65  onst u16 outOfMe
12690 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c  m[] = {.    'o',
126a0 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
126b0 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27  'o', 'f', ' ', '
126c0 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f  m', 'e', 'm', 'o
126d0 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20  ', 'r', 'y', 0. 
126e0 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
126f0 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20  st u16 misuse[] 
12700 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27  = {.    'l', 'i'
12710 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c  , 'b', 'r', 'a',
12720 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20   'r', 'y', ' ', 
12730 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27  .    'r', 'o', '
12740 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e  u', 't', 'i', 'n
12750 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'e', ' ', .  
12760 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c    'c', 'a', 'l',
12770 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20   'l', 'e', 'd', 
12780 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27  ' ', .    'o', '
12790 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20  u', 't', ' ', . 
127a0 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27     'o', 'f', ' '
127b0 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c  , .    's', 'e',
127c0 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20   'q', 'u', 'e', 
127d0 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30  'n', 'c', 'e', 0
127e0 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76  .  };..  const v
127f0 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64  oid *z;.  if( !d
12800 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
12810 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d  (void *)outOfMem
12820 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
12830 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
12840 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
12850 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
12860 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20  *)misuse;.  }.  
12870 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
12880 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
12890 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
128a0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
128b0 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  = (void *)outOfM
128c0 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  em;.  }else{.   
128d0 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
128e0 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
128f0 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  rr);.    if( z==
12900 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
12910 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
12920 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20  b, db->errCode, 
12930 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
12940 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20 20 20  ->errCode));.   
12950 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
12960 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
12970 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pErr);.    }.   
12980 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d   /* A malloc() m
12990 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  ay have failed w
129a0 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74  ithin the call t
129b0 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  o sqlite3_value_
129c0 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20  text16().    ** 
129d0 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69  above. If this i
129e0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
129f0 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
12a00 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73  ailed flag needs
12a10 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c   to.    ** be cl
12a20 65 61 72 65 64 20 62 65 66 6f 72 65 20 72 65 74  eared before ret
12a30 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20  urning. Do this 
12a40 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
12a50 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20  d of via.    ** 
12a60 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 29  sqlite3ApiExit()
12a70 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69  , to avoid setti
12a80 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
12a90 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73  handle error mes
12aa0 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sage..    */.   
12ab0 20 73 71 6c 69 74 65 33 4f 6f 6d 43 6c 65 61 72   sqlite3OomClear
12ac0 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
12ad0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
12ae0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
12af0 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
12b00 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12b10 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
12b20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  Return the most 
12b30 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  recent error cod
12b40 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
12b50 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65  n SQLite routine
12b60 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20  . If NULL is.** 
12b70 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
12b80 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75  unction, we assu
12b90 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  me a malloc() fa
12ba0 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69  iled during sqli
12bb0 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69  te3_open()..*/.i
12bc0 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  nt sqlite3_errco
12bd0 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  de(sqlite3 *db){
12be0 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71  .  if( db && !sq
12bf0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
12c00 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
12c10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12c20 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
12c30 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20   }.  if( !db || 
12c40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12c50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
12c60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
12c70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
12c80 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d  b->errCode & db-
12c90 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20  >errMask;.}.int 
12ca0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
12cb0 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
12cc0 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
12cd0 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
12ce0 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
12cf0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
12d00 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
12d10 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
12d20 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
12d30 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
12d40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12d50 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  M_BKPT;.  }.  re
12d60 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65  turn db->errCode
12d70 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
12d80 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28 73 71 6c  system_errno(sql
12d90 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74  ite3 *db){.  ret
12da0 75 72 6e 20 64 62 20 3f 20 64 62 2d 3e 69 53 79  urn db ? db->iSy
12db0 73 45 72 72 6e 6f 20 3a 20 30 3b 0a 7d 20 20 0a  sErrno : 0;.}  .
12dc0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
12dd0 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
12de0 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f  ribes the kind o
12df0 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65  f error specifie
12e00 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75  d in the.** argu
12e10 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20  ment.  For now, 
12e20 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c  this simply call
12e30 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
12e40 71 6c 69 74 65 33 45 72 72 53 74 72 28 29 0a 2a  qlite3ErrStr().*
12e50 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  * function..*/.c
12e60 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
12e70 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20 72 63  e3_errstr(int rc
12e80 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
12e90 74 65 33 45 72 72 53 74 72 28 72 63 29 3b 0a 7d  te3ErrStr(rc);.}
12ea0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
12eb0 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66   new collating f
12ec0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61  unction for data
12ed0 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65 20  base "db".  The 
12ee0 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a  name is zName.**
12ef0 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e   and the encodin
12f00 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61  g is enc..*/.sta
12f10 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f  tic int createCo
12f20 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
12f30 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3* db,.  const 
12f40 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
12f50 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20  u8 enc,.  void* 
12f60 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
12f70 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
12f80 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
12f90 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20  ,const void*),. 
12fa0 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69   void(*xDel)(voi
12fb0 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  d*).){.  CollSeq
12fc0 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65   *pColl;.  int e
12fd0 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  nc2;.  .  assert
12fe0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12ff0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
13000 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49  );..  /* If SQLI
13010 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63  TE_UTF16 is spec
13020 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63  ified as the enc
13030 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e  oding type, tran
13040 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20  sform this.  ** 
13050 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  to one of SQLITE
13060 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49  _UTF16LE or SQLI
13070 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67  TE_UTF16BE using
13080 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
13090 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63  _UTF16NATIVE mac
130a0 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ro. SQLITE_UTF16
130b0 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
130c0 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
130d0 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65  enc2 = enc;.  te
130e0 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51  stcase( enc2==SQ
130f0 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20  LITE_UTF16 );.  
13100 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
13110 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
13120 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e  GNED );.  if( en
13130 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
13140 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45   || enc2==SQLITE
13150 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29  _UTF16_ALIGNED )
13160 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c  {.    enc2 = SQL
13170 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
13180 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c  .  }.  if( enc2<
13190 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65  SQLITE_UTF8 || e
131a0 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36  nc2>SQLITE_UTF16
131b0 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  BE ){.    return
131c0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
131d0 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
131e0 68 65 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c  heck if this cal
131f0 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72  l is removing or
13200 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78   replacing an ex
13210 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e  isting collation
13220 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e   .  ** sequence.
13230 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72   If so, and ther
13240 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
13250 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49  , return busy. I
13260 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65  f there.  ** are
13270 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
13280 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70  invalidate any p
13290 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  re-compiled stat
132a0 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
132b0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
132c0 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75  ndCollSeq(db, (u
132d0 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30  8)enc2, zName, 0
132e0 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26  );.  if( pColl &
132f0 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b  & pColl->xCmp ){
13300 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64  .    if( db->nVd
13310 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20  beActive ){.    
13320 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
13330 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
13340 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20  _BUSY, .        
13350 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74  "unable to delet
13360 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69  e/modify collati
13370 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20  on sequence due 
13380 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  to active statem
13390 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65  ents");.      re
133a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
133b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
133c0 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
133d0 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
133e0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c  ..    /* If coll
133f0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70  ation sequence p
13400 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64  Coll was created
13410 20 64 69 72 65 63 74 6c 79 20 62 79 20 61 20 63   directly by a c
13420 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
13430 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
13440 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20  lation, and not 
13450 67 65 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e  generated by syn
13460 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20  thCollSeq(),.   
13470 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70   ** then any cop
13480 69 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74  ies made by synt
13490 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20  hCollSeq() need 
134a0 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  to be invalidate
134b0 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  d..    ** Also, 
134c0 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75  collation destru
134d0 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78  ctor - CollSeq.x
134e0 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e  Del() - function
134f0 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a   may need.    **
13500 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20   to be called.. 
13510 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28     */ .    if( (
13520 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51  pColl->enc & ~SQ
13530 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
13540 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20  ED)==enc2 ){.   
13550 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c     CollSeq *aCol
13560 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  l = sqlite3HashF
13570 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ind(&db->aCollSe
13580 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  q, zName);.     
13590 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
135a0 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
135b0 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
135c0 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d  q *p = &aColl[j]
135d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
135e0 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
135f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
13600 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20  ( p->xDel ){.   
13610 20 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c           p->xDel
13620 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20  (p->pUser);.    
13630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13640 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20    p->xCmp = 0;. 
13650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13660 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43  .    }.  }..  pC
13670 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
13680 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38  dCollSeq(db, (u8
13690 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29  )enc2, zName, 1)
136a0 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30  ;.  if( pColl==0
136b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
136c0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 70  _NOMEM_BKPT;.  p
136d0 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f  Coll->xCmp = xCo
136e0 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e  mpare;.  pColl->
136f0 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20  pUser = pCtx;.  
13700 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44  pColl->xDel = xD
13710 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63  el;.  pColl->enc
13720 20 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28   = (u8)(enc2 | (
13730 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46  enc & SQLITE_UTF
13740 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20  16_ALIGNED));.  
13750 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
13760 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 72   SQLITE_OK);.  r
13770 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13780 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
13790 61 72 72 61 79 20 64 65 66 69 6e 65 73 20 68 61  array defines ha
137a0 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20  rd upper bounds 
137b0 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e  on limit values.
137c0 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c    The.** initial
137d0 69 7a 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70  izer must be kep
137e0 74 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74  t in sync with t
137f0 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  he SQLITE_LIMIT_
13800 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e  *.** #defines in
13810 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73   sqlite3.h..*/.s
13820 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
13830 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b  aHardLimit[] = {
13840 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  .  SQLITE_MAX_LE
13850 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  NGTH,.  SQLITE_M
13860 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20  AX_SQL_LENGTH,. 
13870 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
13880 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  MN,.  SQLITE_MAX
13890 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53  _EXPR_DEPTH,.  S
138a0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
138b0 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c  ND_SELECT,.  SQL
138c0 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c  ITE_MAX_VDBE_OP,
138d0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  .  SQLITE_MAX_FU
138e0 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51  NCTION_ARG,.  SQ
138f0 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
13900 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  D,.  SQLITE_MAX_
13910 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
13920 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
13930 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
13940 52 2c 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  R,      /* IMP: 
13950 52 2d 33 38 30 39 31 2d 33 32 33 35 32 20 2a 2f  R-38091-32352 */
13960 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  .  SQLITE_MAX_TR
13970 49 47 47 45 52 5f 44 45 50 54 48 2c 0a 20 20 53  IGGER_DEPTH,.  S
13980 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
13990 5f 54 48 52 45 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a  _THREADS,.};../*
139a0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
139b0 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72  e hard limits ar
139c0 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61  e set to reasona
139d0 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69  ble values.*/.#i
139e0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  f SQLITE_MAX_LEN
139f0 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
13a00 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
13a10 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
13a20 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
13a30 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
13a40 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
13a50 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ror SQLITE_MAX_S
13a60 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  QL_LENGTH must b
13a70 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
13a80 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13a90 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e  _MAX_SQL_LENGTH>
13aa0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
13ab0 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  H.# error SQLITE
13ac0 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
13ad0 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61  must not be grea
13ae0 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  ter than SQLITE_
13af0 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69  MAX_LENGTH.#endi
13b00 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
13b10 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
13b20 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <2.# error SQLIT
13b30 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
13b40 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61 74  ELECT must be at
13b50 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a   least 2.#endif.
13b60 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  #if SQLITE_MAX_V
13b70 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f  DBE_OP<40.# erro
13b80 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  r SQLITE_MAX_VDB
13b90 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20  E_OP must be at 
13ba0 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a  least 40.#endif.
13bb0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  #if SQLITE_MAX_F
13bc0 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c  UNCTION_ARG<0 ||
13bd0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
13be0 54 49 4f 4e 5f 41 52 47 3e 31 32 37 0a 23 20 65  TION_ARG>127.# e
13bf0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
13c00 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73  FUNCTION_ARG mus
13c10 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  t be between 0 a
13c20 6e 64 20 31 32 37 0a 23 65 6e 64 69 66 0a 23 69  nd 127.#endif.#i
13c30 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  f SQLITE_MAX_ATT
13c40 41 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54  ACHED<0 || SQLIT
13c50 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 31  E_MAX_ATTACHED>1
13c60 32 35 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  25.# error SQLIT
13c70 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 6d  E_MAX_ATTACHED m
13c80 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30  ust be between 0
13c90 20 61 6e 64 20 31 32 35 0a 23 65 6e 64 69 66 0a   and 125.#endif.
13ca0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
13cb0 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
13cc0 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  TH<1.# error SQL
13cd0 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
13ce0 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74  TERN_LENGTH must
13cf0 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
13d00 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13d10 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36  _MAX_COLUMN>3276
13d20 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  7.# error SQLITE
13d30 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74  _MAX_COLUMN must
13d40 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37 36   not exceed 3276
13d50 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  7.#endif.#if SQL
13d60 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
13d70 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20  DEPTH<1.# error 
13d80 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
13d90 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65  ER_DEPTH must be
13da0 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64   at least 1.#end
13db0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
13dc0 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
13dd0 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  <0 || SQLITE_MAX
13de0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e  _WORKER_THREADS>
13df0 35 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  50.# error SQLIT
13e00 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
13e10 45 41 44 53 20 6d 75 73 74 20 62 65 20 62 65 74  EADS must be bet
13e20 77 65 65 6e 20 30 20 61 6e 64 20 35 30 0a 23 65  ween 0 and 50.#e
13e30 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ndif.../*.** Cha
13e40 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
13e50 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72   a limit.  Repor
13e60 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e  t the old value.
13e70 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69  .** If an invali
13e80 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73  d limit index is
13e90 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72   supplied, repor
13ea0 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  t -1..** Make no
13eb0 20 63 68 61 6e 67 65 73 20 62 75 74 20 73 74 69   changes but sti
13ec0 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c  ll report the ol
13ed0 64 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a  d value if the.*
13ee0 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e  * new limit is n
13ef0 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41  egative..**.** A
13f00 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74   new lower limit
13f10 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b   does not shrink
13f20 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72   existing constr
13f30 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65  ucts..** It mere
13f40 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20  ly prevents new 
13f50 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74 20  constructs that 
13f60 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74  exceed the limit
13f70 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67  .** from forming
13f80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13f90 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  _limit(sqlite3 *
13fa0 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c  db, int limitId,
13fb0 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a   int newLimit){.
13fc0 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a    int oldLimit;.
13fd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
13fe0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
13ff0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
14000 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
14010 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
14020 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
14030 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
14040 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
14050 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
14060 33 30 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20  30189-54097 For 
14070 65 61 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67  each limit categ
14080 6f 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  ory SQLITE_LIMIT
14090 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65  _NAME.  ** there
140a0 20 69 73 20 61 20 68 61 72 64 20 75 70 70 65 72   is a hard upper
140b0 20 62 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f   bound set at co
140c0 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20  mpile-time by a 
140d0 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20  C preprocessor. 
140e0 20 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64   ** macro called
140f0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45   SQLITE_MAX_NAME
14100 2e 20 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22  . (The "_LIMIT_"
14110 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20   in the name is 
14120 63 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20  changed to.  ** 
14130 22 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20  "_MAX_".).  */. 
14140 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
14150 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
14160 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45  _LENGTH]==SQLITE
14170 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  _MAX_LENGTH );. 
14180 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
14190 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
141a0 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  _SQL_LENGTH]==SQ
141b0 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
141c0 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  GTH );.  assert(
141d0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
141e0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
141f0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  ==SQLITE_MAX_COL
14200 55 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UMN );.  assert(
14210 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
14220 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
14230 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  PTH]==SQLITE_MAX
14240 5f 45 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20  _EXPR_DEPTH );. 
14250 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
14260 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
14270 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
14280 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  ]==SQLITE_MAX_CO
14290 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a  MPOUND_SELECT);.
142a0 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
142b0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
142c0 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49  T_VDBE_OP]==SQLI
142d0 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29  TE_MAX_VDBE_OP )
142e0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
142f0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
14300 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MIT_FUNCTION_ARG
14310 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  ]==SQLITE_MAX_FU
14320 4e 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20  NCTION_ARG );.  
14330 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
14340 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
14350 41 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54  ATTACHED]==SQLIT
14360 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29  E_MAX_ATTACHED )
14370 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
14380 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
14390 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
143a0 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20  _LENGTH]==.     
143b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143d0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
143e0 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
143f0 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  N_LENGTH );.  as
14400 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
14410 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
14420 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d  RIABLE_NUMBER]==
14430 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
14440 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61  BLE_NUMBER);.  a
14450 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
14460 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54  t[SQLITE_LIMIT_T
14470 52 49 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53  RIGGER_DEPTH]==S
14480 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
14490 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  R_DEPTH );.  ass
144a0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
144b0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
144c0 4b 45 52 5f 54 48 52 45 41 44 53 5d 3d 3d 53 51  KER_THREADS]==SQ
144d0 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
144e0 54 48 52 45 41 44 53 20 29 3b 0a 20 20 61 73 73  THREADS );.  ass
144f0 65 72 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49  ert( SQLITE_LIMI
14500 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
14510 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49  ==(SQLITE_N_LIMI
14520 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20  T-1) );...  if( 
14530 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d  limitId<0 || lim
14540 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c  itId>=SQLITE_N_L
14550 49 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75  IMIT ){.    retu
14560 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64  rn -1;.  }.  old
14570 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d  Limit = db->aLim
14580 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69  it[limitId];.  i
14590 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29  f( newLimit>=0 )
145a0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
145b0 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32      /* IMP: R-52
145c0 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20  476-28732 */.   
145d0 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48   if( newLimit>aH
145e0 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ardLimit[limitId
145f0 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69  ] ){.      newLi
14600 6d 69 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74  mit = aHardLimit
14610 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49  [limitId];  /* I
14620 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32 35 36 33  MP: R-51463-2563
14630 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64  4 */.    }.    d
14640 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  b->aLimit[limitI
14650 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20  d] = newLimit;. 
14660 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c   }.  return oldL
14670 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  imit;           
14680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
14690 3a 20 52 2d 35 33 33 34 31 2d 33 35 34 31 39 20  : R-53341-35419 
146a0 2a 2f 0a 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  */.}.#if defined
146b0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
146c0 55 54 4f 5f 50 52 4f 46 49 4c 45 29 0a 2f 2a 20  UTO_PROFILE)./* 
146d0 73 74 64 65 72 72 20 6c 6f 67 67 69 6e 67 20 2a  stderr logging *
146e0 2f 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61  /.void _sqlite_a
146f0 75 74 6f 5f 70 72 6f 66 69 6c 65 28 76 6f 69 64  uto_profile(void
14700 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61   *aux, const cha
14710 72 20 2a 73 71 6c 2c 20 75 36 34 20 6e 73 29 3b  r *sql, u64 ns);
14720 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75  .void _sqlite_au
14730 74 6f 5f 74 72 61 63 65 28 76 6f 69 64 20 2a 61  to_trace(void *a
14740 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ux, const char *
14750 73 71 6c 29 3b 0a 76 6f 69 64 20 5f 73 71 6c 69  sql);.void _sqli
14760 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65 28  te_auto_profile(
14770 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74  void *aux, const
14780 20 63 68 61 72 20 2a 73 71 6c 2c 20 75 36 34 20   char *sql, u64 
14790 6e 73 29 20 7b 0a 23 70 72 61 67 6d 61 20 75 6e  ns) {.#pragma un
147a0 75 73 65 64 28 61 75 78 29 0a 09 66 70 72 69 6e  used(aux)..fprin
147b0 74 66 28 73 74 64 65 72 72 2c 20 22 51 75 65 72  tf(stderr, "Quer
147c0 79 3a 20 25 73 5c 6e 20 45 78 65 63 75 74 69 6f  y: %s\n Executio
147d0 6e 20 54 69 6d 65 3a 20 25 6c 6c 75 20 6d 73 5c  n Time: %llu ms\
147e0 6e 22 2c 20 73 71 6c 2c 20 6e 73 20 2f 20 31 30  n", sql, ns / 10
147f0 30 30 30 30 30 29 3b 0a 7d 0a 76 6f 69 64 20 5f  00000);.}.void _
14800 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63  sqlite_auto_trac
14810 65 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e  e(void *aux, con
14820 73 74 20 63 68 61 72 20 2a 73 71 6c 29 20 7b 0a  st char *sql) {.
14830 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .fprintf(stderr,
14840 20 22 54 72 61 63 65 53 51 4c 28 25 70 29 3a 20   "TraceSQL(%p): 
14850 25 73 5c 6e 22 2c 20 61 75 78 2c 20 73 71 6c 29  %s\n", aux, sql)
14860 3b 0a 7d 0a 0a 2f 2a 20 73 79 73 6c 6f 67 20 6c  ;.}../* syslog l
14870 6f 67 67 69 6e 67 20 2a 2f 0a 23 69 6e 63 6c 75  ogging */.#inclu
14880 64 65 20 3c 61 73 6c 2e 68 3e 0a 73 74 61 74 69  de <asl.h>.stati
14890 63 20 61 73 6c 63 6c 69 65 6e 74 20 61 75 74 6f  c aslclient auto
148a0 6c 6f 67 5f 63 6c 69 65 6e 74 20 3d 20 4e 55 4c  log_client = NUL
148b0 4c 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f  L;.static void _
148c0 63 6c 6f 73 65 5f 61 73 6c 5f 6c 6f 67 28 29 20  close_asl_log() 
148d0 7b 0a 20 20 69 66 28 20 4e 55 4c 4c 21 3d 61 75  {.  if( NULL!=au
148e0 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 29 7b 0a  tolog_client ){.
148f0 20 20 20 20 61 73 6c 5f 63 6c 6f 73 65 28 61 75      asl_close(au
14900 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 29 3b 0a 20  tolog_client);. 
14910 20 20 20 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e     autolog_clien
14920 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a  t = NULL;.  }.}.
14930 73 74 61 74 69 63 20 76 6f 69 64 20 5f 6f 70 65  static void _ope
14940 6e 5f 61 73 6c 5f 6c 6f 67 28 29 20 7b 0a 20 20  n_asl_log() {.  
14950 69 66 28 20 4e 55 4c 4c 3d 3d 61 75 74 6f 6c 6f  if( NULL==autolo
14960 67 5f 63 6c 69 65 6e 74 20 29 7b 0a 20 20 20 20  g_client ){.    
14970 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 3d  autolog_client =
14980 20 61 73 6c 5f 6f 70 65 6e 28 22 53 51 4c 69 74   asl_open("SQLit
14990 65 22 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20  e", NULL, 0);.  
149a0 20 20 61 74 65 78 69 74 28 5f 63 6c 6f 73 65 5f    atexit(_close_
149b0 61 73 6c 5f 6c 6f 67 29 3b 0a 20 20 7d 0a 7d 0a  asl_log);.  }.}.
149c0 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75  .void _sqlite_au
149d0 74 6f 5f 70 72 6f 66 69 6c 65 5f 73 79 73 6c 6f  to_profile_syslo
149e0 67 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e  g(void *aux, con
149f0 73 74 20 63 68 61 72 20 2a 73 71 6c 2c 20 75 36  st char *sql, u6
14a00 34 20 6e 73 29 3b 0a 76 6f 69 64 20 5f 73 71 6c  4 ns);.void _sql
14a10 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 5f 73  ite_auto_trace_s
14a20 79 73 6c 6f 67 28 76 6f 69 64 20 2a 61 75 78 2c  yslog(void *aux,
14a30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
14a40 29 3b 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f  );.void _sqlite_
14a50 61 75 74 6f 5f 70 72 6f 66 69 6c 65 5f 73 79 73  auto_profile_sys
14a60 6c 6f 67 28 76 6f 69 64 20 2a 61 75 78 2c 20 63  log(void *aux, c
14a70 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 2c 20  onst char *sql, 
14a80 75 36 34 20 6e 73 29 20 7b 0a 23 70 72 61 67 6d  u64 ns) {.#pragm
14a90 61 20 75 6e 75 73 65 64 28 61 75 78 29 0a 09 61  a unused(aux)..a
14aa0 73 6c 5f 6c 6f 67 28 61 75 74 6f 6c 6f 67 5f 63  sl_log(autolog_c
14ab0 6c 69 65 6e 74 2c 20 4e 55 4c 4c 2c 20 41 53 4c  lient, NULL, ASL
14ac0 5f 4c 45 56 45 4c 5f 4e 4f 54 49 43 45 2c 20 22  _LEVEL_NOTICE, "
14ad0 51 75 65 72 79 3a 20 25 73 5c 6e 20 45 78 65 63  Query: %s\n Exec
14ae0 75 74 69 6f 6e 20 54 69 6d 65 3a 20 25 6c 6c 75  ution Time: %llu
14af0 20 6d 73 5c 6e 22 2c 20 73 71 6c 2c 20 6e 73 20   ms\n", sql, ns 
14b00 2f 20 31 30 30 30 30 30 30 29 3b 0a 7d 0a 76 6f  / 1000000);.}.vo
14b10 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f  id _sqlite_auto_
14b20 74 72 61 63 65 5f 73 79 73 6c 6f 67 28 76 6f 69  trace_syslog(voi
14b30 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68  d *aux, const ch
14b40 61 72 20 2a 73 71 6c 29 20 7b 0a 09 61 73 6c 5f  ar *sql) {..asl_
14b50 6c 6f 67 28 61 75 74 6f 6c 6f 67 5f 63 6c 69 65  log(autolog_clie
14b60 6e 74 2c 20 4e 55 4c 4c 2c 20 41 53 4c 5f 4c 45  nt, NULL, ASL_LE
14b70 56 45 4c 5f 4e 4f 54 49 43 45 2c 20 22 54 72 61  VEL_NOTICE, "Tra
14b80 63 65 53 51 4c 28 25 70 29 3a 20 25 73 5c 6e 22  ceSQL(%p): %s\n"
14b90 2c 20 61 75 78 2c 20 73 71 6c 29 3b 0a 7d 0a 23  , aux, sql);.}.#
14ba0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
14bb0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
14bc0 65 64 20 74 6f 20 70 61 72 73 65 20 62 6f 74 68  ed to parse both
14bd0 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52   URIs and non-UR
14be0 49 20 66 69 6c 65 6e 61 6d 65 73 20 70 61 73 73  I filenames pass
14bf0 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 75 73 65  ed by the.** use
14c00 72 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f  r to API functio
14c10 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ns sqlite3_open(
14c20 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65  ) or sqlite3_ope
14c30 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66 6f 72 20  n_v2(), and for 
14c40 64 61 74 61 62 61 73 65 0a 2a 2a 20 55 52 49 73  database.** URIs
14c50 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61   specified as pa
14c60 72 74 20 6f 66 20 41 54 54 41 43 48 20 73 74 61  rt of ATTACH sta
14c70 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  tements..**.** T
14c80 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
14c90 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
14ca0 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  on is the name o
14cb0 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73 65  f the VFS to use
14cc0 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74   (or.** a NULL t
14cd0 6f 20 73 69 67 6e 69 66 79 20 74 68 65 20 64 65  o signify the de
14ce0 66 61 75 6c 74 20 56 46 53 29 20 69 66 20 74 68  fault VFS) if th
14cf0 65 20 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 63  e URI does not c
14d00 6f 6e 74 61 69 6e 20 61 20 22 76 66 73 3d 78 78  ontain a "vfs=xx
14d10 78 22 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61  x".** query para
14d20 6d 65 74 65 72 2e 20 54 68 65 20 73 65 63 6f 6e  meter. The secon
14d30 64 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61  d argument conta
14d40 69 6e 73 20 74 68 65 20 55 52 49 20 28 6f 72 20  ins the URI (or 
14d50 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65  non-URI filename
14d60 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20 57 68 65  ).** itself. Whe
14d70 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
14d80 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 2a 70  is called the *p
14d90 46 6c 61 67 73 20 76 61 72 69 61 62 6c 65 20 73  Flags variable s
14da0 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  hould contain.**
14db0 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 6c 61   the default fla
14dc0 67 73 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64  gs to open the d
14dd0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77  atabase handle w
14de0 69 74 68 2e 20 54 68 65 20 76 61 6c 75 65 20 73  ith. The value s
14df0 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c  tored in.** *pFl
14e00 61 67 73 20 6d 61 79 20 62 65 20 75 70 64 61 74  ags may be updat
14e10 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
14e20 69 6e 67 20 69 66 20 74 68 65 20 55 52 49 20 66  ing if the URI f
14e30 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73  ilename contains
14e40 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78 78 78 22   .** "cache=xxx"
14e50 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78 22 20 71   or "mode=xxx" q
14e60 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e  uery parameters.
14e70 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
14e80 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
14e90 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20  is returned. In 
14ea0 74 68 69 73 20 63 61 73 65 20 2a 70 70 56 66 73  this case *ppVfs
14eb0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
14ec0 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46 53 20 74   to.** the VFS t
14ed0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
14ee0 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64  ed to open the d
14ef0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 70  atabase file. *p
14f00 7a 46 69 6c 65 20 69 73 20 73 65 74 20 74 6f 0a  zFile is set to.
14f10 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  ** point to a bu
14f20 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
14f30 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
14f40 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74  file to open. It
14f50 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
14f60 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
14f70 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
14f80 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69  tually call sqli
14f90 74 65 33 5f 66 72 65 65 28 29 20 74 6f 20 72 65  te3_free() to re
14fa0 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75  lease.** this bu
14fb0 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ffer..**.** If a
14fc0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
14fd0 74 68 65 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  then an SQLite e
14fe0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
14ff0 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a 45 72 72  urned and *pzErr
15000 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65  Msg.** may be se
15010 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
15020 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
15030 67 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e  g an English lan
15040 67 75 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20  guage error .** 
15050 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74  message. It is t
15060 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
15070 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
15080 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65  to eventually re
15090 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75  lease.** this bu
150a0 66 66 65 72 20 62 79 20 63 61 6c 6c 69 6e 67 20  ffer by calling 
150b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
150c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
150d0 72 73 65 55 72 69 28 0a 20 20 63 6f 6e 73 74 20  rseUri(.  const 
150e0 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 56 66  char *zDefaultVf
150f0 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53  s,        /* VFS
15100 20 74 6f 20 75 73 65 20 69 66 20 6e 6f 20 22 76   to use if no "v
15110 66 73 3d 78 78 78 22 20 71 75 65 72 79 20 6f 70  fs=xxx" query op
15120 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tion */.  const 
15130 63 68 61 72 20 2a 7a 55 72 69 2c 20 20 20 20 20  char *zUri,     
15140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c            /* Nul
15150 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 52 49 20  -terminated URI 
15160 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e  to parse */.  un
15170 73 69 67 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61  signed int *pFla
15180 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs,           /*
15190 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f   IN/OUT: SQLITE_
151a0 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a  OPEN_XXX flags *
151b0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
151c0 2a 2a 70 70 56 66 73 2c 20 20 20 20 20 20 20 20  **ppVfs,        
151d0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20      /* OUT: VFS 
151e0 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20 63 68 61  to use */ .  cha
151f0 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20  r **pzFile,     
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15210 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f  OUT: Filename co
15220 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a  mponent of URI *
15230 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  /.  char **pzErr
15240 4d 73 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Msg             
15250 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f      /* OUT: Erro
15260 72 20 6d 65 73 73 61 67 65 20 28 69 66 20 72 63  r message (if rc
15270 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a  !=SQLITE_OK) */.
15280 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
15290 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67  LITE_OK;.  unsig
152a0 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ned int flags = 
152b0 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74  *pFlags;.  const
152c0 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44   char *zVfs = zD
152d0 65 66 61 75 6c 74 56 66 73 3b 0a 20 20 63 68 61  efaultVfs;.  cha
152e0 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72  r *zFile;.  char
152f0 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d   c;.  int nUri =
15300 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
15310 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73 73 65 72  (zUri);..  asser
15320 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20  t( *pzErrMsg==0 
15330 29 3b 0a 0a 20 20 69 66 28 20 28 28 66 6c 61 67  );..  if( ((flag
15340 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
15350 55 52 49 29 20 20 20 20 20 20 20 20 20 20 20 20  URI)            
15360 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38 37 32 35   /* IMP: R-48725
15370 2d 33 32 32 30 36 20 2a 2f 0a 20 20 20 20 20 20  -32206 */.      
15380 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
15390 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70  GlobalConfig.bOp
153a0 65 6e 55 72 69 29 20 2f 2a 20 49 4d 50 3a 20 52  enUri) /* IMP: R
153b0 2d 35 31 36 38 39 2d 34 36 35 34 38 20 2a 2f 0a  -51689-46548 */.
153c0 20 20 20 26 26 20 6e 55 72 69 3e 3d 35 20 26 26     && nUri>=5 &&
153d0 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66   memcmp(zUri, "f
153e0 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 2f 2a 20  ile:", 5)==0 /* 
153f0 49 4d 50 3a 20 52 2d 35 37 38 38 34 2d 33 37 34  IMP: R-57884-374
15400 39 36 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 63  96 */.  ){.    c
15410 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69  har *zOpt;.    i
15420 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  nt eState;      
15430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15440 50 61 72 73 65 72 20 73 74 61 74 65 20 77 68 65  Parser state whe
15450 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20 2a 2f  n parsing URI */
15460 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20 20 20  .    int iIn;   
15470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15480 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61 72     /* Input char
15490 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20  acter index */. 
154a0 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b     int iOut = 0;
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154c0 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61 72 61   /* Output chara
154d0 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cter index */.  
154e0 20 20 75 36 34 20 6e 42 79 74 65 20 3d 20 6e 55    u64 nByte = nU
154f0 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20 20 20  ri+2;           
15500 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
15510 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  e to allocate */
15520 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
15530 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50  re the SQLITE_OP
15540 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73 20 73  EN_URI flag is s
15550 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  et to indicate t
15560 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65 6e 20  o the VFS xOpen 
15570 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74  .    ** method t
15580 68 61 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  hat there may be
15590 20 65 78 74 72 61 20 70 61 72 61 6d 65 74 65 72   extra parameter
155a0 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  s following the 
155b0 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20  file-name.  */. 
155c0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
155d0 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20  TE_OPEN_URI;..  
155e0 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e    for(iIn=0; iIn
155f0 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42  <nUri; iIn++) nB
15600 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e  yte += (zUri[iIn
15610 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a 46 69  ]=='&');.    zFi
15620 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  le = sqlite3_mal
15630 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20  loc64(nByte);.  
15640 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72    if( !zFile ) r
15650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
15660 45 4d 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 69 49  EM_BKPT;..    iI
15670 6e 20 3d 20 35 3b 0a 23 69 66 64 65 66 20 53 51  n = 5;.#ifdef SQ
15680 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41  LITE_ALLOW_URI_A
15690 55 54 48 4f 52 49 54 59 0a 20 20 20 20 69 66 28  UTHORITY.    if(
156a0 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c   strncmp(zUri+5,
156b0 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b   "///", 3)==0 ){
156c0 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a  .      iIn = 7;.
156d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
156e0 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e  lowing condition
156f0 20 63 61 75 73 65 73 20 55 52 49 73 20 77 69 74   causes URIs wit
15700 68 20 66 69 76 65 20 6c 65 61 64 69 6e 67 20 2f  h five leading /
15710 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20   characters.    
15720 20 20 2a 2a 20 6c 69 6b 65 20 66 69 6c 65 3a 2f    ** like file:/
15730 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 20 74 6f  ////host/path to
15740 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
15750 74 6f 20 55 4e 43 73 20 6c 69 6b 65 20 2f 2f 68  to UNCs like //h
15760 6f 73 74 2f 70 61 74 68 2e 0a 20 20 20 20 20 20  ost/path..      
15770 2a 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20 55  ** The correct U
15780 52 49 20 66 6f 72 20 74 68 61 74 20 55 4e 43 20  RI for that UNC 
15790 68 61 73 20 6f 6e 6c 79 20 74 77 6f 20 6f 72 20  has only two or 
157a0 66 6f 75 72 20 6c 65 61 64 69 6e 67 20 2f 20 63  four leading / c
157b0 68 61 72 61 63 74 65 72 73 0a 20 20 20 20 20 20  haracters.      
157c0 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73 74 2f 70  ** file://host/p
157d0 61 74 68 20 6f 72 20 66 69 6c 65 3a 2f 2f 2f 2f  ath or file:////
157e0 68 6f 73 74 2f 70 61 74 68 2e 20 20 42 75 74 20  host/path.  But 
157f0 35 20 6c 65 61 64 69 6e 67 20 73 6c 61 73 68 65  5 leading slashe
15800 73 20 69 73 20 61 20 0a 20 20 20 20 20 20 2a 2a  s is a .      **
15810 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72 2c 20 77   common error, w
15820 65 20 61 72 65 20 74 6f 6c 64 2c 20 73 6f 20 77  e are told, so w
15830 65 20 68 61 6e 64 6c 65 20 69 74 20 61 73 20 61  e handle it as a
15840 20 73 70 65 63 69 61 6c 20 63 61 73 65 2e 20 2a   special case. *
15850 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  /.      if( strn
15860 63 6d 70 28 7a 55 72 69 2b 37 2c 20 22 2f 2f 2f  cmp(zUri+7, "///
15870 22 2c 20 33 29 3d 3d 30 20 29 7b 20 69 49 6e 2b  ", 3)==0 ){ iIn+
15880 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69  +; }.    }else i
15890 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b  f( strncmp(zUri+
158a0 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f  5, "//localhost/
158b0 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 12)==0 ){.   
158c0 20 20 20 69 49 6e 20 3d 20 31 36 3b 0a 20 20 20     iIn = 16;.   
158d0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20   }.#else.    /* 
158e0 44 69 73 63 61 72 64 20 74 68 65 20 73 63 68 65  Discard the sche
158f0 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69 74 79  me and authority
15900 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74 68 65   segments of the
15910 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28   URI. */.    if(
15920 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26   zUri[5]=='/' &&
15930 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b   zUri[6]=='/' ){
15940 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a  .      iIn = 7;.
15950 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72        while( zUr
15960 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69  i[iIn] && zUri[i
15970 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b  In]!='/' ) iIn++
15980 3b 0a 20 20 20 20 20 20 69 66 28 20 69 49 6e 21  ;.      if( iIn!
15990 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36 20 7c  =7 && (iIn!=16 |
159a0 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68  | memcmp("localh
159b0 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20  ost", &zUri[7], 
159c0 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  9)) ){.        *
159d0 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
159e0 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61  e3_mprintf("inva
159f0 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72 69 74  lid uri authorit
15a00 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20  y: %.*s", .     
15a10 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a         iIn-7, &z
15a20 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20  Uri[7]);.       
15a30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
15a40 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  OR;.        goto
15a50 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
15a60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
15a70 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70  ndif..    /* Cop
15a80 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61  y the filename a
15a90 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70 61 72  nd any query par
15aa0 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65  ameters into the
15ab0 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a   zFile buffer. .
15ac0 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48      ** Decode %H
15ad0 48 20 65 73 63 61 70 65 20 63 6f 64 65 73 20 61  H escape codes a
15ae0 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20  long the way. . 
15af0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74     **.    ** Wit
15b00 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76  hin this loop, v
15b10 61 72 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d  ariable eState m
15b20 61 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20  ay be set to 0, 
15b30 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e  1 or 2, dependin
15b40 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  g.    ** on the 
15b50 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e  parsing context.
15b60 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   As follows:.   
15b70 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20   **.    **   0: 
15b80 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d  Parsing file-nam
15b90 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50  e..    **   1: P
15ba0 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74  arsing name sect
15bb0 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61  ion of a name=va
15bc0 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  lue query parame
15bd0 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a  ter..    **   2:
15be0 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73   Parsing value s
15bf0 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65  ection of a name
15c00 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72  =value query par
15c10 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  ameter..    */. 
15c20 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20     eState = 0;. 
15c30 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
15c40 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20  Uri[iIn])!=0 && 
15c50 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20  c!='#' ){.      
15c60 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  iIn++;.      if(
15c70 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20   c=='%' .       
15c80 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67  && sqlite3Isxdig
15c90 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20  it(zUri[iIn]) . 
15ca0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
15cb0 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49  Isxdigit(zUri[iI
15cc0 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a  n+1]) .      ){.
15cd0 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65          int octe
15ce0 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54  t = (sqlite3HexT
15cf0 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d  oInt(zUri[iIn++]
15d00 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20  ) << 4);.       
15d10 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65   octet += sqlite
15d20 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69  3HexToInt(zUri[i
15d30 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20  In++]);..       
15d40 20 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d   assert( octet>=
15d50 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29  0 && octet<256 )
15d60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 63  ;.        if( oc
15d70 74 65 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  tet==0 ){.#ifnde
15d80 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
15d90 55 52 49 5f 30 30 5f 45 52 52 4f 52 0a 20 20 20  URI_00_ERROR.   
15da0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
15db0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
15dc0 68 65 6e 20 22 25 30 30 22 20 61 70 70 65 61 72  hen "%00" appear
15dd0 73 20 77 69 74 68 69 6e 20 74 68 65 20 55 52 49  s within the URI
15de0 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20  . In this.      
15df0 20 20 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69      ** case we i
15e00 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69  gnore all text i
15e10 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  n the remainder 
15e20 6f 66 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d  of the path, nam
15e30 65 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  e or.          *
15e40 2a 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c  * value currentl
15e50 79 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20  y being parsed. 
15e60 53 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75  So ignore the cu
15e70 72 72 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a  rrent character.
15e80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
15e90 20 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78   skip to the nex
15ea0 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26  t "?", "=" or "&
15eb0 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ", as appropriat
15ec0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
15ed0 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69  while( (c = zUri
15ee0 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d  [iIn])!=0 && c!=
15ef0 27 23 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  '#' .           
15f00 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 30     && (eState!=0
15f10 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20   || c!='?').    
15f20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53            && (eS
15f30 74 61 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27  tate!=1 || (c!='
15f40 3d 27 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20  =' && c!='&')). 
15f50 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
15f60 28 65 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21  (eState!=2 || c!
15f70 3d 27 26 27 29 0a 20 20 20 20 20 20 20 20 20 20  ='&').          
15f80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
15f90 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  In++;.          
15fa0 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  }.          cont
15fb0 69 6e 75 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20  inue;.#else.    
15fc0 20 20 20 20 20 20 2f 2a 20 49 66 20 45 4e 41 42        /* If ENAB
15fd0 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f 52 20  LE_URI_00_ERROR 
15fe0 69 73 20 64 65 66 69 6e 65 64 2c 20 22 25 30 30  is defined, "%00
15ff0 22 20 69 6e 20 61 20 55 52 49 20 69 73 20 61 6e  " in a URI is an
16000 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 20   error. */.     
16010 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
16020 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
16030 28 22 75 6e 65 78 70 65 63 74 65 64 20 25 25 30  ("unexpected %%0
16040 30 20 69 6e 20 75 72 69 22 29 3b 0a 20 20 20 20  0 in uri");.    
16050 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16060 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
16070 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
16080 69 5f 6f 75 74 3b 0a 23 65 6e 64 69 66 0a 20 20  i_out;.#endif.  
16090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
160a0 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20 20 20  c = octet;.     
160b0 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74   }else if( eStat
160c0 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26 27 20  e==1 && (c=='&' 
160d0 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20  || c=='=') ){.  
160e0 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b        if( zFile[
160f0 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20  iOut-1]==0 ){.  
16100 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d          /* An em
16110 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e  pty option name.
16120 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74   Ignore this opt
16130 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  ion altogether. 
16140 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  */.          whi
16150 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26  le( zUri[iIn] &&
16160 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20   zUri[iIn]!='#' 
16170 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d  && zUri[iIn-1]!=
16180 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20  '&' ) iIn++;.   
16190 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
161a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
161b0 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20 29 7b     if( c=='&' ){
161c0 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65  .          zFile
161d0 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
161e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
161f0 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
16200 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 2;.        }.
16210 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20          c = 0;. 
16220 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
16230 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d  eState==0 && c==
16240 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74 65 3d  '?') || (eState=
16250 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20 29 7b  =2 && c=='&') ){
16260 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a  .        c = 0;.
16270 20 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d          eState =
16280 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
16290 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
162a0 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = c;.    }.    i
162b0 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29 20 7a  f( eState==1 ) z
162c0 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
162d0 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69  \0';.    zFile[i
162e0 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out++] = '\0';. 
162f0 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
16300 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a   = '\0';..    /*
16310 20 43 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   Check if there 
16320 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73  were any options
16330 20 73 70 65 63 69 66 69 65 64 20 74 68 61 74 20   specified that 
16340 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65 72 70  should be interp
16350 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20 68 65  reted .    ** he
16360 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68 61 74  re. Options that
16370 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 65 64   are interpreted
16380 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20 22 76   here include "v
16390 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20 74 68  fs" and those th
163a0 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 73  at.    ** corres
163b0 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20 74 68  pond to flags th
163c0 61 74 20 6d 61 79 20 62 65 20 70 61 73 73 65 64  at may be passed
163d0 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f   to the sqlite3_
163e0 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a  open_v2().    **
163f0 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20   method. */.    
16400 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71  zOpt = &zFile[sq
16410 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
16420 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69  ile)+1];.    whi
16430 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20  le( zOpt[0] ){. 
16440 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20       int nOpt = 
16450 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
16460 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63 68 61  zOpt);.      cha
16470 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b  r *zVal = &zOpt[
16480 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69  nOpt+1];.      i
16490 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65  nt nVal = sqlite
164a0 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b  3Strlen30(zVal);
164b0 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74  ..      if( nOpt
164c0 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 22 76  ==3 && memcmp("v
164d0 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30  fs", zOpt, 3)==0
164e0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56 66 73   ){.        zVfs
164f0 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d   = zVal;.      }
16500 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
16510 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a  ruct OpenMode {.
16520 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
16530 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20  char *z;.       
16540 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20     int mode;.   
16550 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20       } *aMode = 
16560 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
16570 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a  *zModeType = 0;.
16580 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b          int mask
16590 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
165a0 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20  t limit = 0;..  
165b0 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d        if( nOpt==
165c0 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63 61 63  5 && memcmp("cac
165d0 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30  he", zOpt, 5)==0
165e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
165f0 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e  atic struct Open
16600 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64 65 5b  Mode aCacheMode[
16610 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
16620 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20 20 53    { "shared",  S
16630 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
16640 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  DCACHE },.      
16650 20 20 20 20 20 20 7b 20 22 70 72 69 76 61 74 65        { "private
16660 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  ", SQLITE_OPEN_P
16670 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20  RIVATECACHE },. 
16680 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20             { 0, 
16690 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b  0 }.          };
166a0 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b  ..          mask
166b0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   = SQLITE_OPEN_S
166c0 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c 49 54  HAREDCACHE|SQLIT
166d0 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
166e0 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20 20 61  CHE;.          a
166f0 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d 6f 64  Mode = aCacheMod
16700 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d  e;.          lim
16710 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  it = mask;.     
16720 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d       zModeType =
16730 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20 20 20   "cache";.      
16740 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
16750 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d  nOpt==4 && memcm
16760 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20  p("mode", zOpt, 
16770 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)==0 ){.       
16780 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
16790 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d   OpenMode aOpenM
167a0 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
167b0 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20 20 53        { "ro",  S
167c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
167d0 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  NLY },.         
167e0 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51 4c 49     { "rw",  SQLI
167f0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
16800 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  E }, .          
16810 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c 49 54    { "rwc", SQLIT
16820 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16830 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
16840 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20 20  REATE },.       
16850 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c       { "memory",
16860 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
16870 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  ORY },.         
16880 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20     { 0, 0 }.    
16890 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20        };..      
168a0 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54      mask = SQLIT
168b0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
168c0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
168d0 41 44 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  ADWRITE.        
168e0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
168f0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
16900 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  | SQLITE_OPEN_ME
16910 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20 20 20 20  MORY;.          
16920 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64  aMode = aOpenMod
16930 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d  e;.          lim
16940 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67  it = mask & flag
16950 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f  s;.          zMo
16960 64 65 54 79 70 65 20 3d 20 22 61 63 63 65 73 73  deType = "access
16970 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  ";.        }..  
16980 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64 65 20        if( aMode 
16990 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
169a0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   i;.          in
169b0 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  t mode = 0;.    
169c0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61        for(i=0; a
169d0 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b  Mode[i].z; i++){
169e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
169f0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f  st char *z = aMo
16a00 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20  de[i].z;.       
16a10 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73       if( nVal==s
16a20 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
16a30 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a  ) && 0==memcmp(z
16a40 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b  Val, z, nVal) ){
16a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
16a60 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d  ode = aMode[i].m
16a70 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ode;.           
16a80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
16a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16aa0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
16ab0 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  ( mode==0 ){.   
16ac0 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d           *pzErrM
16ad0 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
16ae0 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 25 73  intf("no such %s
16af0 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64   mode: %s", zMod
16b00 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20  eType, zVal);.  
16b10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
16b20 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
16b30 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61           goto pa
16b40 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
16b50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16b60 20 20 20 69 66 28 20 28 6d 6f 64 65 20 26 20 7e     if( (mode & ~
16b70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
16b80 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20  RY)>limit ){.   
16b90 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d           *pzErrM
16ba0 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
16bb0 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f  intf("%s mode no
16bc0 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a  t allowed: %s",.
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bf0 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
16c00 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  e, zVal);.      
16c10 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16c20 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 20 20  E_PERM;.        
16c30 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75      goto parse_u
16c40 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ri_out;.        
16c50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6c    }.          fl
16c60 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26 20 7e  ags = (flags & ~
16c70 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20  mask) | mode;.  
16c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16c90 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a  .      zOpt = &z
16ca0 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20  Val[nVal+1];.   
16cb0 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
16cc0 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   zFile = sqlite3
16cd0 5f 6d 61 6c 6c 6f 63 36 34 28 6e 55 72 69 2b 32  _malloc64(nUri+2
16ce0 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c  );.    if( !zFil
16cf0 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
16d00 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
16d10 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20    memcpy(zFile, 
16d20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20  zUri, nUri);.   
16d30 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27   zFile[nUri] = '
16d40 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e  \0';.    zFile[n
16d50 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20  Uri+1] = '\0';. 
16d60 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
16d70 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20  ITE_OPEN_URI;.  
16d80 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73 71  }..  *ppVfs = sq
16d90 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a  lite3_vfs_find(z
16da0 56 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70 56  Vfs);.  if( *ppV
16db0 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a  fs==0 ){.    *pz
16dc0 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
16dd0 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63  _mprintf("no suc
16de0 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73  h vfs: %s", zVfs
16df0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
16e00 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70  TE_ERROR;.  }. p
16e10 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20  arse_uri_out:.  
16e20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16e30 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
16e40 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20  _free(zFile);.  
16e50 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d    zFile = 0;.  }
16e60 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61  .  *pFlags = fla
16e70 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20  gs;.  *pzFile = 
16e80 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  zFile;.  return 
16e90 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  rc;.}..#if defin
16ea0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
16eb0 5f 41 55 54 4f 5f 50 52 4f 46 49 4c 45 29 0a 23  _AUTO_PROFILE).#
16ec0 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 41 55  define SQLITE_AU
16ed0 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44 45 52 52  TOLOGGING_STDERR
16ee0 20 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54   1.#define SQLIT
16ef0 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59  E_AUTOLOGGING_SY
16f00 53 4c 4f 47 20 32 0a 73 74 61 74 69 63 20 76 6f  SLOG 2.static vo
16f10 69 64 20 65 6e 61 62 6c 65 41 75 74 6f 4c 6f 67  id enableAutoLog
16f20 67 69 6e 67 28 0a 20 20 73 71 6c 69 74 65 33 20  ging(.  sqlite3 
16f30 2a 64 62 0a 29 7b 0a 20 20 63 68 61 72 20 2a 65  *db.){.  char *e
16f40 6e 76 70 72 6f 66 69 6c 65 20 3d 20 67 65 74 65  nvprofile = gete
16f50 6e 76 28 22 53 51 4c 49 54 45 5f 41 55 54 4f 5f  nv("SQLITE_AUTO_
16f60 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20 0a 20 20  PROFILE");.  .  
16f70 69 66 28 20 65 6e 76 70 72 6f 66 69 6c 65 21 3d  if( envprofile!=
16f80 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20  NULL ){.    int 
16f90 77 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 69  where = 0;.    i
16fa0 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70 28  f( !strncasecmp(
16fb0 22 31 22 2c 20 65 6e 76 70 72 6f 66 69 6c 65 2c  "1", envprofile,
16fc0 20 31 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28   1) ){.      if(
16fd0 20 69 73 61 74 74 79 28 32 29 20 29 7b 0a 20 20   isatty(2) ){.  
16fe0 20 20 20 20 20 20 77 68 65 72 65 20 3d 20 53 51        where = SQ
16ff0 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47  LITE_AUTOLOGGING
17000 5f 53 54 44 45 52 52 3b 0a 20 20 20 20 20 20 7d  _STDERR;.      }
17010 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68  else{.        wh
17020 65 72 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54  ere = SQLITE_AUT
17030 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 3b  OLOGGING_SYSLOG;
17040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
17050 6c 73 65 20 69 66 28 20 21 73 74 72 6e 63 61 73  lse if( !strncas
17060 65 63 6d 70 28 22 73 74 64 65 72 72 22 2c 20 65  ecmp("stderr", e
17070 6e 76 70 72 6f 66 69 6c 65 2c 20 36 29 20 29 7b  nvprofile, 6) ){
17080 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d 20 53  .      where = S
17090 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e  QLITE_AUTOLOGGIN
170a0 47 5f 53 54 44 45 52 52 3b 0a 20 20 20 20 7d 20  G_STDERR;.    } 
170b0 65 6c 73 65 20 69 66 28 20 21 73 74 72 6e 63 61  else if( !strnca
170c0 73 65 63 6d 70 28 22 73 79 73 6c 6f 67 22 2c 20  secmp("syslog", 
170d0 65 6e 76 70 72 6f 66 69 6c 65 2c 20 36 29 20 29  envprofile, 6) )
170e0 7b 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d 20  {.      where = 
170f0 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
17100 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20 20 20 20 7d  NG_SYSLOG;.    }
17110 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 3d 3d  .    if( where==
17120 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
17130 4e 47 5f 53 54 44 45 52 52 20 29 7b 0a 20 20 20  NG_STDERR ){.   
17140 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69     sqlite3_profi
17150 6c 65 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61  le(db, _sqlite_a
17160 75 74 6f 5f 70 72 6f 66 69 6c 65 2c 20 64 62 29  uto_profile, db)
17170 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
17180 77 68 65 72 65 3d 3d 53 51 4c 49 54 45 5f 41 55  where==SQLITE_AU
17190 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47  TOLOGGING_SYSLOG
171a0 20 29 7b 0a 20 20 20 20 20 20 5f 6f 70 65 6e 5f   ){.      _open_
171b0 61 73 6c 5f 6c 6f 67 28 29 3b 0a 20 20 20 20 20  asl_log();.     
171c0 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65   sqlite3_profile
171d0 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75 74  (db, _sqlite_aut
171e0 6f 5f 70 72 6f 66 69 6c 65 5f 73 79 73 6c 6f 67  o_profile_syslog
171f0 2c 20 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , db);.    }.  }
17200 0a 20 20 63 68 61 72 20 2a 65 6e 76 74 72 61 63  .  char *envtrac
17210 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  e = getenv("SQLI
17220 54 45 5f 41 55 54 4f 5f 54 52 41 43 45 22 29 3b  TE_AUTO_TRACE");
17230 0a 20 20 69 66 28 20 65 6e 76 74 72 61 63 65 21  .  if( envtrace!
17240 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74  =NULL ){.    int
17250 20 77 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20   where = 0;.    
17260 69 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70  if( !strncasecmp
17270 28 22 31 22 2c 20 65 6e 76 74 72 61 63 65 2c 20  ("1", envtrace, 
17280 31 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  1) ){.      if( 
17290 69 73 61 74 74 79 28 32 29 20 29 7b 0a 20 20 20  isatty(2) ){.   
172a0 20 20 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c       where = SQL
172b0 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f  ITE_AUTOLOGGING_
172c0 53 54 44 45 52 52 3b 0a 20 20 20 20 20 20 7d 65  STDERR;.      }e
172d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 65  lse{.        whe
172e0 72 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f  re = SQLITE_AUTO
172f0 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a  LOGGING_SYSLOG;.
17300 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
17310 73 65 20 69 66 28 20 21 73 74 72 6e 63 61 73 65  se if( !strncase
17320 63 6d 70 28 22 73 74 64 65 72 72 22 2c 20 65 6e  cmp("stderr", en
17330 76 74 72 61 63 65 2c 20 36 29 20 29 7b 0a 20 20  vtrace, 6) ){.  
17340 20 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49      where = SQLI
17350 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
17360 54 44 45 52 52 3b 0a 20 20 20 20 7d 20 65 6c 73  TDERR;.    } els
17370 65 20 69 66 28 20 21 73 74 72 6e 63 61 73 65 63  e if( !strncasec
17380 6d 70 28 22 73 79 73 6c 6f 67 22 2c 20 65 6e 76  mp("syslog", env
17390 74 72 61 63 65 2c 20 36 29 20 29 7b 0a 20 20 20  trace, 6) ){.   
173a0 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54     where = SQLIT
173b0 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59  E_AUTOLOGGING_SY
173c0 53 4c 4f 47 3b 0a 20 20 20 20 7d 0a 20 20 20 20  SLOG;.    }.    
173d0 69 66 28 20 77 68 65 72 65 3d 3d 53 51 4c 49 54  if( where==SQLIT
173e0 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54  E_AUTOLOGGING_ST
173f0 44 45 52 52 20 29 7b 0a 20 20 20 20 20 20 73 71  DERR ){.      sq
17400 6c 69 74 65 33 5f 74 72 61 63 65 28 64 62 2c 20  lite3_trace(db, 
17410 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61  _sqlite_auto_tra
17420 63 65 2c 20 64 62 29 3b 0a 20 20 20 20 7d 65 6c  ce, db);.    }el
17430 73 65 20 69 66 28 20 77 68 65 72 65 3d 3d 53 51  se if( where==SQ
17440 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47  LITE_AUTOLOGGING
17450 5f 53 59 53 4c 4f 47 20 29 7b 0a 20 20 20 20 20  _SYSLOG ){.     
17460 20 5f 6f 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28 29   _open_asl_log()
17470 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
17480 74 72 61 63 65 28 64 62 2c 20 5f 73 71 6c 69 74  trace(db, _sqlit
17490 65 5f 61 75 74 6f 5f 74 72 61 63 65 5f 73 79 73  e_auto_trace_sys
174a0 6c 6f 67 2c 20 64 62 29 3b 0a 20 20 20 20 7d 0a  log, db);.    }.
174b0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
174c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
174d0 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f   does the work o
174e0 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61  f opening a data
174f0 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f  base on behalf o
17500 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  f.** sqlite3_ope
17510 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  n() and sqlite3_
17520 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61  open16(). The da
17530 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
17540 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a  "zFilename"  .**
17550 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65   is UTF-8 encode
17560 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
17570 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20   openDatabase(. 
17580 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
17590 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62  lename, /* Datab
175a0 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46  ase filename UTF
175b0 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20  -8 encoded */.  
175c0 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
175d0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
175e0 65 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65  eturned database
175f0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73   handle */.  uns
17600 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c  igned int flags,
17610 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e      /* Operation
17620 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  al flags */.  co
17630 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
17640 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
17650 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a  the VFS to use *
17660 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
17670 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
17680 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
17690 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65  allocated handle
176a0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72   here */.  int r
176b0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
176c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
176d0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
176e0 6e 74 20 69 73 54 68 72 65 61 64 73 61 66 65 3b  nt isThreadsafe;
176f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17700 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72 65 61  * True for threa
17710 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  dsafe connection
17720 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70  s */.  char *zOp
17730 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  en = 0;         
17740 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
17750 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70  me argument to p
17760 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e  ass to BtreeOpen
17770 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  () */.  char *zE
17780 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20  rrMsg = 0;      
17790 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
177a0 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71   message from sq
177b0 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 29 20  lite3ParseUri() 
177c0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
177d0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
177e0 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30  OR.  if( ppDb==0
177f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
17800 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
17810 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30  ndif.  *ppDb = 0
17820 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
17830 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
17840 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
17850 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
17860 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
17870 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f  ;.#endif..  /* O
17880 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62  nly allow sensib
17890 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  le combinations 
178a0 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 66  of bits in the f
178b0 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e 20 20  lags argument.  
178c0 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65  .  ** Throw an e
178d0 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d  rror if any non-
178e0 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f  sense combinatio
178f0 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66 20 77  n is used.  If w
17900 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c  e.  ** do not bl
17910 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62  ock illegal comb
17920 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c 20 69  inations here, i
17930 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65 72 0a  t could trigger.
17940 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 73 74    ** assert() st
17950 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65 65 70  atements in deep
17960 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65 6e 73  er layers.  Sens
17970 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ible combination
17980 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a  s.  ** are:.  **
17990 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54  .  **  1:  SQLIT
179a0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a  E_OPEN_READONLY.
179b0 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54 45    **  2:  SQLITE
179c0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
179d0 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54 45    **  6:  SQLITE
179e0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
179f0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
17a00 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73 73 65  EATE.  */.  asse
17a10 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
17a20 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30  READONLY  == 0x0
17a30 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  1 );.  assert( S
17a40 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
17a50 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a  RITE == 0x02 );.
17a60 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
17a70 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20 20 20  _OPEN_CREATE    
17a80 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74 65 73  == 0x04 );.  tes
17a90 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67  tcase( (1<<(flag
17aa0 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f  s&7))==0x02 ); /
17ab0 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20  * READONLY */.  
17ac0 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
17ad0 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34 20 29  lags&7))==0x04 )
17ae0 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 2a  ; /* READWRITE *
17af0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31  /.  testcase( (1
17b00 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78  <<(flags&7))==0x
17b10 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49  40 ); /* READWRI
17b20 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20  TE | CREATE */. 
17b30 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61 67 73   if( ((1<<(flags
17b40 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d 30 20  &7)) & 0x46)==0 
17b50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
17b60 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
17b70 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 35 34  ;  /* IMP: R-654
17b80 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20 20 7d 0a  97-44594 */.  }.
17b90 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
17ba0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
17bb0 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Mutex==0 ){.    
17bc0 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30  isThreadsafe = 0
17bd0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
17be0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
17bf0 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20  N_NOMUTEX ){.   
17c00 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
17c10 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  0;.  }else if( f
17c20 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
17c30 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a  EN_FULLMUTEX ){.
17c40 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
17c50 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
17c60 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
17c70 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
17c80 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
17c90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
17ca0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
17cb0 50 52 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a  PRIVATECACHE ){.
17cc0 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
17cd0 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
17ce0 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69  CACHE;.  }else i
17cf0 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
17d00 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
17d10 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20  heEnabled ){.   
17d20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
17d30 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
17d40 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d  E;.  }..  /* Rem
17d50 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73  ove harmful bits
17d60 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20   from the flags 
17d70 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20  parameter.  **. 
17d80 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f   ** The SQLITE_O
17d90 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20  PEN_NOMUTEX and 
17da0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
17db0 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65 72 65  MUTEX flags were
17dc0 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68  .  ** dealt with
17dd0 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
17de0 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65   code block.  Be
17df0 73 69 64 65 73 20 74 68 65 73 65 2c 20 74 68 65  sides these, the
17e00 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64   only.  ** valid
17e10 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72   input flags for
17e20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
17e30 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50  () are SQLITE_OP
17e40 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a  EN_READONLY,.  *
17e50 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  * SQLITE_OPEN_RE
17e60 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f  ADWRITE, SQLITE_
17e70 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c  OPEN_CREATE, SQL
17e80 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
17e90 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  ACHE,.  ** SQLIT
17ea0 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
17eb0 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65  CHE, and some re
17ec0 73 65 72 76 65 64 20 62 69 74 73 2e 20 20 53 69  served bits.  Si
17ed0 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a  lently mask.  **
17ee0 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66   off all other f
17ef0 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61  lags..  */.  fla
17f00 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45  gs &=  ~( SQLITE
17f10 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
17f20 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  OSE |.          
17f30 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
17f40 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
17f50 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
17f60 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
17f70 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
17f80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
17f90 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20  P_DB | .        
17fa0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
17fb0 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
17fc0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
17fd0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
17fe0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  IN_JOURNAL | .  
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18000 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
18010 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
18020 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
18030 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c  PEN_SUBJOURNAL |
18040 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
18050 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53   SQLITE_OPEN_MAS
18060 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20  TER_JOURNAL |.  
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18080 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
18090 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
180a0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55    SQLITE_OPEN_FU
180b0 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20  LLMUTEX |.      
180c0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
180d0 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20  OPEN_WAL.       
180e0 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41        );..  /* A
180f0 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
18100 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  te data structur
18110 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69  e */.  db = sqli
18120 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
18130 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29  izeof(sqlite3) )
18140 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20  ;.  if( db==0 ) 
18150 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
18160 0a 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73  .  if( isThreads
18170 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  afe ){.    db->m
18180 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
18190 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
181a0 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29  MUTEX_RECURSIVE)
181b0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75  ;.    if( db->mu
181c0 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
181d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29  sqlite3_free(db)
181e0 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a  ;.      db = 0;.
181f0 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64        goto opend
18200 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  b_out;.    }.  }
18210 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
18220 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
18230 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b  );.  db->errMask
18240 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e   = 0xff;.  db->n
18250 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61  Db = 2;.  db->ma
18260 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
18270 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61  IC_BUSY;.  db->a
18280 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74  Db = db->aDbStat
18290 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ic;..  assert( s
182a0 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
182b0 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c  )==sizeof(aHardL
182c0 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70  imit) );.  memcp
182d0 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48  y(db->aLimit, aH
182e0 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66  ardLimit, sizeof
182f0 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20  (db->aLimit));. 
18300 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
18310 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
18320 54 48 52 45 41 44 53 5d 20 3d 20 53 51 4c 49 54  THREADS] = SQLIT
18330 45 5f 44 45 46 41 55 4c 54 5f 57 4f 52 4b 45 52  E_DEFAULT_WORKER
18340 5f 54 48 52 45 41 44 53 3b 0a 20 20 64 62 2d 3e  _THREADS;.  db->
18350 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
18360 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61    db->nextAutova
18370 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a  c = -1;.  db->sz
18380 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65 33 47 6c  Mmap = sqlite3Gl
18390 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
183a0 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67  p;.  db->nextPag
183b0 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d  esize = 0;.  db-
183c0 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20  >nMaxSorterMmap 
183d0 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20 20  = 0x7FFFFFFF;.  
183e0 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
183f0 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
18400 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c  s | SQLITE_Enabl
18410 65 54 72 69 67 67 65 72 20 7c 20 53 51 4c 49 54  eTrigger | SQLIT
18420 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a 23 69 66  E_CacheSpill.#if
18430 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
18440 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54  _DEFAULT_AUTOMAT
18450 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c  IC_INDEX) || SQL
18460 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
18470 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20  MATIC_INDEX.    
18480 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
18490 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a  QLITE_AutoIndex.
184a0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
184b0 45 5f 44 45 46 41 55 4c 54 5f 43 4b 50 54 46 55  E_DEFAULT_CKPTFU
184c0 4c 4c 46 53 59 4e 43 0a 20 20 20 20 20 20 20 20  LLFSYNC.        
184d0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
184e0 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63 0a  E_CkptFullFSync.
184f0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
18500 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46  E_DEFAULT_FILE_F
18510 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20  ORMAT<4.        
18520 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
18530 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a  E_LegacyFileFmt.
18540 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
18550 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  LITE_ENABLE_LOAD
18560 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20  _EXTENSION.     
18570 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
18580 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69  LITE_LoadExtensi
18590 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  on.#endif.#if SQ
185a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43  LITE_DEFAULT_REC
185b0 55 52 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a  URSIVE_TRIGGERS.
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185d0 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69   | SQLITE_RecTri
185e0 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66  ggers.#endif.#if
185f0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
18600 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
18610 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f  KEYS) && SQLITE_
18620 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
18630 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20 20 20  KEYS.           
18640 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46        | SQLITE_F
18650 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69  oreignKeys.#endi
18660 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
18670 4c 49 54 45 5f 52 45 56 45 52 53 45 5f 55 4e 4f  LITE_REVERSE_UNO
18680 52 44 45 52 45 44 5f 53 45 4c 45 43 54 53 29 0a  RDERED_SELECTS).
18690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186a0 20 7c 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73   | SQLITE_Revers
186b0 65 4f 72 64 65 72 0a 23 65 6e 64 69 66 0a 23 69  eOrder.#endif.#i
186c0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
186d0 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
186e0 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20  _CELL_CHECK).   
186f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18700 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43  SQLITE_CellSizeC
18710 6b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  k.#endif.#if def
18720 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
18730 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45  LE_FTS3_TOKENIZE
18740 52 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R).             
18750 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 74 73      | SQLITE_Fts
18760 33 54 6f 6b 65 6e 69 7a 65 72 0a 23 65 6e 64 69  3Tokenizer.#endi
18770 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69  f.      ;.  sqli
18780 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
18790 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e  >aCollSeq);.#ifn
187a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
187b0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
187c0 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
187d0 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65  db->aModule);.#e
187e0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74  ndif..  /* Add t
187f0 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
18800 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49  tion sequence BI
18810 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72  NARY. BINARY wor
18820 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d  ks for both UTF-
18830 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31  8.  ** and UTF-1
18840 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72 73  6, so add a vers
18850 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20  ion for each to 
18860 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65  avoid any unnece
18870 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65  ssary.  ** conve
18880 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79  rsions. The only
18890 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20   error that can 
188a0 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61 20  occur here is a 
188b0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
188c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 56 49 44  ..  **.  ** EVID
188d0 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 37 38 36  ENCE-OF: R-52786
188e0 2d 34 34 38 37 38 20 53 51 4c 69 74 65 20 64 65  -44878 SQLite de
188f0 66 69 6e 65 73 20 74 68 72 65 65 20 62 75 69 6c  fines three buil
18900 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20  t-in collating. 
18910 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 20   ** functions:. 
18920 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c   */.  createColl
18930 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65  ation(db, sqlite
18940 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49  3StrBINARY, SQLI
18950 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43  TE_UTF8, 0, binC
18960 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
18970 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
18980 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e  b, sqlite3StrBIN
18990 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  ARY, SQLITE_UTF1
189a0 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  6BE, 0, binCollF
189b0 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
189c0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73  eCollation(db, s
189d0 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c  qlite3StrBINARY,
189e0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
189f0 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
18a00 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
18a10 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41  lation(db, "NOCA
18a20 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  SE", SQLITE_UTF8
18a30 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61  , 0, nocaseColla
18a40 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 20 20  tingFunc, 0);.  
18a50 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
18a60 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c  db, "RTRIM", SQL
18a70 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a  ITE_UTF8, (void*
18a80 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c  )1, binCollFunc,
18a90 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
18aa0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
18ab0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
18ac0 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45 56 49  ut;.  }.  /* EVI
18ad0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 33 30  DENCE-OF: R-0830
18ae0 38 2d 31 37 32 32 34 20 54 68 65 20 64 65 66 61  8-17224 The defa
18af0 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  ult collating fu
18b00 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 0a 20  nction for all. 
18b10 20 2a 2a 20 73 74 72 69 6e 67 73 20 69 73 20 42   ** strings is B
18b20 49 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a 20 20 64  INARY. .  */.  d
18b30 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73  b->pDfltColl = s
18b40 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
18b50 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46  q(db, SQLITE_UTF
18b60 38 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e  8, sqlite3StrBIN
18b70 41 52 59 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ARY, 0);.  asser
18b80 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  t( db->pDfltColl
18b90 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72  !=0 );..  /* Par
18ba0 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f  se the filename/
18bb0 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f  URI argument. */
18bc0 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73  .  db->openFlags
18bd0 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d   = flags;.  rc =
18be0 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
18bf0 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (zVfs, zFilename
18c00 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70  , &flags, &db->p
18c10 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45  Vfs, &zOpen, &zE
18c20 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63  rrMsg);.  if( rc
18c30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18c40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18c50 45 5f 4e 4f 4d 45 4d 20 29 20 73 71 6c 69 74 65  E_NOMEM ) sqlite
18c60 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
18c70 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
18c80 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 7a  ithMsg(db, rc, z
18c90 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20  ErrMsg ? "%s" : 
18ca0 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  0, zErrMsg);.   
18cb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
18cc0 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f 74 6f  rrMsg);.    goto
18cd0 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
18ce0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
18cf0 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61 73 65  backend database
18d00 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72 63 20   driver */.  rc 
18d10 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  = sqlite3BtreeOp
18d20 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a 4f 70  en(db->pVfs, zOp
18d30 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44 62  en, db, &db->aDb
18d40 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20  [0].pBt, 0,.    
18d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d60 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49      flags | SQLI
18d70 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
18d80 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
18d90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
18da0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
18db0 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  R_NOMEM ){.     
18dc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
18dd0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
18de0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
18df0 64 62 2c 20 72 63 29 3b 0a 20 20 20 20 67 6f 74  db, rc);.    got
18e00 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
18e10 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
18e20 45 6e 74 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d  Enter(db->aDb[0]
18e30 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62  .pBt);.  db->aDb
18e40 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71  [0].pSchema = sq
18e50 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
18e60 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  b, db->aDb[0].pB
18e70 74 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  t);.  if( !db->m
18e80 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 45 4e  allocFailed ) EN
18e90 43 28 64 62 29 20 3d 20 53 43 48 45 4d 41 5f 45  C(db) = SCHEMA_E
18ea0 4e 43 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  NC(db);.  sqlite
18eb0 33 42 74 72 65 65 4c 65 61 76 65 28 64 62 2d 3e  3BtreeLeave(db->
18ec0 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64  aDb[0].pBt);.  d
18ed0 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
18ee0 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
18ef0 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 20 20  aGet(db, 0);..  
18f00 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73  /* The default s
18f10 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20  afety_level for 
18f20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
18f30 65 20 69 73 20 46 55 4c 4c 3b 20 66 6f 72 20 74  e is FULL; for t
18f40 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74  he temp.  ** dat
18f50 61 62 61 73 65 20 69 74 20 69 73 20 4f 46 46 2e  abase it is OFF.
18f60 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
18f70 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64 65  e pager layer de
18f80 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  faults.  .  */. 
18f90 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62 53   db->aDb[0].zDbS
18fa0 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
18fb0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65   db->aDb[0].safe
18fc0 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54  ty_level = SQLIT
18fd0 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52  E_DEFAULT_SYNCHR
18fe0 4f 4e 4f 55 53 2b 31 3b 0a 20 20 64 62 2d 3e 61  ONOUS+1;.  db->a
18ff0 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d  Db[1].zDbSName =
19000 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61   "temp";.  db->a
19010 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[1].safety_lev
19020 65 6c 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 48  el = PAGER_SYNCH
19030 52 4f 4e 4f 55 53 5f 4f 46 46 3b 0a 0a 20 20 64  RONOUS_OFF;..  d
19040 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
19050 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20  E_MAGIC_OPEN;.  
19060 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
19070 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
19080 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
19090 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  ..  /* Register 
190a0 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e  all built-in fun
190b0 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e  ctions, but do n
190c0 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ot attempt to re
190d0 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  ad the.  ** data
190e0 62 61 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e  base schema yet.
190f0 20 54 68 69 73 20 69 73 20 64 65 6c 61 79 65 64   This is delayed
19100 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
19110 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61   time the databa
19120 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73  se.  ** is acces
19130 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  sed..  */.  sqli
19140 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
19150 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74  ITE_OK);.  sqlit
19160 65 33 52 65 67 69 73 74 65 72 50 65 72 43 6f 6e  e3RegisterPerCon
19170 6e 65 63 74 69 6f 6e 42 75 69 6c 74 69 6e 46 75  nectionBuiltinFu
19180 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 20 20 72  nctions(db);.  r
19190 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
191a0 6f 64 65 28 64 62 29 3b 0a 0a 23 69 66 64 65 66  ode(db);..#ifdef
191b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
191c0 54 53 35 0a 20 20 2f 2a 20 52 65 67 69 73 74 65  TS5.  /* Registe
191d0 72 20 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20 46  r any built-in F
191e0 54 53 35 20 6d 6f 64 75 6c 65 20 62 65 66 6f 72  TS5 module befor
191f0 65 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 61 75  e loading the au
19200 74 6f 6d 61 74 69 63 0a 20 20 2a 2a 20 65 78 74  tomatic.  ** ext
19210 65 6e 73 69 6f 6e 73 2e 20 54 68 69 73 20 61 6c  ensions. This al
19220 6c 6f 77 73 20 61 75 74 6f 6d 61 74 69 63 20 65  lows automatic e
19230 78 74 65 6e 73 69 6f 6e 73 20 74 6f 20 72 65 67  xtensions to reg
19240 69 73 74 65 72 20 46 54 53 35 20 0a 20 20 2a 2a  ister FTS5 .  **
19250 20 74 6f 6b 65 6e 69 7a 65 72 73 20 61 6e 64 20   tokenizers and 
19260 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69  auxiliary functi
19270 6f 6e 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21  ons.  */.  if( !
19280 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19290 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
192a0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
192b0 6c 69 74 65 33 46 74 73 35 49 6e 69 74 28 64 62  lite3Fts5Init(db
192c0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
192d0 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74   /* Load automat
192e0 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20  ic extensions - 
192f0 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20  extensions that 
19300 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74  have been regist
19310 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20  ered.  ** using 
19320 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f  the sqlite3_auto
19330 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28  matic_extension(
19340 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 69 66  ) API..  */.  if
19350 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19360 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75  ){.    sqlite3Au
19370 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73  toLoadExtensions
19380 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  (db);.    rc = s
19390 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
193a0 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  b);.    if( rc!=
193b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
193c0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
193d0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  ut;.    }.  }..#
193e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
193f0 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21  BLE_FTS1.  if( !
19400 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19410 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69   ){.    extern i
19420 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e  nt sqlite3Fts1In
19430 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  it(sqlite3*);.  
19440 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
19450 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s1Init(db);.  }.
19460 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
19470 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
19480 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  2.  if( !db->mal
19490 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
194a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
194b0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
194c0 69 74 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c  ite3Fts2Init(sql
194d0 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d  ite3*);.    rc =
194e0 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74   sqlite3Fts2Init
194f0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
19500 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
19510 45 4e 41 42 4c 45 5f 46 54 53 33 20 2f 2a 20 61  ENABLE_FTS3 /* a
19520 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 66  utomatically def
19530 69 6e 65 64 20 62 79 20 53 51 4c 49 54 45 5f 45  ined by SQLITE_E
19540 4e 41 42 4c 45 5f 46 54 53 34 20 2a 2f 0a 20 20  NABLE_FTS4 */.  
19550 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
19560 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
19570 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
19580 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e   = sqlite3Fts3In
19590 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
195a0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
195b0 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69  E_ENABLE_ICU.  i
195c0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
195d0 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
195e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
195f0 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74  = sqlite3IcuInit
19600 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
19610 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
19620 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69  ENABLE_RTREE.  i
19630 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
19640 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
19650 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d  TE_OK){.    rc =
19660 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69   sqlite3RtreeIni
19670 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
19680 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
19690 5f 45 4e 41 42 4c 45 5f 44 42 53 54 41 54 5f 56  _ENABLE_DBSTAT_V
196a0 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TAB.  if( !db->m
196b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
196c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20  c==SQLITE_OK){. 
196d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 44     rc = sqlite3D
196e0 62 73 74 61 74 52 65 67 69 73 74 65 72 28 64 62  bstatRegister(db
196f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
19700 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
19710 42 4c 45 5f 4a 53 4f 4e 31 0a 20 20 69 66 28 20  BLE_JSON1.  if( 
19720 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
19730 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
19740 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  OK){.    rc = sq
19750 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64  lite3Json1Init(d
19760 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
19770 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45    /* -DSQLITE_DE
19780 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
19790 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55  DE=1 makes EXCLU
197a0 53 49 56 45 20 74 68 65 20 64 65 66 61 75 6c 74  SIVE the default
197b0 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
197c0 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45  de.  -DSQLITE_DE
197d0 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
197e0 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c  DE=0 make NORMAL
197f0 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
19800 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
19810 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61   Doing nothing a
19820 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73  t all also makes
19830 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61   NORMAL the defa
19840 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ult..  */.#ifdef
19850 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
19860 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64  LOCKING_MODE.  d
19870 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20  b->dfltLockMode 
19880 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
19890 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20  _LOCKING_MODE;. 
198a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
198b0 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33  kingMode(sqlite3
198c0 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61  BtreePager(db->a
198d0 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20  Db[0].pBt),.    
198e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46        SQLITE_DEF
19900 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
19910 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  E);.#endif..  if
19920 28 20 72 63 20 29 20 73 71 6c 69 74 65 33 45 72  ( rc ) sqlite3Er
19930 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20  ror(db, rc);..  
19940 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f  /* Enable the lo
19950 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73  okaside-malloc s
19960 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65  ubsystem */.  se
19970 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c  tupLookaside(db,
19980 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   0, sqlite3Globa
19990 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73  lConfig.szLookas
199a0 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
199c0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
199d0 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20  .nLookaside);.. 
199e0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
199f0 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  ocheckpoint(db, 
19a00 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
19a10 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e  AL_AUTOCHECKPOIN
19a20 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a  T);..opendb_out:
19a30 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20  .  if( db ){.   
19a40 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74   assert( db->mut
19a50 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61  ex!=0 || isThrea
19a60 64 73 61 66 65 3d 3d 30 0a 20 20 20 20 20 20 20  dsafe==0.       
19a70 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c      || sqlite3Gl
19a80 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
19a90 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Mutex==0 );.    
19aa0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
19ab0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
19ac0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
19ad0 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
19ae0 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
19af0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
19b00 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  MEM );.  if( rc=
19b10 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
19b20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
19b30 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d  se(db);.    db =
19b40 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
19b50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19b60 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
19b70 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49   SQLITE_MAGIC_SI
19b80 43 4b 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66 69  CK;.  }.#if defi
19b90 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
19ba0 26 20 45 4e 41 42 4c 45 5f 46 4f 52 43 45 5f 57  & ENABLE_FORCE_W
19bb0 41 4c 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  AL.  if( db && !
19bc0 72 63 20 29 7b 0a 20 20 20 20 69 66 20 28 28 30  rc ){.    if ((0
19bd0 20 3d 3d 20 61 63 63 65 73 73 28 22 2f 76 61 72   == access("/var
19be0 2f 64 62 2f 65 6e 61 62 6c 65 46 6f 72 63 65 57  /db/enableForceW
19bf0 41 4c 22 2c 20 52 5f 4f 4b 29 29 29 20 7b 0a 23  AL", R_OK))) {.#
19c00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
19c10 55 47 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  UG.      fprintf
19c20 28 73 74 64 65 72 72 2c 20 22 53 51 4c 69 74 65  (stderr, "SQLite
19c30 20 57 41 4c 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   WAL journal_mod
19c40 65 20 45 4e 41 42 4c 45 44 20 62 79 20 64 65 66  e ENABLED by def
19c50 61 75 6c 74 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69  ault.\n");.#endi
19c60 66 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 73  f.      .      s
19c70 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
19c80 22 70 72 61 67 6d 61 20 6a 6f 75 72 6e 61 6c 5f  "pragma journal_
19c90 6d 6f 64 65 3d 77 61 6c 22 2c 20 4e 55 4c 4c 2c  mode=wal", NULL,
19ca0 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 23 69   NULL, NULL);.#i
19cb0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
19cc0 47 0a 2f 2f 20 20 20 20 7d 20 65 6c 73 65 20 7b  G.//    } else {
19cd0 0a 2f 2f 20 20 20 20 20 20 66 70 72 69 6e 74 66  .//      fprintf
19ce0 28 73 74 64 65 72 72 2c 20 22 53 51 4c 69 74 65  (stderr, "SQLite
19cf0 20 57 41 4c 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   WAL journal_mod
19d00 65 20 4e 4f 54 20 45 4e 41 42 4c 45 44 20 62 79  e NOT ENABLED by
19d10 20 64 65 66 61 75 6c 74 2e 5c 6e 22 29 3b 0a 23   default.\n");.#
19d20 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
19d30 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
19d40 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
19d50 5f 41 55 54 4f 5f 50 52 4f 46 49 4c 45 29 0a 20  _AUTO_PROFILE). 
19d60 20 69 66 28 20 64 62 20 26 26 20 21 72 63 20 29   if( db && !rc )
19d70 7b 0a 20 20 20 20 65 6e 61 62 6c 65 41 75 74 6f  {.    enableAuto
19d80 4c 6f 67 67 69 6e 67 28 64 62 29 3b 0a 20 20 7d  Logging(db);.  }
19d90 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20  .#endif.  *ppDb 
19da0 3d 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c  = db;.#ifdef SQL
19db0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 52 52  ITE_ENABLE_SQLRR
19dc0 0a 20 20 53 52 52 65 63 4f 70 65 6e 28 64 62 2c  .  SRRecOpen(db,
19dd0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 66 6c 61 67   zFilename, flag
19de0 73 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  s);.#endif.#ifde
19df0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
19e00 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c  SQLLOG.  if( sql
19e10 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
19e20 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20  .xSqllog ){.    
19e30 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64 62 20  /* Opening a db 
19e40 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70  handle. Fourth p
19e50 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73  arameter is pass
19e60 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f 69  ed 0. */.    voi
19e70 64 20 2a 70 41 72 67 20 3d 20 73 71 6c 69 74 65  d *pArg = sqlite
19e80 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
19e90 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73 71  qllogArg;.    sq
19ea0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
19eb0 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c 20  g.xSqllog(pArg, 
19ec0 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30  db, zFilename, 0
19ed0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  );.  }.#endif.#i
19ee0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
19ef0 5f 48 41 53 5f 43 4f 44 45 43 29 0a 20 20 69 66  _HAS_CODEC).  if
19f00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19f10 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
19f20 72 20 2a 7a 48 65 78 4b 65 79 20 3d 20 73 71 6c  r *zHexKey = sql
19f30 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
19f40 65 72 28 7a 4f 70 65 6e 2c 20 22 68 65 78 6b 65  er(zOpen, "hexke
19f50 79 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 48 65  y");.    if( zHe
19f60 78 4b 65 79 20 26 26 20 7a 48 65 78 4b 65 79 5b  xKey && zHexKey[
19f70 30 5d 20 29 7b 0a 20 20 20 20 20 20 75 38 20 69  0] ){.      u8 i
19f80 42 79 74 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Byte;.      int 
19f90 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4b  i;.      char zK
19fa0 65 79 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66 6f  ey[40];.      fo
19fb0 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b 20  r(i=0, iByte=0; 
19fc0 69 3c 73 69 7a 65 6f 66 28 7a 4b 65 79 29 2a 32  i<sizeof(zKey)*2
19fd0 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
19fe0 67 69 74 28 7a 48 65 78 4b 65 79 5b 69 5d 29 3b  git(zHexKey[i]);
19ff0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
1a000 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c 34  Byte = (iByte<<4
1a010 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54 6f  ) + sqlite3HexTo
1a020 49 6e 74 28 7a 48 65 78 4b 65 79 5b 69 5d 29 3b  Int(zHexKey[i]);
1a030 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69 26  .        if( (i&
1a040 31 29 21 3d 30 20 29 20 7a 4b 65 79 5b 69 2f 32  1)!=0 ) zKey[i/2
1a050 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20 20 20 20  ] = iByte;.     
1a060 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1a070 5f 6b 65 79 5f 76 32 28 64 62 2c 20 30 2c 20 7a  _key_v2(db, 0, z
1a080 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20 7d  Key, i/2);.    }
1a090 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
1a0a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e  lite3_free(zOpen
1a0b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26  );.  return rc &
1a0c0 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   0xff;.}../*.** 
1a0d0 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
1a0e0 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
1a0f0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  nt sqlite3_open(
1a100 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a110 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
1a120 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a  ite3 **ppDb .){.
1a130 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
1a140 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c  abase(zFilename,
1a150 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1a170 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1a180 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
1a190 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69  _CREATE, 0);.}.i
1a1a0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  nt sqlite3_open_
1a1b0 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  v2(.  const char
1a1c0 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a   *filename,   /*
1a1d0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
1a1e0 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  me (UTF-8) */.  
1a1f0 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
1a200 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1a210 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65  SQLite db handle
1a220 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
1a230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a240 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   Flags */.  cons
1a250 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20  t char *zVfs    
1a260 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56      /* Name of V
1a270 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65  FS module to use
1a280 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
1a290 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c  openDatabase(fil
1a2a0 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e  ename, ppDb, (un
1a2b0 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67 73  signed int)flags
1a2c0 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e  , zVfs);.}..#ifn
1a2d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a2e0 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  UTF16./*.** Open
1a2f0 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
1a300 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
1a310 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20  qlite3_open16(. 
1a320 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
1a330 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
1a340 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63  e3 **ppDb.){.  c
1a350 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
1a360 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c  name8;   /* zFil
1a370 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e  ename encoded in
1a380 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f   UTF-8 instead o
1a390 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71  f UTF-16 */.  sq
1a3a0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
1a3b0 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  l;.  int rc;..#i
1a3c0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1a3d0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1a3e0 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65 74  f( ppDb==0 ) ret
1a3f0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1a400 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
1a410 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e   *ppDb = 0;.#ifn
1a420 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a430 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20  AUTOINIT.  rc = 
1a440 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
1a450 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
1a460 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
1a470 69 66 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  if.  if( zFilena
1a480 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65 6e 61 6d  me==0 ) zFilenam
1a490 65 20 3d 20 22 5c 30 30 30 5c 30 30 30 22 3b 0a  e = "\000\000";.
1a4a0 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
1a4b0 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
1a4c0 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
1a4d0 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c  r(pVal, -1, zFil
1a4e0 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  ename, SQLITE_UT
1a4f0 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54  F16NATIVE, SQLIT
1a500 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69  E_STATIC);.  zFi
1a510 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65  lename8 = sqlite
1a520 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c  3ValueText(pVal,
1a530 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
1a540 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20   if( zFilename8 
1a550 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  ){.    rc = open
1a560 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61  Database(zFilena
1a570 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20  me8, ppDb,.     
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a590 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1a5a0 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
1a5b0 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b  OPEN_CREATE, 0);
1a5c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70  .    assert( *pp
1a5d0 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  Db || rc==SQLITE
1a5e0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66  _NOMEM );.    if
1a5f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a600 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  && !DbHasPropert
1a610 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53  y(*ppDb, 0, DB_S
1a620 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a  chemaLoaded) ){.
1a630 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43        SCHEMA_ENC
1a640 28 2a 70 70 44 62 29 20 3d 20 45 4e 43 28 2a 70  (*ppDb) = ENC(*p
1a650 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54  pDb) = SQLITE_UT
1a660 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d  F16NATIVE;.    }
1a670 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1a680 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
1a690 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
1a6a0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
1a6b0 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  l);..  return rc
1a6c0 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e 64 69   & 0xff;.}.#endi
1a6d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1a6e0 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
1a6f0 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
1a700 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1a710 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
1a720 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
1a730 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
1a740 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
1a750 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
1a760 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a770 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
1a780 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
1a790 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
1a7a0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
1a7b0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
1a7c0 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72 65  t void*).){.  re
1a7d0 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
1a7e0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
1a7f0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c  (db, zName, enc,
1a800 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
1a810 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   0);.}../*.** Re
1a820 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
1a830 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1a840 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1a850 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
1a860 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
1a870 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
1a880 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
1a890 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a8a0 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
1a8b0 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
1a8c0 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
1a8d0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
1a8e0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
1a8f0 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
1a900 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
1a910 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
1a920 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1a930 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1a940 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1a950 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
1a960 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
1a970 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1a980 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
1a990 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1a9a0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1a9b0 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
1a9c0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
1a9d0 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
1a9e0 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  ion(db, zName, (
1a9f0 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  u8)enc, pCtx, xC
1aa00 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20  ompare, xDel);. 
1aa10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
1aa20 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
1aa30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1aa40 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1aa50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1aa60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1aa70 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
1aa80 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
1aa90 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1aaa0 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
1aab0 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
1aac0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
1aad0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36  eate_collation16
1aae0 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
1aaf0 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
1ab00 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63  zName,.  int enc
1ab10 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
1ab20 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
1ab30 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
1ab40 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
1ab50 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  t void*).){.  in
1ab60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ab70 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38  ;.  char *zName8
1ab80 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1ab90 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1aba0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1abb0 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1abc0 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20  ) || zName==0 ) 
1abd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1abe0 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1abf0 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1ac00 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1ac10 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
1ac20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1ac30 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71  );.  zName8 = sq
1ac40 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62  lite3Utf16to8(db
1ac50 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
1ac60 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
1ac70 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29  ;.  if( zName8 )
1ac80 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74  {.    rc = creat
1ac90 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
1aca0 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20  Name8, (u8)enc, 
1acb0 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
1acc0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
1acd0 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38  bFree(db, zName8
1ace0 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
1acf0 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
1ad00 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
1ad10 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1ad20 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1ad30 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
1ad40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1ad50 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
1ad60 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
1ad70 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
1ad80 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
1ad90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1ada0 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
1adb0 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
1adc0 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
1add0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1ade0 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
1adf0 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
1ae00 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69  n_needed(.  sqli
1ae10 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
1ae20 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
1ae30 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
1ae40 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71  Needed)(void*,sq
1ae50 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
1ae60 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  Rep,const char*)
1ae70 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
1ae80 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1ae90 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1aea0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1aeb0 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1aec0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1aed0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1aee0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1aef0 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78  >mutex);.  db->x
1af00 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f  CollNeeded = xCo
1af10 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e  llNeeded;.  db->
1af20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
1af30 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65  0;.  db->pCollNe
1af40 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e  ededArg = pCollN
1af50 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69  eededArg;.  sqli
1af60 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1af70 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1af80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1af90 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1afa0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
1afb0 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
1afc0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1afd0 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
1afe0 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
1aff0 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
1b000 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
1b010 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
1b020 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
1b030 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
1b040 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
1b050 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36  llation_needed16
1b060 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1b070 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e   .  void *pCollN
1b080 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69  eededArg, .  voi
1b090 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  d(*xCollNeeded16
1b0a0 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a  )(void*,sqlite3*
1b0b0 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f  ,int eTextRep,co
1b0c0 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23 69  nst void*).){.#i
1b0d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1b0e0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1b0f0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1b100 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
1b110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1b120 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1b130 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b140 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1b150 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
1b160 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  eded = 0;.  db->
1b170 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
1b180 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20  xCollNeeded16;. 
1b190 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
1b1a0 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
1b1b0 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
1b1c0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1b1d0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1b1e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1b1f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1b200 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69  MIT_UTF16 */..#i
1b210 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b220 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
1b230 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1b240 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68   is now an anach
1b250 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20  ronism. It used 
1b260 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  to be used to re
1b270 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20  cover from a.** 
1b280 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
1b290 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77  , but SQLite now
1b2a0 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d   does this autom
1b2b0 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  atically..*/.int
1b2c0 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f   sqlite3_global_
1b2d0 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20  recover(void){. 
1b2e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b2f0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
1b300 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77  ** Test to see w
1b310 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
1b320 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1b330 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f  ction is in auto
1b340 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20  commit.** mode. 
1b350 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1b360 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20  it is and FALSE 
1b370 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d  if not.  Autocom
1b380 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a  mit mode is on.*
1b390 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41  * by default.  A
1b3a0 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73  utocommit is dis
1b3b0 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e  abled by a BEGIN
1b3c0 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
1b3d0 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74  eenabled.** by t
1b3e0 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f  he next COMMIT o
1b3f0 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69  r ROLLBACK..*/.i
1b400 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  nt sqlite3_get_a
1b410 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65  utocommit(sqlite
1b420 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
1b430 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1b440 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1b450 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1b460 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
1b470 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
1b480 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
1b490 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
1b4a0 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75  .  return db->au
1b4b0 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a  toCommit;.}../*.
1b4c0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1b4d0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75   routines are su
1b4e0 62 73 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f  bstitutes for co
1b4f0 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43  nstants SQLITE_C
1b500 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54  ORRUPT,.** SQLIT
1b510 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45  E_MISUSE, SQLITE
1b520 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54  _CANTOPEN, SQLIT
1b530 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 70 6f 73 73  E_NOMEM and poss
1b540 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72  ibly other error
1b550 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20  .** constants.  
1b560 54 68 65 79 20 73 65 72 76 65 20 74 77 6f 20 70  They serve two p
1b570 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  urposes:.**.**  
1b580 20 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20   1.  Serve as a 
1b590 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65  convenient place
1b5a0 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
1b5b0 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67  oint in a debugg
1b5c0 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64  er.**       to d
1b5d0 65 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69  etect when versi
1b5e0 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  on error conditi
1b5f0 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ons occurs..**.*
1b600 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73  *   2.  Invoke s
1b610 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20  qlite3_log() to 
1b620 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72  provide the sour
1b630 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e  ce code location
1b640 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20   where.**       
1b650 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  a low-level erro
1b660 72 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63  r is first detec
1b670 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
1b680 6e 74 20 72 65 70 6f 72 74 45 72 72 6f 72 28 69  nt reportError(i
1b690 6e 74 20 69 45 72 72 2c 20 69 6e 74 20 6c 69 6e  nt iErr, int lin
1b6a0 65 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  eno, const char 
1b6b0 2a 7a 54 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  *zType){.  sqlit
1b6c0 65 33 5f 6c 6f 67 28 69 45 72 72 2c 20 22 25 73  e3_log(iErr, "%s
1b6d0 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
1b6e0 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
1b6f0 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 6c 69         zType, li
1b700 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33  neno, 20+sqlite3
1b710 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20  _sourceid());.  
1b720 72 65 74 75 72 6e 20 69 45 72 72 3b 0a 7d 0a 69  return iErr;.}.i
1b730 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70  nt sqlite3Corrup
1b740 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  tError(int linen
1b750 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
1b760 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b770 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
1b780 20 72 65 74 75 72 6e 20 72 65 70 6f 72 74 45 72   return reportEr
1b790 72 6f 72 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  ror(SQLITE_CORRU
1b7a0 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20 22 64 61 74  PT, lineno, "dat
1b7b0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1b7c0 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ");.}.int sqlite
1b7d0 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e 74  3MisuseError(int
1b7e0 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
1b7f0 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
1b800 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
1b810 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  0 );.  return re
1b820 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45  portError(SQLITE
1b830 5f 4d 49 53 55 53 45 2c 20 6c 69 6e 65 6e 6f 2c  _MISUSE, lineno,
1b840 20 22 6d 69 73 75 73 65 22 29 3b 0a 7d 0a 69 6e   "misuse");.}.in
1b850 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65  t sqlite3Cantope
1b860 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  nError(int linen
1b870 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
1b880 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b890 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
1b8a0 20 72 65 74 75 72 6e 20 72 65 70 6f 72 74 45 72   return reportEr
1b8b0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
1b8c0 50 45 4e 2c 20 6c 69 6e 65 6e 6f 2c 20 22 63 61  PEN, lineno, "ca
1b8d0 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 22 29  nnot open file")
1b8e0 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;.}.#ifdef SQLIT
1b8f0 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69  E_DEBUG.int sqli
1b900 74 65 33 4e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e  te3NomemError(in
1b910 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
1b920 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
1b930 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
1b940 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
1b950 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54  eportError(SQLIT
1b960 45 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c  E_NOMEM, lineno,
1b970 20 22 4f 4f 4d 22 29 3b 0a 7d 0a 69 6e 74 20 73   "OOM");.}.int s
1b980 71 6c 69 74 65 33 49 6f 65 72 72 6e 6f 6d 65 6d  qlite3Ioerrnomem
1b990 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
1b9a0 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
1b9b0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b9c0 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
1b9d0 72 65 74 75 72 6e 20 72 65 70 6f 72 74 45 72 72  return reportErr
1b9e0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1b9f0 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22  NOMEM, lineno, "
1ba00 49 2f 4f 20 4f 4f 4d 20 65 72 72 6f 72 22 29 3b  I/O OOM error");
1ba10 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
1ba20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
1ba30 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
1ba40 54 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e  This is a conven
1ba50 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68  ience routine th
1ba60 61 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  at makes sure th
1ba70 61 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70  at all thread-sp
1ba80 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66  ecific.** data f
1ba90 6f 72 20 74 68 69 73 20 74 68 72 65 61 64 20 68  or this thread h
1baa0 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61  as been dealloca
1bab0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ted..**.** SQLit
1bac0 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73  e no longer uses
1bad0 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
1bae0 20 64 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f   data so this ro
1baf0 75 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a  utine is now a.*
1bb00 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20  * no-op.  It is 
1bb10 72 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73  retained for his
1bb20 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62  torical compatib
1bb30 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ility..*/.void s
1bb40 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
1bb50 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23  eanup(void){.}.#
1bb60 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
1bb70 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  urn meta informa
1bb80 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65  tion about a spe
1bb90 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20  cific column of 
1bba0 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
1bbb0 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ..** See comment
1bbc0 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73   in sqlite3.h (s
1bbd0 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20  qlite.h.in) for 
1bbe0 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  details..*/.int 
1bbf0 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
1bc00 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20  lumn_metadata(. 
1bc10 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bc30 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  Connection handl
1bc40 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1bc50 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20  r *zDbName,     
1bc60 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
1bc70 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ame or NULL */. 
1bc80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1bc90 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  bleName,     /* 
1bca0 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  Table name */.  
1bcb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1bcc0 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43  umnName,    /* C
1bcd0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
1bce0 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44  char const **pzD
1bcf0 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f  ataType,    /* O
1bd00 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20  UTPUT: Declared 
1bd10 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63  data type */.  c
1bd20 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f  har const **pzCo
1bd30 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55  llSeq,     /* OU
1bd40 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20  TPUT: Collation 
1bd50 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f  sequence name */
1bd60 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c  .  int *pNotNull
1bd70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1bd80 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
1bd90 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  f NOT NULL const
1bda0 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a  raint exists */.
1bdb0 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b    int *pPrimaryK
1bdc0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
1bdd0 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
1bde0 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20   column part of 
1bdf0 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75  PK */.  int *pAu
1be00 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20 20  toinc           
1be10 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
1be20 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73  rue if column is
1be30 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20   auto-increment 
1be40 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
1be50 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
1be60 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  = 0;.  Table *pT
1be70 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e  ab = 0;.  Column
1be80 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pCol = 0;.  in
1be90 74 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 63 68  t iCol = 0;.  ch
1bea0 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54  ar const *zDataT
1beb0 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ype = 0;.  char 
1bec0 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20  const *zCollSeq 
1bed0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75  = 0;.  int notnu
1bee0 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72  ll = 0;.  int pr
1bef0 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20  imarykey = 0;.  
1bf00 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b  int autoinc = 0;
1bf10 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
1bf20 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1bf30 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1bf40 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1bf50 29 20 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d 65 3d  ) || zTableName=
1bf60 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1bf70 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1bf80 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
1bf90 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65  .  /* Ensure the
1bfa0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
1bfb0 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64   has been loaded
1bfc0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1bfd0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1bfe0 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  tex);.  sqlite3B
1bff0 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
1c000 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1c010 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73  Init(db, &zErrMs
1c020 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  g);.  if( SQLITE
1c030 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67  _OK!=rc ){.    g
1c040 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
1c050 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
1c060 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65  the table in que
1c070 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20  stion */.  pTab 
1c080 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
1c090 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d  le(db, zTableNam
1c0a0 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69  e, zDbName);.  i
1c0b0 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62  f( !pTab || pTab
1c0c0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1c0d0 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67   pTab = 0;.    g
1c0e0 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
1c0f0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68   }..  /* Find th
1c100 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69  e column for whi
1c110 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65  ch info is reque
1c120 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a 43  sted */.  if( zC
1c130 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a  olumnName==0 ){.
1c140 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6f 72      /* Query for
1c150 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 74 61   existance of ta
1c160 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65  ble only */.  }e
1c170 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f  lse{.    for(iCo
1c180 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
1c190 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
1c1a0 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61       pCol = &pTa
1c1b0 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
1c1c0 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
1c1d0 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
1c1e0 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e  >zName, zColumnN
1c1f0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
1c200 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1c210 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
1c220 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  l==pTab->nCol ){
1c230 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f  .      if( HasRo
1c240 77 69 64 28 70 54 61 62 29 20 26 26 20 73 71 6c  wid(pTab) && sql
1c250 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
1c260 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
1c270 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
1c280 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
1c290 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f  pCol = iCol>=0 ?
1c2a0 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
1c2b0 6c 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 65  l] : 0;.      }e
1c2c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61  lse{.        pTa
1c2d0 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  b = 0;.        g
1c2e0 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
1c2f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c300 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1c310 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65  wing block store
1c320 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72  s the meta infor
1c330 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  mation that will
1c340 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a   be returned.  *
1c350 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  * to the caller 
1c360 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  in local variabl
1c370 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43  es zDataType, zC
1c380 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c  ollSeq, notnull,
1c390 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a   primarykey.  **
1c3a0 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74   and autoinc. At
1c3b0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
1c3c0 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62  e are two possib
1c3d0 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20  ilities:.  ** . 
1c3e0 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73   **     1. The s
1c3f0 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20  pecified column 
1c400 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c  name was rowid",
1c410 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69   "oid" or "_rowi
1c420 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  d_" .  **       
1c430 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
1c440 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c   explicitly decl
1c450 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e  ared IPK column.
1c460 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20   .  **.  **     
1c470 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  2. The table is 
1c480 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74  not a view and t
1c490 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
1c4a0 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20  dentified an .  
1c4b0 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63  **        explic
1c4c0 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f  itly declared co
1c4d0 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20  lumn. Copy meta 
1c4e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
1c4f0 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20   *pCol..  */ .  
1c500 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20  if( pCol ){.    
1c510 7a 44 61 74 61 54 79 70 65 20 3d 20 73 71 6c 69  zDataType = sqli
1c520 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43  te3ColumnType(pC
1c530 6f 6c 2c 30 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c  ol,0);.    zColl
1c540 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c  Seq = pCol->zCol
1c550 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d  l;.    notnull =
1c560 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d   pCol->notNull!=
1c570 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65  0;.    primaryke
1c580 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46  y  = (pCol->colF
1c590 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50  lags & COLFLAG_P
1c5a0 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20  RIMKEY)!=0;.    
1c5b0 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e  autoinc = pTab->
1c5c0 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28  iPKey==iCol && (
1c5d0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
1c5e0 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
1c5f0 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t)!=0;.  }else{.
1c600 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20      zDataType = 
1c610 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70  "INTEGER";.    p
1c620 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20  rimarykey = 1;. 
1c630 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53   }.  if( !zCollS
1c640 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53  eq ){.    zCollS
1c650 65 71 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  eq = sqlite3StrB
1c660 49 4e 41 52 59 3b 0a 20 20 7d 0a 0a 65 72 72 6f  INARY;.  }..erro
1c670 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  r_out:.  sqlite3
1c680 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
1c690 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72  );..  /* Whether
1c6a0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61   the function ca
1c6b0 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72 20  ll succeeded or 
1c6c0 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20  failed, set the 
1c6d0 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
1c6e0 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76  s.  ** to whatev
1c6f0 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63  er their local c
1c700 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74  ounterparts cont
1c710 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ain. If an error
1c720 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a   did occur,.  **
1c730 20 74 68 69 73 20 68 61 73 20 74 68 65 20 65 66   this has the ef
1c740 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20  fect of zeroing 
1c750 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d  all output param
1c760 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eters..  */.  if
1c770 28 20 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a  ( pzDataType ) *
1c780 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61  pzDataType = zDa
1c790 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a  taType;.  if( pz
1c7a0 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c  CollSeq ) *pzCol
1c7b0 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b  lSeq = zCollSeq;
1c7c0 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20  .  if( pNotNull 
1c7d0 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f  ) *pNotNull = no
1c7e0 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72  tnull;.  if( pPr
1c7f0 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69  imaryKey ) *pPri
1c800 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72  maryKey = primar
1c810 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74  ykey;.  if( pAut
1c820 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63  oinc ) *pAutoinc
1c830 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69   = autoinc;..  i
1c840 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63  f( SQLITE_OK==rc
1c850 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
1c860 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1c870 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b, zErrMsg);.   
1c880 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74   zErrMsg = sqlit
1c890 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e  e3MPrintf(db, "n
1c8a0 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c  o such table col
1c8b0 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61  umn: %s.%s", zTa
1c8c0 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  bleName,.       
1c8d0 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20   zColumnName);. 
1c8e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1c8f0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  RROR;.  }.  sqli
1c900 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
1c910 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67  db, rc, (zErrMsg
1c920 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73  ?"%s":0), zErrMs
1c930 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1c940 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
1c950 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1c960 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
1c970 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1c980 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1c990 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1c9a0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  }../*.** Sleep f
1c9b0 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
1c9c0 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
1c9d0 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
1c9e0 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ept..*/.int sqli
1c9f0 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73  te3_sleep(int ms
1ca00 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1ca10 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63   *pVfs;.  int rc
1ca20 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74  ;.  pVfs = sqlit
1ca30 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
1ca40 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20    if( pVfs==0 ) 
1ca50 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
1ca60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f  This function wo
1ca70 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f  rks in milliseco
1ca80 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64  nds, but the und
1ca90 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28  erlying OsSleep(
1caa0 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73  ) .  ** API uses
1cab0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48   microseconds. H
1cac0 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73 2e  ence the 1000's.
1cad0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71  .  */.  rc = (sq
1cae0 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66  lite3OsSleep(pVf
1caf0 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30  s, 1000*ms)/1000
1cb00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1cb10 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  }../*.** Enable 
1cb20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 65  or disable the e
1cb30 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63  xtended result c
1cb40 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  odes..*/.int sql
1cb50 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65  ite3_extended_re
1cb60 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74  sult_codes(sqlit
1cb70 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66  e3 *db, int onof
1cb80 66 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  f){.#ifdef SQLIT
1cb90 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1cba0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1cbb0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1cbc0 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1cbd0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1cbe0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1cbf0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1cc00 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65  >mutex);.  db->e
1cc10 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f  rrMask = onoff ?
1cc20 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78   0xffffffff : 0x
1cc30 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ff;.  sqlite3_mu
1cc40 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1cc50 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
1cc60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1cc70 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46  ** Invoke the xF
1cc80 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  ileControl metho
1cc90 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d on a particula
1cca0 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  r database..*/.i
1ccb0 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  nt sqlite3_file_
1ccc0 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20  control(sqlite3 
1ccd0 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1cce0 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70  *zDbName, int op
1ccf0 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
1cd00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1cd10 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20  _ERROR;.  Btree 
1cd20 2a 70 42 74 72 65 65 3b 0a 0a 23 69 66 64 65 66  *pBtree;..#ifdef
1cd30 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1cd40 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1cd50 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1cd60 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
1cd70 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1cd80 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
1cd90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1cda0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1cdb0 20 70 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65   pBtree = sqlite
1cdc0 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
1cdd0 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69  b, zDbName);.  i
1cde0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
1cdf0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
1ce00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
1ce10 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65   *fd;.    sqlite
1ce20 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
1ce30 65 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20  ee);.    pPager 
1ce40 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
1ce50 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ger(pBtree);.   
1ce60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
1ce70 3d 30 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73  =0 );.    fd = s
1ce80 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
1ce90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
1cea0 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20  ert( fd!=0 );.  
1ceb0 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45    if( op==SQLITE
1cec0 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e  _FCNTL_FILE_POIN
1ced0 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73  TER ){.      *(s
1cee0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41  qlite3_file**)pA
1cef0 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72  rg = fd;.      r
1cf00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1cf10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d     }else if( op=
1cf20 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46  =SQLITE_FCNTL_VF
1cf30 53 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20  S_POINTER ){.   
1cf40 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 76 66 73     *(sqlite3_vfs
1cf50 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  **)pArg = sqlite
1cf60 33 50 61 67 65 72 56 66 73 28 70 50 61 67 65 72  3PagerVfs(pPager
1cf70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1cf80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1cf90 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54  se if( op==SQLIT
1cfa0 45 5f 46 43 4e 54 4c 5f 4a 4f 55 52 4e 41 4c 5f  E_FCNTL_JOURNAL_
1cfb0 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20  POINTER ){.     
1cfc0 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a   *(sqlite3_file*
1cfd0 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
1cfe0 50 61 67 65 72 4a 72 6e 6c 46 69 6c 65 28 70 50  PagerJrnlFile(pP
1cff0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ager);.      rc 
1d000 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1d010 20 7d 65 6c 73 65 20 69 66 28 20 66 64 2d 3e 70   }else if( fd->p
1d020 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
1d030 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1d040 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f  ileControl(fd, o
1d050 70 2c 20 70 41 72 67 29 3b 0a 23 69 66 6e 64 65  p, pArg);.#ifnde
1d060 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1d070 4c 0a 20 20 20 20 20 20 69 66 28 20 28 72 63 3d  L.      if( (rc=
1d080 3d 53 51 4c 49 54 45 5f 4f 4b 29 26 26 28 6f 70  =SQLITE_OK)&&(op
1d090 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  ==SQLITE_FCNTL_L
1d0a0 41 53 54 5f 45 52 52 4e 4f 29 26 26 28 2a 28 69  AST_ERRNO)&&(*(i
1d0b0 6e 74 20 2a 29 70 41 72 67 3d 3d 30 29 20 29 7b  nt *)pArg==0) ){
1d0c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d0d0 5f 66 69 6c 65 20 2a 70 57 61 6c 46 64 20 3d 20  _file *pWalFd = 
1d0e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 61 6c 46  sqlite3PagerWalF
1d0f0 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ile(pPager);.   
1d100 20 20 20 20 20 69 66 28 20 70 57 61 6c 46 64 26       if( pWalFd&
1d110 26 28 70 57 61 6c 46 64 2d 3e 70 4d 65 74 68 6f  &(pWalFd->pMetho
1d120 64 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ds) ){.         
1d130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1d140 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 57 61 6c 46  ileControl(pWalF
1d150 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20  d, op, pArg);.  
1d160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d170 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1d180 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1d190 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
1d1a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
1d1b0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
1d1c0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1d1d0 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20  Error(db, rc);. 
1d1e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1d1f0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1d200 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d210 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
1d220 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20   to the testing 
1d230 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71  logic..*/.int sq
1d240 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1d250 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  ol(int op, ...){
1d260 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23  .  int rc = 0;.#
1d270 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 54  ifdef SQLITE_UNT
1d280 45 53 54 41 42 4c 45 0a 20 20 55 4e 55 53 45 44  ESTABLE.  UNUSED
1d290 5f 50 41 52 41 4d 45 54 45 52 28 6f 70 29 3b 0a  _PARAMETER(op);.
1d2a0 23 65 6c 73 65 0a 20 20 76 61 5f 6c 69 73 74 20  #else.  va_list 
1d2b0 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
1d2c0 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
1d2d0 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a  ( op ){..    /*.
1d2e0 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20      ** Save the 
1d2f0 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
1d300 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a   the PRNG..    *
1d310 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1d320 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
1d330 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SAVE: {.      sq
1d340 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61  lite3PrngSaveSta
1d350 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
1d360 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1d370 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20  .    ** Restore 
1d380 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
1d390 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73   PRNG to the las
1d3a0 74 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73  t state saved us
1d3b0 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f  ing.    ** PRNG_
1d3c0 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53  SAVE.  If PRNG_S
1d3d0 41 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65  AVE has never be
1d3e0 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64  fore been called
1d3f0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
1d400 69 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b  is verb acts lik
1d410 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20  e PRNG_RESET..  
1d420 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1d430 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
1d440 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20  NG_RESTORE: {.  
1d450 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52      sqlite3PrngR
1d460 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20  estoreState();. 
1d470 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d480 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1d490 20 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20   Reset the PRNG 
1d4a0 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e  back to its unin
1d4b0 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e  itialized state.
1d4c0 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a    The next call.
1d4d0 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
1d4e0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77  3_randomness() w
1d4f0 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50  ill reseed the P
1d500 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67  RNG using a sing
1d510 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  le call.    ** t
1d520 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73  o the xRandomnes
1d530 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  s method of the 
1d540 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20  default VFS..   
1d550 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1d560 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
1d570 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20  G_RESET: {.     
1d580 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
1d590 65 73 73 28 30 2c 30 29 3b 0a 20 20 20 20 20 20  ess(0,0);.      
1d5a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1d5b0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1d5c0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1d5d0 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73  l(BITVEC_TEST, s
1d5e0 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20  ize, program).  
1d5f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20    **.    ** Run 
1d600 61 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61  a test against a
1d610 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f   Bitvec object o
1d620 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f  f size.  The pro
1d630 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20  gram argument.  
1d640 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79    ** is an array
1d650 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61   of integers tha
1d660 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65  t defines the te
1d670 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f  st.  Return -1 o
1d680 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72  n a.    ** memor
1d690 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
1d6a0 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73  or, 0 on success
1d6b0 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  , or non-zero fo
1d6c0 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  r an error..    
1d6d0 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74  ** See the sqlit
1d6e0 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
1d6f0 65 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  est() for additi
1d700 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1d710 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1d720 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1d730 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b  L_BITVEC_TEST: {
1d740 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  .      int sz = 
1d750 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1d760 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f  .      int *aPro
1d770 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  g = va_arg(ap, i
1d780 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt*);.      rc =
1d790 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
1d7a0 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50  iltinTest(sz, aP
1d7b0 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rog);.      brea
1d7c0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1d7d0 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
1d7e0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41  _test_control(FA
1d7f0 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 78 43 61  ULT_INSTALL, xCa
1d800 6c 6c 62 61 63 6b 29 0a 20 20 20 20 2a 2a 0a 20  llback).    **. 
1d810 20 20 20 2a 2a 20 41 72 72 61 6e 67 65 20 74 6f     ** Arrange to
1d820 20 69 6e 76 6f 6b 65 20 78 43 61 6c 6c 62 61 63   invoke xCallbac
1d830 6b 28 29 20 77 68 65 6e 65 76 65 72 20 73 71 6c  k() whenever sql
1d840 69 74 65 33 46 61 75 6c 74 53 69 6d 28 29 20 69  ite3FaultSim() i
1d850 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a  s called,.    **
1d860 20 69 66 20 78 43 61 6c 6c 62 61 63 6b 20 69 73   if xCallback is
1d870 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a   not NULL..    *
1d880 2a 0a 20 20 20 20 2a 2a 20 41 73 20 61 20 74 65  *.    ** As a te
1d890 73 74 20 6f 66 20 74 68 65 20 66 61 75 6c 74 20  st of the fault 
1d8a0 73 69 6d 75 6c 61 74 6f 72 20 6d 65 63 68 61 6e  simulator mechan
1d8b0 69 73 6d 20 69 74 73 65 6c 66 2c 20 73 71 6c 69  ism itself, sqli
1d8c0 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 0a 20  te3FaultSim(0). 
1d8d0 20 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20     ** is called 
1d8e0 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
1d8f0 72 20 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65  r installing the
1d900 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b 20 61 6e   new callback an
1d910 64 20 74 68 65 20 72 65 74 75 72 6e 0a 20 20 20  d the return.   
1d920 20 2a 2a 20 76 61 6c 75 65 20 66 72 6f 6d 20 73   ** value from s
1d930 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30  qlite3FaultSim(0
1d940 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65  ) becomes the re
1d950 74 75 72 6e 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  turn from.    **
1d960 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1d970 6e 74 72 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a  ntrol()..    */.
1d980 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1d990 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49  TESTCTRL_FAULT_I
1d9a0 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  NSTALL: {.      
1d9b0 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79  /* MSVC is picky
1d9c0 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66   about pulling f
1d9d0 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61  unc ptrs from va
1d9e0 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a   lists..      **
1d9f0 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e   http://support.
1da00 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62  microsoft.com/kb
1da10 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20  /47961.      ** 
1da20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1da30 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63  fig.xTestCallbac
1da40 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  k = va_arg(ap, i
1da50 6e 74 28 2a 29 28 69 6e 74 29 29 3b 0a 20 20 20  nt(*)(int));.   
1da60 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65     */.      type
1da70 64 65 66 20 69 6e 74 28 2a 54 45 53 54 43 41 4c  def int(*TESTCAL
1da80 4c 42 41 43 4b 46 55 4e 43 5f 74 29 28 69 6e 74  LBACKFUNC_t)(int
1da90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1daa0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65  GlobalConfig.xTe
1dab0 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f  stCallback = va_
1dac0 61 72 67 28 61 70 2c 20 54 45 53 54 43 41 4c 4c  arg(ap, TESTCALL
1dad0 42 41 43 4b 46 55 4e 43 5f 74 29 3b 0a 20 20 20  BACKFUNC_t);.   
1dae0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
1daf0 61 75 6c 74 53 69 6d 28 30 29 3b 0a 20 20 20 20  aultSim(0);.    
1db00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1db10 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1db20 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1db30 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  rol(BENIGN_MALLO
1db40 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c  C_HOOKS, xBegin,
1db50 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20   xEnd).    **.  
1db60 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f    ** Register ho
1db70 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69  oks to call to i
1db80 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61  ndicate which ma
1db90 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20  lloc() failures 
1dba0 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69  .    ** are beni
1dbb0 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  gn..    */.    c
1dbc0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1dbd0 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  TRL_BENIGN_MALLO
1dbe0 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20  C_HOOKS: {.     
1dbf0 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
1dc00 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76  void_function)(v
1dc10 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64  oid);.      void
1dc20 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67  _function xBenig
1dc30 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f  nBegin;.      vo
1dc40 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
1dc50 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42  ignEnd;.      xB
1dc60 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f  enignBegin = va_
1dc70 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
1dc80 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42  ction);.      xB
1dc90 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72  enignEnd = va_ar
1dca0 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74  g(ap, void_funct
1dcb0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
1dcc0 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48  te3BenignMallocH
1dcd0 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69  ooks(xBenignBegi
1dce0 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a  n, xBenignEnd);.
1dcf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dd00 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1dd10 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1dd20 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1dd30 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
1dd40 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69  BYTE, unsigned i
1dd50 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
1dd60 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44   ** Set the PEND
1dd70 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20  ING byte to the 
1dd80 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67  value in the arg
1dd90 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20  ument, if X>0.. 
1dda0 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68     ** Make no ch
1ddb0 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20  anges if X==0.  
1ddc0 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
1ddd0 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20   of the pending 
1dde0 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69  byte.    ** as i
1ddf0 74 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72  t existing befor
1de00 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
1de10 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
1de20 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41  *.    ** IMPORTA
1de30 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68  NT:  Changing th
1de40 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66  e PENDING byte f
1de50 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72  rom 0x40000000 r
1de60 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a  esults in.    **
1de70 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
1de80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1de90 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67  ormat.  Changing
1dea0 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
1deb0 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61  e.    ** while a
1dec0 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ny database conn
1ded0 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72  ection is open r
1dee0 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69  esults in undefi
1def0 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  ned and.    ** d
1df00 65 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76  eleterious behav
1df10 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ior..    */.    
1df20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1df30 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
1df40 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E: {.      rc = 
1df50 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69  PENDING_BYTE;.#i
1df60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1df70 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20  T_WSD.      {.  
1df80 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
1df90 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61  nt newVal = va_a
1dfa0 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20  rg(ap, unsigned 
1dfb0 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  int);.        if
1dfc0 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74  ( newVal ) sqlit
1dfd0 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20  e3PendingByte = 
1dfe0 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  newVal;.      }.
1dff0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
1e000 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1e010 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1e020 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1e030 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1e040 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20  SSERT, int X).  
1e050 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
1e060 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
1e070 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
1e080 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
1e090 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73  or not.    ** as
1e0a0 73 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c  sert() was enabl
1e0b0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1e0c0 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  me.  If X is tru
1e0d0 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20  e and assert(). 
1e0e0 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64     ** is enabled
1e0f0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
1e100 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e  n value is true.
1e110 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61    If X is true a
1e120 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74  nd.    ** assert
1e130 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  () is disabled, 
1e140 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
1e150 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20  value is zero.  
1e160 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66  If X is.    ** f
1e170 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
1e180 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  ) is enabled, th
1e190 65 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e  en the assertion
1e1a0 20 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20   fires and the. 
1e1b0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62     ** process ab
1e1c0 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66  orts.  If X is f
1e1d0 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
1e1e0 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
1e1f0 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
1e200 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a  eturn value is z
1e210 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
1e220 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1e230 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20  CTRL_ASSERT: {. 
1e240 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e       volatile in
1e250 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  t x = 0;.      a
1e260 73 73 65 72 74 28 20 2f 2a 73 69 64 65 2d 65 66  ssert( /*side-ef
1e270 66 65 63 74 73 2d 6f 6b 2a 2f 20 28 78 20 3d 20  fects-ok*/ (x = 
1e280 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21  va_arg(ap,int))!
1e290 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
1e2a0 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   x;.      break;
1e2b0 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a  .    }...    /*.
1e2c0 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1e2d0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1e2e0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
1e2f0 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  AYS, int X).    
1e300 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
1e310 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
1e320 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
1e330 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c  o see how the AL
1e340 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20  WAYS and.    ** 
1e350 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72  NEVER macros wer
1e360 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  e defined at com
1e370 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a  pile-time..    *
1e380 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74  *.    ** The ret
1e390 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57  urn value is ALW
1e3a0 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a  AYS(X).  .    **
1e3b0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
1e3c0 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20  mmended test is 
1e3d0 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65  X==2.  If the re
1e3e0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c  turn value is 2,
1e3f0 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20   that means.    
1e400 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20  ** ALWAYS() and 
1e410 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68  NEVER() are both
1e420 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
1e430 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63  ugh macros, whic
1e440 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  h is the.    ** 
1e450 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e  default setting.
1e460 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
1e470 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e  value is 1, then
1e480 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74   ALWAYS() is eit
1e490 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d  her.    ** hard-
1e4a0 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72  coded to true or
1e4b0 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73   else it asserts
1e4c0 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74   if its argument
1e4d0 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a   is false..    *
1e4e0 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61  * The first beha
1e4f0 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64  vior (hard-coded
1e500 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65   to true) is the
1e510 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
1e520 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e530 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
1e540 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  t assert() is di
1e550 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73  sabled and the s
1e560 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68  econd.    ** beh
1e570 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66  avior (assert if
1e580 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
1e590 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c   ALWAYS() is fal
1e5a0 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20  se) is the case 
1e5b0 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
1e5c0 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
1e5d0 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65   shows that asse
1e5e0 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e  rt() is enabled.
1e5f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1e600 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74  he run-time test
1e610 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74   procedure might
1e620 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20   look something 
1e630 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
1e640 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20  *.    **    if( 
1e650 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1e660 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1e670 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d  CTRL_ALWAYS, 2)=
1e680 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20  =2 ){.    **    
1e690 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e    // ALWAYS() an
1e6a0 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f  d NEVER() are no
1e6b0 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
1e6c0 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20   macros.    **  
1e6d0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1e6e0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1e6f0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1e700 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20  _ASSERT, 1) ){. 
1e710 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
1e720 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20  WAYS(x) asserts 
1e730 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20  that x is true. 
1e740 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73  NEVER(x) asserts
1e750 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20   x is false..   
1e760 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   **    }else{.  
1e770 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
1e780 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73  AYS(x) is a cons
1e790 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78  tant 1.  NEVER(x
1e7a0 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
1e7b0 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20  0..    **    }. 
1e7c0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1e7d0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1e7e0 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69  LWAYS: {.      i
1e7f0 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
1e800 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20  ,int);.      rc 
1e810 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20 20  = ALWAYS(x);.   
1e820 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e830 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1e840 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1e850 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1e860 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 29  TCTRL_BYTEORDER)
1e870 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1e880 54 68 65 20 69 6e 74 65 67 65 72 20 72 65 74 75  The integer retu
1e890 72 6e 65 64 20 72 65 76 65 61 6c 73 20 74 68 65  rned reveals the
1e8a0 20 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74   byte-order of t
1e8b0 68 65 20 63 6f 6d 70 75 74 65 72 20 6f 6e 20 77  he computer on w
1e8c0 68 69 63 68 0a 20 20 20 20 2a 2a 20 53 51 4c 69  hich.    ** SQLi
1e8d0 74 65 20 69 73 20 72 75 6e 6e 69 6e 67 3a 0a 20  te is running:. 
1e8e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1e8f0 20 20 20 31 20 20 20 20 20 62 69 67 2d 65 6e 64     1     big-end
1e900 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e  ian,    determin
1e910 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20  ed at run-time. 
1e920 20 20 20 2a 2a 20 20 20 20 20 20 31 30 20 20 20     **      10   
1e930 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c    little-endian,
1e940 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72   determined at r
1e950 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20  un-time.    **  
1e960 34 33 32 31 30 31 20 20 20 20 20 62 69 67 2d 65  432101     big-e
1e970 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d  ndian,    determ
1e980 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
1e990 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 31 32 33  time.    **  123
1e9a0 34 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65  410     little-e
1e9b0 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65  ndian, determine
1e9c0 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1e9d0 65 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 63 61  e.    */ .    ca
1e9e0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1e9f0 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a 20 7b 0a  RL_BYTEORDER: {.
1ea00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1ea10 45 5f 42 59 54 45 4f 52 44 45 52 2a 31 30 30 20  E_BYTEORDER*100 
1ea20 2b 20 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45  + SQLITE_LITTLEE
1ea30 4e 44 49 41 4e 2a 31 30 20 2b 20 53 51 4c 49 54  NDIAN*10 + SQLIT
1ea40 45 5f 42 49 47 45 4e 44 49 41 4e 3b 0a 20 20 20  E_BIGENDIAN;.   
1ea50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ea60 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1ea70 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1ea80 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52  QLITE_TESTCTRL_R
1ea90 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20  ESERVE, sqlite3 
1eaa0 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
1eab0 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
1eac0 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20  e nReserve size 
1ead0 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69  to N for the mai
1eae0 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68  n database on th
1eaf0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
1eb00 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  * connection db.
1eb10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1eb20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1eb30 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20  _RESERVE: {.    
1eb40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1eb50 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1eb60 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  e3*);.      int 
1eb70 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
1eb80 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1eb90 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1eba0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
1ebb0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
1ebc0 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b  ageSize(db->aDb[
1ebd0 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29  0].pBt, 0, x, 0)
1ebe0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1ebf0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1ec00 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72  mutex);.      br
1ec10 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1ec20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  /*  sqlite3_test
1ec30 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1ec40 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
1ec50 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20  ATIONS, sqlite3 
1ec60 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
1ec70 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65  **.    ** Enable
1ec80 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69   or disable vari
1ec90 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
1eca0 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  s for testing pu
1ecb0 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20  rposes.  The .  
1ecc0 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20    ** argument N 
1ecd0 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
1ece0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f  optimizations to
1ecf0 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46   be disabled.  F
1ed00 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a  or normal.    **
1ed10 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f   operation N sho
1ed20 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69  uld be 0.  The i
1ed30 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65  dea is that a te
1ed40 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65  st program (like
1ed50 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20   the.    ** SQL 
1ed60 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c  Logic Test or SL
1ed70 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63  T test module) c
1ed80 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20  an run the same 
1ed90 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  SQL multiple tim
1eda0 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76  es.    ** with v
1edb0 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
1edc0 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f  ions disabled to
1edd0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1ede0 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20   same answer.   
1edf0 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20   ** is obtained 
1ee00 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20  in every case.. 
1ee10 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1ee20 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
1ee30 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a  PTIMIZATIONS: {.
1ee40 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1ee50 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1ee60 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1ee70 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d  db->dbOptFlags =
1ee80 20 28 75 31 36 29 28 76 61 5f 61 72 67 28 61 70   (u16)(va_arg(ap
1ee90 2c 20 69 6e 74 29 20 26 20 30 78 66 66 66 66 29  , int) & 0xffff)
1eea0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1eeb0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
1eec0 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20  ITE_N_KEYWORD.  
1eed0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
1eee0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1eef0 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57  _TESTCTRL_ISKEYW
1ef00 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ORD, const char 
1ef10 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20  *zWord).    **. 
1ef20 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69     ** If zWord i
1ef30 73 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f  s a keyword reco
1ef40 67 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61  gnized by the pa
1ef50 72 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72  rser, then retur
1ef60 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  n the.    ** num
1ef70 62 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e  ber of keywords.
1ef80 20 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73    Or if zWord is
1ef90 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20   not a keyword, 
1efa0 72 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a  return 0..    **
1efb0 20 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65   .    ** This te
1efc0 73 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e  st feature is on
1efd0 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ly available in 
1efe0 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e  the amalgamation
1eff0 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68   since.    ** th
1f000 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  e SQLITE_N_KEYWO
1f010 52 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  RD macro is not 
1f020 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
1f030 66 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20  file if SQLite. 
1f040 20 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75     ** is built u
1f050 73 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f  sing separate so
1f060 75 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  urce files..    
1f070 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1f080 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45  TE_TESTCTRL_ISKE
1f090 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63  YWORD: {.      c
1f0a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64  onst char *zWord
1f0b0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f   = va_arg(ap, co
1f0c0 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
1f0d0 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
1f0e0 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29  3Strlen30(zWord)
1f0f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71  ;.      rc = (sq
1f100 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
1f110 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21  ((u8*)zWord, n)!
1f120 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45  =TK_ID) ? SQLITE
1f130 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a  _N_KEYWORD : 0;.
1f140 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f150 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20   }.#endif ..    
1f160 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
1f170 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1f180 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d  ESTCTRL_SCRATCHM
1f190 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77  ALLOC, sz, &pNew
1f1a0 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a  , pFree);.    **
1f1b0 0a 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72  .    ** Pass pFr
1f1c0 65 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53  ee into sqlite3S
1f1d0 63 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20  cratchFree(). . 
1f1e0 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68     ** If sz>0 th
1f1f0 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63  en allocate a sc
1f200 72 61 74 63 68 20 62 75 66 66 65 72 20 69 6e 74  ratch buffer int
1f210 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f  o pNew.  .    */
1f220 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f230 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43  _TESTCTRL_SCRATC
1f240 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  HMALLOC: {.     
1f250 20 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a   void *pFree, **
1f260 70 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74  ppNew;.      int
1f270 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20   sz;.      sz = 
1f280 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1f290 0a 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76  .      ppNew = v
1f2a0 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a  a_arg(ap, void**
1f2b0 29 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d  );.      pFree =
1f2c0 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
1f2d0 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  *);.      if( sz
1f2e0 20 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69   ) *ppNew = sqli
1f2f0 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
1f300 28 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  (sz);.      sqli
1f310 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 70  te3ScratchFree(p
1f320 46 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Free);.      bre
1f330 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1f340 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1f350 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1f360 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
1f370 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e  ME_FAULT, int on
1f380 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  off);.    **.   
1f390 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72   ** If parameter
1f3a0 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65   onoff is non-ze
1f3b0 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68  ro, configure th
1f3c0 65 20 77 72 61 70 70 65 72 73 20 73 6f 20 74 68  e wrappers so th
1f3d0 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75  at all.    ** su
1f3e0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
1f3f0 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e  o localtime() an
1f400 64 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e  d variants fail.
1f410 20 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72   If onoff is zer
1f420 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74  o,.    ** undo t
1f430 68 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20  his setting..   
1f440 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1f450 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
1f460 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a  ALTIME_FAULT: {.
1f470 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1f480 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c  balConfig.bLocal
1f490 74 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61  timeFault = va_a
1f4a0 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1f4b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f4c0 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1f4d0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1f4e0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
1f4f0 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e  EVER_CORRUPT, in
1f500 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t);.    **.    *
1f510 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61  * Set or clear a
1f520 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63   flag that indic
1f530 61 74 65 73 20 74 68 61 74 20 74 68 65 20 64 61  ates that the da
1f540 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 61  tabase file is a
1f550 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20  lways well-.    
1f560 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65  ** formed and ne
1f570 76 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54 68  ver corrupt.  Th
1f580 69 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  is flag is clear
1f590 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e 64   by default, ind
1f5a0 69 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20 20  icating that.   
1f5b0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1f5c0 65 73 20 6d 69 67 68 74 20 68 61 76 65 20 61 72  es might have ar
1f5d0 62 69 74 72 61 72 79 20 63 6f 72 72 75 70 74 69  bitrary corrupti
1f5e0 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65  on.  Setting the
1f5f0 20 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20 20   flag during.   
1f600 20 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75 73   ** testing caus
1f610 65 73 20 63 65 72 74 61 69 6e 20 61 73 73 65 72  es certain asser
1f620 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
1f630 6e 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62 65  n the code to be
1f640 20 61 63 74 69 76 61 74 65 64 0a 20 20 20 20 2a   activated.    *
1f650 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72 61  * that demonstra
1f660 74 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20  t invariants on 
1f670 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
1f680 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  base files..    
1f690 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1f6a0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45  TE_TESTCTRL_NEVE
1f6b0 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20  R_CORRUPT: {.   
1f6c0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1f6d0 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72 72  Config.neverCorr
1f6e0 75 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  upt = va_arg(ap,
1f6f0 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
1f700 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1f710 2a 20 53 65 74 20 74 68 65 20 74 68 72 65 73 68  * Set the thresh
1f720 6f 6c 64 20 61 74 20 77 68 69 63 68 20 4f 50 5f  old at which OP_
1f730 4f 6e 63 65 20 63 6f 75 6e 74 65 72 73 20 72 65  Once counters re
1f740 73 65 74 20 62 61 63 6b 20 74 6f 20 7a 65 72 6f  set back to zero
1f750 2e 0a 20 20 20 20 2a 2a 20 42 79 20 64 65 66 61  ..    ** By defa
1f760 75 6c 74 20 74 68 69 73 20 69 73 20 30 78 37 66  ult this is 0x7f
1f770 66 66 66 66 66 65 20 28 6f 76 65 72 20 32 20 62  fffffe (over 2 b
1f780 69 6c 6c 69 6f 6e 29 2c 20 62 75 74 20 74 68 61  illion), but tha
1f790 74 20 76 61 6c 75 65 20 69 73 0a 20 20 20 20 2a  t value is.    *
1f7a0 2a 20 74 6f 6f 20 62 69 67 20 74 6f 20 74 65 73  * too big to tes
1f7b0 74 20 69 6e 20 61 20 72 65 61 73 6f 6e 61 62 6c  t in a reasonabl
1f7c0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
1f7d0 2c 20 73 6f 20 74 68 69 73 20 63 6f 6e 74 72 6f  , so this contro
1f7e0 6c 20 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 76  l is.    ** prov
1f7f0 69 64 65 64 20 74 6f 20 73 65 74 20 61 20 73 6d  ided to set a sm
1f800 61 6c 6c 20 61 6e 64 20 65 61 73 69 6c 79 20 72  all and easily r
1f810 65 61 63 68 61 62 6c 65 20 72 65 73 65 74 20 76  eachable reset v
1f820 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  alue..    */.   
1f830 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1f840 54 43 54 52 4c 5f 4f 4e 43 45 5f 52 45 53 45 54  TCTRL_ONCE_RESET
1f850 5f 54 48 52 45 53 48 4f 4c 44 3a 20 7b 0a 20 20  _THRESHOLD: {.  
1f860 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1f870 6c 43 6f 6e 66 69 67 2e 69 4f 6e 63 65 52 65 73  lConfig.iOnceRes
1f880 65 74 54 68 72 65 73 68 6f 6c 64 20 3d 20 76 61  etThreshold = va
1f890 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
1f8a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f8b0 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
1f8c0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1f8d0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1f8e0 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 2c 20  _VDBE_COVERAGE, 
1f8f0 78 43 61 6c 6c 62 61 63 6b 2c 20 70 74 72 29 3b  xCallback, ptr);
1f900 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
1f910 65 74 20 74 68 65 20 56 44 42 45 20 63 6f 76 65  et the VDBE cove
1f920 72 61 67 65 20 63 61 6c 6c 62 61 63 6b 20 66 75  rage callback fu
1f930 6e 63 74 69 6f 6e 20 74 6f 20 78 43 61 6c 6c 62  nction to xCallb
1f940 61 63 6b 20 77 69 74 68 20 63 6f 6e 74 65 78 74  ack with context
1f950 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72   .    ** pointer
1f960 20 70 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   ptr..    */.   
1f970 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1f980 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52  TCTRL_VDBE_COVER
1f990 41 47 45 3a 20 7b 0a 23 69 66 64 65 66 20 53 51  AGE: {.#ifdef SQ
1f9a0 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
1f9b0 47 45 0a 20 20 20 20 20 20 74 79 70 65 64 65 66  GE.      typedef
1f9c0 20 76 6f 69 64 20 28 2a 62 72 61 6e 63 68 5f 63   void (*branch_c
1f9d0 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69  allback)(void*,i
1f9e0 6e 74 2c 75 38 2c 75 38 29 3b 0a 20 20 20 20 20  nt,u8,u8);.     
1f9f0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1fa00 6e 66 69 67 2e 78 56 64 62 65 42 72 61 6e 63 68  nfig.xVdbeBranch
1fa10 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 62 72 61   = va_arg(ap,bra
1fa20 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 3b 0a 20  nch_callback);. 
1fa30 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1fa40 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62 65 42 72  alConfig.pVdbeBr
1fa50 61 6e 63 68 41 72 67 20 3d 20 76 61 5f 61 72 67  anchArg = va_arg
1fa60 28 61 70 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64  (ap,void*);.#end
1fa70 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  if.      break;.
1fa80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
1fa90 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1faa0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1fab0 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50  CTRL_SORTER_MMAP
1fac0 2c 20 64 62 2c 20 6e 4d 61 78 29 3b 20 2a 2f 0a  , db, nMax); */.
1fad0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1fae0 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f  TESTCTRL_SORTER_
1faf0 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20 20 73 71  MMAP: {.      sq
1fb00 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
1fb10 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
1fb20 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 4d 61 78  ;.      db->nMax
1fb30 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20 76 61 5f  SorterMmap = va_
1fb40 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1fb50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1fb60 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
1fb70 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1fb80 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1fb90 49 53 49 4e 49 54 29 3b 0a 20 20 20 20 2a 2a 0a  ISINIT);.    **.
1fba0 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 53 51      ** Return SQ
1fbb0 4c 49 54 45 5f 4f 4b 20 69 66 20 53 51 4c 69 74  LITE_OK if SQLit
1fbc0 65 20 68 61 73 20 62 65 65 6e 20 69 6e 69 74 69  e has been initi
1fbd0 61 6c 69 7a 65 64 20 61 6e 64 20 53 51 4c 49 54  alized and SQLIT
1fbe0 45 5f 45 52 52 4f 52 20 69 66 0a 20 20 20 20 2a  E_ERROR if.    *
1fbf0 2a 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  * not..    */.  
1fc00 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1fc10 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 3a 20 7b  STCTRL_ISINIT: {
1fc20 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1fc30 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1fc40 73 49 6e 69 74 3d 3d 30 20 29 20 72 63 20 3d 20  sInit==0 ) rc = 
1fc50 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1fc60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1fc70 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65  ..    /*  sqlite
1fc80 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1fc90 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
1fca0 4d 50 4f 53 54 45 52 2c 20 64 62 2c 20 64 62 4e  MPOSTER, db, dbN
1fcb0 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d  ame, onOff, tnum
1fcc0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1fcd0 20 54 68 69 73 20 74 65 73 74 20 63 6f 6e 74 72   This test contr
1fce0 6f 6c 20 69 73 20 75 73 65 64 20 74 6f 20 63 72  ol is used to cr
1fcf0 65 61 74 65 20 69 6d 70 6f 73 74 65 72 20 74 61  eate imposter ta
1fd00 62 6c 65 73 2e 20 20 22 64 62 22 20 69 73 20 61  bles.  "db" is a
1fd10 20 70 6f 69 6e 74 65 72 0a 20 20 20 20 2a 2a 20   pointer.    ** 
1fd20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1fd30 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 64 62 4e  connection.  dbN
1fd40 61 6d 65 20 69 73 20 74 68 65 20 64 61 74 61 62  ame is the datab
1fd50 61 73 65 20 6e 61 6d 65 20 28 65 78 3a 20 22 6d  ase name (ex: "m
1fd60 61 69 6e 22 20 6f 72 0a 20 20 20 20 2a 2a 20 22  ain" or.    ** "
1fd70 74 65 6d 70 22 29 20 77 68 69 63 68 20 77 69 6c  temp") which wil
1fd80 6c 20 72 65 63 65 69 76 65 20 74 68 65 20 69 6d  l receive the im
1fd90 70 6f 73 74 65 72 2e 20 20 22 6f 6e 4f 66 66 22  poster.  "onOff"
1fda0 20 74 75 72 6e 73 20 69 6d 70 6f 73 74 65 72 20   turns imposter 
1fdb0 6d 6f 64 65 20 6f 6e 0a 20 20 20 20 2a 2a 20 6f  mode on.    ** o
1fdc0 72 20 6f 66 66 2e 20 20 22 74 6e 75 6d 22 20 69  r off.  "tnum" i
1fdd0 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
1fde0 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 74 6f  of the b-tree to
1fdf0 20 77 68 69 63 68 20 74 68 65 20 69 6d 70 6f 73   which the impos
1fe00 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ter.    ** table
1fe10 20 73 68 6f 75 6c 64 20 63 6f 6e 6e 65 63 74 2e   should connect.
1fe20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
1fe30 6e 61 62 6c 65 20 69 6d 70 6f 73 74 65 72 20 6d  nable imposter m
1fe40 6f 64 65 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68  ode only when th
1fe50 65 20 73 63 68 65 6d 61 20 68 61 73 20 61 6c 72  e schema has alr
1fe60 65 61 64 79 20 62 65 65 6e 20 70 61 72 73 65 64  eady been parsed
1fe70 2e 20 20 54 68 65 6e 0a 20 20 20 20 2a 2a 20 72  .  Then.    ** r
1fe80 75 6e 20 61 20 73 69 6e 67 6c 65 20 43 52 45 41  un a single CREA
1fe90 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
1fea0 6e 74 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  nt to construct 
1feb0 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62  the imposter tab
1fec0 6c 65 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  le in.    ** the
1fed0 20 70 61 72 73 65 64 20 73 63 68 65 6d 61 2e 20   parsed schema. 
1fee0 20 54 68 65 6e 20 74 75 72 6e 20 69 6d 70 6f 73   Then turn impos
1fef0 74 65 72 20 6d 6f 64 65 20 62 61 63 6b 20 6f 66  ter mode back of
1ff00 66 20 61 67 61 69 6e 2e 0a 20 20 20 20 2a 2a 0a  f again..    **.
1ff10 20 20 20 20 2a 2a 20 49 66 20 6f 6e 4f 66 66 3d      ** If onOff=
1ff20 3d 30 20 61 6e 64 20 74 6e 75 6d 3e 30 20 74 68  =0 and tnum>0 th
1ff30 65 6e 20 72 65 73 65 74 20 74 68 65 20 73 63 68  en reset the sch
1ff40 65 6d 61 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  ema for all data
1ff50 62 61 73 65 73 2c 20 63 61 75 73 69 6e 67 0a 20  bases, causing. 
1ff60 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61     ** the schema
1ff70 20 74 6f 20 62 65 20 72 65 70 61 72 73 65 64 20   to be reparsed 
1ff80 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74  the next time it
1ff90 20 69 73 20 6e 65 65 64 65 64 2e 20 20 54 68 69   is needed.  Thi
1ffa0 73 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  s has the.    **
1ffb0 20 65 66 66 65 63 74 20 6f 66 20 65 72 61 73 69   effect of erasi
1ffc0 6e 67 20 61 6c 6c 20 69 6d 70 6f 73 74 65 72 20  ng all imposter 
1ffd0 74 61 62 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  tables..    */. 
1ffe0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1fff0 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
20000 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
20010 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61  3 *db = va_arg(a
20020 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  p, sqlite3*);.  
20030 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
20040 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
20050 78 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e  x);.      db->in
20060 69 74 2e 69 44 62 20 3d 20 73 71 6c 69 74 65 33  it.iDb = sqlite3
20070 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 76  FindDbName(db, v
20080 61 5f 61 72 67 28 61 70 2c 63 6f 6e 73 74 20 63  a_arg(ap,const c
20090 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 64 62  har*));.      db
200a0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20 64 62  ->init.busy = db
200b0 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54  ->init.imposterT
200c0 61 62 6c 65 20 3d 20 76 61 5f 61 72 67 28 61 70  able = va_arg(ap
200d0 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 64 62 2d  ,int);.      db-
200e0 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 3d 20  >init.newTnum = 
200f0 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
20100 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e        if( db->in
20110 69 74 2e 62 75 73 79 3d 3d 30 20 26 26 20 64 62  it.busy==0 && db
20120 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3e 30  ->init.newTnum>0
20130 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20140 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d  te3ResetAllSchem
20150 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64  asOfConnection(d
20160 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
20170 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
20180 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
20190 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
201a0 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e     }.  }.  va_en
201b0 64 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  d(ap);.#endif /*
201c0 20 53 51 4c 49 54 45 5f 55 4e 54 45 53 54 41 42   SQLITE_UNTESTAB
201d0 4c 45 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  LE */.  return r
201e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
201f0 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f   is a utility ro
20200 75 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f  utine, useful to
20210 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
20220 69 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b  ions, that check
20230 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61  s.** to see if a
20240 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
20250 61 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f  as a URI that co
20260 6e 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66  ntained a specif
20270 69 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72  ic query .** par
20280 61 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73  ameter, and if s
20290 6f 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61  o obtains the va
202a0 6c 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79  lue of the query
202b0 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
202c0 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
202d0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
202e0 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72  filename pointer
202f0 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65   passed into the
20300 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68   xOpen().** meth
20310 6f 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c  od of a VFS impl
20320 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
20330 20 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74   zParam argument
20340 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
20350 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72  the.** query par
20360 61 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20  ameter we seek. 
20370 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
20380 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20  turns the value 
20390 6f 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a  of the zParam.**
203a0 20 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74   parameter if it
203b0 20 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65   exists.  If the
203c0 20 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20   parameter does 
203d0 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20  not exist, this 
203e0 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
203f0 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  ns a NULL pointe
20400 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  r..*/.const char
20410 20 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61   *sqlite3_uri_pa
20420 72 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68  rameter(const ch
20430 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63  ar *zFilename, c
20440 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
20450 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  m){.  if( zFilen
20460 61 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d  ame==0 || zParam
20470 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
20480 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
20490 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
204a0 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
204b0 20 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d   while( zFilenam
204c0 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e[0] ){.    int 
204d0 78 20 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  x = strcmp(zFile
204e0 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20  name, zParam);. 
204f0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20     zFilename += 
20500 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
20510 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a  zFilename) + 1;.
20520 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72      if( x==0 ) r
20530 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b  eturn zFilename;
20540 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  .    zFilename +
20550 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
20560 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
20570 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
20580 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
20590 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  n a boolean valu
205a0 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61  e for a query pa
205b0 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  rameter..*/.int 
205c0 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
205d0 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ean(const char *
205e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74  zFilename, const
205f0 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69   char *zParam, i
20600 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e  nt bDflt){.  con
20610 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  st char *z = sql
20620 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
20630 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  er(zFilename, zP
20640 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d  aram);.  bDflt =
20650 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74   bDflt!=0;.  ret
20660 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47  urn z ? sqlite3G
20670 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66  etBoolean(z, bDf
20680 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a  lt) : bDflt;.}..
20690 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36  /*.** Return a 6
206a0 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61  4-bit integer va
206b0 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20  lue for a query 
206c0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71  parameter..*/.sq
206d0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69  lite3_int64 sqli
206e0 74 65 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20  te3_uri_int64(. 
206f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
20700 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69  lename,    /* Fi
20710 6c 65 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64  lename as passed
20720 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63   to xOpen */.  c
20730 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
20740 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20  m,       /* URI 
20750 70 61 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74  parameter sought
20760 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
20770 74 36 34 20 62 44 66 6c 74 20 20 20 20 20 20 20  t64 bDflt       
20780 2f 2a 20 72 65 74 75 72 6e 20 69 66 20 70 61 72  /* return if par
20790 61 6d 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e  ameter is missin
207a0 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  g */.){.  const 
207b0 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
207c0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
207d0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
207e0 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  m);.  sqlite3_in
207f0 74 36 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26  t64 v;.  if( z &
20800 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65  & sqlite3DecOrHe
20810 78 54 6f 49 36 34 28 7a 2c 20 26 76 29 3d 3d 53  xToI64(z, &v)==S
20820 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20830 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20  bDflt = v;.  }. 
20840 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d   return bDflt;.}
20850 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
20860 68 65 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72  he Btree pointer
20870 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a   identified by z
20880 44 62 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20  DbName.  Return 
20890 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
208a0 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c  d..*/.Btree *sql
208b0 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
208c0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
208d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
208e0 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
208f0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
20900 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
20910 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
20920 0a 20 20 20 20 20 26 26 20 28 7a 44 62 4e 61 6d  .     && (zDbNam
20930 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  e==0 || sqlite3S
20940 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20  trICmp(zDbName, 
20950 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e  db->aDb[i].zDbSN
20960 61 6d 65 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a  ame)==0).    ){.
20970 20 20 20 20 20 20 72 65 74 75 72 6e 20 64 62 2d        return db-
20980 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
20990 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
209a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
209b0 72 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  rn the filename 
209c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
209d0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
209e0 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
209f0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e  nnection..*/.con
20a00 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
20a10 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c  _db_filename(sql
20a20 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
20a30 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
20a40 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69    Btree *pBt;.#i
20a50 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
20a60 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
20a70 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
20a80 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
20a90 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
20aa0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
20ab0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
20ac0 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20 73  #endif.  pBt = s
20ad0 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
20ae0 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
20af0 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f  ;.  return pBt ?
20b00 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
20b10 46 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20  Filename(pBt) : 
20b20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
20b30 72 6e 20 31 20 69 66 20 64 61 74 61 62 61 73 65  rn 1 if database
20b40 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72   is read-only or
20b50 20 30 20 69 66 20 72 65 61 64 2f 77 72 69 74 65   0 if read/write
20b60 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a  .  Return -1 if.
20b70 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62  ** no such datab
20b80 61 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69  ase exists..*/.i
20b90 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
20ba0 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a  adonly(sqlite3 *
20bb0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
20bc0 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
20bd0 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53  e *pBt;.#ifdef S
20be0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
20bf0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
20c00 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
20c10 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
20c20 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
20c30 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
20c40 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn -1;.  }.#endi
20c50 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65  f.  pBt = sqlite
20c60 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
20c70 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72  b, zDbName);.  r
20c80 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69  eturn pBt ? sqli
20c90 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e  te3BtreeIsReadon
20ca0 6c 79 28 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a  ly(pBt) : -1;.}.
20cb0 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42  #if (SQLITE_ENAB
20cc0 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20  LE_APPLE_SPI>0) 
20cd0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
20ce0 4c 45 5f 5f 29 0a 0a 23 69 6e 63 6c 75 64 65 20  LE__)..#include 
20cf0 22 73 71 6c 69 74 65 33 5f 70 72 69 76 61 74 65  "sqlite3_private
20d00 2e 68 22 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 73 74  .h"../* .** Test
20d10 69 6e 67 20 61 20 66 69 6c 65 20 70 61 74 68 20  ing a file path 
20d20 66 6f 72 20 73 71 6c 69 74 65 20 6c 6f 63 6b 73  for sqlite locks
20d30 20 68 65 6c 64 20 62 79 20 61 20 70 72 6f 63 65   held by a proce
20d40 73 73 20 49 44 2e 20 0a 2a 2a 20 52 65 74 75 72  ss ID. .** Retur
20d50 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54  ns SQLITE_LOCKST
20d60 41 54 45 5f 4f 4e 20 69 66 20 6c 6f 63 6b 73 20  ATE_ON if locks 
20d70 61 72 65 20 70 72 65 73 65 6e 74 20 6f 6e 20 70  are present on p
20d80 61 74 68 0a 2a 2a 20 74 68 61 74 20 77 6f 75 6c  ath.** that woul
20d90 64 20 70 72 65 76 65 6e 74 20 77 72 69 74 69 6e  d prevent writin
20da0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
20db0 65 2e 0a 2a 2f 0a 69 6e 74 20 5f 73 71 6c 69 74  e..*/.int _sqlit
20dc0 65 33 5f 6c 6f 63 6b 73 74 61 74 65 28 63 6f 6e  e3_lockstate(con
20dd0 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 70  st char *path, p
20de0 69 64 5f 74 20 70 69 64 29 7b 0a 20 20 73 71 6c  id_t pid){.  sql
20df0 69 74 65 33 20 2a 64 62 20 3d 20 4e 55 4c 4c 3b  ite3 *db = NULL;
20e00 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65  .  .  if( sqlite
20e10 33 5f 6f 70 65 6e 5f 76 32 28 70 61 74 68 2c 20  3_open_v2(path, 
20e20 26 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  &db, SQLITE_OPEN
20e30 5f 52 45 41 44 4f 4e 4c 59 2c 20 4e 55 4c 4c 29  _READONLY, NULL)
20e40 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   == SQLITE_OK ){
20e50 0a 20 20 20 20 4c 6f 63 6b 73 74 61 74 65 50 49  .    LockstatePI
20e60 44 20 6c 6f 63 6b 73 74 61 74 65 20 3d 20 7b 70  D lockstate = {p
20e70 69 64 2c 20 2d 31 7d 3b 0a 20 20 20 20 73 71 6c  id, -1};.    sql
20e80 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
20e90 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
20ea0 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
20eb0 54 45 5f 50 49 44 2c 20 26 6c 6f 63 6b 73 74 61  TE_PID, &locksta
20ec0 74 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  te);.    sqlite3
20ed0 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20  _close(db);.    
20ee0 69 6e 74 20 73 74 61 74 65 20 3d 20 6c 6f 63 6b  int state = lock
20ef0 73 74 61 74 65 2e 73 74 61 74 65 3b 0a 20 20 20  state.state;.   
20f00 20 72 65 74 75 72 6e 20 73 74 61 74 65 3b 0a 20   return state;. 
20f10 20 7d 0a 20 20 69 66 28 20 4e 55 4c 4c 21 3d 64   }.  if( NULL!=d
20f20 62 20 29 7b 20 0a 20 20 20 20 73 71 6c 69 74 65  b ){ .    sqlite
20f30 33 5f 63 6c 6f 73 65 28 64 62 29 3b 20 2f 2a 20  3_close(db); /* 
20f40 6e 65 65 64 20 74 6f 20 63 6c 6f 73 65 20 65 76  need to close ev
20f50 65 6e 20 69 66 20 6f 70 65 6e 20 72 65 74 75 72  en if open retur
20f60 6e 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  ns an error */. 
20f70 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
20f80 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 45 52 52  TE_LOCKSTATE_ERR
20f90 4f 52 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OR;.}..#endif /*
20fa0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
20fb0 50 50 4c 45 5f 53 50 49 20 2a 2f 0a 0a 23 69 66  PPLE_SPI */..#if
20fc0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20fd0 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a  E_SNAPSHOT./*.**
20fe0 20 4f 62 74 61 69 6e 20 61 20 73 6e 61 70 73 68   Obtain a snapsh
20ff0 6f 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68  ot handle for th
21000 65 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 64 61  e snapshot of da
21010 74 61 62 61 73 65 20 7a 44 62 20 63 75 72 72 65  tabase zDb curre
21020 6e 74 6c 79 20 0a 2a 2a 20 62 65 69 6e 67 20 72  ntly .** being r
21030 65 61 64 20 62 79 20 68 61 6e 64 6c 65 20 64 62  ead by handle db
21040 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21050 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 0a 20  _snapshot_get(. 
21060 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
21070 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
21080 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  ,.  sqlite3_snap
21090 73 68 6f 74 20 2a 2a 70 70 53 6e 61 70 73 68 6f  shot **ppSnapsho
210a0 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t.){.  int rc = 
210b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69  SQLITE_ERROR;.#i
210c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
210d0 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51  T_WAL..#ifdef SQ
210e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
210f0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
21100 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
21110 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
21120 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
21130 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
21140 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
21150 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
21160 65 78 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  ex);..  if( db->
21170 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  autoCommit==0 ){
21180 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73  .    int iDb = s
21190 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
211a0 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  (db, zDb);.    i
211b0 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62  f( iDb==0 || iDb
211c0 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74 72 65  >1 ){.      Btre
211d0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
211e0 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
211f0 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42   if( 0==sqlite3B
21200 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
21210 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
21220 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
21230 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30  eginTrans(pBt, 0
21240 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
21250 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21260 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
21270 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73  qlite3PagerSnaps
21280 68 6f 74 47 65 74 28 73 71 6c 69 74 65 33 42 74  hotGet(sqlite3Bt
21290 72 65 65 50 61 67 65 72 28 70 42 74 29 2c 20 70  reePager(pBt), p
212a0 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20  pSnapshot);.    
212b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
212c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
212d0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
212e0 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69  b->mutex);.#endi
212f0 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  f   /* SQLITE_OM
21300 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75  IT_WAL */.  retu
21310 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21320 4f 70 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  Open a read-tran
21330 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73  saction on the s
21340 6e 61 70 73 68 6f 74 20 69 64 65 6e 64 69 66 69  napshot idendifi
21350 65 64 20 62 79 20 70 53 6e 61 70 73 68 6f 74 2e  ed by pSnapshot.
21360 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
21370 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20  snapshot_open(. 
21380 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
21390 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
213a0 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61  , .  sqlite3_sna
213b0 70 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74  pshot *pSnapshot
213c0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
213d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66  QLITE_ERROR;.#if
213e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
213f0 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c  _WAL..#ifdef SQL
21400 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
21410 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
21420 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
21430 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
21440 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
21450 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
21460 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
21470 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
21480 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 75  x);.  if( db->au
21490 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20  toCommit==0 ){. 
214a0 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
214b0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
214c0 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29  dDbName(db, zDb)
214d0 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30  ;.    if( iDb==0
214e0 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20   || iDb>1 ){.   
214f0 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
21500 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
21510 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
21520 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 52  qlite3BtreeIsInR
21530 65 61 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b  eadTrans(pBt) ){
21540 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
21550 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68  lite3PagerSnapsh
21560 6f 74 4f 70 65 6e 28 73 71 6c 69 74 65 33 42 74  otOpen(sqlite3Bt
21570 72 65 65 50 61 67 65 72 28 70 42 74 29 2c 20 70  reePager(pBt), p
21580 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20  Snapshot);.     
21590 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
215a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
215b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
215c0 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42  reeBeginTrans(pB
215d0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
215e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61   sqlite3PagerSna
215f0 70 73 68 6f 74 4f 70 65 6e 28 73 71 6c 69 74 65  pshotOpen(sqlite
21600 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
21610 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
21620 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21630 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  }..  sqlite3_mut
21640 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
21650 65 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a  ex);.#endif   /*
21660 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
21670 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
21680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 76 65  .}../*.** Recove
21690 72 20 61 73 20 6d 61 6e 79 20 73 6e 61 70 73 68  r as many snapsh
216a0 6f 74 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ots as possible 
216b0 66 72 6f 6d 20 74 68 65 20 77 61 6c 20 66 69 6c  from the wal fil
216c0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
216d0 68 0a 2a 2a 20 73 63 68 65 6d 61 20 7a 44 62 20  h.** schema zDb 
216e0 6f 66 20 64 61 74 61 62 61 73 65 20 64 62 2e 0a  of database db..
216f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
21700 6e 61 70 73 68 6f 74 5f 72 65 63 6f 76 65 72 28  napshot_recover(
21710 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
21720 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
21730 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21740 5f 45 52 52 4f 52 3b 0a 20 20 69 6e 74 20 69 44  _ERROR;.  int iD
21750 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
21760 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64  E_OMIT_WAL..#ifd
21770 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
21780 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
21790 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
217a0 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
217b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
217c0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
217d0 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
217e0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
217f0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 44 62  b->mutex);.  iDb
21800 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
21810 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20  Name(db, zDb);. 
21820 20 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69   if( iDb==0 || i
21830 44 62 3e 31 20 29 7b 0a 20 20 20 20 42 74 72 65  Db>1 ){.    Btre
21840 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
21850 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69  [iDb].pBt;.    i
21860 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72  f( 0==sqlite3Btr
21870 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28  eeIsInReadTrans(
21880 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pBt) ){.      rc
21890 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
218a0 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30  eginTrans(pBt, 0
218b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
218c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
218d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
218e0 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 52  e3PagerSnapshotR
218f0 65 63 6f 76 65 72 28 73 71 6c 69 74 65 33 42 74  ecover(sqlite3Bt
21900 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a  reePager(pBt));.
21910 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
21920 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b  treeCommit(pBt);
21930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21940 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
21950 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
21960 65 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a  ex);.#endif   /*
21970 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
21980 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
21990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
219a0 20 73 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c 65   snapshot handle
219b0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
219c0 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
219d0 67 65 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  get()..*/.void s
219e0 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
219f0 66 72 65 65 28 73 71 6c 69 74 65 33 5f 73 6e 61  free(sqlite3_sna
21a00 70 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74  pshot *pSnapshot
21a10 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ){.  sqlite3_fre
21a20 65 28 70 53 6e 61 70 73 68 6f 74 29 3b 0a 7d 0a  e(pSnapshot);.}.
21a30 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
21a40 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54  _ENABLE_SNAPSHOT
21a50 20 2a 2f 0a                                       */.