/ Hex Artifact Content
Login

Artifact 5d8883e245ff3c7a24529e964d807a942a8fd16a:


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 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1b30: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
1b40: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47   ){.    sqlite3G
1b60: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
1b70: 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d  InitMutex++;.  }
1b80: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b90: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
1ba0: 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20  ..  /* If rc is 
1bb0: 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74  not SQLITE_OK at
1bc0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
1bd0: 6e 20 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c  n either the mal
1be0: 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74  loc.  ** subsyst
1bf0: 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  em could not be 
1c00: 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74  initialized or t
1c10: 68 65 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64  he system failed
1c20: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a   to allocate.  *
1c30: 2a 20 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78  * the pInitMutex
1c40: 20 6d 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61   mutex. Return a
1c50: 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65  n error in eithe
1c60: 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66  r case.  */.  if
1c70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1c90: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74  ;.  }..  /* Do t
1ca0: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 69  he rest of the i
1cb0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e  nitialization un
1cc0: 64 65 72 20 74 68 65 20 72 65 63 75 72 73 69 76  der the recursiv
1cd0: 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20  e mutex so.  ** 
1ce0: 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
1cf0: 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72  able to handle r
1d00: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69  ecursive calls i
1d10: 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  nto.  ** sqlite3
1d20: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20  _initialize().  
1d30: 54 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  The recursive ca
1d40: 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d  lls normally com
1d50: 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73  e through.  ** s
1d60: 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29  qlite3_os_init()
1d70: 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73   when it invokes
1d80: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
1d90: 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68  ister(), but oth
1da0: 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76  er.  ** recursiv
1db0: 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c  e calls might al
1dc0: 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a  so be possible..
1dd0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d    **.  ** IMPLEM
1de0: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30  ENTATION-OF: R-0
1df0: 30 31 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74  0140-37445 SQLit
1e00: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
1e10: 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73  serializes calls
1e20: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e  .  ** to the xIn
1e30: 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68  it method, so th
1e40: 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e  e xInit method n
1e50: 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61  eed not be threa
1e60: 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dsafe..  **.  **
1e70: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
1e80: 75 74 65 78 20 69 73 20 77 68 61 74 20 73 65 72  utex is what ser
1e90: 69 61 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74  ializes access t
1ea0: 6f 20 74 68 65 20 61 70 70 64 65 66 20 70 63 61  o the appdef pca
1eb0: 63 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d  che xInit.  ** m
1ec0: 65 74 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c  ethods.  The sql
1ed0: 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68  ite3_pcache_meth
1ee0: 6f 64 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20  ods.xInit() all 
1ef0: 69 73 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74  is embedded in t
1f00: 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20  he.  ** call to 
1f10: 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69  sqlite3PcacheIni
1f20: 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a  tialize()..  */.
1f30: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1f40: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f  enter(sqlite3Glo
1f50: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1f60: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c  utex);.  if( sql
1f70: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1f80: 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71  .isInit==0 && sq
1f90: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1fa0: 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20  g.inProgress==0 
1fb0: 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 48 61  ){.    FuncDefHa
1fc0: 73 68 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f  sh *pHash = &GLO
1fd0: 42 41 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c  BAL(FuncDefHash,
1fe0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75   sqlite3GlobalFu
1ff0: 6e 63 74 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71  nctions);.    sq
2000: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2010: 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31  g.inProgress = 1
2020: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2030: 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20  ENABLE_SQLLOG.  
2040: 20 20 7b 0a 20 20 20 20 20 20 65 78 74 65 72 6e    {.      extern
2050: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e   void sqlite3_in
2060: 69 74 5f 73 71 6c 6c 6f 67 28 76 6f 69 64 29 3b  it_sqllog(void);
2070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
2080: 6e 69 74 5f 73 71 6c 6c 6f 67 28 29 3b 0a 20 20  nit_sqllog();.  
2090: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6d    }.#endif.    m
20a0: 65 6d 73 65 74 28 70 48 61 73 68 2c 20 30 2c 20  emset(pHash, 0, 
20b0: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c  sizeof(sqlite3Gl
20c0: 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29 29 3b  obalFunctions));
20d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69  .    sqlite3Regi
20e0: 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e 63 74 69  sterGlobalFuncti
20f0: 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73  ons();.    if( s
2100: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2110: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d  ig.isPCacheInit=
2120: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2130: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e   sqlite3PcacheIn
2140: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
2150: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2160: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2170: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2180: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2190: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  t = 1;.      rc 
21a0: 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28  = sqlite3OsInit(
21b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
21c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
21e0: 43 61 63 68 65 42 75 66 66 65 72 53 65 74 75 70  CacheBufferSetup
21f0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2200: 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20 0a 20 20  onfig.pPage, .  
2210: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
2220: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
2230: 67 65 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ge, sqlite3Globa
2240: 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 29 3b 0a  lConfig.nPage);.
2250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2260: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
2270: 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 1;.#ifdef SQL
2280: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20  ITE_EXTRA_INIT. 
2290: 20 20 20 20 20 62 52 75 6e 45 78 74 72 61 49 6e       bRunExtraIn
22a0: 69 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20  it = 1;.#endif. 
22b0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
22c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
22d0: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 7d  rogress = 0;.  }
22e0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
22f0: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 47 6c  _leave(sqlite3Gl
2300: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
2310: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f  Mutex);..  /* Go
2320: 20 62 61 63 6b 20 75 6e 64 65 72 20 74 68 65 20   back under the 
2330: 73 74 61 74 69 63 20 6d 75 74 65 78 20 61 6e 64  static mutex and
2340: 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65   clean up the re
2350: 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 6d 75 74  cursive.  ** mut
2360: 65 78 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20  ex to prevent a 
2370: 72 65 73 6f 75 72 63 65 20 6c 65 61 6b 2e 0a 20  resource leak.. 
2380: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
2390: 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
23a0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f  r);.  sqlite3Glo
23b0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
23c0: 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28  itMutex--;.  if(
23d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
23e0: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
23f0: 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ex<=0 ){.    ass
2400: 65 72 74 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ert( sqlite3Glob
2410: 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69  alConfig.nRefIni
2420: 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20  tMutex==0 );.   
2430: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
2440: 72 65 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ree(sqlite3Globa
2450: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
2460: 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
2470: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
2480: 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 7d  itMutex = 0;.  }
2490: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
24a0: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
24b0: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
24c0: 77 69 6e 67 20 69 73 20 6a 75 73 74 20 61 20 73  wing is just a s
24d0: 61 6e 69 74 79 20 63 68 65 63 6b 20 74 6f 20 6d  anity check to m
24e0: 61 6b 65 20 73 75 72 65 20 53 51 4c 69 74 65 20  ake sure SQLite 
24f0: 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f  has.  ** been co
2500: 6d 70 69 6c 65 64 20 63 6f 72 72 65 63 74 6c 79  mpiled correctly
2510: 2e 20 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  .  It is importa
2520: 6e 74 20 74 6f 20 72 75 6e 20 74 68 69 73 20 63  nt to run this c
2530: 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a 20 77 65  ode, but.  ** we
2540: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
2550: 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74 65 6e 20  un it too often 
2560: 61 6e 64 20 73 6f 61 6b 20 75 70 20 43 50 55 20  and soak up CPU 
2570: 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f 0a 20 20  cycles for no.  
2580: 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53 6f 20 77  ** reason.  So w
2590: 65 20 72 75 6e 20 69 74 20 6f 6e 63 65 20 64 75  e run it once du
25a0: 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74  ring initializat
25b0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ion..  */.#ifnde
25c0: 66 20 4e 44 45 42 55 47 0a 23 69 66 6e 64 65 66  f NDEBUG.#ifndef
25d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
25e0: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a  ATING_POINT.  /*
25f0: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 6f 66   This section of
2600: 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20 22 6f 75   code's only "ou
2610: 74 70 75 74 22 20 69 73 20 76 69 61 20 61 73 73  tput" is via ass
2620: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
2630: 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72 63 3d 3d  . */.  if ( rc==
2640: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2650: 20 75 36 34 20 78 20 3d 20 28 28 28 75 36 34 29   u64 x = (((u64)
2660: 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20 20 20 64  1)<<63)-1;.    d
2670: 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 61 73 73  ouble y;.    ass
2680: 65 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 38  ert(sizeof(x)==8
2690: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69  );.    assert(si
26a0: 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65 6f 66 28  zeof(x)==sizeof(
26b0: 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  y));.    memcpy(
26c0: 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20  &y, &x, 8);.    
26d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 49  assert( sqlite3I
26e0: 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20 7d 0a 23  sNaN(y) );.  }.#
26f0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
2700: 2f 2a 20 44 6f 20 65 78 74 72 61 20 69 6e 69 74  /* Do extra init
2710: 69 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73  ialization steps
2720: 20 72 65 71 75 65 73 74 65 64 20 62 79 20 74 68   requested by th
2730: 65 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  e SQLITE_EXTRA_I
2740: 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65  NIT.  ** compile
2750: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20 20  -time option..  
2760: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2770: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 66  _EXTRA_INIT.  if
2780: 28 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20  ( bRunExtraInit 
2790: 29 7b 0a 20 20 20 20 69 6e 74 20 53 51 4c 49 54  ){.    int SQLIT
27a0: 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 63 6f 6e  E_EXTRA_INIT(con
27b0: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 72  st char*);.    r
27c0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 58 54 52 41  c = SQLITE_EXTRA
27d0: 5f 49 4e 49 54 28 30 29 3b 0a 20 20 7d 0a 23 65  _INIT(0);.  }.#e
27e0: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
27f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f  c;.}../*.** Undo
2800: 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20   the effects of 
2810: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
2820: 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e 6f 74 20  ze().  Must not 
2830: 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 0a  be called while.
2840: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  ** there are out
2850: 73 74 61 6e 64 69 6e 67 20 64 61 74 61 62 61 73  standing databas
2860: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
2870: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2880: 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69 6c 65 20  ons or.** while 
2890: 61 6e 79 20 70 61 72 74 20 6f 66 20 53 51 4c 69  any part of SQLi
28a0: 74 65 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  te is otherwise 
28b0: 69 6e 20 75 73 65 20 69 6e 20 61 6e 79 20 74 68  in use in any th
28c0: 72 65 61 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  read.  This.** r
28d0: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 74 68  outine is not th
28e0: 72 65 61 64 73 61 66 65 2e 20 20 42 75 74 20 69  readsafe.  But i
28f0: 74 20 69 73 20 73 61 66 65 20 74 6f 20 69 6e 76  t is safe to inv
2900: 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oke this routine
2910: 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20 53 51 4c 69  .** on when SQLi
2920: 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 68  te is already sh
2930: 75 74 20 64 6f 77 6e 2e 20 20 49 66 20 53 51 4c  ut down.  If SQL
2940: 69 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 73  ite is already s
2950: 68 75 74 20 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e  hut down.** when
2960: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2970: 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65 6e 20 74   invoked, then t
2980: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
2990: 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
29a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
29b0: 73 68 75 74 64 6f 77 6e 28 76 6f 69 64 29 7b 0a  shutdown(void){.
29c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
29d0: 49 54 5f 57 53 44 0a 20 20 69 6e 74 20 72 63 20  IT_WSD.  int rc 
29e0: 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69 6e  = sqlite3_wsd_in
29f0: 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20 20  it(4096, 24);.  
2a00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a10: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
2a20: 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
2a30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2a40: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
2a50: 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
2a60: 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e  E_EXTRA_SHUTDOWN
2a70: 0a 20 20 20 20 76 6f 69 64 20 53 51 4c 49 54 45  .    void SQLITE
2a80: 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e 28  _EXTRA_SHUTDOWN(
2a90: 76 6f 69 64 29 3b 0a 20 20 20 20 53 51 4c 49 54  void);.    SQLIT
2aa0: 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e  E_EXTRA_SHUTDOWN
2ab0: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  ();.#endif.    s
2ac0: 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 3b  qlite3_os_end();
2ad0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2ae0: 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f  et_auto_extensio
2af0: 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n();.    sqlite3
2b00: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2b10: 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  nit = 0;.  }.  i
2b20: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
2b30: 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49  Config.isPCacheI
2b40: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2b50: 65 33 50 63 61 63 68 65 53 68 75 74 64 6f 77 6e  e3PcacheShutdown
2b60: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  ();.    sqlite3G
2b70: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2b80: 61 63 68 65 49 6e 69 74 20 3d 20 30 3b 0a 20 20  acheInit = 0;.  
2b90: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2ba0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61  lobalConfig.isMa
2bb0: 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20  llocInit ){.    
2bc0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64  sqlite3MallocEnd
2bd0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  ();.    sqlite3G
2be0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61  lobalConfig.isMa
2bf0: 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b 0a 0a 23  llocInit = 0;..#
2c00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c10: 49 54 5f 53 48 55 54 44 4f 57 4e 5f 44 49 52 45  IT_SHUTDOWN_DIRE
2c20: 43 54 4f 52 49 45 53 0a 20 20 20 20 2f 2a 20 54  CTORIES.    /* T
2c30: 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74 65  he heap subsyste
2c40: 6d 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 73  m has now been s
2c50: 68 75 74 64 6f 77 6e 20 61 6e 64 20 74 68 65 73  hutdown and thes
2c60: 65 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70  e values are sup
2c70: 70 6f 73 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20  posed.    ** to 
2c80: 62 65 20 4e 55 4c 4c 20 6f 72 20 70 6f 69 6e 74  be NULL or point
2c90: 20 74 6f 20 6d 65 6d 6f 72 79 20 74 68 61 74 20   to memory that 
2ca0: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
2cb0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
2cc0: 28 29 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68  (),.    ** which
2cd0: 20 77 6f 75 6c 64 20 72 65 6c 79 20 6f 6e 20 74   would rely on t
2ce0: 68 61 74 20 68 65 61 70 20 73 75 62 73 79 73 74  hat heap subsyst
2cf0: 65 6d 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6d  em; therefore, m
2d00: 61 6b 65 20 73 75 72 65 20 74 68 65 73 65 0a 20  ake sure these. 
2d10: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 63 61 6e     ** values can
2d20: 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 68 65 61  not refer to hea
2d30: 70 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61  p memory that wa
2d40: 73 20 6a 75 73 74 20 69 6e 76 61 6c 69 64 61 74  s just invalidat
2d50: 65 64 20 77 68 65 6e 20 74 68 65 0a 20 20 20 20  ed when the.    
2d60: 2a 2a 20 68 65 61 70 20 73 75 62 73 79 73 74 65  ** heap subsyste
2d70: 6d 20 77 61 73 20 73 68 75 74 64 6f 77 6e 2e 20  m was shutdown. 
2d80: 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 64 6f   This is only do
2d90: 6e 65 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ne if the curren
2da0: 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  t call to.    **
2db0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2dc0: 65 73 75 6c 74 65 64 20 69 6e 20 74 68 65 20 68  esulted in the h
2dd0: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 61 63  eap subsystem ac
2de0: 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 73 68 75  tually being shu
2df0: 74 64 6f 77 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  tdown..    */.  
2e00: 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
2e10: 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20  irectory = 0;.  
2e20: 20 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64    sqlite3_temp_d
2e30: 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 65  irectory = 0;.#e
2e40: 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 73  ndif.  }.  if( s
2e50: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2e60: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 29  ig.isMutexInit )
2e70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74  {.    sqlite3Mut
2e80: 65 78 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  exEnd();.    sql
2e90: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2ea0: 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d 20 30  .isMutexInit = 0
2eb0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2ec0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2ed0: 0a 2a 2a 20 54 68 69 73 20 41 50 49 20 61 6c 6c  .** This API all
2ee0: 6f 77 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  ows applications
2ef0: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 67   to modify the g
2f00: 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  lobal configurat
2f10: 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 53 51  ion of.** the SQ
2f20: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 61 74 20  Lite library at 
2f30: 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  run-time..**.** 
2f40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
2f50: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
2f60: 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
2f70: 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
2f80: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
2f90: 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f  nections or memo
2fa0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20  ry allocations. 
2fb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2fc0: 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 61   not.** threadsa
2fd0: 66 65 2e 20 20 46 61 69 6c 75 72 65 20 74 6f 20  fe.  Failure to 
2fe0: 68 65 65 64 20 74 68 65 73 65 20 77 61 72 6e 69  heed these warni
2ff0: 6e 67 73 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  ngs can lead to 
3000: 75 6e 70 72 65 64 69 63 74 61 62 6c 65 0a 2a 2a  unpredictable.**
3010: 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e   behavior..*/.in
3020: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  t sqlite3_config
3030: 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20  (int op, ...){. 
3040: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
3050: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
3060: 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33  K;..  /* sqlite3
3070: 5f 63 6f 6e 66 69 67 28 29 20 73 68 61 6c 6c 20  _config() shall 
3080: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
3090: 53 55 53 45 20 69 66 20 69 74 20 69 73 20 69 6e  SUSE if it is in
30a0: 76 6f 6b 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a  voked while.  **
30b0: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
30c0: 61 72 79 20 69 73 20 69 6e 20 75 73 65 2e 20 2a  ary is in use. *
30d0: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  /.  if( sqlite3G
30e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
30f0: 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  it ) return SQLI
3100: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
3110: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
3120: 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op);.  switch( o
3130: 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4d 75 74  p ){..    /* Mut
3140: 65 78 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ex configuration
3150: 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 6f 6e 6c   options are onl
3160: 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  y available in a
3170: 20 74 68 72 65 61 64 73 61 66 65 0a 20 20 20 20   threadsafe.    
3180: 2a 2a 20 63 6f 6d 70 69 6c 65 2e 0a 20 20 20 20  ** compile..    
3190: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
31a0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
31b0: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
31c0: 41 44 53 41 46 45 3e 30 20 20 2f 2a 20 49 4d 50  ADSAFE>0  /* IMP
31d0: 3a 20 52 2d 35 34 34 36 36 2d 34 36 37 35 36 20  : R-54466-46756 
31e0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
31f0: 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45  TE_CONFIG_SINGLE
3200: 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20  THREAD: {.      
3210: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
3220: 52 2d 30 32 37 34 38 2d 31 39 30 39 36 20 54 68  R-02748-19096 Th
3230: 69 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74  is option sets t
3240: 68 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64  he threading mod
3250: 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 69  e to.      ** Si
3260: 6e 67 6c 65 2d 74 68 72 65 61 64 2e 20 2a 2f 0a  ngle-thread. */.
3270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3280: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
3290: 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a 20 44 69  utex = 0;  /* Di
32a0: 73 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63  sable mutex on c
32b0: 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ore */.      sql
32c0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
32d0: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b  .bFullMutex = 0;
32e0: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74    /* Disable mut
32f0: 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e  ex on connection
3300: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
3310: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
3320: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3330: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
3340: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3350: 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  FE>0 /* IMP: R-2
3360: 30 35 32 30 2d 35 34 30 38 36 20 2a 2f 0a 20 20  0520-54086 */.  
3370: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3380: 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44  NFIG_MULTITHREAD
3390: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
33a0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 33 37  DENCE-OF: R-1437
33b0: 34 2d 34 32 34 36 38 20 54 68 69 73 20 6f 70 74  4-42468 This opt
33c0: 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74 68 72  ion sets the thr
33d0: 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f 0a 20  eading mode to. 
33e0: 20 20 20 20 20 2a 2a 20 4d 75 6c 74 69 2d 74 68       ** Multi-th
33f0: 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73  read. */.      s
3400: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3410: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
3420: 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75  1;  /* Enable mu
3430: 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20  tex on core */. 
3440: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3450: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
3460: 74 65 78 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73  tex = 0;  /* Dis
3470: 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f  able mutex on co
3480: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
3490: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
34a0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
34b0: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
34c0: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
34d0: 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20  THREADSAFE>0 /* 
34e0: 49 4d 50 3a 20 52 2d 35 39 35 39 33 2d 32 31 38  IMP: R-59593-218
34f0: 31 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  10 */.    case S
3500: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 52  QLITE_CONFIG_SER
3510: 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20 20  IALIZED: {.     
3520: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
3530: 20 52 2d 34 31 32 32 30 2d 35 31 38 30 30 20 54   R-41220-51800 T
3540: 68 69 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20  his option sets 
3550: 74 68 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f  the threading mo
3560: 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53  de to.      ** S
3570: 65 72 69 61 6c 69 7a 65 64 2e 20 2a 2f 0a 20 20  erialized. */.  
3580: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3590: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
35a0: 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62  ex = 1;  /* Enab
35b0: 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65  le mutex on core
35c0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
35d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
35e0: 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f  ullMutex = 1;  /
35f0: 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f  * Enable mutex o
3600: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  n connections */
3610: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3620: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
3630: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48  efined(SQLITE_TH
3640: 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c  READSAFE) && SQL
3650: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
3660: 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 33 36 36 36   /* IMP: R-63666
3670: 2d 34 38 37 35 35 20 2a 2f 0a 20 20 20 20 63 61  -48755 */.    ca
3680: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3690: 5f 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  _MUTEX: {.      
36a0: 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c  /* Specify an al
36b0: 74 65 72 6e 61 74 69 76 65 20 6d 75 74 65 78 20  ternative mutex 
36c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
36d0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
36e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65  lobalConfig.mute
36f0: 78 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  x = *va_arg(ap, 
3700: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65  sqlite3_mutex_me
3710: 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62  thods*);.      b
3720: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3730: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
3740: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
3750: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
3760: 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a  ADSAFE>0 /* IMP:
3770: 20 52 2d 31 34 34 35 30 2d 33 37 35 39 37 20 2a   R-14450-37597 *
3780: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
3790: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45  E_CONFIG_GETMUTE
37a0: 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65  X: {.      /* Re
37b0: 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65  trieve the curre
37c0: 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  nt mutex impleme
37d0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
37e0: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
37f0: 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f  ite3_mutex_metho
3800: 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  ds*) = sqlite3Gl
3810: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78  obalConfig.mutex
3820: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3830: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
3840: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3850: 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  FIG_MALLOC: {.  
3860: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
3870: 4f 46 3a 20 52 2d 35 35 35 39 34 2d 32 31 30 33  OF: R-55594-2103
3880: 30 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  0 The SQLITE_CON
3890: 46 49 47 5f 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f  FIG_MALLOC optio
38a0: 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20  n takes a.      
38b0: 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65  ** single argume
38c0: 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70 6f  nt which is a po
38d0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
38e0: 61 6e 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20  ance of the.    
38f0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d    ** sqlite3_mem
3900: 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75  _methods structu
3910: 72 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  re. The argument
3920: 20 73 70 65 63 69 66 69 65 73 20 61 6c 74 65 72   specifies alter
3930: 6e 61 74 69 76 65 0a 20 20 20 20 20 20 2a 2a 20  native.      ** 
3940: 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79  low-level memory
3950: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74   allocation rout
3960: 69 6e 65 73 20 74 6f 20 62 65 20 75 73 65 64 20  ines to be used 
3970: 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  in place of the 
3980: 6d 65 6d 6f 72 79 0a 20 20 20 20 20 20 2a 2a 20  memory.      ** 
3990: 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69  allocation routi
39a0: 6e 65 73 20 62 75 69 6c 74 20 69 6e 74 6f 20 53  nes built into S
39b0: 51 4c 69 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20  QLite. */.      
39c0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
39d0: 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28  fig.m = *va_arg(
39e0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  ap, sqlite3_mem_
39f0: 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20  methods*);.     
3a00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3a10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3a20: 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20  NFIG_GETMALLOC: 
3a30: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
3a40: 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 32 31 33 2d  NCE-OF: R-51213-
3a50: 34 36 34 31 34 20 54 68 65 20 53 51 4c 49 54 45  46414 The SQLITE
3a60: 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f  _CONFIG_GETMALLO
3a70: 43 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  C option takes a
3a80: 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65  .      ** single
3a90: 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20   argument which 
3aa0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
3ab0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
3ac0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  he.      ** sqli
3ad0: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
3ae0: 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 20 73  structure. The s
3af0: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
3b00: 64 73 20 73 74 72 75 63 74 75 72 65 20 69 73 0a  ds structure is.
3b10: 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20        ** filled 
3b20: 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
3b30: 6c 79 20 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72  ly defined memor
3b40: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75  y allocation rou
3b50: 74 69 6e 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tines. */.      
3b60: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
3b70: 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f  lConfig.m.xMallo
3b80: 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d 65  c==0 ) sqlite3Me
3b90: 6d 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20  mSetDefault();. 
3ba0: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
3bb0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3bc0: 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33  hods*) = sqlite3
3bd0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a  GlobalConfig.m;.
3be0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3bf0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3c00: 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41  TE_CONFIG_MEMSTA
3c10: 54 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  TUS: {.      /* 
3c20: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
3c30: 31 32 37 35 2d 33 35 31 35 37 20 54 68 65 20 53  1275-35157 The S
3c40: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d  QLITE_CONFIG_MEM
3c50: 53 54 41 54 55 53 20 6f 70 74 69 6f 6e 20 74 61  STATUS option ta
3c60: 6b 65 73 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e  kes.      ** sin
3c70: 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 6f 66 20  gle argument of 
3c80: 74 79 70 65 20 69 6e 74 2c 20 69 6e 74 65 72 70  type int, interp
3c90: 72 65 74 65 64 20 61 73 20 61 20 62 6f 6f 6c 65  reted as a boole
3ca0: 61 6e 2c 20 77 68 69 63 68 20 65 6e 61 62 6c 65  an, which enable
3cb0: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 64 69  s.      ** or di
3cc0: 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 6c 65  sables the colle
3cd0: 63 74 69 6f 6e 20 6f 66 20 6d 65 6d 6f 72 79 20  ction of memory 
3ce0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 74 61 74 69  allocation stati
3cf0: 73 74 69 63 73 2e 20 2a 2f 0a 20 20 20 20 20 20  stics. */.      
3d00: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3d10: 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20 76  fig.bMemstat = v
3d20: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
3d30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3d40: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3d50: 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43  TE_CONFIG_SCRATC
3d60: 48 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  H: {.      /* EV
3d70: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 34  IDENCE-OF: R-084
3d80: 30 34 2d 36 30 38 38 37 20 54 68 65 72 65 20 61  04-60887 There a
3d90: 72 65 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e  re three argumen
3da0: 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53  ts to.      ** S
3db0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52  QLITE_CONFIG_SCR
3dc0: 41 54 43 48 3a 20 41 20 70 6f 69 6e 74 65 72 20  ATCH: A pointer 
3dd0: 61 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  an 8-byte aligne
3de0: 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 20  d memory buffer 
3df0: 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 77 68  from.      ** wh
3e00: 69 63 68 20 74 68 65 20 73 63 72 61 74 63 68 20  ich the scratch 
3e10: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 77 69 6c 6c  allocations will
3e20: 20 62 65 20 64 72 61 77 6e 2c 20 74 68 65 20 73   be drawn, the s
3e30: 69 7a 65 20 6f 66 20 65 61 63 68 20 73 63 72 61  ize of each scra
3e40: 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  tch.      ** all
3e50: 6f 63 61 74 69 6f 6e 20 28 73 7a 29 2c 20 61 6e  ocation (sz), an
3e60: 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  d the maximum nu
3e70: 6d 62 65 72 20 6f 66 20 73 63 72 61 74 63 68 20  mber of scratch 
3e80: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 28 4e 29 2e  allocations (N).
3e90: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3ea0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
3eb0: 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28  cratch = va_arg(
3ec0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
3ed0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3ee0: 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20  onfig.szScratch 
3ef0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3f00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3f10: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63  GlobalConfig.nSc
3f20: 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61  ratch = va_arg(a
3f30: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3f40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3f50: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3f60: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3f70: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3f80: 45 2d 4f 46 3a 20 52 2d 33 31 34 30 38 2d 34 30  E-OF: R-31408-40
3f90: 35 31 30 20 54 68 65 72 65 20 61 72 65 20 74 68  510 There are th
3fa0: 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ree arguments to
3fb0: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
3fc0: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
3fd0: 45 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  E: A pointer to 
3fe0: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d  8-byte aligned m
3ff0: 65 6d 6f 72 79 2c 20 74 68 65 20 73 69 7a 65 0a  emory, the size.
4000: 20 20 20 20 20 20 2a 2a 20 6f 66 20 65 61 63 68        ** of each
4010: 20 70 61 67 65 20 62 75 66 66 65 72 20 28 73 7a   page buffer (sz
4020: 29 2c 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ), and the numbe
4030: 72 20 6f 66 20 70 61 67 65 73 20 28 4e 29 2e 20  r of pages (N). 
4040: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
4050: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61  GlobalConfig.pPa
4060: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
4070: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
4080: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4090: 67 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f 61 72  g.szPage = va_ar
40a0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
40b0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
40c0: 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76 61  onfig.nPage = va
40d0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
40e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
40f0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
4100: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f  E_CONFIG_PCACHE_
4110: 48 44 52 53 5a 3a 20 7b 0a 20 20 20 20 20 20 2f  HDRSZ: {.      /
4120: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
4130: 2d 33 39 31 30 30 2d 32 37 33 31 37 20 54 68 65  -39100-27317 The
4140: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4150: 43 41 43 48 45 5f 48 44 52 53 5a 20 6f 70 74 69  CACHE_HDRSZ opti
4160: 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a  on takes.      *
4170: 2a 20 61 20 73 69 6e 67 6c 65 20 70 61 72 61 6d  * a single param
4180: 65 74 65 72 20 77 68 69 63 68 20 69 73 20 61 20  eter which is a 
4190: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
41a0: 74 65 67 65 72 20 61 6e 64 20 77 72 69 74 65 73  teger and writes
41b0: 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74   into.      ** t
41c0: 68 61 74 20 69 6e 74 65 67 65 72 20 74 68 65 20  hat integer the 
41d0: 6e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  number of extra 
41e0: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 72  bytes per page r
41f0: 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
4200: 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
4210: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  n SQLITE_CONFIG_
4220: 50 41 47 45 43 41 43 48 45 2e 20 2a 2f 0a 20 20  PAGECACHE. */.  
4230: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
4240: 69 6e 74 2a 29 20 3d 20 0a 20 20 20 20 20 20 20  int*) = .       
4250: 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72     sqlite3Header
4260: 53 69 7a 65 42 74 72 65 65 28 29 20 2b 0a 20 20  SizeBtree() +.  
4270: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
4280: 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 28  eaderSizePcache(
4290: 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ) +.          sq
42a0: 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 50  lite3HeaderSizeP
42b0: 63 61 63 68 65 31 28 29 3b 0a 20 20 20 20 20 20  cache1();.      
42c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
42d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
42e0: 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20  NFIG_PCACHE: {. 
42f0: 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f       /* no-op */
4300: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4310: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
4320: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43  ITE_CONFIG_GETPC
4330: 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ACHE: {.      /*
4340: 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f   now an error */
4350: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
4360: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
4370: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4380: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
4390: 4e 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a  NFIG_PCACHE2: {.
43a0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
43b0: 45 2d 4f 46 3a 20 52 2d 36 33 33 32 35 2d 34 38  E-OF: R-63325-48
43c0: 33 37 38 20 54 68 65 20 53 51 4c 49 54 45 5f 43  378 The SQLITE_C
43d0: 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 20 6f 70  ONFIG_PCACHE2 op
43e0: 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20  tion takes a.   
43f0: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
4400: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61  ument which is a
4410: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
4420: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
4430: 74 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20  thods2.      ** 
4440: 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 6f 62 6a  object. This obj
4450: 65 63 74 20 73 70 65 63 69 66 69 65 73 20 74 68  ect specifies th
4460: 65 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 61  e interface to a
4470: 20 63 75 73 74 6f 6d 20 70 61 67 65 20 63 61 63   custom page cac
4480: 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  he.      ** impl
4490: 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20  ementation. */. 
44a0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
44b0: 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32  alConfig.pcache2
44c0: 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73   = *va_arg(ap, s
44d0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
44e0: 74 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20 20  thods2*);.      
44f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4500: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4510: 46 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a 20  FIG_GETPCACHE2: 
4520: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
4530: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 30 33 35 2d  NCE-OF: R-22035-
4540: 34 36 31 38 32 20 54 68 65 20 53 51 4c 49 54 45  46182 The SQLITE
4550: 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48  _CONFIG_GETPCACH
4560: 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  E2 option takes 
4570: 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c  a.      ** singl
4580: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
4590: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
45a0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61 63   an sqlite3_pcac
45b0: 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20 20  he_methods2.    
45c0: 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 53 51 4c    ** object. SQL
45d0: 69 74 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ite copies of th
45e0: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
45f0: 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ache implementat
4600: 69 6f 6e 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a  ion into.      *
4610: 2a 20 74 68 61 74 20 6f 62 6a 65 63 74 2e 20 2a  * that object. *
4620: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
4630: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4640: 70 63 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30  pcache2.xInit==0
4650: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4660: 74 65 33 50 43 61 63 68 65 53 65 74 44 65 66 61  te3PCacheSetDefa
4670: 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ult();.      }. 
4680: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
4690: 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
46a0: 6d 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c  methods2*) = sql
46b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
46c0: 2e 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20 20  .pcache2;.      
46d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 2f 2a  break;.    }../*
46e0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
46f0: 30 36 36 32 36 2d 31 32 39 31 31 20 54 68 65 20  06626-12911 The 
4700: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45  SQLITE_CONFIG_HE
4710: 41 50 20 6f 70 74 69 6f 6e 20 69 73 20 6f 6e 6c  AP option is onl
4720: 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 69  y.** available i
4730: 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  f SQLite is comp
4740: 69 6c 65 64 20 77 69 74 68 20 65 69 74 68 65 72  iled with either
4750: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
4760: 45 4d 53 59 53 33 20 6f 72 0a 2a 2a 20 53 51 4c  EMSYS3 or.** SQL
4770: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4780: 53 35 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53  S5 and returns S
4790: 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 69  QLITE_ERROR if i
47a0: 6e 76 6f 6b 65 64 20 6f 74 68 65 72 77 69 73 65  nvoked otherwise
47b0: 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  . */.#if defined
47c0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d  (SQLITE_ENABLE_M
47d0: 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69 6e  EMSYS3) || defin
47e0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
47f0: 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63 61  _MEMSYS5).    ca
4800: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
4810: 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f  _HEAP: {.      /
4820: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
4830: 2d 31 39 38 35 34 2d 34 32 31 32 36 20 54 68 65  -19854-42126 The
4840: 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72 67  re are three arg
4850: 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  uments to.      
4860: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ** SQLITE_CONFIG
4870: 5f 48 45 41 50 3a 20 41 6e 20 38 2d 62 79 74 65  _HEAP: An 8-byte
4880: 20 61 6c 69 67 6e 65 64 20 70 6f 69 6e 74 65 72   aligned pointer
4890: 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20   to the memory, 
48a0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d  the.      ** num
48b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
48c0: 74 68 65 20 6d 65 6d 6f 72 79 20 62 75 66 66 65  the memory buffe
48d0: 72 2c 20 61 6e 64 20 74 68 65 20 6d 69 6e 69 6d  r, and the minim
48e0: 75 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69  um allocation si
48f0: 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
4900: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4910: 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 76  Config.pHeap = v
4920: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4930: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4940: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61  lobalConfig.nHea
4950: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  p = va_arg(ap, i
4960: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
4970: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4980: 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28 61 70  nReq = va_arg(ap
4990: 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20 69  , int);..      i
49a0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
49b0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c 31 20 29  Config.mnReq<1 )
49c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
49d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
49e0: 52 65 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Req = 1;.      }
49f0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
4a00: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
4a10: 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b 0a 20 20  eq>(1<<12) ){.  
4a20: 20 20 20 20 20 20 2f 2a 20 63 61 70 20 6d 69 6e        /* cap min
4a30: 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 61 74   request size at
4a40: 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20 20 20 20   2^12 */.       
4a50: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4a60: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 28 31 3c  nfig.mnReq = (1<
4a70: 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  <12);.      }.. 
4a80: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
4a90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
4aa0: 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ap==0 ){.       
4ab0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
4ac0: 20 52 2d 34 39 39 32 30 2d 36 30 31 38 39 20 49   R-49920-60189 I
4ad0: 66 20 74 68 65 20 66 69 72 73 74 20 70 6f 69 6e  f the first poin
4ae0: 74 65 72 20 28 74 68 65 20 6d 65 6d 6f 72 79 20  ter (the memory 
4af0: 70 6f 69 6e 74 65 72 29 0a 20 20 20 20 20 20 20  pointer).       
4b00: 20 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65   ** is NULL, the
4b10: 6e 20 53 51 4c 69 74 65 20 72 65 76 65 72 74 73  n SQLite reverts
4b20: 20 74 6f 20 75 73 69 6e 67 20 69 74 73 20 64 65   to using its de
4b30: 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20 61 6c 6c  fault memory all
4b40: 6f 63 61 74 6f 72 0a 20 20 20 20 20 20 20 20 2a  ocator.        *
4b50: 2a 20 28 74 68 65 20 73 79 73 74 65 6d 20 6d 61  * (the system ma
4b60: 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74  lloc() implement
4b70: 61 74 69 6f 6e 29 2c 20 75 6e 64 6f 69 6e 67 20  ation), undoing 
4b80: 61 6e 79 20 70 72 69 6f 72 20 69 6e 76 6f 63 61  any prior invoca
4b90: 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 20 20  tion of.        
4ba0: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ** SQLITE_CONFIG
4bb0: 5f 4d 41 4c 4c 4f 43 2e 0a 20 20 20 20 20 20 20  _MALLOC..       
4bc0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 53   **.        ** S
4bd0: 65 74 74 69 6e 67 20 73 71 6c 69 74 65 33 47 6c  etting sqlite3Gl
4be0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 74 6f 20  obalConfig.m to 
4bf0: 61 6c 6c 20 7a 65 72 6f 73 20 77 69 6c 6c 20 63  all zeros will c
4c00: 61 75 73 65 20 6d 61 6c 6c 6f 63 20 74 6f 0a 20  ause malloc to. 
4c10: 20 20 20 20 20 20 20 2a 2a 20 72 65 76 65 72 74         ** revert
4c20: 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74 20   to its default 
4c30: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
4c40: 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  hen sqlite3_init
4c50: 69 61 6c 69 7a 65 28 29 20 69 73 20 72 75 6e 0a  ialize() is run.
4c60: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
4c70: 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74     memset(&sqlit
4c80: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4c90: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
4ca0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4cb0: 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  m));.      }else
4cc0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
4cd0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 30 30  DENCE-OF: R-6100
4ce0: 36 2d 30 38 39 31 38 20 49 66 20 74 68 65 20 6d  6-08918 If the m
4cf0: 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 20 69 73  emory pointer is
4d00: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 74   not NULL then t
4d10: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  he.        ** al
4d20: 74 65 72 6e 61 74 69 76 65 20 6d 65 6d 6f 72 79  ternative memory
4d30: 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6e   allocator is en
4d40: 67 61 67 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  gaged to handle 
4d50: 61 6c 6c 20 6f 66 20 53 51 4c 69 74 65 73 0a 20  all of SQLites. 
4d60: 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79         ** memory
4d70: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6e 65 65 64   allocation need
4d80: 73 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s. */.#ifdef SQL
4d90: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4da0: 53 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  S3.        sqlit
4db0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4dc0: 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65   = *sqlite3MemGe
4dd0: 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e 64  tMemsys3();.#end
4de0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
4df0: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 0a  _ENABLE_MEMSYS5.
4e00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
4e10: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20  lobalConfig.m = 
4e20: 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65  *sqlite3MemGetMe
4e30: 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64 69 66 0a  msys5();.#endif.
4e40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4e50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
4e60: 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  f..    case SQLI
4e70: 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53  TE_CONFIG_LOOKAS
4e80: 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  IDE: {.      sql
4e90: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4ea0: 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76  .szLookaside = v
4eb0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
4ec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4ed0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61  balConfig.nLooka
4ee0: 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70  side = va_arg(ap
4ef0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
4f00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a  eak;.    }.    .
4f10: 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 61 20      /* Record a 
4f20: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c  pointer to the l
4f30: 6f 67 67 65 72 20 66 75 6e 63 74 69 6f 6e 20 61  ogger function a
4f40: 6e 64 20 69 74 73 20 66 69 72 73 74 20 61 72 67  nd its first arg
4f50: 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ument..    ** Th
4f60: 65 20 64 65 66 61 75 6c 74 20 69 73 20 4e 55 4c  e default is NUL
4f70: 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69 73 20 64  L.  Logging is d
4f80: 69 73 61 62 6c 65 64 20 69 66 20 74 68 65 20 66  isabled if the f
4f90: 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
4fa0: 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 0a  is.    ** NULL..
4fb0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4fc0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
4fd0: 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53  G: {.      /* MS
4fe0: 56 43 20 69 73 20 70 69 63 6b 79 20 61 62 6f 75  VC is picky abou
4ff0: 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70  t pulling func p
5000: 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69 73 74  trs from va list
5010: 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74 74 70  s..      ** http
5020: 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f  ://support.micro
5030: 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36  soft.com/kb/4796
5040: 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  1.      ** sqlit
5050: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
5060: 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Log = va_arg(ap,
5070: 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a 2c 69   void(*)(void*,i
5080: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  nt,const char*))
5090: 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ;.      */.     
50a0: 20 74 79 70 65 64 65 66 20 76 6f 69 64 28 2a 4c   typedef void(*L
50b0: 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c  OGFUNC_t)(void*,
50c0: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  int,const char*)
50d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
50e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
50f0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 4c 4f   = va_arg(ap, LO
5100: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
5110: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
5120: 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d 20 76 61  fig.pLogArg = va
5130: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
5140: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5150: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44    }..    /* EVID
5160: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 34 38  ENCE-OF: R-55548
5170: 2d 33 33 38 31 37 20 54 68 65 20 63 6f 6d 70 69  -33817 The compi
5180: 6c 65 2d 74 69 6d 65 20 73 65 74 74 69 6e 67 20  le-time setting 
5190: 66 6f 72 20 55 52 49 20 66 69 6c 65 6e 61 6d 65  for URI filename
51a0: 73 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20  s.    ** can be 
51b0: 63 68 61 6e 67 65 64 20 61 74 20 73 74 61 72 74  changed at start
51c0: 2d 74 69 6d 65 20 75 73 69 6e 67 20 74 68 65 0a  -time using the.
51d0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
51e0: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
51f0: 46 49 47 5f 55 52 49 2c 31 29 20 6f 72 0a 20 20  FIG_URI,1) or.  
5200: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e    ** sqlite3_con
5210: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
5220: 47 5f 55 52 49 2c 30 29 20 63 6f 6e 66 69 67 75  G_URI,0) configu
5230: 72 61 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 20 20  ration calls..  
5240: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
5250: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 3a  LITE_CONFIG_URI:
5260: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
5270: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 34 35 31  ENCE-OF: R-25451
5280: 2d 36 31 31 32 35 20 54 68 65 20 53 51 4c 49 54  -61125 The SQLIT
5290: 45 5f 43 4f 4e 46 49 47 5f 55 52 49 20 6f 70 74  E_CONFIG_URI opt
52a0: 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67  ion takes a sing
52b0: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75  le.      ** argu
52c0: 6d 65 6e 74 20 6f 66 20 74 79 70 65 20 69 6e 74  ment of type int
52d0: 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  . If non-zero, t
52e0: 68 65 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e 67  hen URI handling
52f0: 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20   is globally.   
5300: 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49     ** enabled. I
5310: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
5320: 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52  is zero, then UR
5330: 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c  I handling is gl
5340: 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  obally.      ** 
5350: 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 20  disabled. */.   
5360: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
5370: 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 20  Config.bOpenUri 
5380: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5390: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
53a0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
53b0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f  SQLITE_CONFIG_CO
53c0: 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41  VERING_INDEX_SCA
53d0: 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  N: {.      /* EV
53e0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 36 35  IDENCE-OF: R-365
53f0: 39 32 2d 30 32 37 37 32 20 54 68 65 20 53 51 4c  92-02772 The SQL
5400: 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52  ITE_CONFIG_COVER
5410: 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41 4e 0a 20  ING_INDEX_SCAN. 
5420: 20 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 74       ** option t
5430: 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  akes a single in
5440: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 20 77  teger argument w
5450: 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
5460: 74 65 64 20 61 73 20 61 0a 20 20 20 20 20 20 2a  ted as a.      *
5470: 2a 20 62 6f 6f 6c 65 61 6e 20 69 6e 20 6f 72 64  * boolean in ord
5480: 65 72 20 74 6f 20 65 6e 61 62 6c 65 20 6f 72 20  er to enable or 
5490: 64 69 73 61 62 6c 65 20 74 68 65 20 75 73 65 20  disable the use 
54a0: 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 69  of covering indi
54b0: 63 65 73 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  ces for.      **
54c0: 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
54d0: 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 6f  s in the query o
54e0: 70 74 69 6d 69 7a 65 72 2e 20 2a 2f 0a 20 20 20  ptimizer. */.   
54f0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
5500: 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 20 3d  Config.bUseCis =
5510: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
5520: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5530: 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
5540: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
5550: 47 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  G.    case SQLIT
5560: 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 3a  E_CONFIG_SQLLOG:
5570: 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65 66   {.      typedef
5580: 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47 46 55 4e   void(*SQLLOGFUN
5590: 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73 71 6c 69  C_t)(void*, sqli
55a0: 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  te3*, const char
55b0: 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  *, int);.      s
55c0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
55d0: 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20 76 61 5f  ig.xSqllog = va_
55e0: 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f 47 46 55  arg(ap, SQLLOGFU
55f0: 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  NC_t);.      sql
5600: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5610: 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d 20 76 61  .pSqllogArg = va
5620: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 20 2a 29  _arg(ap, void *)
5630: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5640: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
5650: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
5660: 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b  FIG_MMAP_SIZE: {
5670: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
5680: 43 45 2d 4f 46 3a 20 52 2d 35 38 30 36 33 2d 33  CE-OF: R-58063-3
5690: 38 32 35 38 20 53 51 4c 49 54 45 5f 43 4f 4e 46  8258 SQLITE_CONF
56a0: 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 20 74 61 6b  IG_MMAP_SIZE tak
56b0: 65 73 20 74 77 6f 20 36 34 2d 62 69 74 0a 20 20  es two 64-bit.  
56c0: 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 28      ** integer (
56d0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 76  sqlite3_int64) v
56e0: 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 74  alues that are t
56f0: 68 65 20 64 65 66 61 75 6c 74 20 6d 6d 61 70 20  he default mmap 
5700: 73 69 7a 65 20 6c 69 6d 69 74 0a 20 20 20 20 20  size limit.     
5710: 20 2a 2a 20 28 74 68 65 20 64 65 66 61 75 6c 74   ** (the default
5720: 20 73 65 74 74 69 6e 67 20 66 6f 72 20 50 52 41   setting for PRA
5730: 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 29 20 61  GMA mmap_size) a
5740: 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  nd the maximum a
5750: 6c 6c 6f 77 65 64 0a 20 20 20 20 20 20 2a 2a 20  llowed.      ** 
5760: 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d 69 74 2e  mmap size limit.
5770: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5780: 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20 3d  3_int64 szMmap =
5790: 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
57a0: 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20  te3_int64);.    
57b0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
57c0: 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  mxMmap = va_arg(
57d0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ap, sqlite3_int6
57e0: 34 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  4);.      /* EVI
57f0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 33 36  DENCE-OF: R-5336
5800: 37 2d 34 33 31 39 30 20 49 66 20 65 69 74 68 65  7-43190 If eithe
5810: 72 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  r argument to th
5820: 69 73 20 6f 70 74 69 6f 6e 20 69 73 0a 20 20 20  is option is.   
5830: 20 20 20 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20     ** negative, 
5840: 74 68 65 6e 20 74 68 61 74 20 61 72 67 75 6d 65  then that argume
5850: 6e 74 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  nt is changed to
5860: 20 69 74 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   its compile-tim
5870: 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 20 20 20  e default..     
5880: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49   **.      ** EVI
5890: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 39  DENCE-OF: R-3499
58a0: 33 2d 34 35 30 33 31 20 54 68 65 20 6d 61 78 69  3-45031 The maxi
58b0: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 6d 6d 61 70  mum allowed mmap
58c0: 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 0a 20 20   size will be.  
58d0: 20 20 20 20 2a 2a 20 73 69 6c 65 6e 74 6c 79 20      ** silently 
58e0: 74 72 75 6e 63 61 74 65 64 20 69 66 20 6e 65 63  truncated if nec
58f0: 65 73 73 61 72 79 20 73 6f 20 74 68 61 74 20 69  essary so that i
5900: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 63 65 65  t does not excee
5910: 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  d the.      ** c
5920: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6d 61 78 69  ompile-time maxi
5930: 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65 20 73 65  mum mmap size se
5940: 74 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  t by the SQLITE_
5950: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 0a 20 20  MAX_MMAP_SIZE.  
5960: 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74      ** compile-t
5970: 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 20 20  ime option..    
5980: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6d    */.      if( m
5990: 78 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d 61  xMmap<0 || mxMma
59a0: 70 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  p>SQLITE_MAX_MMA
59b0: 50 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  P_SIZE ){.      
59c0: 20 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54    mxMmap = SQLIT
59d0: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b  E_MAX_MMAP_SIZE;
59e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
59f0: 66 28 20 73 7a 4d 6d 61 70 3c 30 20 29 20 73 7a  f( szMmap<0 ) sz
5a00: 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mmap = SQLITE_DE
5a10: 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 3b  FAULT_MMAP_SIZE;
5a20: 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d 61  .      if( szMma
5a30: 70 3e 6d 78 4d 6d 61 70 29 20 73 7a 4d 6d 61 70  p>mxMmap) szMmap
5a40: 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20   = mxMmap;.     
5a50: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5a60: 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78  nfig.mxMmap = mx
5a70: 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mmap;.      sqli
5a80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
5a90: 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b  szMmap = szMmap;
5aa0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5ab0: 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
5ac0: 4f 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e 65  OS_WIN && define
5ad0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
5ae0: 41 4c 4c 4f 43 29 20 2f 2a 20 49 4d 50 3a 20 52  ALLOC) /* IMP: R
5af0: 2d 30 34 37 38 30 2d 35 35 38 31 35 20 2a 2f 0a  -04780-55815 */.
5b00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5b10: 43 4f 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41  CONFIG_WIN32_HEA
5b20: 50 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 2f  PSIZE: {.      /
5b30: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5b40: 2d 33 34 39 32 36 2d 30 33 33 36 30 20 53 51 4c  -34926-03360 SQL
5b50: 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e 33 32  ITE_CONFIG_WIN32
5b60: 5f 48 45 41 50 53 49 5a 45 20 74 61 6b 65 73 20  _HEAPSIZE takes 
5b70: 61 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a  a 32-bit.      *
5b80: 2a 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  * unsigned integ
5b90: 65 72 20 76 61 6c 75 65 20 74 68 61 74 20 73 70  er value that sp
5ba0: 65 63 69 66 69 65 73 20 74 68 65 20 6d 61 78 69  ecifies the maxi
5bb0: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20  mum size of the 
5bc0: 63 72 65 61 74 65 64 0a 20 20 20 20 20 20 2a 2a  created.      **
5bd0: 20 68 65 61 70 2e 20 2a 2f 0a 20 20 20 20 20 20   heap. */.      
5be0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
5bf0: 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61  fig.nHeap = va_a
5c00: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5c10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5c20: 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65  #endif..    case
5c30: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
5c40: 4d 41 53 5a 3a 20 7b 0a 20 20 20 20 20 20 73 71  MASZ: {.      sq
5c50: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5c60: 67 2e 73 7a 50 6d 61 20 3d 20 76 61 5f 61 72 67  g.szPma = va_arg
5c70: 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  (ap, unsigned in
5c80: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
5c90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61  .    }..    defa
5ca0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  ult: {.      rc 
5cb0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
5cc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5cd0: 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28   }.  }.  va_end(
5ce0: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ap);.  return rc
5cf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
5d00: 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  p the lookaside 
5d10: 62 75 66 66 65 72 73 20 66 6f 72 20 61 20 64 61  buffers for a da
5d20: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
5d30: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  n..** Return SQL
5d40: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
5d50: 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61  s.  .** If looka
5d60: 73 69 64 65 20 69 73 20 61 6c 72 65 61 64 79 20  side is already 
5d70: 61 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53  active, return S
5d80: 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a  QLITE_BUSY..**.*
5d90: 2a 20 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74  * The sz paramet
5da0: 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  er is the number
5db0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 65 61 63   of bytes in eac
5dc0: 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  h lookaside slot
5dd0: 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72  ..** The cnt par
5de0: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75  ameter is the nu
5df0: 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20  mber of slots.  
5e00: 49 66 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c  If pStart is NUL
5e10: 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66  L the.** space f
5e20: 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  or the lookaside
5e30: 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69   memory is obtai
5e40: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
5e50: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66  _malloc()..** If
5e60: 20 70 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e   pStart is not N
5e70: 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73  ULL then it is s
5e80: 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d  z*cnt bytes of m
5e90: 65 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72  emory to use for
5ea0: 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64  .** the lookasid
5eb0: 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
5ec0: 74 69 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f  tic int setupLoo
5ed0: 6b 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a  kaside(sqlite3 *
5ee0: 64 62 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  db, void *pBuf, 
5ef0: 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29  int sz, int cnt)
5f00: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
5f10: 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a  _OMIT_LOOKASIDE.
5f20: 20 20 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a    void *pStart;.
5f30: 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73    if( db->lookas
5f40: 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20 20 20 20  ide.nOut ){.    
5f50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
5f60: 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 72 65  SY;.  }.  /* Fre
5f70: 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6c  e any existing l
5f80: 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 20  ookaside buffer 
5f90: 66 6f 72 20 74 68 69 73 20 68 61 6e 64 6c 65 20  for this handle 
5fa0: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f  before.  ** allo
5fb0: 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65  cating a new one
5fc0: 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 68 61 76   so we don't hav
5fd0: 65 20 74 6f 20 68 61 76 65 20 73 70 61 63 65 20  e to have space 
5fe0: 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74 68 20 61  for .  ** both a
5ff0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
6000: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
6010: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
6020: 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ced ){.    sqlit
6030: 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b  e3_free(db->look
6040: 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20  aside.pStart);. 
6050: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 69 7a 65   }.  /* The size
6060: 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20   of a lookaside 
6070: 73 6c 6f 74 20 61 66 74 65 72 20 52 4f 55 4e 44  slot after ROUND
6080: 44 4f 57 4e 38 20 6e 65 65 64 73 20 74 6f 20 62  DOWN8 needs to b
6090: 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a 20 74 68  e larger.  ** th
60a0: 61 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  an a pointer to 
60b0: 62 65 20 75 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a  be useful..  */.
60c0: 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e    sz = ROUNDDOWN
60d0: 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d 50 3a 20  8(sz);  /* IMP: 
60e0: 52 2d 33 33 30 33 38 2d 30 39 33 38 32 20 2a 2f  R-33038-09382 */
60f0: 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69 6e 74 29  .  if( sz<=(int)
6100: 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65  sizeof(Lookaside
6110: 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d 20 30 3b  Slot*) ) sz = 0;
6120: 0a 20 20 69 66 28 20 63 6e 74 3c 30 20 29 20 63  .  if( cnt<0 ) c
6130: 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 7a  nt = 0;.  if( sz
6140: 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b  ==0 || cnt==0 ){
6150: 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20  .    sz = 0;.   
6160: 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 7d   pStart = 0;.  }
6170: 65 6c 73 65 20 69 66 28 20 70 42 75 66 3d 3d 30  else if( pBuf==0
6180: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
6190: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
61a0: 28 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d  ();.    pStart =
61b0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
61c0: 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a 20 49 4d  sz*cnt );  /* IM
61d0: 50 3a 20 52 2d 36 31 39 34 39 2d 33 35 37 32 37  P: R-61949-35727
61e0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
61f0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
6200: 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  ;.    if( pStart
6210: 20 29 20 63 6e 74 20 3d 20 73 71 6c 69 74 65 33   ) cnt = sqlite3
6220: 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53 74 61 72  MallocSize(pStar
6230: 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t)/sz;.  }else{.
6240: 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 42 75      pStart = pBu
6250: 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f  f;.  }.  db->loo
6260: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20 3d 20  kaside.pStart = 
6270: 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f  pStart;.  db->lo
6280: 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20  okaside.pFree = 
6290: 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  0;.  db->lookasi
62a0: 64 65 2e 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b  de.sz = (u16)sz;
62b0: 0a 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b  .  if( pStart ){
62c0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
62d0: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70  LookasideSlot *p
62e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
62f0: 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c   > (int)sizeof(L
6300: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29  ookasideSlot*) )
6310: 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61  ;.    p = (Looka
6320: 73 69 64 65 53 6c 6f 74 2a 29 70 53 74 61 72 74  sideSlot*)pStart
6330: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d  ;.    for(i=cnt-
6340: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
6350: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
6360: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46  db->lookaside.pF
6370: 72 65 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c  ree;.      db->l
6380: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d  ookaside.pFree =
6390: 20 70 3b 0a 20 20 20 20 20 20 70 20 3d 20 28 4c   p;.      p = (L
63a0: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 26 28  ookasideSlot*)&(
63b0: 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20  (u8*)p)[sz];.   
63c0: 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61   }.    db->looka
63d0: 73 69 64 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20  side.pEnd = p;. 
63e0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
63f0: 2e 62 45 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 20  .bEnabled = 1;. 
6400: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6410: 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75  .bMalloced = pBu
6420: 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c  f==0 ?1:0;.  }el
6430: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  se{.    db->look
6440: 61 73 69 64 65 2e 70 53 74 61 72 74 20 3d 20 64  aside.pStart = d
6450: 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  b;.    db->looka
6460: 73 69 64 65 2e 70 45 6e 64 20 3d 20 64 62 3b 0a  side.pEnd = db;.
6470: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
6480: 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a  e.bEnabled = 0;.
6490: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
64a0: 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b  e.bMalloced = 0;
64b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
64c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41  QLITE_OMIT_LOOKA
64d0: 53 49 44 45 20 2a 2f 0a 20 20 72 65 74 75 72 6e  SIDE */.  return
64e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
64f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6500: 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64  mutex associated
6510: 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
6520: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
6530: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 73  sqlite3_mutex *s
6540: 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28  qlite3_db_mutex(
6550: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
6560: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6570: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
6580: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
6590: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
65a0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
65b0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
65c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
65d0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
65e0: 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a  db->mutex;.}../*
65f0: 0a 2a 2a 20 46 72 65 65 20 75 70 20 61 73 20 6d  .** Free up as m
6600: 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 77 65  uch memory as we
6610: 20 63 61 6e 20 66 72 6f 6d 20 74 68 65 20 67 69   can from the gi
6620: 76 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ven database.** 
6630: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  connection..*/.i
6640: 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
6650: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c  lease_memory(sql
6660: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
6670: 20 69 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   i;..#ifdef SQLI
6680: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
6690: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
66a0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
66b0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
66c0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
66d0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
66e0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
66f0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69  ->mutex);.  sqli
6700: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
6710: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
6720: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
6730: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
6740: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
6750: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 29  t;.    if( pBt )
6760: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
6770: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
6780: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
6790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
67a0: 65 72 53 68 72 69 6e 6b 28 70 50 61 67 65 72 29  erShrink(pPager)
67b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
67c0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
67d0: 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  ll(db);.  sqlite
67e0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
67f0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
6800: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6810: 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79  ./*.** Flush any
6820: 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
6830: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
6840: 66 6f 72 20 61 6e 79 20 61 74 74 61 63 68 65 64  for any attached
6850: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 6f 20   database.** to 
6860: 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  disk..*/.int sql
6870: 69 74 65 33 5f 64 62 5f 63 61 63 68 65 66 6c 75  ite3_db_cacheflu
6880: 73 68 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  sh(sqlite3 *db){
6890: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
68a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
68b0: 20 20 69 6e 74 20 62 53 65 65 6e 42 75 73 79 20    int bSeenBusy 
68c0: 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  = 0;..#ifdef SQL
68d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
68e0: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
68f0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
6900: 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
6910: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
6920: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
6930: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
6940: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c  b->mutex);.  sql
6950: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
6960: 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30  l(db);.  for(i=0
6970: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
6980: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
6990: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
69a0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
69b0: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
69c0: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
69d0: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
69e0: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
69f0: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
6a00: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
6a10: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6a20: 65 33 50 61 67 65 72 46 6c 75 73 68 28 70 50 61  e3PagerFlush(pPa
6a30: 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
6a40: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
6a50: 29 7b 0a 20 20 20 20 20 20 20 20 62 53 65 65 6e  ){.        bSeen
6a60: 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  Busy = 1;.      
6a70: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
6a80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6a90: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
6aa0: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
6ab0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6ac0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
6ad0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d  ;.  return ((rc=
6ae0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 53  =SQLITE_OK && bS
6af0: 65 65 6e 42 75 73 79 29 20 3f 20 53 51 4c 49 54  eenBusy) ? SQLIT
6b00: 45 5f 42 55 53 59 20 3a 20 72 63 29 3b 0a 7d 0a  E_BUSY : rc);.}.
6b10: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61  ./*.** Configura
6b20: 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20 66 6f  tion settings fo
6b30: 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20  r an individual 
6b40: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
6b50: 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ion.*/.int sqlit
6b60: 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c  e3_db_config(sql
6b70: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70  ite3 *db, int op
6b80: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
6b90: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  t ap;.  int rc;.
6ba0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f    va_start(ap, o
6bb0: 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p);.  switch( op
6bc0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
6bd0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f  ITE_DBCONFIG_LOO
6be0: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
6bf0: 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f  void *pBuf = va_
6c00: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20  arg(ap, void*); 
6c10: 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d  /* IMP: R-26835-
6c20: 31 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69  10964 */.      i
6c30: 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
6c40: 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f  p, int);       /
6c50: 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32  * IMP: R-47871-2
6c60: 35 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e  5994 */.      in
6c70: 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61  t cnt = va_arg(a
6c80: 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a  p, int);      /*
6c90: 20 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33   IMP: R-04460-53
6ca0: 33 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  386 */.      rc 
6cb0: 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65  = setupLookaside
6cc0: 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63  (db, pBuf, sz, c
6cd0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
6ce0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
6cf0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61  ult: {.      sta
6d00: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
6d10: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f   {.        int o
6d20: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  p;      /* The o
6d30: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20  pcode */.       
6d40: 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a   u32 mask;    /*
6d50: 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74   Mask of the bit
6d60: 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67   in sqlite3.flag
6d70: 73 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a  s to set/clear *
6d80: 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f  /.      } aFlagO
6d90: 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  p[] = {.        
6da0: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
6db0: 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20  G_ENABLE_FKEY,  
6dc0: 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e    SQLITE_Foreign
6dd0: 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20 20 20  Keys    },.     
6de0: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
6df0: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47  NFIG_ENABLE_TRIG
6e00: 47 45 52 2c 20 53 51 4c 49 54 45 5f 45 6e 61 62  GER, SQLITE_Enab
6e10: 6c 65 54 72 69 67 67 65 72 20 20 7d 2c 0a 20 20  leTrigger  },.  
6e20: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73      };.      uns
6e30: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20  igned int i;.   
6e40: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
6e50: 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  RROR; /* IMP: R-
6e60: 34 32 37 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20  42790-23372 */. 
6e70: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
6e80: 41 72 72 61 79 53 69 7a 65 28 61 46 6c 61 67 4f  ArraySize(aFlagO
6e90: 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  p); i++){.      
6ea0: 20 20 69 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d    if( aFlagOp[i]
6eb0: 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20  .op==op ){.     
6ec0: 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d       int onoff =
6ed0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6ee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
6ef0: 2a 70 52 65 73 20 3d 20 76 61 5f 61 72 67 28 61  *pRes = va_arg(a
6f00: 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
6f10: 20 20 20 20 69 6e 74 20 6f 6c 64 46 6c 61 67 73      int oldFlags
6f20: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
6f30: 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e 6f 66          if( onof
6f40: 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  f>0 ){.         
6f50: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
6f60: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b  aFlagOp[i].mask;
6f70: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
6f80: 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b   if( onoff==0 ){
6f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
6fa0: 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46 6c 61 67  >flags &= ~aFlag
6fb0: 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  Op[i].mask;.    
6fc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6fd0: 20 20 69 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d    if( oldFlags!=
6fe0: 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20  db->flags ){.   
6ff0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7000: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
7010: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
7020: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7030: 20 20 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a      if( pRes ){.
7040: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
7050: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
7060: 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b   aFlagOp[i].mask
7070: 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )!=0;.          
7080: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
7090: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
70a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
70b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
70c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
70d0: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
70e0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
70f0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
7100: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 62 75  n true if the bu
7110: 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63  ffer z[0..n-1] c
7120: 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70 61 63  ontains all spac
7130: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
7140: 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73  t allSpaces(cons
7150: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
7160: 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  ){.  while( n>0 
7170: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29  && z[n-1]==' ' )
7180: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72  { n--; }.  retur
7190: 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n n==0;.}../*.**
71a0: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
71b0: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66  ault collating f
71c0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42  unction named "B
71d0: 49 4e 41 52 59 22 20 77 68 69 63 68 20 69 73 20  INARY" which is 
71e0: 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61  always.** availa
71f0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
7200: 65 20 70 61 64 46 6c 61 67 20 61 72 67 75 6d 65  e padFlag argume
7210: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  nt is not NULL t
7220: 68 65 6e 20 73 70 61 63 65 20 70 61 64 64 69 6e  hen space paddin
7230: 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20  g at the end.** 
7240: 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20 69 67  of strings is ig
7250: 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 6d 70  nored.  This imp
7260: 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54 52 49  lements the RTRI
7270: 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  M collation..*/.
7280: 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f  static int binCo
7290: 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  llFunc(.  void *
72a0: 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e  padFlag,.  int n
72b0: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
72c0: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
72d0: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
72e0: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
72f0: 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b   rc, n;.  n = nK
7300: 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79  ey1<nKey2 ? nKey
7310: 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 2f 2a 20  1 : nKey2;.  /* 
7320: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
7330: 35 30 33 33 2d 32 38 34 34 39 20 54 68 65 20 62  5033-28449 The b
7340: 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59 20 63  uilt-in BINARY c
7350: 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70 61 72 65  ollation compare
7360: 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 62  s.  ** strings b
7370: 79 74 65 20 62 79 20 62 79 74 65 20 75 73 69 6e  yte by byte usin
7380: 67 20 74 68 65 20 6d 65 6d 63 6d 70 28 29 20 66  g the memcmp() f
7390: 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  unction from the
73a0: 20 73 74 61 6e 64 61 72 64 20 43 0a 20 20 2a 2a   standard C.  **
73b0: 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a 20 20 72   library. */.  r
73c0: 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31  c = memcmp(pKey1
73d0: 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69  , pKey2, n);.  i
73e0: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
73f0: 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20  if( padFlag.    
7400: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
7410: 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20  char*)pKey1)+n, 
7420: 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26  nKey1-n).     &&
7430: 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61   allSpaces(((cha
7440: 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65  r*)pKey2)+n, nKe
7450: 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  y2-n).    ){.   
7460: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
7470: 46 3a 20 52 2d 33 31 36 32 34 2d 32 34 37 33 37  F: R-31624-24737
7480: 20 52 54 52 49 4d 20 69 73 20 6c 69 6b 65 20 42   RTRIM is like B
7490: 49 4e 41 52 59 20 65 78 63 65 70 74 20 74 68 61  INARY except tha
74a0: 74 20 65 78 74 72 61 0a 20 20 20 20 20 20 2a 2a  t extra.      **
74b0: 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20 65   spaces at the e
74c0: 6e 64 20 6f 66 20 65 69 74 68 65 72 20 73 74 72  nd of either str
74d0: 69 6e 67 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67  ing do not chang
74e0: 65 20 74 68 65 20 72 65 73 75 6c 74 2e 20 49 6e  e the result. In
74f0: 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
7500: 77 6f 72 64 73 2c 20 73 74 72 69 6e 67 73 20 77  words, strings w
7510: 69 6c 6c 20 63 6f 6d 70 61 72 65 20 65 71 75 61  ill compare equa
7520: 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72  l to one another
7530: 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 79   as long as they
7540: 0a 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72  .      ** differ
7550: 20 6f 6e 6c 79 20 69 6e 20 74 68 65 20 6e 75 6d   only in the num
7560: 62 65 72 20 6f 66 20 73 70 61 63 65 73 20 61 74  ber of spaces at
7570: 20 74 68 65 20 65 6e 64 2e 0a 20 20 20 20 20 20   the end..      
7580: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
7590: 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d      rc = nKey1 -
75a0: 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20   nKey2;.    }.  
75b0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
75c0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20  ../*.** Another 
75d0: 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
75e0: 6e 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43  ng sequence: NOC
75f0: 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ASE. .**.** This
7600: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
7610: 6e 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  nce is intended 
7620: 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 22  to be used for "
7630: 63 61 73 65 20 69 6e 64 65 70 65 6e 64 65 6e 74  case independent
7640: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e  .** comparison".
7650: 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65   SQLite's knowle
7660: 64 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64  dge of upper and
7670: 20 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75 69   lower case equi
7680: 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e  valents.** exten
7690: 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32  ds only to the 2
76a0: 36 20 63 68 61 72 61 63 74 65 72 73 20 75 73 65  6 characters use
76b0: 64 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68  d in the English
76c0: 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a   language..**.**
76d0: 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74   At the moment t
76e0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55  here is only a U
76f0: 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74  TF-8 implementat
7700: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
7710: 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69  nt nocaseCollati
7720: 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  ngFunc(.  void *
7730: 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e  NotUsed,.  int n
7740: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
7750: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
7760: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
7770: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
7780: 20 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e   r = sqlite3StrN
7790: 49 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e  ICmp(.      (con
77a0: 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c  st char *)pKey1,
77b0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
77c0: 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65  Key2, (nKey1<nKe
77d0: 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29  y2)?nKey1:nKey2)
77e0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
77f0: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
7800: 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20   if( 0==r ){.   
7810: 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32   r = nKey1-nKey2
7820: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
7830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7840: 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  n the ROWID of t
7850: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69  he most recent i
7860: 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f  nsert.*/.sqlite_
7870: 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61  int64 sqlite3_la
7880: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
7890: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
78a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
78b0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
78c0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
78d0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
78e0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
78f0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
7900: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7910: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7920: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d  db->lastRowid;.}
7930: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7940: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
7950: 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74  nges in the most
7960: 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
7970: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
7980: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
7990: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
79a0: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
79b0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
79c0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
79d0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
79e0: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
79f0: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
7a00: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
7a10: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
7a20: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e  return db->nChan
7a30: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ge;.}../*.** Ret
7a40: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
7a50: 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20  f changes since 
7a60: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
7a70: 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  dle was opened..
7a80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
7a90: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c  otal_changes(sql
7aa0: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
7ab0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7ac0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
7ad0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
7ae0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
7af0: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
7b00: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
7b10: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
7b20: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  dif.  return db-
7b30: 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d  >nTotalChange;.}
7b40: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
7b50: 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
7b60: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
7b70: 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65   only manipulate
7b80: 73 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a  s fields of the.
7b90: 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
7ba0: 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f  le object, it do
7bb0: 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79  es not close any
7bc0: 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74   savepoints that
7bd0: 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20   may be open.** 
7be0: 61 74 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61  at the b-tree/pa
7bf0: 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f  ger level..*/.vo
7c00: 69 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53  id sqlite3CloseS
7c10: 61 76 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65  avepoints(sqlite
7c20: 33 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28  3 *db){.  while(
7c30: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
7c40: 29 7b 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74  ){.    Savepoint
7c50: 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61   *pTmp = db->pSa
7c60: 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d  vepoint;.    db-
7c70: 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54  >pSavepoint = pT
7c80: 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  mp->pNext;.    s
7c90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7ca0: 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62   pTmp);.  }.  db
7cb0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
7cc0: 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  ;.  db->nStateme
7cd0: 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73  nt = 0;.  db->is
7ce0: 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70  TransactionSavep
7cf0: 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  oint = 0;.}../*.
7d00: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 64 65  ** Invoke the de
7d10: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
7d20: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  n associated wit
7d30: 68 20 46 75 6e 63 44 65 66 20 70 2c 20 69 66 20  h FuncDef p, if 
7d40: 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20  any. Except,.** 
7d50: 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  if this is not t
7d60: 68 65 20 6c 61 73 74 20 63 6f 70 79 20 6f 66 20  he last copy of 
7d70: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f  the function, do
7d80: 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20   not invoke it. 
7d90: 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69  Multiple.** copi
7da0: 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 66  es of a single f
7db0: 75 6e 63 74 69 6f 6e 20 61 72 65 20 63 72 65 61  unction are crea
7dc0: 74 65 64 20 77 68 65 6e 20 63 72 65 61 74 65 5f  ted when create_
7dd0: 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 63 61  function() is ca
7de0: 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c  lled.** with SQL
7df0: 49 54 45 5f 41 4e 59 20 61 73 20 74 68 65 20 65  ITE_ANY as the e
7e00: 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ncoding..*/.stat
7e10: 69 63 20 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e  ic void function
7e20: 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 20  Destroy(sqlite3 
7e30: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 29  *db, FuncDef *p)
7e40: 7b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  {.  FuncDestruct
7e50: 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 20  or *pDestructor 
7e60: 3d 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72  = p->pDestructor
7e70: 3b 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63  ;.  if( pDestruc
7e80: 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74  tor ){.    pDest
7e90: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  ructor->nRef--;.
7ea0: 20 20 20 20 69 66 28 20 70 44 65 73 74 72 75 63      if( pDestruc
7eb0: 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  tor->nRef==0 ){.
7ec0: 20 20 20 20 20 20 70 44 65 73 74 72 75 63 74 6f        pDestructo
7ed0: 72 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73  r->xDestroy(pDes
7ee0: 74 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61  tructor->pUserDa
7ef0: 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ta);.      sqlit
7f00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65  e3DbFree(db, pDe
7f10: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d  structor);.    }
7f20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  .  }.}../*.** Di
7f30: 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c  sconnect all sql
7f40: 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74  ite3_vtab object
7f50: 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
7f60: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
7f70: 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73  tion.** db. This
7f80: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
7f90: 64 62 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73  db is being clos
7fa0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
7fb0: 69 64 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c  id disconnectAll
7fc0: 56 74 61 62 28 73 71 6c 69 74 65 33 20 2a 64 62  Vtab(sqlite3 *db
7fd0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
7fe0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
7ff0: 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20 48  BLE.  int i;.  H
8000: 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 73 71  ashElem *p;.  sq
8010: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
8020: 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d  ll(db);.  for(i=
8030: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
8040: 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a  +){.    Schema *
8050: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
8060: 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  b[i].pSchema;.  
8070: 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
8080: 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
8090: 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61    for(p=sqliteHa
80a0: 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61  shFirst(&pSchema
80b0: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70  ->tblHash); p; p
80c0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
80d0: 70 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62  p)){.        Tab
80e0: 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c  le *pTab = (Tabl
80f0: 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  e *)sqliteHashDa
8100: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  ta(p);.        i
8110: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
8120: 62 29 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  b) ) sqlite3Vtab
8130: 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70  Disconnect(db, p
8140: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
8150: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 3d    }.  }.  for(p=
8160: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
8170: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 70  &db->aModule); p
8180: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
8190: 78 74 28 70 29 29 7b 0a 20 20 20 20 4d 6f 64 75  xt(p)){.    Modu
81a0: 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  le *pMod = (Modu
81b0: 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  le *)sqliteHashD
81c0: 61 74 61 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ata(p);.    if( 
81d0: 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20 29 7b  pMod->pEpoTab ){
81e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
81f0: 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c  abDisconnect(db,
8200: 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 29 3b   pMod->pEpoTab);
8210: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
8220: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
8230: 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  st(db);.  sqlite
8240: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
8250: 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  b);.#else.  UNUS
8260: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
8270: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
8280: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
8290: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
82a0: 74 69 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69  tion db has unfi
82b0: 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64  nalized prepared
82c0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  .** statements o
82d0: 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c  r unfinished sql
82e0: 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65  ite3_backup obje
82f0: 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  cts.  .*/.static
8300: 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49   int connectionI
8310: 73 42 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64  sBusy(sqlite3 *d
8320: 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61  b){.  int j;.  a
8330: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8340: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
8350: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62  tex) );.  if( db
8360: 2d 3e 70 56 64 62 65 20 29 20 72 65 74 75 72 6e  ->pVdbe ) return
8370: 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   1;.  for(j=0; j
8380: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
8390: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
83a0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b   db->aDb[j].pBt;
83b0: 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
83c0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
83d0: 42 61 63 6b 75 70 28 70 42 74 29 20 29 20 72 65  Backup(pBt) ) re
83e0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
83f0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8400: 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69   Close an existi
8410: 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ng SQLite databa
8420: 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  se.*/.static int
8430: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71   sqlite3Close(sq
8440: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66  lite3 *db, int f
8450: 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69  orceZombie){.  i
8460: 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 2f 2a  f( !db ){.    /*
8470: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
8480: 36 33 32 35 37 2d 31 31 37 34 30 20 43 61 6c 6c  63257-11740 Call
8490: 69 6e 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  ing sqlite3_clos
84a0: 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  e() or.    ** sq
84b0: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
84c0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69   with a NULL poi
84d0: 6e 74 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73  nter argument is
84e0: 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f   a harmless no-o
84f0: 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  p. */.    return
8500: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
8510: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
8520: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
8530: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
8540: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
8550: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  E_BKPT;.  }.  sq
8560: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
8570: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  r(db->mutex);.. 
8580: 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73 63 6f   /* Force xDisco
8590: 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e 20 61  nnect calls on a
85a0: 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ll virtual table
85b0: 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e 65 63  s */.  disconnec
85c0: 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a 0a 20  tAllVtab(db);.. 
85d0: 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63   /* If a transac
85e0: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68  tion is open, th
85f0: 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56  e disconnectAllV
8600: 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f 76 65  tab() call above
8610: 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68  .  ** will not h
8620: 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20 78  ave called the x
8630: 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74  Disconnect() met
8640: 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74 75  hod on any virtu
8650: 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 69  al.  ** tables i
8660: 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e  n the db->aVTran
8670: 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66  s[] array. The f
8680: 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
8690: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20  VtabRollback(). 
86a0: 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f   ** call will do
86b0: 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f 20   so. We need to 
86c0: 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 74  do this before t
86d0: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63 74  he check for act
86e0: 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ive.  ** SQL sta
86f0: 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61  tements below, a
8700: 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69 6d  s the v-table im
8710: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79  plementation may
8720: 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a   be storing.  **
8730: 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20 73   some prepared s
8740: 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e  tatements intern
8750: 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ally..  */.  sql
8760: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
8770: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67 61  (db);..  /* Lega
8780: 63 79 20 62 65 68 61 76 69 6f 72 20 28 73 71 6c  cy behavior (sql
8790: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62 65 68  ite3_close() beh
87a0: 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72 65 74  avior) is to ret
87b0: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
87c0: 42 55 53 59 20 69 66 20 74 68 65 20 63 6f 6e 6e  BUSY if the conn
87d0: 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74 20 62  ection can not b
87e0: 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61  e closed immedia
87f0: 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
8800: 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20 26 26   !forceZombie &&
8810: 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73   connectionIsBus
8820: 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  y(db) ){.    sql
8830: 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
8840: 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
8850: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f  , "unable to clo
8860: 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61  se due to unfina
8870: 6c 69 7a 65 64 20 22 0a 20 20 20 20 20 20 20 22  lized ".       "
8880: 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e  statements or un
8890: 66 69 6e 69 73 68 65 64 20 62 61 63 6b 75 70 73  finished backups
88a0: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ");.    sqlite3_
88b0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
88c0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75  mutex);.    retu
88d0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
88e0: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
88f0: 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
8900: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
8910: 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
8920: 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f  og ){.    /* Clo
8930: 73 69 6e 67 20 74 68 65 20 68 61 6e 64 6c 65 2e  sing the handle.
8940: 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65   Fourth paramete
8950: 72 20 69 73 20 70 61 73 73 65 64 20 74 68 65 20  r is passed the 
8960: 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20 20 20 20  value 2. */.    
8970: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
8980: 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73 71 6c 69  fig.xSqllog(sqli
8990: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
89a0: 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64 62 2c 20  pSqllogArg, db, 
89b0: 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 2);.  }.#endi
89c0: 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  f..  /* Convert 
89d0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
89e0: 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20 61 6e 64  nto a zombie and
89f0: 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 2e 0a   then close it..
8a00: 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67 69 63    */.  db->magic
8a10: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
8a20: 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c 69 74 65  ZOMBIE;.  sqlite
8a30: 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c  3LeaveMutexAndCl
8a40: 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29 3b 0a 20  oseZombie(db);. 
8a50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8a60: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20  K;.}../*.** Two 
8a70: 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 74 68  variations on th
8a80: 65 20 70 75 62 6c 69 63 20 69 6e 74 65 72 66 61  e public interfa
8a90: 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 61  ce for closing a
8aa0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
8ab0: 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 73 71 6c  nection. The sql
8ac0: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 76 65 72  ite3_close() ver
8ad0: 73 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  sion returns SQL
8ae0: 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20  ITE_BUSY and.** 
8af0: 6c 65 61 76 65 73 20 74 68 65 20 63 6f 6e 6e 65  leaves the conne
8b00: 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 66 20  ction option if 
8b10: 74 68 65 72 65 20 61 72 65 20 75 6e 66 69 6e 61  there are unfina
8b20: 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a  lized prepared.*
8b30: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20  * statements or 
8b40: 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74  unfinished sqlit
8b50: 65 33 5f 62 61 63 6b 75 70 73 2e 20 20 54 68 65  e3_backups.  The
8b60: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
8b70: 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 66  2().** version f
8b80: 6f 72 63 65 73 20 74 68 65 20 63 6f 6e 6e 65 63  orces the connec
8b90: 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d 65 20 61  tion to become a
8ba0: 20 7a 6f 6d 62 69 65 20 69 66 20 74 68 65 72 65   zombie if there
8bb0: 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64   are.** unclosed
8bc0: 20 72 65 73 6f 75 72 63 65 73 2c 20 61 6e 64 20   resources, and 
8bd0: 61 72 72 61 6e 67 65 73 20 66 6f 72 20 64 65 61  arranges for dea
8be0: 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65 6e 20 74  llocation when t
8bf0: 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72 65 70 61  he last.** prepa
8c00: 72 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20  re statement or 
8c10: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 63  sqlite3_backup c
8c20: 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  loses..*/.int sq
8c30: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69  lite3_close(sqli
8c40: 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e  te3 *db){ return
8c50: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62   sqlite3Close(db
8c60: 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74  ,0); }.int sqlit
8c70: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73 71 6c 69  e3_close_v2(sqli
8c80: 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e  te3 *db){ return
8c90: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62   sqlite3Close(db
8ca0: 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ,1); }.../*.** C
8cb0: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 6f  lose the mutex o
8cc0: 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  n database conne
8cd0: 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20  ction db..**.** 
8ce0: 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20  Furthermore, if 
8cf0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
8d00: 69 6f 6e 20 64 62 20 69 73 20 61 20 7a 6f 6d 62  ion db is a zomb
8d10: 69 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74  ie (meaning that
8d20: 20 74 68 65 72 65 0a 2a 2a 20 68 61 73 20 62 65   there.** has be
8d30: 65 6e 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  en a prior call 
8d40: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  to sqlite3_close
8d50: 28 64 62 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  (db) or sqlite3_
8d60: 63 6c 6f 73 65 5f 76 32 28 64 62 29 29 20 61 6e  close_v2(db)) an
8d70: 64 0a 2a 2a 20 65 76 65 72 79 20 73 71 6c 69 74  d.** every sqlit
8d80: 65 33 5f 73 74 6d 74 20 68 61 73 20 6e 6f 77 20  e3_stmt has now 
8d90: 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61  been finalized a
8da0: 6e 64 20 65 76 65 72 79 20 73 71 6c 69 74 65 33  nd every sqlite3
8db0: 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a 2a 20 66  _backup has.** f
8dc0: 69 6e 69 73 68 65 64 2c 20 74 68 65 6e 20 66 72  inished, then fr
8dd0: 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73  ee all resources
8de0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8df0: 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c  3LeaveMutexAndCl
8e00: 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c 69 74 65  oseZombie(sqlite
8e10: 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c  3 *db){.  HashEl
8e20: 65 6d 20 2a 69 3b 20 20 20 20 20 20 20 20 20 20  em *i;          
8e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
8e40: 68 20 74 61 62 6c 65 20 69 74 65 72 61 74 6f 72  h table iterator
8e50: 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20   */.  int j;..  
8e60: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
8e70: 6f 75 74 73 74 61 6e 64 69 6e 67 20 73 71 6c 69  outstanding sqli
8e80: 74 65 33 5f 73 74 6d 74 20 6f 72 20 73 71 6c 69  te3_stmt or sqli
8e90: 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63  te3_backup objec
8ea0: 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  ts.  ** or if th
8eb0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  e connection has
8ec0: 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6c   not yet been cl
8ed0: 6f 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  osed by sqlite3_
8ee0: 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20 20 2a 2a  close_v2(),.  **
8ef0: 20 74 68 65 6e 20 6a 75 73 74 20 6c 65 61 76 65   then just leave
8f00: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 72   the mutex and r
8f10: 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  eturn..  */.  if
8f20: 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c  ( db->magic!=SQL
8f30: 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45  ITE_MAGIC_ZOMBIE
8f40: 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73   || connectionIs
8f50: 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20  Busy(db) ){.    
8f60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
8f70: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
8f80: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8f90: 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
8fa0: 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
8fb0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
8fc0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
8fd0: 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20 63 6c 6f  ion has.  ** clo
8fe0: 73 65 64 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f  sed all sqlite3_
8ff0: 73 74 6d 74 20 61 6e 64 20 73 71 6c 69 74 65 33  stmt and sqlite3
9000: 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20  _backup objects 
9010: 61 6e 64 20 68 61 73 20 62 65 65 6e 0a 20 20 2a  and has been.  *
9020: 2a 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  * passed to sqli
9030: 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65 61 6e 69  te3_close (meani
9040: 6e 67 20 74 68 61 74 20 69 74 20 69 73 20 61 20  ng that it is a 
9050: 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65 72 65 66  zombie).  Theref
9060: 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20 61 68 65  ore,.  ** go ahe
9070: 61 64 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20  ad and free all 
9080: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 2a 2f 0a  resources..  */.
9090: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
90a0: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
90b0: 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 54 68  roll it back. Th
90c0: 69 73 20 61 6c 73 6f 20 65 6e 73 75 72 65 73 20  is also ensures 
90d0: 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 61 6e 79  that if.  ** any
90e0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
90f0: 73 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  s have been modi
9100: 66 69 65 64 20 62 79 20 61 6e 20 75 6e 63 6f 6d  fied by an uncom
9110: 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69  mitted transacti
9120: 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20 61 72 65  on.  ** they are
9130: 20 72 65 73 65 74 2e 20 41 6e 64 20 74 68 61 74   reset. And that
9140: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 62 2d   the required b-
9150: 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65  tree mutex is he
9160: 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  ld to make.  ** 
9170: 74 68 65 20 70 61 67 65 72 20 72 6f 6c 6c 62 61  the pager rollba
9180: 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65  ck and schema re
9190: 73 65 74 20 61 6e 20 61 74 6f 6d 69 63 20 6f 70  set an atomic op
91a0: 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71  eration. */.  sq
91b0: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
91c0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
91d0: 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
91e0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65  outstanding Save
91f0: 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 73  point structures
9200: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c  . */.  sqlite3Cl
9210: 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
9220: 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  );..  /* Close a
9230: 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ll database conn
9240: 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72  ections */.  for
9250: 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b  (j=0; j<db->nDb;
9260: 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   j++){.    struc
9270: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
9280: 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  >aDb[j];.    if(
9290: 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20   pDb->pBt ){.   
92a0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
92b0: 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a  lose(pDb->pBt);.
92c0: 20 20 20 20 20 20 70 44 62 2d 3e 70 42 74 20 3d        pDb->pBt =
92d0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 21   0;.      if( j!
92e0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  =1 ){.        pD
92f0: 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a  b->pSchema = 0;.
9300: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9310: 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65  }.  /* Clear the
9320: 20 54 45 4d 50 20 73 63 68 65 6d 61 20 73 65 70   TEMP schema sep
9330: 61 72 61 74 65 6c 79 20 61 6e 64 20 6c 61 73 74  arately and last
9340: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 44   */.  if( db->aD
9350: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
9360: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
9370: 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b 31  aClear(db->aDb[1
9380: 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ].pSchema);.  }.
9390: 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c    sqlite3VtabUnl
93a0: 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20  ockList(db);..  
93b0: 2f 2a 20 46 72 65 65 20 75 70 20 74 68 65 20 61  /* Free up the a
93c0: 72 72 61 79 20 6f 66 20 61 75 78 69 6c 69 61 72  rray of auxiliar
93d0: 79 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  y databases */. 
93e0: 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65   sqlite3Collapse
93f0: 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62  DatabaseArray(db
9400: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
9410: 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73  >nDb<=2 );.  ass
9420: 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62  ert( db->aDb==db
9430: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a 0a  ->aDbStatic );..
9440: 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f    /* Tell the co
9450: 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74  de in notify.c t
9460: 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  hat the connecti
9470: 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c  on no longer hol
9480: 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b  ds any.  ** lock
9490: 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72  s and does not r
94a0: 65 71 75 69 72 65 20 61 6e 79 20 66 75 72 74 68  equire any furth
94b0: 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  er unlock-notify
94c0: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
94d0: 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  .  sqlite3Connec
94e0: 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a  tionClosed(db);.
94f0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72  .  for(j=0; j<Ar
9500: 72 61 79 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e  raySize(db->aFun
9510: 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  c.a); j++){.    
9520: 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20  FuncDef *pNext, 
9530: 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20  *pHash, *p;.    
9540: 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e  for(p=db->aFunc.
9550: 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68  a[j]; p; p=pHash
9560: 29 7b 0a 20 20 20 20 20 20 70 48 61 73 68 20 3d  ){.      pHash =
9570: 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 20   p->pHash;.     
9580: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
9590: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73       functionDes
95a0: 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20  troy(db, p);.   
95b0: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e       pNext = p->
95c0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73  pNext;.        s
95d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
95e0: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d   p);.        p =
95f0: 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a   pNext;.      }.
9600: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
9610: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
9620: 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
9630: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
9640: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43  hNext(i)){.    C
9650: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
9660: 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74  (CollSeq *)sqlit
9670: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
9680: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20    /* Invoke any 
9690: 64 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69  destructors regi
96a0: 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61  stered for colla
96b0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
96c0: 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  er data. */.    
96d0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b  for(j=0; j<3; j+
96e0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  +){.      if( pC
96f0: 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20  oll[j].xDel ){. 
9700: 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e         pColl[j].
9710: 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55  xDel(pColl[j].pU
9720: 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ser);.      }.  
9730: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
9740: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29  bFree(db, pColl)
9750: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
9760: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43  ashClear(&db->aC
9770: 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66  ollSeq);.#ifndef
9780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
9790: 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28  TUALTABLE.  for(
97a0: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
97b0: 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
97c0: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
97d0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f  Next(i)){.    Mo
97e0: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
97f0: 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  dule *)sqliteHas
9800: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
9810: 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79  ( pMod->xDestroy
9820: 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e   ){.      pMod->
9830: 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70  xDestroy(pMod->p
9840: 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Aux);.    }.    
9850: 73 71 6c 69 74 65 33 56 74 61 62 45 70 6f 6e 79  sqlite3VtabEpony
9860: 6d 6f 75 73 54 61 62 6c 65 43 6c 65 61 72 28 64  mousTableClear(d
9870: 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 20 20 73 71  b, pMod);.    sq
9880: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9890: 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pMod);.  }.  sql
98a0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
98b0: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
98c0: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72  dif..  sqlite3Er
98d0: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
98e0: 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  K); /* Deallocat
98f0: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
9900: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
9910: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
9920: 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  ee(db->pErr);.  
9930: 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65  sqlite3CloseExte
9940: 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 23 69 66 20  nsions(db);.#if 
9950: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
9960: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 73 71 6c  ENTICATION.  sql
9970: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75  ite3_free(db->au
9980: 74 68 2e 7a 41 75 74 68 55 73 65 72 29 3b 0a 20  th.zAuthUser);. 
9990: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
99a0: 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50 57 29 3b  ->auth.zAuthPW);
99b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d  .#endif..  db->m
99c0: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
99d0: 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  GIC_ERROR;..  /*
99e0: 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61   The temp-databa
99f0: 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c  se schema is all
9a00: 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74  ocated different
9a10: 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  ly from the othe
9a20: 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62  r schema.  ** ob
9a30: 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c  jects (using sql
9a40: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65  iteMalloc() dire
9a50: 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
9a60: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
9a70: 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20  ema())..  ** So 
9a80: 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  it needs to be f
9a90: 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a  reed here. Todo:
9aa0: 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68   Why not roll th
9ab0: 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e  e temp schema in
9ac0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  to.  ** the same
9ad0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
9ae0: 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20  as the one that 
9af0: 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61  allocates the da
9b00: 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72  tabase .  ** str
9b10: 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73  ucture?.  */.  s
9b20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9b30: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
9b40: 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ema);.  sqlite3_
9b50: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
9b60: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61  mutex);.  db->ma
9b70: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
9b80: 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c  IC_CLOSED;.  sql
9b90: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
9ba0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
9bb0: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
9bc0: 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20  ide.nOut==0 );  
9bd0: 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f  /* Fails on a lo
9be0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c  okaside memory l
9bf0: 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  eak */.  if( db-
9c00: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
9c10: 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  oced ){.    sqli
9c20: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f  te3_free(db->loo
9c30: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a  kaside.pStart);.
9c40: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
9c50: 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 52 52 0a 20  E_ENABLE_SQLRR. 
9c60: 20 53 52 52 65 63 43 6c 6f 73 65 28 64 62 29 3b   SRRecClose(db);
9c70: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 71 6c  .#endif.  .  sql
9c80: 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d  ite3_free(db);.}
9c90: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
9ca0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69   all database fi
9cb0: 6c 65 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64  les.  If tripCod
9cc0: 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
9cd0: 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20  OK, then.** any 
9ce0: 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
9cf0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 22  e invalidated ("
9d00: 74 72 69 70 70 65 64 22 20 2d 20 61 73 20 69 6e  tripped" - as in
9d10: 20 22 74 72 69 70 70 69 6e 67 20 61 20 63 69 72   "tripping a cir
9d20: 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22  cuit.** breaker"
9d30: 29 20 61 6e 64 20 6d 61 64 65 20 74 6f 20 72 65  ) and made to re
9d40: 74 75 72 6e 20 74 72 69 70 43 6f 64 65 20 69 66  turn tripCode if
9d50: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 66   there are any f
9d60: 75 72 74 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70  urther.** attemp
9d70: 74 73 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ts to use that c
9d80: 75 72 73 6f 72 2e 20 20 52 65 61 64 20 63 75 72  ursor.  Read cur
9d90: 73 6f 72 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e  sors remain open
9da0: 20 61 6e 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75   and valid.** bu
9db0: 74 20 61 72 65 20 22 73 61 76 65 64 22 20 69 6e  t are "saved" in
9dc0: 20 63 61 73 65 20 74 68 65 20 74 61 62 6c 65 20   case the table 
9dd0: 70 61 67 65 73 20 61 72 65 20 6d 6f 76 65 64 20  pages are moved 
9de0: 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20  around..*/.void 
9df0: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
9e00: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
9e10: 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20  int tripCode){. 
9e20: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e   int i;.  int in
9e30: 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74  Trans = 0;.  int
9e40: 20 73 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20   schemaChange;. 
9e50: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9e60: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
9e70: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
9e80: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
9e90: 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62  lloc();..  /* Ob
9ea0: 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20  tain all b-tree 
9eb0: 6d 75 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d  mutexes before m
9ec0: 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20  aking any calls 
9ed0: 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  to BtreeRollback
9ee0: 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69  (). .  ** This i
9ef0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63  s important in c
9f00: 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ase the transact
9f10: 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64  ion being rolled
9f20: 20 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d   back has.  ** m
9f30: 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61  odified the data
9f40: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
9f50: 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78  the b-tree mutex
9f60: 65 73 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e  es are not taken
9f70: 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e  .  ** here, then
9f80: 20 61 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d   another shared-
9f90: 63 61 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  cache connection
9fa0: 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20   might sneak in 
9fb0: 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65  between.  ** the
9fc0: 20 64 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61   database rollba
9fd0: 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65  ck and schema re
9fe0: 73 65 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63  set, which can c
9ff0: 61 75 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20  ause false.  ** 
a000: 63 6f 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72  corruption repor
a010: 74 73 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73  ts in some cases
a020: 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
a030: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
a040: 3b 0a 20 20 73 63 68 65 6d 61 43 68 61 6e 67 65  ;.  schemaChange
a050: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
a060: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
a070: 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d 3e  nges)!=0 && db->
a080: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20  init.busy==0;.. 
a090: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
a0a0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
a0b0: 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44  tree *p = db->aD
a0c0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
a0d0: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ( p ){.      if(
a0e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
a0f0: 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20  nTrans(p) ){.   
a100: 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 31       inTrans = 1
a110: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a120: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
a130: 62 61 63 6b 28 70 2c 20 74 72 69 70 43 6f 64 65  back(p, tripCode
a140: 2c 20 21 73 63 68 65 6d 61 43 68 61 6e 67 65 29  , !schemaChange)
a150: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
a160: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
a170: 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  k(db);.  sqlite3
a180: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
a190: 29 3b 0a 0a 20 20 69 66 28 20 28 64 62 2d 3e 66  );..  if( (db->f
a1a0: 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
a1b0: 72 6e 43 68 61 6e 67 65 73 29 21 3d 30 20 26 26  rnChanges)!=0 &&
a1c0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
a1d0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
a1e0: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
a1f0: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
a200: 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c    sqlite3ResetAl
a210: 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63  lSchemasOfConnec
a220: 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20  tion(db);.  }.  
a230: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
a240: 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eAll(db);..  /* 
a250: 41 6e 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e  Any deferred con
a260: 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
a270: 6e 73 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  ns have now been
a280: 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20   resolved. */.  
a290: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
a2a0: 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 44 65  s = 0;.  db->nDe
a2b0: 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
a2c0: 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  0;.  db->flags &
a2d0: 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46  = ~SQLITE_DeferF
a2e0: 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65  Ks;..  /* If one
a2f0: 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67   has been config
a300: 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65  ured, invoke the
a310: 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63   rollback-hook c
a320: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  allback */.  if(
a330: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
a340: 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61  llback && (inTra
a350: 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43  ns || !db->autoC
a360: 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62  ommit) ){.    db
a370: 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
a380: 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  ack(db->pRollbac
a390: 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  kArg);.  }.}../*
a3a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61  .** Return a sta
a3b0: 74 69 63 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  tic string conta
a3c0: 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 63  ining the name c
a3d0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
a3e0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  the error code.*
a3f0: 2a 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  * specified in t
a400: 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
a410: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
a420: 54 45 5f 4e 45 45 44 5f 45 52 52 5f 4e 41 4d 45  TE_NEED_ERR_NAME
a430: 29 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  ).const char *sq
a440: 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74  lite3ErrName(int
a450: 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68   rc){.  const ch
a460: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
a470: 20 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d   int i, origRc =
a480: 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   rc;.  for(i=0; 
a490: 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b  i<2 && zName==0;
a4a0: 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66   i++, rc &= 0xff
a4b0: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 72  ){.    switch( r
a4c0: 63 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  c ){.      case 
a4d0: 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20  SQLITE_OK:      
a4e0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a4f0: 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20   = "SQLITE_OK"; 
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
a510: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a520: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20   SQLITE_ERROR:  
a530: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
a540: 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  e = "SQLITE_ERRO
a550: 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  R";             
a560: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a570: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  e SQLITE_INTERNA
a580: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  L:           zNa
a590: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54  me = "SQLITE_INT
a5a0: 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20  ERNAL";         
a5b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a5c0: 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20  se SQLITE_PERM: 
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
a5e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45  ame = "SQLITE_PE
a5f0: 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  RM";            
a600: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a610: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
a620: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
a630: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41  Name = "SQLITE_A
a640: 42 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20 20  BORT";          
a650: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a660: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
a670: 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20  T_ROLLBACK:     
a680: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a690: 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b  ABORT_ROLLBACK";
a6a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a6b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
a6c0: 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:              
a6d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a6e0: 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20 20 20  _BUSY";         
a6f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a700: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
a710: 53 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20  SY_RECOVERY:    
a720: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a730: 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22  E_BUSY_RECOVERY"
a740: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
a750: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
a760: 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20  USY_SNAPSHOT:   
a770: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a780: 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
a790: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
a7a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a7b0: 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20  LOCKED:         
a7c0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a7d0: 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20  ITE_LOCKED";    
a7e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a7f0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a800: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
a810: 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  CHE: zName = "SQ
a820: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
a830: 45 44 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a  EDCACHE";break;.
a840: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a850: 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20  E_NOMEM:        
a860: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a870: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20  QLITE_NOMEM";   
a880: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a890: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a8a0: 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20  TE_READONLY:    
a8b0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a8c0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22  SQLITE_READONLY"
a8d0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
a8e0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a8f0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43  ITE_READONLY_REC
a900: 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20  OVERY:  zName = 
a910: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
a920: 5f 52 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61  _RECOVERY"; brea
a930: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a940: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
a950: 4e 54 4c 4f 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d  NTLOCK:  zName =
a960: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
a970: 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20 62 72 65  Y_CANTLOCK"; bre
a980: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a990: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
a9a0: 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20  OLLBACK:  zName 
a9b0: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
a9c0: 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72  LY_ROLLBACK"; br
a9d0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a9e0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
a9f0: 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65  DBMOVED:   zName
aa00: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
aa10: 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62  NLY_DBMOVED";  b
aa20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
aa30: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
aa40: 54 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  T:          zNam
aa50: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45  e = "SQLITE_INTE
aa60: 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20  RRUPT";         
aa70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
aa80: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20  e SQLITE_IOERR: 
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
aaa0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
aab0: 52 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  RR";            
aac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
aad0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
aae0: 52 45 41 44 3a 20 20 20 20 20 20 20 20 20 7a 4e  READ:         zN
aaf0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
ab00: 45 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20  ERR_READ";      
ab10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ab20: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
ab30: 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a  _SHORT_READ:   z
ab40: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
ab50: 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22  OERR_SHORT_READ"
ab60: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
ab70: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
ab80: 52 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20 20  R_WRITE:        
ab90: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
aba0: 49 4f 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20  IOERR_WRITE";   
abb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
abc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
abd0: 52 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20 20  RR_FSYNC:       
abe0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
abf0: 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20 20  _IOERR_FSYNC";  
ac00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ac10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
ac20: 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20  ERR_DIR_FSYNC:  
ac30: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ac40: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
ac50: 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  C";   break;.   
ac60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
ac70: 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20  OERR_TRUNCATE:  
ac80: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ac90: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
aca0: 45 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  E";    break;.  
acb0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
acc0: 49 4f 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20  IOERR_FSTAT:    
acd0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ace0: 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22  ITE_IOERR_FSTAT"
acf0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
ad00: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ad10: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20  _IOERR_UNLOCK:  
ad20: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ad30: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
ad40: 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K";      break;.
ad50: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ad60: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20  E_IOERR_RDLOCK: 
ad70: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ad80: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
ad90: 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  CK";      break;
ada0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
adb0: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a  TE_IOERR_DELETE:
adc0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
add0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
ade0: 45 54 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b  ETE";      break
adf0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ae00: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a  ITE_IOERR_NOMEM:
ae10: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ae20: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  "SQLITE_IOERR_NO
ae30: 4d 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61  MEM";       brea
ae40: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ae50: 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
ae60: 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  S:       zName =
ae70: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41   "SQLITE_IOERR_A
ae80: 43 43 45 53 53 22 3b 20 20 20 20 20 20 62 72 65  CCESS";      bre
ae90: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
aea0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
aeb0: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20  KRESERVEDLOCK:. 
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
aee0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
aef0: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
af00: 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  EDLOCK"; break;.
af10: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
af20: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20  E_IOERR_LOCK:   
af30: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
af40: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
af50: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
af60: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
af70: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20  TE_IOERR_CLOSE: 
af80: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
af90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
afa0: 53 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  SE";       break
afb0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
afc0: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
afd0: 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  OSE:    zName = 
afe0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49  "SQLITE_IOERR_DI
aff0: 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72 65 61  R_CLOSE";   brea
b000: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b010: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50  LITE_IOERR_SHMOP
b020: 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  EN:      zName =
b030: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b040: 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62 72 65  HMOPEN";     bre
b050: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b060: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
b070: 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  IZE:      zName 
b080: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b090: 53 48 4d 53 49 5a 45 22 3b 20 20 20 20 20 62 72  SHMSIZE";     br
b0a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b0b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b0c0: 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65  LOCK:      zName
b0d0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b0e0: 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62  _SHMLOCK";     b
b0f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b100: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
b110: 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d  MMAP:       zNam
b120: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b130: 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20 20 20  R_SHMMAP";      
b140: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b150: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
b160: 45 45 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  EEK:         zNa
b170: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b180: 52 52 5f 53 45 45 4b 22 3b 20 20 20 20 20 20 20  RR_SEEK";       
b190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b1a0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b1b0: 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e  DELETE_NOENT: zN
b1c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b1d0: 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
b1e0: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
b1f0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b200: 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20 20 20 7a  _MMAP:         z
b210: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b220: 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20  OERR_MMAP";     
b230: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b240: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b250: 52 5f 47 45 54 54 45 4d 50 50 41 54 48 3a 20 20  R_GETTEMPPATH:  
b260: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b270: 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
b280: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  H"; break;.     
b290: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b2a0: 52 52 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20 20  RR_CONVPATH:    
b2b0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b2c0: 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 22  _IOERR_CONVPATH"
b2d0: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
b2e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
b2f0: 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20  RRUPT:          
b300: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b310: 45 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20  E_CORRUPT";     
b320: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b330: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b340: 4f 52 52 55 50 54 5f 56 54 41 42 3a 20 20 20 20  ORRUPT_VTAB:    
b350: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b360: 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 22  TE_CORRUPT_VTAB"
b370: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
b380: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b390: 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20  NOTFOUND:       
b3a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b3b0: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20  ITE_NOTFOUND";  
b3c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b3d0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b3e0: 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20  _FULL:          
b3f0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b400: 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20  LITE_FULL";     
b410: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b420: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b430: 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20  E_CANTOPEN:     
b440: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b450: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b  QLITE_CANTOPEN";
b460: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b470: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b480: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45  TE_CANTOPEN_NOTE
b490: 4d 50 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22  MPDIR: zName = "
b4a0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
b4b0: 4e 4f 54 45 4d 50 44 49 52 22 3b 62 72 65 61 6b  NOTEMPDIR";break
b4c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b4d0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44  ITE_CANTOPEN_ISD
b4e0: 49 52 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  IR:     zName = 
b4f0: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
b500: 5f 49 53 44 49 52 22 3b 20 20 20 20 62 72 65 61  _ISDIR";    brea
b510: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b520: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
b530: 4c 4c 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d  LLPATH:  zName =
b540: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
b550: 4e 5f 46 55 4c 4c 50 41 54 48 22 3b 20 62 72 65  N_FULLPATH"; bre
b560: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b570: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43  QLITE_CANTOPEN_C
b580: 4f 4e 56 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20  ONVPATH:  zName 
b590: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
b5a0: 45 4e 5f 43 4f 4e 56 50 41 54 48 22 3b 20 62 72  EN_CONVPATH"; br
b5b0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b5c0: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a  SQLITE_PROTOCOL:
b5d0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b5e0: 20 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f   = "SQLITE_PROTO
b5f0: 43 4f 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62  COL";          b
b600: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b610: 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20   SQLITE_EMPTY:  
b620: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b630: 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54  e = "SQLITE_EMPT
b640: 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Y";             
b650: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b660: 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a  e SQLITE_SCHEMA:
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
b680: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48  me = "SQLITE_SCH
b690: 45 4d 41 22 3b 20 20 20 20 20 20 20 20 20 20 20  EMA";           
b6a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b6b0: 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  se SQLITE_TOOBIG
b6c0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
b6d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f  ame = "SQLITE_TO
b6e0: 4f 42 49 47 22 3b 20 20 20 20 20 20 20 20 20 20  OBIG";          
b6f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b700: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
b710: 52 41 49 4e 54 3a 20 20 20 20 20 20 20 20 20 7a  RAINT:         z
b720: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b730: 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20  ONSTRAINT";     
b740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b750: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
b760: 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20  TRAINT_UNIQUE:  
b770: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b780: 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
b790: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  E"; break;.     
b7a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
b7b0: 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 3a  STRAINT_TRIGGER:
b7c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b7d0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47  _CONSTRAINT_TRIG
b7e0: 47 45 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  GER";break;.    
b7f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
b800: 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
b810: 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20  KEY:.           
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b830: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b840: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b850: 46 4f 52 45 49 47 4e 4b 45 59 22 3b 20 20 20 62  FOREIGNKEY";   b
b860: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b870: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
b880: 4e 54 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d  NT_CHECK:   zNam
b890: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
b8a0: 54 52 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20  TRAINT_CHECK";  
b8b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b8c0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
b8d0: 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a  INT_PRIMARYKEY:.
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b900: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b910: 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41  CONSTRAINT_PRIMA
b920: 52 59 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b  RYKEY";   break;
b930: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b940: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f  TE_CONSTRAINT_NO
b950: 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22  TNULL: zName = "
b960: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b970: 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b  T_NOTNULL";break
b980: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b990: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
b9a0: 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20  OMMITHOOK:.     
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9c0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b9d0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
b9e0: 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b  RAINT_COMMITHOOK
b9f0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
ba00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
ba10: 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 3a 20 20  NSTRAINT_VTAB:  
ba20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ba30: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41  E_CONSTRAINT_VTA
ba40: 42 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  B";   break;.   
ba50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
ba60: 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49  ONSTRAINT_FUNCTI
ba70: 4f 4e 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ON:.            
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
baa0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
bab0: 55 4e 43 54 49 4f 4e 22 3b 20 20 20 20 20 62 72  UNCTION";     br
bac0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bad0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
bae0: 54 5f 52 4f 57 49 44 3a 20 20 20 7a 4e 61 6d 65  T_ROWID:   zName
baf0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
bb00: 52 41 49 4e 54 5f 52 4f 57 49 44 22 3b 20 20 62  RAINT_ROWID";  b
bb10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bb20: 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48   SQLITE_MISMATCH
bb30: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
bb40: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d  e = "SQLITE_MISM
bb50: 41 54 43 48 22 3b 20 20 20 20 20 20 20 20 20 20  ATCH";          
bb60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bb70: 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a  e SQLITE_MISUSE:
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
bb90: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53  me = "SQLITE_MIS
bba0: 55 53 45 22 3b 20 20 20 20 20 20 20 20 20 20 20  USE";           
bbb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bbc0: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a  se SQLITE_NOLFS:
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
bbe0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
bbf0: 4c 46 53 22 3b 20 20 20 20 20 20 20 20 20 20 20  LFS";           
bc00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bc10: 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a  ase SQLITE_AUTH:
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
bc30: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41  Name = "SQLITE_A
bc40: 55 54 48 22 3b 20 20 20 20 20 20 20 20 20 20 20  UTH";           
bc50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bc60: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d  case SQLITE_FORM
bc70: 41 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  AT:             
bc80: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bc90: 46 4f 52 4d 41 54 22 3b 20 20 20 20 20 20 20 20  FORMAT";        
bca0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bcb0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e   case SQLITE_RAN
bcc0: 47 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  GE:             
bcd0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bce0: 5f 52 41 4e 47 45 22 3b 20 20 20 20 20 20 20 20  _RANGE";        
bcf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bd00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
bd10: 54 41 44 42 3a 20 20 20 20 20 20 20 20 20 20 20  TADB:           
bd20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bd30: 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20 20 20  E_NOTADB";      
bd40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bd50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
bd60: 4f 57 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  OW:             
bd70: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bd80: 54 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20  TE_ROW";        
bd90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bda0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bdb0: 4e 4f 54 49 43 45 3a 20 20 20 20 20 20 20 20 20  NOTICE:         
bdc0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bdd0: 49 54 45 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20  ITE_NOTICE";    
bde0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bdf0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
be00: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
be10: 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  WAL: zName = "SQ
be20: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
be30: 56 45 52 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a  VER_WAL";break;.
be40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
be50: 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52  E_NOTICE_RECOVER
be60: 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20  _ROLLBACK:.     
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be80: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
be90: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43   = "SQLITE_NOTIC
bea0: 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41  E_RECOVER_ROLLBA
beb0: 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CK"; break;.    
bec0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41    case SQLITE_WA
bed0: 52 4e 49 4e 47 3a 20 20 20 20 20 20 20 20 20 20  RNING:          
bee0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bef0: 45 5f 57 41 52 4e 49 4e 47 22 3b 20 20 20 20 20  E_WARNING";     
bf00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bf10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57     case SQLITE_W
bf20: 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58  ARNING_AUTOINDEX
bf30: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
bf40: 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49  TE_WARNING_AUTOI
bf50: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
bf60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bf70: 44 4f 4e 45 3a 20 20 20 20 20 20 20 20 20 20 20  DONE:           
bf80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bf90: 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20  ITE_DONE";      
bfa0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bfb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
bfc0: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Name==0 ){.    s
bfd0: 74 61 74 69 63 20 63 68 61 72 20 7a 42 75 66 5b  tatic char zBuf[
bfe0: 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  50];.    sqlite3
bff0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
c000: 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 53  (zBuf), zBuf, "S
c010: 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64  QLITE_UNKNOWN(%d
c020: 29 22 2c 20 6f 72 69 67 52 63 29 3b 0a 20 20 20  )", origRc);.   
c030: 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20   zName = zBuf;. 
c040: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
c050: 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e;.}.#endif../*.
c060: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74  ** Return a stat
c070: 69 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 64  ic string that d
c080: 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e  escribes the kin
c090: 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69  d of error speci
c0a0: 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61  fied in the.** a
c0b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73  rgument..*/.cons
c0c0: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45  t char *sqlite3E
c0d0: 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20  rrStr(int rc){. 
c0e0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
c0f0: 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d  ar* const aMsg[]
c100: 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49   = {.    /* SQLI
c110: 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a  TE_OK          *
c120: 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22  / "not an error"
c130: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c140: 45 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22  ERROR       */ "
c150: 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20  SQL logic error 
c160: 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62  or missing datab
c170: 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ase",.    /* SQL
c180: 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20  ITE_INTERNAL    
c190: 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  */ 0,.    /* SQL
c1a0: 49 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20  ITE_PERM        
c1b0: 2a 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d 69  */ "access permi
c1c0: 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20  ssion denied",. 
c1d0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f     /* SQLITE_ABO
c1e0: 52 54 20 20 20 20 20 20 20 2a 2f 20 22 63 61 6c  RT       */ "cal
c1f0: 6c 62 61 63 6b 20 72 65 71 75 65 73 74 65 64 20  lback requested 
c200: 71 75 65 72 79 20 61 62 6f 72 74 22 2c 0a 20 20  query abort",.  
c210: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    /* SQLITE_BUSY
c220: 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61          */ "data
c230: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c  base is locked",
c240: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  .    /* SQLITE_L
c250: 4f 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64  OCKED      */ "d
c260: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73  atabase table is
c270: 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a   locked",.    /*
c280: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20   SQLITE_NOMEM   
c290: 20 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d      */ "out of m
c2a0: 65 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53  emory",.    /* S
c2b0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20  QLITE_READONLY  
c2c0: 20 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f    */ "attempt to
c2d0: 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c   write a readonl
c2e0: 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20  y database",.   
c2f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   /* SQLITE_INTER
c300: 52 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72  RUPT   */ "inter
c310: 72 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20  rupted",.    /* 
c320: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20  SQLITE_IOERR    
c330: 20 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20     */ "disk I/O 
c340: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
c350: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20  QLITE_CORRUPT   
c360: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64    */ "database d
c370: 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c  isk image is mal
c380: 66 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20  formed",.    /* 
c390: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
c3a0: 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f     */ "unknown o
c3b0: 70 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f  peration",.    /
c3c0: 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20  * SQLITE_FULL   
c3d0: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
c3e0: 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c  e or disk is ful
c3f0: 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  l",.    /* SQLIT
c400: 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f  E_CANTOPEN    */
c410: 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
c420: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c   database file",
c430: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50  .    /* SQLITE_P
c440: 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c  ROTOCOL    */ "l
c450: 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22  ocking protocol"
c460: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c470: 45 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20 22  EMPTY       */ "
c480: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e  table contains n
c490: 6f 20 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20  o data",.    /* 
c4a0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20  SQLITE_SCHEMA   
c4b0: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
c4c0: 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67  schema has chang
c4d0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c4e0: 54 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a  TE_TOOBIG      *
c4f0: 2f 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f  / "string or blo
c500: 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20  b too big",.    
c510: 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  /* SQLITE_CONSTR
c520: 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72  AINT  */ "constr
c530: 61 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20  aint failed",.  
c540: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d    /* SQLITE_MISM
c550: 41 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61  ATCH    */ "data
c560: 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a  type mismatch",.
c570: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49      /* SQLITE_MI
c580: 53 55 53 45 20 20 20 20 20 20 2a 2f 20 22 6c 69  SUSE      */ "li
c590: 62 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61  brary routine ca
c5a0: 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75  lled out of sequ
c5b0: 65 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  ence",.    /* SQ
c5c0: 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20  LITE_NOLFS      
c5d0: 20 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c 65 20   */ "large file 
c5e0: 73 75 70 70 6f 72 74 20 69 73 20 64 69 73 61 62  support is disab
c5f0: 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  led",.    /* SQL
c600: 49 54 45 5f 41 55 54 48 20 20 20 20 20 20 20 20  ITE_AUTH        
c610: 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f  */ "authorizatio
c620: 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f  n denied",.    /
c630: 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20  * SQLITE_FORMAT 
c640: 20 20 20 20 20 2a 2f 20 22 61 75 78 69 6c 69 61       */ "auxilia
c650: 72 79 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d  ry database form
c660: 61 74 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f  at error",.    /
c670: 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20  * SQLITE_RANGE  
c680: 20 20 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72       */ "bind or
c690: 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75   column index ou
c6a0: 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20  t of range",.   
c6b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44   /* SQLITE_NOTAD
c6c0: 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20  B      */ "file 
c6d0: 69 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72 20  is encrypted or 
c6e0: 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73  is not a databas
c6f0: 65 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74  e",.  };.  const
c700: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 75   char *zErr = "u
c710: 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20  nknown error";. 
c720: 20 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20   switch( rc ){. 
c730: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
c740: 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b  BORT_ROLLBACK: {
c750: 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 61  .      zErr = "a
c760: 62 6f 72 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c  bort due to ROLL
c770: 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 62 72 65  BACK";.      bre
c780: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
c790: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
c7a0: 63 20 26 3d 20 30 78 66 66 3b 0a 20 20 20 20 20  c &= 0xff;.     
c7b0: 20 69 66 28 20 41 4c 57 41 59 53 28 72 63 3e 3d   if( ALWAYS(rc>=
c7c0: 30 29 20 26 26 20 72 63 3c 41 72 72 61 79 53 69  0) && rc<ArraySi
c7d0: 7a 65 28 61 4d 73 67 29 20 26 26 20 61 4d 73 67  ze(aMsg) && aMsg
c7e0: 5b 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20  [rc]!=0 ){.     
c7f0: 20 20 20 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72     zErr = aMsg[r
c800: 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c];.      }.    
c810: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c820: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72   }.  return zErr
c830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
c840: 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
c850: 74 73 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61  ts a busy callba
c860: 63 6b 20 74 68 61 74 20 73 6c 65 65 70 73 20 61  ck that sleeps a
c870: 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69  nd tries.** agai
c880: 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75  n until a timeou
c890: 74 20 76 61 6c 75 65 20 69 73 20 72 65 61 63 68  t value is reach
c8a0: 65 64 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74  ed.  The timeout
c8b0: 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20   value is.** an 
c8c0: 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f  integer number o
c8d0: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70  f milliseconds p
c8e0: 61 73 73 65 64 20 69 6e 20 61 73 20 74 68 65 20  assed in as the 
c8f0: 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
c900: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
c910: 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75   sqliteDefaultBu
c920: 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69  syCallback(. voi
c930: 64 20 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20  d *ptr,         
c940: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
c950: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
c960: 20 69 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20   int count      
c970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c980: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 61 62  ber of times tab
c990: 6c 65 20 68 61 73 20 62 65 65 6e 20 62 75 73 79  le has been busy
c9a0: 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54   */.){.#if SQLIT
c9b0: 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45  E_OS_WIN || HAVE
c9c0: 5f 55 53 4c 45 45 50 0a 20 20 73 74 61 74 69 63  _USLEEP.  static
c9d0: 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73   const u8 delays
c9e0: 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32  [] =.     { 1, 2
c9f0: 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c  , 5, 10, 15, 20,
ca00: 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35   25, 25,  25,  5
ca10: 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20  0,  50, 100 };. 
ca20: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
ca30: 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20   totals[] =.    
ca40: 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20   { 0, 1, 3,  8, 
ca50: 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20  18, 33, 53, 78, 
ca60: 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32  103, 128, 178, 2
ca70: 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e  28 };.# define N
ca80: 44 45 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28  DELAY ArraySize(
ca90: 64 65 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65  delays).  sqlite
caa0: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
cab0: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69   *)ptr;.  int ti
cac0: 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79  meout = db->busy
cad0: 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64  Timeout;.  int d
cae0: 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20  elay, prior;..  
caf0: 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30  assert( count>=0
cb00: 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20   );.  if( count 
cb10: 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20  < NDELAY ){.    
cb20: 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63  delay = delays[c
cb30: 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72  ount];.    prior
cb40: 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d   = totals[count]
cb50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
cb60: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44  elay = delays[ND
cb70: 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69  ELAY-1];.    pri
cb80: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c  or = totals[NDEL
cb90: 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63  AY-1] + delay*(c
cba0: 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29  ount-(NDELAY-1))
cbb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f  ;.  }.  if( prio
cbc0: 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65  r + delay > time
cbd0: 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  out ){.    delay
cbe0: 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69   = timeout - pri
cbf0: 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61  or;.    if( dela
cc00: 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y<=0 ) return 0;
cc10: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
cc20: 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20  Sleep(db->pVfs, 
cc30: 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72  delay*1000);.  r
cc40: 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20  eturn 1;.#else. 
cc50: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
cc60: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
cc70: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28   int timeout = (
cc80: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d  (sqlite3 *)ptr)-
cc90: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
cca0: 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30  if( (count+1)*10
ccb0: 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a  00 > timeout ){.
ccc0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ccd0: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
cce0: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30  ep(db->pVfs, 100
ccf0: 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0000);.  return 
cd00: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
cd10: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
cd20: 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ven busy handler
cd30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
cd40: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
cd50: 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  hen an operation
cd60: 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c   failed with a l
cd70: 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20  ock..** If this 
cd80: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
cd90: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
cda0: 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20  ck is retried.  
cdb0: 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73  If it.** returns
cdc0: 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f   0, the operatio
cdd0: 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e  n aborts with an
cde0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
cdf0: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
ce00: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
ce10: 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20  ler(BusyHandler 
ce20: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
ce30: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
ce40: 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20   || p->xFunc==0 
ce50: 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20  || p->nBusy<0 ) 
ce60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
ce70: 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72   p->xFunc(p->pAr
ce80: 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20  g, p->nBusy);.  
ce90: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
cea0: 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a   p->nBusy = -1;.
ceb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
cec0: 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72  nBusy++;.  }.  r
ced0: 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a  eturn rc; .}../*
cee0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
cef0: 20 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63   sets the busy c
cf00: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
cf10: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
cf20: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
cf30: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
cf40: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
cf50: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
cf60: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
cf70: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
cf80: 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42   *db,.  int (*xB
cf90: 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c  usy)(void*,int),
cfa0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
cfb0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
cfc0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
cfd0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
cfe0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
cff0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
d000: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
d010: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
d020: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
d030: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79  tex);.  db->busy
d040: 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20  Handler.xFunc = 
d050: 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73  xBusy;.  db->bus
d060: 79 48 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20  yHandler.pArg = 
d070: 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79  pArg;.  db->busy
d080: 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
d090: 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 54 69 6d  0;.  db->busyTim
d0a0: 65 6f 75 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  eout = 0;.  sqli
d0b0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
d0c0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
d0d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d0e0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
d0f0: 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f  E_OMIT_PROGRESS_
d100: 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54  CALLBACK./*.** T
d110: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
d120: 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   the progress ca
d130: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71  llback for an Sq
d140: 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f  lite database to
d150: 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61   the.** given ca
d160: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
d170: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61  with the given a
d180: 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f  rgument. The pro
d190: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77  gress callback w
d1a0: 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65  ill.** be invoke
d1b0: 64 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63  d every nOps opc
d1c0: 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  odes..*/.void sq
d1d0: 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68  lite3_progress_h
d1e0: 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65  andler(.  sqlite
d1f0: 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f  3 *db, .  int nO
d200: 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f  ps,.  int (*xPro
d210: 67 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a  gress)(void*), .
d220: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
d230: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d240: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
d250: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
d260: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
d270: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
d280: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
d290: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d2a0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
d2b0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
d2c0: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e  >mutex);.  if( n
d2d0: 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d  Ops>0 ){.    db-
d2e0: 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72  >xProgress = xPr
d2f0: 6f 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e  ogress;.    db->
d300: 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 28  nProgressOps = (
d310: 75 6e 73 69 67 6e 65 64 29 6e 4f 70 73 3b 0a 20  unsigned)nOps;. 
d320: 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73     db->pProgress
d330: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65  Arg = pArg;.  }e
d340: 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72  lse{.    db->xPr
d350: 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
d360: 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73  db->nProgressOps
d370: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50   = 0;.    db->pP
d380: 72 6f 67 72 65 73 73 41 72 67 20 3d 20 30 3b 0a  rogressArg = 0;.
d390: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
d3a0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
d3b0: 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  tex);.}.#endif..
d3c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d3d0: 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61 20 64  ine installs a d
d3e0: 65 66 61 75 6c 74 20 62 75 73 79 20 68 61 6e 64  efault busy hand
d3f0: 6c 65 72 20 74 68 61 74 20 77 61 69 74 73 20 66  ler that waits f
d400: 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66  or the.** specif
d410: 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  ied number of mi
d420: 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72  lliseconds befor
d430: 65 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a  e returning 0..*
d440: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75  /.int sqlite3_bu
d450: 73 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69 74  sy_timeout(sqlit
d460: 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b  e3 *db, int ms){
d470: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d480: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
d490: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
d4a0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
d4b0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
d4c0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
d4d0: 64 69 66 0a 20 20 69 66 28 20 6d 73 3e 30 20 29  dif.  if( ms>0 )
d4e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  {.    sqlite3_bu
d4f0: 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73  sy_handler(db, s
d500: 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79  qliteDefaultBusy
d510: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a  Callback, (void*
d520: 29 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62 75  )db);.    db->bu
d530: 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a  syTimeout = ms;.
d540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
d550: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
d560: 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  r(db, 0, 0);.  }
d570: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d580: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  _OK;.}../*.** Ca
d590: 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20  use any pending 
d5a0: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f  operation to sto
d5b0: 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73  p at its earlies
d5c0: 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a  t opportunity..*
d5d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69  /.void sqlite3_i
d5e0: 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33  nterrupt(sqlite3
d5f0: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
d600: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
d610: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
d620: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
d630: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
d640: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
d650: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
d660: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
d670: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
d680: 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  pted = 1;.}.../*
d690: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d6a0: 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74 68 65  n is exactly the
d6b0: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
d6c0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
d6d0: 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68  (), except.** th
d6e0: 61 74 20 69 74 20 69 73 20 64 65 73 69 67 6e 65  at it is designe
d6f0: 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62  d to be called b
d700: 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e  y internal code.
d710: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
d720: 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20  is.** that if a 
d730: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69  malloc() fails i
d740: 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  n sqlite3_create
d750: 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20  _function(), an 
d760: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
d770: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
d780: 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  e mallocFailed f
d790: 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f  lag cleared. .*/
d7a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61  .int sqlite3Crea
d7b0: 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  teFunc(.  sqlite
d7c0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
d7d0: 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61  har *zFunctionNa
d7e0: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  me,.  int nArg,.
d7f0: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
d800: 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20  d *pUserData,.  
d810: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
d820: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
d830: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
d840: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
d850: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
d860: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
d870: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
d880: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
d890: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
d8a0: 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  ,.  FuncDestruct
d8b0: 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a  or *pDestructor.
d8c0: 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b  ){.  FuncDef *p;
d8d0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20  .  int nName;.  
d8e0: 69 6e 74 20 65 78 74 72 61 46 6c 61 67 73 3b 0a  int extraFlags;.
d8f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d900: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
d910: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
d920: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  ( zFunctionName=
d930: 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75  =0 ||.      (xFu
d940: 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c  nc && (xFinal ||
d950: 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20   xStep)) || .   
d960: 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 78     (!xFunc && (x
d970: 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29  Final && !xStep)
d980: 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75  ) ||.      (!xFu
d990: 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26  nc && (!xFinal &
d9a0: 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20  & xStep)) ||.   
d9b0: 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e     (nArg<-1 || n
d9c0: 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46  Arg>SQLITE_MAX_F
d9d0: 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a  UNCTION_ARG) ||.
d9e0: 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d        (255<(nNam
d9f0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
da00: 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  n30( zFunctionNa
da10: 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74  me))) ){.    ret
da20: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
da30: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61  E_BKPT;.  }..  a
da40: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
da50: 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c  NC_CONSTANT==SQL
da60: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
da70: 43 20 29 3b 0a 20 20 65 78 74 72 61 46 6c 61 67  C );.  extraFlag
da80: 73 20 3d 20 65 6e 63 20 26 20 20 53 51 4c 49 54  s = enc &  SQLIT
da90: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b  E_DETERMINISTIC;
daa0: 0a 20 20 65 6e 63 20 26 3d 20 28 53 51 4c 49 54  .  enc &= (SQLIT
dab0: 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53  E_FUNC_ENCMASK|S
dac0: 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a 23  QLITE_ANY);.  .#
dad0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
dae0: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66  IT_UTF16.  /* If
daf0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
db00: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
db10: 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
db20: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
db30: 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
db40: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
db50: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
db60: 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
db70: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
db80: 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
db90: 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
dba0: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
dbb0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54  **.  ** If SQLIT
dbc0: 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69  E_ANY is specifi
dbd0: 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65  ed, add three ve
dbe0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75  rsions of the fu
dbf0: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74  nction.  ** to t
dc00: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20  he hash table.. 
dc10: 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53   */.  if( enc==S
dc20: 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20  QLITE_UTF16 ){. 
dc30: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
dc40: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
dc50: 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51  else if( enc==SQ
dc60: 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20  LITE_ANY ){.    
dc70: 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  int rc;.    rc =
dc80: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
dc90: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
dca0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
dcb0: 54 45 5f 55 54 46 38 7c 65 78 74 72 61 46 6c 61  TE_UTF8|extraFla
dcc0: 67 73 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73  gs,.         pUs
dcd0: 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78  erData, xFunc, x
dce0: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44  Step, xFinal, pD
dcf0: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
dd00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
dd10: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
dd20: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
dd30: 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  c(db, zFunctionN
dd40: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
dd50: 45 5f 55 54 46 31 36 4c 45 7c 65 78 74 72 61 46  E_UTF16LE|extraF
dd60: 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
dd70: 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63  pUserData, xFunc
dd80: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
dd90: 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20   pDestructor);. 
dda0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
ddb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ddc0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ddd0: 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53     }.    enc = S
dde0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20  QLITE_UTF16BE;. 
ddf0: 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d   }.#else.  enc =
de00: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
de10: 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65  ndif.  .  /* Che
de20: 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ck if an existin
de30: 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  g function is be
de40: 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f  ing overridden o
de50: 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f  r deleted. If so
de60: 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65  ,.  ** and there
de70: 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c   are active VMs,
de80: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c   then return SQL
de90: 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66  ITE_BUSY. If a f
dea0: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
deb0: 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e  being overridden
dec0: 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68 65  /deleted but the
ded0: 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  re are no active
dee0: 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a   VMs, allow the.
def0: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74    ** operation t
df00: 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69  o continue but i
df10: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
df20: 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  ecompiled statem
df30: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  ents..  */.  p =
df40: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
df50: 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69  tion(db, zFuncti
df60: 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e  onName, nName, n
df70: 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29  Arg, (u8)enc, 0)
df80: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 28 70 2d  ;.  if( p && (p-
df90: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
dfa0: 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b  ITE_FUNC_ENCMASK
dfb0: 29 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72  )==enc && p->nAr
dfc0: 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69  g==nArg ){.    i
dfd0: 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  f( db->nVdbeActi
dfe0: 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ve ){.      sqli
dff0: 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
e000: 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
e010: 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c   .        "unabl
e020: 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69  e to delete/modi
e030: 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e  fy user-function
e040: 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73   due to active s
e050: 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
e060: 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
e070: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
e080: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e090: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65  ITE_BUSY;.    }e
e0a0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
e0b0: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
e0c0: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
e0d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d      }.  }..  p =
e0e0: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
e0f0: 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69  tion(db, zFuncti
e100: 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e  onName, nName, n
e110: 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29  Arg, (u8)enc, 1)
e120: 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20  ;.  assert(p || 
e130: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e140: 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
e150: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e160: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
e170: 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72 20 76 65  * If an older ve
e180: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e  rsion of the fun
e190: 63 74 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e  ction with a con
e1a0: 66 69 67 75 72 65 64 20 64 65 73 74 72 75 63 74  figured destruct
e1b0: 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67  or is.  ** being
e1c0: 20 72 65 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65   replaced invoke
e1d0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
e1e0: 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a  function here. *
e1f0: 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74  /.  functionDest
e200: 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69  roy(db, p);..  i
e210: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29  f( pDestructor )
e220: 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f  {.    pDestructo
e230: 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  r->nRef++;.  }. 
e240: 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72 20   p->pDestructor 
e250: 3d 20 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20  = pDestructor;. 
e260: 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20   p->funcFlags = 
e270: 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  (p->funcFlags & 
e280: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d  SQLITE_FUNC_ENCM
e290: 41 53 4b 29 20 7c 20 65 78 74 72 61 46 6c 61 67  ASK) | extraFlag
e2a0: 73 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  s;.  testcase( p
e2b0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
e2c0: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
e2d0: 49 43 20 29 3b 0a 20 20 70 2d 3e 78 46 75 6e 63  IC );.  p->xFunc
e2e0: 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78   = xFunc;.  p->x
e2f0: 53 74 65 70 20 3d 20 78 53 74 65 70 3b 0a 20 20  Step = xStep;.  
e300: 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78  p->xFinalize = x
e310: 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65  Final;.  p->pUse
e320: 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61 74  rData = pUserDat
e330: 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28  a;.  p->nArg = (
e340: 75 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75  u16)nArg;.  retu
e350: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e360: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65  ./*.** Create ne
e370: 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73  w user functions
e380: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e390: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
e3a0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
e3b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e3c0: 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Func,.  int nArg
e3d0: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
e3e0: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
e3f0: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
e400: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
e410: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
e420: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
e430: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
e440: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
e450: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
e460: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
e470: 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20  _context*).){.  
e480: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63  return sqlite3_c
e490: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
e4a0: 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72  2(db, zFunc, nAr
e4b0: 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63  g, enc, p, xFunc
e4c0: 2c 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20 20  , xStep,.       
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 78 46 69               xFi
e4f0: 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20  nal, 0);.}..int 
e500: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
e510: 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71  unction_v2(.  sq
e520: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
e530: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a  st char *zFunc,.
e540: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
e550: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
e560: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63  ,.  void (*xFunc
e570: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e580: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e590: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
e5a0: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
e5b0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e5c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
e5d0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
e5e0: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
e5f0: 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  xt*),.  void (*x
e600: 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29  Destroy)(void *)
e610: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
e620: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46  QLITE_ERROR;.  F
e630: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
e640: 41 72 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  Arg = 0;..#ifdef
e650: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
e660: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
e670: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
e680: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
e690: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
e6a0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
e6b0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
e6c0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
e6d0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44  mutex);.  if( xD
e6e0: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41  estroy ){.    pA
e6f0: 72 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75  rg = (FuncDestru
e700: 63 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62  ctor *)sqlite3Db
e710: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
e720: 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75  izeof(FuncDestru
e730: 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ctor));.    if( 
e740: 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78  !pArg ){.      x
e750: 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20  Destroy(p);.    
e760: 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20    goto out;.    
e770: 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73  }.    pArg->xDes
e780: 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b  troy = xDestroy;
e790: 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72  .    pArg->pUser
e7a0: 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Data = p;.  }.  
e7b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
e7c0: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
e7d0: 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20  , nArg, enc, p, 
e7e0: 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  xFunc, xStep, xF
e7f0: 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69  inal, pArg);.  i
e800: 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
e810: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
e820: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
e830: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65  TE_OK );.    xDe
e840: 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71  stroy(p);.    sq
e850: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e860: 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74  pArg);.  }.. out
e870: 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  :.  rc = sqlite3
e880: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
e890: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
e8a0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
e8b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
e8c0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
e8d0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74  E_OMIT_UTF16.int
e8e0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
e8f0: 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71  function16(.  sq
e900: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
e910: 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69  st void *zFuncti
e920: 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41  onName,.  int nA
e930: 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52  rg,.  int eTextR
e940: 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20  ep,.  void *p,. 
e950: 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73   void (*xFunc)(s
e960: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
e970: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
e980: 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  e**),.  void (*x
e990: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
e9a0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
e9b0: 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76  e3_value**),.  v
e9c0: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
e9d0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a  lite3_context*).
e9e0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
e9f0: 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69  har *zFunc8;..#i
ea00: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ea10: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
ea20: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
ea30: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20  yCheckOk(db) || 
ea40: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30  zFunctionName==0
ea50: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ea60: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
ea70: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
ea80: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
ea90: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
eaa0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
eab0: 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d  ed );.  zFunc8 =
eac0: 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38   sqlite3Utf16to8
ead0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
eae0: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
eaf0: 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72  TF16NATIVE);.  r
eb00: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
eb10: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38  eFunc(db, zFunc8
eb20: 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70  , nArg, eTextRep
eb30: 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  , p, xFunc, xSte
eb40: 70 2c 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20  p, xFinal,0);.  
eb50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
eb60: 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20  , zFunc8);.  rc 
eb70: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
eb80: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
eb90: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
eba0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
ebb0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
ebc0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  f.../*.** Declar
ebd0: 65 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f  e that a functio
ebe0: 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c  n has been overl
ebf0: 6f 61 64 65 64 20 62 79 20 61 20 76 69 72 74 75  oaded by a virtu
ec00: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
ec10: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
ec20: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
ec30: 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62  s a regular glob
ec40: 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  al function, the
ec50: 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
ec60: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
ec70: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
ec80: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
ec90: 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20  hen create.** a 
eca0: 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77  new one that alw
ecb0: 61 79 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e  ays throws a run
ecc0: 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a  -time error.  .*
ecd0: 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61  *.** When virtua
ece0: 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20  l tables intend 
ecf0: 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76  to provide an ov
ed00: 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f  erloaded functio
ed10: 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c  n, they.** shoul
ed20: 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  d call this rout
ed30: 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ine to make sure
ed40: 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63   the global func
ed50: 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20  tion exists..** 
ed60: 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f  A global functio
ed70: 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20  n must exist in 
ed80: 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72  order for name r
ed90: 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72  esolution to wor
eda0: 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a  k.** properly..*
edb0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76  /.int sqlite3_ov
edc0: 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28  erload_function(
edd0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
ede0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
edf0: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a  ame,.  int nArg.
ee00: 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d  ){.  int nName =
ee10: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
ee20: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72  (zName);.  int r
ee30: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
ee40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
ee50: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
ee60: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
ee70: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c  etyCheckOk(db) |
ee80: 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 6e 41  | zName==0 || nA
ee90: 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20 72 65 74  rg<-2 ){.    ret
eea0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
eeb0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
eec0: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
eed0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
eee0: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
eef0: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
ef00: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  b, zName, nName,
ef10: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
ef20: 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20  F8, 0)==0 ){.   
ef30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
ef40: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e 61 6d  ateFunc(db, zNam
ef50: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
ef60: 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 20  UTF8,.          
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef80: 20 30 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c   0, sqlite3Inval
ef90: 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  idFunction, 0, 0
efa0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  , 0);.  }.  rc =
efb0: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
efc0: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
efd0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
efe0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
eff0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
f000: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
f010: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  RACE./*.** Regis
f020: 74 65 72 20 61 20 74 72 61 63 65 20 66 75 6e 63  ter a trace func
f030: 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20  tion.  The pArg 
f040: 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
f050: 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 74  sly registered t
f060: 72 61 63 65 0a 2a 2a 20 69 73 20 72 65 74 75 72  race.** is retur
f070: 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e  ned.  .**.** A N
f080: 55 4c 4c 20 74 72 61 63 65 20 66 75 6e 63 74 69  ULL trace functi
f090: 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  on means that no
f0a0: 20 74 72 61 63 69 6e 67 20 69 73 20 65 78 65 63   tracing is exec
f0b0: 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c  utes.  A non-NUL
f0c0: 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73 20 61 20  L.** trace is a 
f0d0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
f0e0: 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e  ction that is in
f0f0: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 73 74 61  voked at the sta
f100: 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53 51  rt of each.** SQ
f110: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  L statement..*/.
f120: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 74 72  void *sqlite3_tr
f130: 61 63 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ace(sqlite3 *db,
f140: 20 76 6f 69 64 20 28 2a 78 54 72 61 63 65 29 28   void (*xTrace)(
f150: 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
f160: 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  *), void *pArg){
f170: 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a  .  void *pOld;..
f180: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f190: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
f1a0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
f1b0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
f1c0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
f1d0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
f1e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f1f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
f200: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
f210: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
f220: 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72  d = db->pTraceAr
f230: 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20  g;.  db->xTrace 
f240: 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e  = xTrace;.  db->
f250: 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67  pTraceArg = pArg
f260: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
f270: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
f280: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
f290: 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  d;.}./*.** Regis
f2a0: 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75  ter a profile fu
f2b0: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72  nction.  The pAr
f2c0: 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  g from the previ
f2d0: 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
f2e0: 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e   .** profile fun
f2f0: 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65  ction is returne
f300: 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  d.  .**.** A NUL
f310: 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  L profile functi
f320: 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  on means that no
f330: 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78   profiling is ex
f340: 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e  ecutes.  A non-N
f350: 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69  ULL.** profile i
f360: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
f370: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
f380: 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
f390: 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a   conclusion of.*
f3a0: 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  * each SQL state
f3b0: 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e  ment that is run
f3c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
f3d0: 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71  e3_profile(.  sq
f3e0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
f3f0: 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f  d (*xProfile)(vo
f400: 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  id*,const char*,
f410: 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a  sqlite_uint64),.
f420: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
f430: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23    void *pOld;..#
f440: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f450: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
f460: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
f470: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
f480: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
f490: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
f4a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f4b0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
f4c0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
f4d0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
f4e0: 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41   = db->pProfileA
f4f0: 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69  rg;.  db->xProfi
f500: 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20  le = xProfile;. 
f510: 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67   db->pProfileArg
f520: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
f530: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
f540: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
f550: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64  urn pOld;.}.#end
f560: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
f570: 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  T_TRACE */../*.*
f580: 2a 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e  * Register a fun
f590: 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f  ction to be invo
f5a0: 6b 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  ked when a trans
f5b0: 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a  action commits..
f5c0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65  ** If the invoke
f5d0: 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  d function retur
f5e0: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
f5f0: 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63  n the commit bec
f600: 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61  omes a.** rollba
f610: 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ck..*/.void *sql
f620: 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
f630: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f650: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
f660: 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
f670: 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61  e */.  int (*xCa
f680: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20  llback)(void*), 
f690: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
f6a0: 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63  invoke on each c
f6b0: 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20  ommit */.  void 
f6c0: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
f6d0: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
f6e0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
f6f0: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
f700: 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  Old;..#ifdef SQL
f710: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
f720: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
f730: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
f740: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
f750: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
f760: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
f770: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
f780: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
f790: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
f7a0: 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43  .  pOld = db->pC
f7b0: 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e  ommitArg;.  db->
f7c0: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
f7d0: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
f7e0: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20  b->pCommitArg = 
f7f0: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
f800: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
f810: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
f820: 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pOld;.}../*.** 
f830: 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
f840: 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
f850: 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f  d each time a ro
f860: 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  w is updated,.**
f870: 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c   inserted or del
f880: 65 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20  eted using this 
f890: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
f8a0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
f8b0: 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f  lite3_update_hoo
f8c0: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
f8d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
f8e0: 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
f8f0: 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
f900: 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  se */.  void (*x
f910: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c  Callback)(void*,
f920: 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a  int,char const *
f930: 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71  ,char const *,sq
f940: 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76  lite_int64),.  v
f950: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
f960: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
f970: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
f980: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
f990: 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66  d *pRet;..#ifdef
f9a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
f9b0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
f9c0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
f9d0: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
f9e0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
f9f0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
fa00: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
fa10: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
fa20: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
fa30: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
fa40: 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20  ->pUpdateArg;.  
fa50: 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
fa60: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
fa70: 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72  .  db->pUpdateAr
fa80: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
fa90: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
faa0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
fab0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
fac0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
fad0: 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
fae0: 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
faf0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
fb00: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
fb10: 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
fb20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
fb30: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f  void *sqlite3_ro
fb40: 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73  llback_hook(.  s
fb50: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
fb60: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
fb70: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
fb80: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
fb90: 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61    void (*xCallba
fba0: 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43  ck)(void*), /* C
fbb0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
fbc0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbe0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
fbf0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
fc00: 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
fc10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
fc20: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
fc30: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
fc40: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
fc50: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
fc60: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
fc70: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
fc80: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
fc90: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
fca0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
fcb0: 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61  et = db->pRollba
fcc0: 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f  ckArg;.  db->xRo
fcd0: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d  llbackCallback =
fce0: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
fcf0: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d  ->pRollbackArg =
fd00: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
fd10: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
fd20: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
fd30: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64  n pRet;.}..#ifnd
fd40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
fd50: 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  AL./*.** The sql
fd60: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
fd70: 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65  callback registe
fd80: 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77  red by sqlite3_w
fd90: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
fda0: 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73  t()..** Invoke s
fdb0: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
fdc0: 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75 6d  point if the num
fdd0: 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e  ber of frames in
fde0: 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a   the log file.**
fdf0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
fe00: 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72 67   sqlite3.pWalArg
fe10: 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65   cast to an inte
fe20: 67 65 72 20 28 74 68 65 20 76 61 6c 75 65 20 63  ger (the value c
fe30: 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a 20  onfigured by.** 
fe40: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
fe50: 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73  nt())..*/ .int s
fe60: 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74  qlite3WalDefault
fe70: 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43  Hook(.  void *pC
fe80: 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f  lientData,     /
fe90: 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20  * Argument */.  
fea0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
feb0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
fec0: 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tion */.  const 
fed0: 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20  char *zDb,      
fee0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f 0a   /* Database */.
fef0: 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20 20    int nFrame    
ff00: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
ff10: 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20   of WAL */.){.  
ff20: 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49  if( nFrame>=SQLI
ff30: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43  TE_PTR_TO_INT(pC
ff40: 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20 20  lientData) ){.  
ff50: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
ff60: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
ff70: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68    sqlite3_wal_ch
ff80: 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62  eckpoint(db, zDb
ff90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
ffa0: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
ffb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
ffc0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
ffd0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
ffe0: 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  _WAL */../*.** C
fff0: 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c 69  onfigure an sqli
10000 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63  te3_wal_hook() c
10010 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d  allback to autom
10020 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f  atically checkpo
10030 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  int.** a databas
10040 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74 69  e after committi
10050 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
10060 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 46   if there are nF
10070 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20  rame or.** more 
10080 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f  frames in the lo
10090 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67 20  g file. Passing 
100a0 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74 69  zero or a negati
100b0 76 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a  ve value as the.
100c0 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d 65  ** nFrame parame
100d0 74 65 72 20 64 69 73 61 62 6c 65 73 20 61 75 74  ter disables aut
100e0 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e  omatic checkpoin
100f0 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a  ts entirely..**.
10100 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20  ** The callback 
10110 72 65 67 69 73 74 65 72 65 64 20 62 79 20 74 68  registered by th
10120 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c  is function repl
10130 61 63 65 73 20 61 6e 79 20 65 78 69 73 74 69 6e  aces any existin
10140 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65  g callback.** re
10150 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 20 73  gistered using s
10160 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
10170 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65 67  ). Likewise, reg
10180 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c 62  istering a callb
10190 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c  ack.** using sql
101a0 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
101b0 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 75 74  disables the aut
101c0 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e  omatic checkpoin
101d0 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63  t mechanism.** c
101e0 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68 69  onfigured by thi
101f0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  s function..*/.i
10200 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  nt sqlite3_wal_a
10210 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71  utocheckpoint(sq
10220 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
10230 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53  Frame){.#ifdef S
10240 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
10250 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
10260 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(db);.  UNUSED_
10270 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d 65  PARAMETER(nFrame
10280 29 3b 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20  );.#else.#ifdef 
10290 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
102a0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
102b0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
102c0 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
102d0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
102e0 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  KPT;.#endif.  if
102f0 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20  ( nFrame>0 ){.  
10300 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f    sqlite3_wal_ho
10310 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61  ok(db, sqlite3Wa
10320 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51  lDefaultHook, SQ
10330 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
10340 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73  nFrame));.  }els
10350 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  e{.    sqlite3_w
10360 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30  al_hook(db, 0, 0
10370 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
10380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10390 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
103a0 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
103b0 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
103c0 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63  h time a transac
103d0 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a  tion is written.
103e0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74  ** into the writ
103f0 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74  e-ahead-log by t
10400 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
10410 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
10420 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f   *sqlite3_wal_ho
10430 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
10440 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
10450 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
10460 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
10470 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20   db handle */.  
10480 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  int(*xCallback)(
10490 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a  void *, sqlite3*
104a0 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  , const char*, i
104b0 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  nt),.  void *pAr
104c0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
104d0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
104e0 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
104f0 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a  to xCallback() *
10500 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
10510 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76  ITE_OMIT_WAL.  v
10520 6f 69 64 20 2a 70 52 65 74 3b 0a 23 69 66 64 65  oid *pRet;.#ifde
10530 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10540 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
10550 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
10560 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
10570 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
10580 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
10590 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
105a0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
105b0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
105c0 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
105d0 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62  b->pWalArg;.  db
105e0 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d  ->xWalCallback =
105f0 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
10600 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67  ->pWalArg = pArg
10610 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
10620 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
10630 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  x);.  return pRe
10640 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  t;.#else.  retur
10650 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 0;.#endif.}../
10660 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
10670 64 61 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f  database zDb..*/
10680 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
10690 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a  _checkpoint_v2(.
106a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
106b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106c0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
106d0 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndle */.  const 
106e0 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20  char *zDb,      
106f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
10700 65 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61  e of attached da
10710 74 61 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29  tabase (or NULL)
10720 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c   */.  int eMode,
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
10750 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c  CHECKPOINT_* val
10760 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c  ue */.  int *pnL
10770 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  og,             
10780 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
10790 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20  Size of WAL log 
107a0 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69  in frames */.  i
107b0 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20  nt *pnCkpt      
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
107d0 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d  * OUT: Total num
107e0 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 63 68  ber of frames ch
107f0 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b  eckpointed */.){
10800 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
10810 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e  MIT_WAL.  return
10820 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73   SQLITE_OK;.#els
10830 65 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  e.  int rc;     
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10850 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
10860 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  de */.  int iDb 
10870 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  = SQLITE_MAX_ATT
10880 41 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74  ACHED;  /* sqlit
10890 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f  e3.aDb[] index o
108a0 66 20 64 62 20 74 6f 20 63 68 65 63 6b 70 6f 69  f db to checkpoi
108b0 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  nt */..#ifdef SQ
108c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
108d0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
108e0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
108f0 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
10900 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
10910 54 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  T;.#endif..  /* 
10920 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
10930 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
10940 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61 6e  to -1 in case an
10950 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
10960 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29 20  /.  if( pnLog ) 
10970 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69  *pnLog = -1;.  i
10980 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43  f( pnCkpt ) *pnC
10990 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73  kpt = -1;..  ass
109a0 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
109b0 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d  KPOINT_PASSIVE==
109c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  0 );.  assert( S
109d0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
109e0 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73  _FULL==1 );.  as
109f0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
10a00 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d  CKPOINT_RESTART=
10a10 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
10a20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
10a30 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b  T_TRUNCATE==3 );
10a40 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c  .  if( eMode<SQL
10a50 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
10a60 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e  ASSIVE || eMode>
10a70 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
10a80 54 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20  T_TRUNCATE ){.  
10a90 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
10aa0 3a 20 52 2d 30 33 39 39 36 2d 31 32 30 38 38 20  : R-03996-12088 
10ab0 54 68 65 20 4d 20 70 61 72 61 6d 65 74 65 72 20  The M parameter 
10ac0 6d 75 73 74 20 62 65 20 61 20 76 61 6c 69 64 20  must be a valid 
10ad0 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20 20 20 2a  checkpoint.    *
10ae0 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20 20 72  * mode: */.    r
10af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
10b00 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  USE;.  }..  sqli
10b10 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
10b20 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
10b30 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20  ( zDb && zDb[0] 
10b40 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  ){.    iDb = sql
10b50 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
10b60 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69  b, zDb);.  }.  i
10b70 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( iDb<0 ){.    
10b80 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
10b90 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  R;.    sqlite3Er
10ba0 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53  rorWithMsg(db, S
10bb0 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e  QLITE_ERROR, "un
10bc0 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20  known database: 
10bd0 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c  %s", zDb);.  }el
10be0 73 65 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79  se{.    db->busy
10bf0 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
10c00 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
10c10 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62  te3Checkpoint(db
10c20 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e  , iDb, eMode, pn
10c30 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20  Log, pnCkpt);.  
10c40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
10c50 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63  b, rc);.  }.  rc
10c60 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
10c70 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
10c80 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10c90 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
10ca0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
10cb0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .}.../*.** Check
10cc0 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a  point database z
10cd0 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55  Db. If zDb is NU
10ce0 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75  LL, or if the bu
10cf0 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a  ffer zDb points.
10d00 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61  ** to contains a
10d10 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72   zero-length str
10d20 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65  ing, all attache
10d30 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  d databases are 
10d40 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  .** checkpointed
10d50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10d60 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
10d70 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
10d80 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
10d90 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
10da0 20 52 2d 34 31 36 31 33 2d 32 30 35 35 33 20 54   R-41613-20553 T
10db0 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  he sqlite3_wal_c
10dc0 68 65 63 6b 70 6f 69 6e 74 28 44 2c 58 29 20 69  heckpoint(D,X) i
10dd0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
10de0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 77 61 6c    ** sqlite3_wal
10df0 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 44  _checkpoint_v2(D
10e00 2c 58 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  ,X,SQLITE_CHECKP
10e10 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30  OINT_PASSIVE,0,0
10e20 29 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  ). */.  return s
10e30 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
10e40 70 6f 69 6e 74 5f 76 32 28 64 62 2c 7a 44 62 2c  point_v2(db,zDb,
10e50 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
10e60 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29 3b 0a  T_PASSIVE,0,0);.
10e70 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
10e80 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
10e90 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e   Run a checkpoin
10ea0 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44  t on database iD
10eb0 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  b. This is a no-
10ec0 6f 70 20 69 66 20 64 61 74 61 62 61 73 65 20 69  op if database i
10ed0 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72  Db is.** not cur
10ee0 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57  rently open in W
10ef0 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  AL mode..**.** I
10f00 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
10f10 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  is open on the d
10f20 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 63 68  atabase being ch
10f30 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73  eckpointed, this
10f40 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65   .** function re
10f50 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43  turns SQLITE_LOC
10f60 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70  KED and a checkp
10f70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65  oint is not atte
10f80 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e  mpted. If .** an
10f90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
10fa0 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  ile running the 
10fb0 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53  checkpoint, an S
10fc0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
10fd0 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
10fe0 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f   (i.e. SQLITE_IO
10ff0 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c  ERR). Otherwise,
11000 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
11010 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64  * The mutex on d
11020 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
11030 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  b should be held
11040 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
11050 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73  The mutex.** ass
11060 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
11070 20 73 70 65 63 69 66 69 63 20 62 2d 74 72 65 65   specific b-tree
11080 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e   being checkpoin
11090 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a  ted is taken by.
110a0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
110b0 20 77 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b   while the check
110c0 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67  point is running
110d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69  ..**.** If iDb i
110e0 73 20 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f  s passed SQLITE_
110f0 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68  MAX_ATTACHED, th
11100 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  en all attached 
11110 64 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a  databases are.**
11120 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49   checkpointed. I
11130 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
11140 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20  countered it is 
11150 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61  returned immedia
11160 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74  tely -.** no att
11170 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
11180 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72  checkpoint any r
11190 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73  emaining databas
111a0 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  es..**.** Parame
111b0 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65  ter eMode is one
111c0 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   of SQLITE_CHECK
111d0 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46  POINT_PASSIVE, F
111e0 55 4c 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a  ULL or RESTART..
111f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
11200 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33  eckpoint(sqlite3
11210 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69   *db, int iDb, i
11220 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70  nt eMode, int *p
11230 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70  nLog, int *pnCkp
11240 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
11250 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
11260 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
11270 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  code */.  int i;
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
112a0 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
112b0 6f 75 67 68 20 61 74 74 61 63 68 65 64 20 64 62  ough attached db
112c0 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79  s */.  int bBusy
112d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
112e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
112f0 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61  f SQLITE_BUSY ha
11300 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  s been encounter
11310 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
11320 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11330 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
11340 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c  ;.  assert( !pnL
11350 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31  og || *pnLog==-1
11360 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
11370 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74  nCkpt || *pnCkpt
11380 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69  ==-1 );..  for(i
11390 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26  =0; i<db->nDb &&
113a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
113b0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d  i++){.    if( i=
113c0 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c  =iDb || iDb==SQL
113d0 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
113e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
113f0 71 6c 69 74 65 33 42 74 72 65 65 43 68 65 63 6b  qlite3BtreeCheck
11400 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d  point(db->aDb[i]
11410 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c  .pBt, eMode, pnL
11420 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20  og, pnCkpt);.   
11430 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20     pnLog = 0;.  
11440 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a      pnCkpt = 0;.
11450 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
11460 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
11470 20 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a       bBusy = 1;.
11480 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
11490 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
114a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
114b0 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
114c0 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20 53  OK && bBusy) ? S
114d0 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b  QLITE_BUSY : rc;
114e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
114f0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
11500 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11510 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75  tion returns tru
11520 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79  e if main-memory
11530 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
11540 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20  instead of.** a 
11550 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66  temporary file f
11560 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67  or transient pag
11570 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61  er files and sta
11580 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
11590 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
115a0 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f  turned depends o
115b0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64  n the value of d
115c0 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72  b->temp_store (r
115d0 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65  untime.** parame
115e0 74 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d  ter) and the com
115f0 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20  pile time value 
11600 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  of SQLITE_TEMP_S
11610 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c  TORE. The.** fol
11620 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
11630 63 72 69 62 65 73 20 74 68 65 20 72 65 6c 61 74  cribes the relat
11640 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20  ionship between 
11650 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73  these two values
11660 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e  .** and this fun
11670 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61  ctions return va
11680 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  lue..**.**   SQL
11690 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20  ITE_TEMP_STORE  
116a0 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72     db->temp_stor
116b0 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f  e     Location o
116c0 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  f temporary data
116d0 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  base.**   ------
116e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
116f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
11700 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
11710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11720 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
11730 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79               any
11740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11750 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
11760 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 0).**   1     
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
11790 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
117a0 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20  turn 0).**   1  
117b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117c0 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
117d0 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
117e0 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
117f0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
11800 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
11810 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
11820 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
11830 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
11840 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
11850 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
11860 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
11870 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
11880 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
118a0 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
118b0 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   1).**   2      
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118e0 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
118f0 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20  urn 1).**   3   
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20    any           
11920 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
11930 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74  return 1).*/.int
11940 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
11950 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74  mory(const sqlit
11960 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c  e3 *db){.#if SQL
11970 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
11980 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d  1.  return ( db-
11990 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29  >temp_store==2 )
119a0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
119b0 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
119c0 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d  2.  return ( db-
119d0 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29  >temp_store!=1 )
119e0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
119f0 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
11a00 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  3.  UNUSED_PARAM
11a10 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75  ETER(db);.  retu
11a20 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66  rn 1;.#endif.#if
11a30 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
11a40 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54  RE<1 || SQLITE_T
11a50 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 55 4e  EMP_STORE>3.  UN
11a60 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
11a70 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  b);.  return 0;.
11a80 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
11a90 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63  Return UTF-8 enc
11aa0 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e  oded English lan
11ab0 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f  guage explanatio
11ac0 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
11ad0 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  cent.** error..*
11ae0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
11af0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c  lite3_errmsg(sql
11b00 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e  ite3 *db){.  con
11b10 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  st char *z;.  if
11b20 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
11b30 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
11b40 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  r(SQLITE_NOMEM);
11b50 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
11b60 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
11b70 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
11b80 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
11b90 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49  ErrStr(SQLITE_MI
11ba0 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a  SUSE_BKPT);.  }.
11bb0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
11bc0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
11bd0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
11be0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
11bf0 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74  z = sqlite3ErrSt
11c00 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  r(SQLITE_NOMEM);
11c10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65  .  }else{.    te
11c20 73 74 63 61 73 65 28 20 64 62 2d 3e 70 45 72 72  stcase( db->pErr
11c30 3d 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d 20 28  ==0 );.    z = (
11c40 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
11c50 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72  lue_text(db->pEr
11c60 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
11c70 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
11c80 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  d );.    if( z==
11c90 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  0 ){.      z = s
11ca0 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d  qlite3ErrStr(db-
11cb0 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d  >errCode);.    }
11cc0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
11cd0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
11ce0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
11cf0 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  z;.}..#ifndef SQ
11d00 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
11d10 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46  /*.** Return UTF
11d20 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  -16 encoded Engl
11d30 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
11d40 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
11d50 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
11d60 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  rror..*/.const v
11d70 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  oid *sqlite3_err
11d80 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64  msg16(sqlite3 *d
11d90 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  b){.  static con
11da0 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b  st u16 outOfMem[
11db0 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27  ] = {.    'o', '
11dc0 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f  u', 't', ' ', 'o
11dd0 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27  ', 'f', ' ', 'm'
11de0 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c  , 'e', 'm', 'o',
11df0 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d   'r', 'y', 0.  }
11e00 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
11e10 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20   u16 misuse[] = 
11e20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27 2c 20  {.    'l', 'i', 
11e30 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27  'b', 'r', 'a', '
11e40 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a 20  r', 'y', ' ', . 
11e50 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27 75 27     'r', 'o', 'u'
11e60 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c  , 't', 'i', 'n',
11e70 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   'e', ' ', .    
11e80 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27  'c', 'a', 'l', '
11e90 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20 27 20  l', 'e', 'd', ' 
11ea0 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 75 27  ', .    'o', 'u'
11eb0 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 't', ' ', .   
11ec0 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20   'o', 'f', ' ', 
11ed0 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c 20 27  .    's', 'e', '
11ee0 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20 27 6e  q', 'u', 'e', 'n
11ef0 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30 0a 20  ', 'c', 'e', 0. 
11f00 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69   };..  const voi
11f10 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20  d *z;.  if( !db 
11f20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76  ){.    return (v
11f30 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a  oid *)outOfMem;.
11f40 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
11f50 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
11f60 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
11f70 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29   return (void *)
11f80 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71  misuse;.  }.  sq
11f90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
11fa0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
11fb0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
11fc0 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20  iled ){.    z = 
11fd0 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d  (void *)outOfMem
11fe0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
11ff0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
12000 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72  _text16(db->pErr
12010 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
12020 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12030 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
12040 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71   db->errCode, sq
12050 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e  lite3ErrStr(db->
12060 65 72 72 43 6f 64 65 29 29 3b 0a 20 20 20 20 20  errCode));.     
12070 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
12080 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
12090 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rr);.    }.    /
120a0 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79  * A malloc() may
120b0 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 69 74   have failed wit
120c0 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hin the call to 
120d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
120e0 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62  xt16().    ** ab
120f0 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ove. If this is 
12100 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
12110 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
12120 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74  led flag needs t
12130 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61  o.    ** be clea
12140 72 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  red before retur
12150 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69  ning. Do this di
12160 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20  rectly, instead 
12170 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71  of via.    ** sq
12180 6c 69 74 65 33 41 70 69 45 78 69 74 28 29 2c 20  lite3ApiExit(), 
12190 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67  to avoid setting
121a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
121b0 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61  ndle error messa
121c0 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ge..    */.    d
121d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
121e0 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
121f0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
12200 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
12210 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
12220 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
12230 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
12240 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72  eturn the most r
12250 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ecent error code
12260 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e   generated by an
12270 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e   SQLite routine.
12280 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70   If NULL is.** p
12290 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
122a0 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d  nction, we assum
122b0 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  e a malloc() fai
122c0 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74  led during sqlit
122d0 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e  e3_open()..*/.in
122e0 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  t sqlite3_errcod
122f0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
12300 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c    if( db && !sql
12310 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
12320 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
12330 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12340 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
12350 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64  }.  if( !db || d
12360 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12370 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12380 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
12390 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72    return db->err
123a0 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61  Code & db->errMa
123b0 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  sk;.}.int sqlite
123c0 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
123d0 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  de(sqlite3 *db){
123e0 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71  .  if( db && !sq
123f0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
12400 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
12410 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12420 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
12430 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20   }.  if( !db || 
12440 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12450 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
12460 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
12470 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72  .  return db->er
12480 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rCode;.}../*.** 
12490 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  Return a string 
124a0 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
124b0 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  he kind of error
124c0 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
124d0 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20  e.** argument.  
124e0 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20 73 69  For now, this si
124f0 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68 65 20 69  mply calls the i
12500 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74 65 33 45  nternal sqlite3E
12510 72 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74  rrStr().** funct
12520 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ion..*/.const ch
12530 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 73  ar *sqlite3_errs
12540 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 72 65  tr(int rc){.  re
12550 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53  turn sqlite3ErrS
12560 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tr(rc);.}../*.**
12570 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f   Create a new co
12580 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
12590 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 22 64   for database "d
125a0 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73  b".  The name is
125b0 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68   zName.** and th
125c0 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e  e encoding is en
125d0 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
125e0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
125f0 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
12600 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
12610 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c  Name, .  u8 enc,
12620 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
12630 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
12640 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
12650 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
12660 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a  void*),.  void(*
12670 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a  xDel)(void*).){.
12680 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
12690 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20  ;.  int enc2;.  
126a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
126b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
126c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
126d0 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31  * If SQLITE_UTF1
126e0 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  6 is specified a
126f0 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74  s the encoding t
12700 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74  ype, transform t
12710 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20  his.  ** to one 
12720 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  of SQLITE_UTF16L
12730 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31  E or SQLITE_UTF1
12740 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20  6BE using the.  
12750 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  ** SQLITE_UTF16N
12760 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c  ATIVE macro. SQL
12770 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74  ITE_UTF16 is not
12780 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
12790 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20  ..  */.  enc2 = 
127a0 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28  enc;.  testcase(
127b0 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
127c0 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  F16 );.  testcas
127d0 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  e( enc2==SQLITE_
127e0 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b  UTF16_ALIGNED );
127f0 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c  .  if( enc2==SQL
12800 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63  ITE_UTF16 || enc
12810 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  2==SQLITE_UTF16_
12820 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20 20 65  ALIGNED ){.    e
12830 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  nc2 = SQLITE_UTF
12840 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20  16NATIVE;.  }.  
12850 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f  if( enc2<SQLITE_
12860 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c  UTF8 || enc2>SQL
12870 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20  ITE_UTF16BE ){. 
12880 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12890 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
128a0 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
128b0 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65   this call is re
128c0 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63  moving or replac
128d0 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ing an existing 
128e0 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20  collation .  ** 
128f0 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c  sequence. If so,
12900 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
12910 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72  ctive VMs, retur
12920 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65 72 65  n busy. If there
12930 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  .  ** are no act
12940 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64  ive VMs, invalid
12950 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70  ate any pre-comp
12960 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
12970 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20  .  */.  pColl = 
12980 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
12990 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c  eq(db, (u8)enc2,
129a0 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66   zName, 0);.  if
129b0 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c  ( pColl && pColl
129c0 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66  ->xCmp ){.    if
129d0 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ( db->nVdbeActiv
129e0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
129f0 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
12a00 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
12a10 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65  .        "unable
12a20 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66   to delete/modif
12a30 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
12a40 65 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74 69  ence due to acti
12a50 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b  ve statements");
12a60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
12a70 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
12a80 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
12a90 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
12aa0 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f  ents(db);..    /
12ab0 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  * If collation s
12ac0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61  equence pColl wa
12ad0 73 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74  s created direct
12ae0 6c 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a  ly by a call to.
12af0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
12b00 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c  reate_collation,
12b10 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74   and not generat
12b20 65 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53  ed by synthCollS
12b30 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65  eq(),.    ** the
12b40 6e 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64  n any copies mad
12b50 65 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  e by synthCollSe
12b60 71 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69  q() need to be i
12b70 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20  nvalidated..    
12b80 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69  ** Also, collati
12b90 6f 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20  on destructor - 
12ba0 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d  CollSeq.xDel() -
12bb0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65   function may ne
12bc0 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
12bd0 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a  called..    */ .
12be0 20 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e      if( (pColl->
12bf0 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54  enc & ~SQLITE_UT
12c00 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e  F16_ALIGNED)==en
12c10 63 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  c2 ){.      Coll
12c20 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *aColl = sql
12c30 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
12c40 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d  ->aCollSeq, zNam
12c50 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  e);.      int j;
12c60 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
12c70 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<3; j++){.     
12c80 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20     CollSeq *p = 
12c90 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  &aColl[j];.     
12ca0 20 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70     if( p->enc==p
12cb0 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20  Coll->enc ){.   
12cc0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44         if( p->xD
12cd0 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  el ){.          
12ce0 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73    p->xDel(p->pUs
12cf0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  er);.          }
12d00 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43  .          p->xC
12d10 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mp = 0;.        
12d20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
12d30 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73    }..  pColl = s
12d40 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
12d50 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20  q(db, (u8)enc2, 
12d60 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28  zName, 1);.  if(
12d70 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75   pColl==0 ) retu
12d80 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
12d90 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d  .  pColl->xCmp =
12da0 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f   xCompare;.  pCo
12db0 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78  ll->pUser = pCtx
12dc0 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20  ;.  pColl->xDel 
12dd0 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d  = xDel;.  pColl-
12de0 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32  >enc = (u8)(enc2
12df0 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45   | (enc & SQLITE
12e00 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29  _UTF16_ALIGNED))
12e10 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
12e20 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
12e30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12e40 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
12e50 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65  his array define
12e60 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75  s hard upper bou
12e70 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c  nds on limit val
12e80 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69  ues.  The.** ini
12e90 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65  tializer must be
12ea0 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69   kept in sync wi
12eb0 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  th the SQLITE_LI
12ec0 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65  MIT_*.** #define
12ed0 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a  s in sqlite3.h..
12ee0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
12ef0 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d  int aHardLimit[]
12f00 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41   = {.  SQLITE_MA
12f10 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  X_LENGTH,.  SQLI
12f20 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
12f30 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
12f40 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45  COLUMN,.  SQLITE
12f50 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c  _MAX_EXPR_DEPTH,
12f60 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
12f70 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20  MPOUND_SELECT,. 
12f80 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
12f90 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  _OP,.  SQLITE_MA
12fa0 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a  X_FUNCTION_ARG,.
12fb0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54    SQLITE_MAX_ATT
12fc0 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f  ACHED,.  SQLITE_
12fd0 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
12fe0 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
12ff0 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
13000 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20 49  UMBER,      /* I
13010 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33 35  MP: R-38091-3235
13020 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d 41  2 */.  SQLITE_MA
13030 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c  X_TRIGGER_DEPTH,
13040 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  .  SQLITE_MAX_WO
13050 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d 3b  RKER_THREADS,.};
13060 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
13070 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74  e the hard limit
13080 73 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61  s are set to rea
13090 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a  sonable values.*
130a0 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
130b0 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
130c0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
130d0 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
130e0 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69   least 100.#endi
130f0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
13100 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a  _SQL_LENGTH<100.
13110 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
13120 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75  AX_SQL_LENGTH mu
13130 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
13140 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
13150 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
13160 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  GTH>SQLITE_MAX_L
13170 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51  ENGTH.# error SQ
13180 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
13190 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  GTH must not be 
131a0 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c  greater than SQL
131b0 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23  ITE_MAX_LENGTH.#
131c0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
131d0 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
131e0 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53  LECT<2.# error S
131f0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
13200 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62  ND_SELECT must b
13210 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e  e at least 2.#en
13220 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
13230 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20  AX_VDBE_OP<40.# 
13240 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
13250 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65  _VDBE_OP must be
13260 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e   at least 40.#en
13270 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
13280 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c  AX_FUNCTION_ARG<
13290 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
132a0 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30  FUNCTION_ARG>100
132b0 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
132c0 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
132d0 47 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  G must be betwee
132e0 6e 20 30 20 61 6e 64 20 31 30 30 30 0a 23 65 6e  n 0 and 1000.#en
132f0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
13300 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c  AX_ATTACHED<0 ||
13310 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
13320 43 48 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72  CHED>125.# error
13330 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
13340 43 48 45 44 20 6d 75 73 74 20 62 65 20 62 65 74  CHED must be bet
13350 77 65 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23  ween 0 and 125.#
13360 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13370 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
13380 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72  N_LENGTH<1.# err
13390 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  or SQLITE_MAX_LI
133a0 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
133b0 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
133c0 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 1.#endif.#if 
133d0 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
133e0 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20  N>32767.# error 
133f0 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
13400 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65  N must not excee
13410 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23  d 32767.#endif.#
13420 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  if SQLITE_MAX_TR
13430 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20  IGGER_DEPTH<1.# 
13440 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
13450 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d  _TRIGGER_DEPTH m
13460 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
13470 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  1.#endif.#if SQL
13480 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
13490 48 52 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49  HREADS<0 || SQLI
134a0 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
134b0 52 45 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72  READS>50.# error
134c0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
134d0 45 52 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20  ER_THREADS must 
134e0 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
134f0 20 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   50.#endif.../*.
13500 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
13510 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20  lue of a limit. 
13520 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20   Report the old 
13530 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20  value..** If an 
13540 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e  invalid limit in
13550 64 65 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c  dex is supplied,
13560 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d   report -1..** M
13570 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62  ake no changes b
13580 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20  ut still report 
13590 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66  the old value if
135a0 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69   the.** new limi
135b0 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a  t is negative..*
135c0 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72  *.** A new lower
135d0 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20   limit does not 
135e0 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20  shrink existing 
135f0 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49  constructs..** I
13600 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74  t merely prevent
13610 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73  s new constructs
13620 20 74 68 61 74 20 65 78 63 65 65 64 20 74 68 65   that exceed the
13630 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66   limit.** from f
13640 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  orming..*/.int s
13650 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c  qlite3_limit(sql
13660 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69  ite3 *db, int li
13670 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69  mitId, int newLi
13680 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c  mit){.  int oldL
13690 69 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  imit;..#ifdef SQ
136a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
136b0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
136c0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
136d0 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
136e0 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
136f0 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
13700 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n -1;.  }.#endif
13710 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ..  /* EVIDENCE-
13720 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39  OF: R-30189-5409
13730 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74  7 For each limit
13740 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45   category SQLITE
13750 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a  _LIMIT_NAME.  **
13760 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64   there is a hard
13770 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74   upper bound set
13780 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
13790 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65   by a C preproce
137a0 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20  ssor.  ** macro 
137b0 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41  called SQLITE_MA
137c0 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c  X_NAME. (The "_L
137d0 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61  IMIT_" in the na
137e0 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  me is changed to
137f0 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a  .  ** "_MAX_".).
13800 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
13810 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
13820 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d  _LIMIT_LENGTH]==
13830 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
13840 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
13850 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
13860 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
13870 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53  H]==SQLITE_MAX_S
13880 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61  QL_LENGTH );.  a
13890 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
138a0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
138b0 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d  OLUMN]==SQLITE_M
138c0 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61  AX_COLUMN );.  a
138d0 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
138e0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45  t[SQLITE_LIMIT_E
138f0 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  XPR_DEPTH]==SQLI
13900 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
13910 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
13920 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
13930 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
13940 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f  SELECT]==SQLITE_
13950 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
13960 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ECT);.  assert( 
13970 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13980 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d  E_LIMIT_VDBE_OP]
13990 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  ==SQLITE_MAX_VDB
139a0 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OP );.  assert
139b0 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
139c0 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
139d0 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f  ON_ARG]==SQLITE_
139e0 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
139f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
13a00 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
13a10 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d  LIMIT_ATTACHED]=
13a20 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  =SQLITE_MAX_ATTA
13a30 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CHED );.  assert
13a40 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
13a50 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
13a60 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d  ATTERN_LENGTH]==
13a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13aa0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
13ab0 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29  PATTERN_LENGTH )
13ac0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
13ad0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
13ae0 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
13af0 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  BER]==SQLITE_MAX
13b00 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
13b10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
13b20 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
13b30 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
13b40 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
13b50 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b  TRIGGER_DEPTH );
13b60 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
13b70 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
13b80 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  IT_WORKER_THREAD
13b90 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57  S]==SQLITE_MAX_W
13ba0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b  ORKER_THREADS );
13bb0 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
13bc0 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
13bd0 48 52 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f  HREADS==(SQLITE_
13be0 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a  N_LIMIT-1) );...
13bf0 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20    if( limitId<0 
13c00 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49  || limitId>=SQLI
13c10 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  TE_N_LIMIT ){.  
13c20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
13c30 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62  .  oldLimit = db
13c40 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
13c50 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  ];.  if( newLimi
13c60 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  t>=0 ){         
13c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
13c80 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20  : R-52476-28732 
13c90 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69  */.    if( newLi
13ca0 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c  mit>aHardLimit[l
13cb0 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20  imitId] ){.     
13cc0 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72   newLimit = aHar
13cd0 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  dLimit[limitId];
13ce0 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36    /* IMP: R-5146
13cf0 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d  3-25634 */.    }
13d00 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  .    db->aLimit[
13d10 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69  limitId] = newLi
13d20 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mit;.  }.  retur
13d30 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20  n oldLimit;     
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d  /* IMP: R-53341-
13d60 33 35 34 31 39 20 2a 2f 0a 7d 0a 23 69 66 20 64  35419 */.}.#if d
13d70 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
13d80 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49 4c  ABLE_AUTO_PROFIL
13d90 45 29 0a 2f 2a 20 73 74 64 65 72 72 20 6c 6f 67  E)./* stderr log
13da0 67 69 6e 67 20 2a 2f 0a 76 6f 69 64 20 5f 73 71  ging */.void _sq
13db0 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c  lite_auto_profil
13dc0 65 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e  e(void *aux, con
13dd0 73 74 20 63 68 61 72 20 2a 73 71 6c 2c 20 75 36  st char *sql, u6
13de0 34 20 6e 73 29 3b 0a 76 6f 69 64 20 5f 73 71 6c  4 ns);.void _sql
13df0 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 28 76  ite_auto_trace(v
13e00 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20  oid *aux, const 
13e10 63 68 61 72 20 2a 73 71 6c 29 3b 0a 76 6f 69 64  char *sql);.void
13e20 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 70 72   _sqlite_auto_pr
13e30 6f 66 69 6c 65 28 76 6f 69 64 20 2a 61 75 78 2c  ofile(void *aux,
13e40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
13e50 2c 20 75 36 34 20 6e 73 29 20 7b 0a 23 70 72 61  , u64 ns) {.#pra
13e60 67 6d 61 20 75 6e 75 73 65 64 28 61 75 78 29 0a  gma unused(aux).
13e70 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .fprintf(stderr,
13e80 20 22 51 75 65 72 79 3a 20 25 73 5c 6e 20 45 78   "Query: %s\n Ex
13e90 65 63 75 74 69 6f 6e 20 54 69 6d 65 3a 20 25 6c  ecution Time: %l
13ea0 6c 75 20 6d 73 5c 6e 22 2c 20 73 71 6c 2c 20 6e  lu ms\n", sql, n
13eb0 73 20 2f 20 31 30 30 30 30 30 30 29 3b 0a 7d 0a  s / 1000000);.}.
13ec0 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74  void _sqlite_aut
13ed0 6f 5f 74 72 61 63 65 28 76 6f 69 64 20 2a 61 75  o_trace(void *au
13ee0 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  x, const char *s
13ef0 71 6c 29 20 7b 0a 09 66 70 72 69 6e 74 66 28 73  ql) {..fprintf(s
13f00 74 64 65 72 72 2c 20 22 54 72 61 63 65 53 51 4c  tderr, "TraceSQL
13f10 28 25 70 29 3a 20 25 73 5c 6e 22 2c 20 61 75 78  (%p): %s\n", aux
13f20 2c 20 73 71 6c 29 3b 0a 7d 0a 0a 2f 2a 20 73 79  , sql);.}../* sy
13f30 73 6c 6f 67 20 6c 6f 67 67 69 6e 67 20 2a 2f 0a  slog logging */.
13f40 23 69 6e 63 6c 75 64 65 20 3c 61 73 6c 2e 68 3e  #include <asl.h>
13f50 0a 73 74 61 74 69 63 20 61 73 6c 63 6c 69 65 6e  .static aslclien
13f60 74 20 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74  t autolog_client
13f70 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20   = NULL;.static 
13f80 76 6f 69 64 20 5f 63 6c 6f 73 65 5f 61 73 6c 5f  void _close_asl_
13f90 6c 6f 67 28 29 20 7b 0a 20 20 69 66 28 20 4e 55  log() {.  if( NU
13fa0 4c 4c 21 3d 61 75 74 6f 6c 6f 67 5f 63 6c 69 65  LL!=autolog_clie
13fb0 6e 74 20 29 7b 0a 20 20 20 20 61 73 6c 5f 63 6c  nt ){.    asl_cl
13fc0 6f 73 65 28 61 75 74 6f 6c 6f 67 5f 63 6c 69 65  ose(autolog_clie
13fd0 6e 74 29 3b 0a 20 20 20 20 61 75 74 6f 6c 6f 67  nt);.    autolog
13fe0 5f 63 6c 69 65 6e 74 20 3d 20 4e 55 4c 4c 3b 0a  _client = NULL;.
13ff0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
14000 64 20 5f 6f 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28  d _open_asl_log(
14010 29 20 7b 0a 20 20 69 66 28 20 4e 55 4c 4c 3d 3d  ) {.  if( NULL==
14020 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 29  autolog_client )
14030 7b 0a 20 20 20 20 61 75 74 6f 6c 6f 67 5f 63 6c  {.    autolog_cl
14040 69 65 6e 74 20 3d 20 61 73 6c 5f 6f 70 65 6e 28  ient = asl_open(
14050 22 53 51 4c 69 74 65 22 2c 20 4e 55 4c 4c 2c 20  "SQLite", NULL, 
14060 30 29 3b 0a 20 20 20 20 61 74 65 78 69 74 28 5f  0);.    atexit(_
14070 63 6c 6f 73 65 5f 61 73 6c 5f 6c 6f 67 29 3b 0a  close_asl_log);.
14080 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 5f 73 71 6c    }.}..void _sql
14090 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65  ite_auto_profile
140a0 5f 73 79 73 6c 6f 67 28 76 6f 69 64 20 2a 61 75  _syslog(void *au
140b0 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  x, const char *s
140c0 71 6c 2c 20 75 36 34 20 6e 73 29 3b 0a 76 6f 69  ql, u64 ns);.voi
140d0 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74  d _sqlite_auto_t
140e0 72 61 63 65 5f 73 79 73 6c 6f 67 28 76 6f 69 64  race_syslog(void
140f0 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61   *aux, const cha
14100 72 20 2a 73 71 6c 29 3b 0a 76 6f 69 64 20 5f 73  r *sql);.void _s
14110 71 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69  qlite_auto_profi
14120 6c 65 5f 73 79 73 6c 6f 67 28 76 6f 69 64 20 2a  le_syslog(void *
14130 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  aux, const char 
14140 2a 73 71 6c 2c 20 75 36 34 20 6e 73 29 20 7b 0a  *sql, u64 ns) {.
14150 23 70 72 61 67 6d 61 20 75 6e 75 73 65 64 28 61  #pragma unused(a
14160 75 78 29 0a 09 61 73 6c 5f 6c 6f 67 28 61 75 74  ux)..asl_log(aut
14170 6f 6c 6f 67 5f 63 6c 69 65 6e 74 2c 20 4e 55 4c  olog_client, NUL
14180 4c 2c 20 41 53 4c 5f 4c 45 56 45 4c 5f 4e 4f 54  L, ASL_LEVEL_NOT
14190 49 43 45 2c 20 22 51 75 65 72 79 3a 20 25 73 5c  ICE, "Query: %s\
141a0 6e 20 45 78 65 63 75 74 69 6f 6e 20 54 69 6d 65  n Execution Time
141b0 3a 20 25 6c 6c 75 20 6d 73 5c 6e 22 2c 20 73 71  : %llu ms\n", sq
141c0 6c 2c 20 6e 73 20 2f 20 31 30 30 30 30 30 30 29  l, ns / 1000000)
141d0 3b 0a 7d 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65  ;.}.void _sqlite
141e0 5f 61 75 74 6f 5f 74 72 61 63 65 5f 73 79 73 6c  _auto_trace_sysl
141f0 6f 67 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f  og(void *aux, co
14200 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 29 20 7b  nst char *sql) {
14210 0a 09 61 73 6c 5f 6c 6f 67 28 61 75 74 6f 6c 6f  ..asl_log(autolo
14220 67 5f 63 6c 69 65 6e 74 2c 20 4e 55 4c 4c 2c 20  g_client, NULL, 
14230 41 53 4c 5f 4c 45 56 45 4c 5f 4e 4f 54 49 43 45  ASL_LEVEL_NOTICE
14240 2c 20 22 54 72 61 63 65 53 51 4c 28 25 70 29 3a  , "TraceSQL(%p):
14250 20 25 73 5c 6e 22 2c 20 61 75 78 2c 20 73 71 6c   %s\n", aux, sql
14260 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
14270 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
14280 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 72 73   is used to pars
14290 65 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20  e both URIs and 
142a0 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65  non-URI filename
142b0 73 20 70 61 73 73 65 64 20 62 79 20 74 68 65 0a  s passed by the.
142c0 2a 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20 66  ** user to API f
142d0 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33  unctions sqlite3
142e0 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74  _open() or sqlit
142f0 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e  e3_open_v2(), an
14300 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a  d for database.*
14310 2a 20 55 52 49 73 20 73 70 65 63 69 66 69 65 64  * URIs specified
14320 20 61 73 20 70 61 72 74 20 6f 66 20 41 54 54 41   as part of ATTA
14330 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CH statements..*
14340 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
14350 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
14360 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20  function is the 
14370 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  name of the VFS 
14380 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20  to use (or.** a 
14390 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20  NULL to signify 
143a0 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 29  the default VFS)
143b0 20 69 66 20 74 68 65 20 55 52 49 20 64 6f 65 73   if the URI does
143c0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22   not contain a "
143d0 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72  vfs=xxx".** quer
143e0 79 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65  y parameter. The
143f0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
14400 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52   contains the UR
14410 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69  I (or non-URI fi
14420 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c  lename).** itsel
14430 66 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  f. When this fun
14440 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
14450 74 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69  the *pFlags vari
14460 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74  able should cont
14470 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75  ain.** the defau
14480 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  lt flags to open
14490 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
144a0 6e 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76  ndle with. The v
144b0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
144c0 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65  * *pFlags may be
144d0 20 75 70 64 61 74 65 64 20 62 65 66 6f 72 65 20   updated before 
144e0 72 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65  returning if the
144f0 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f   URI filename co
14500 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68  ntains .** "cach
14510 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d  e=xxx" or "mode=
14520 78 78 78 22 20 71 75 65 72 79 20 70 61 72 61 6d  xxx" query param
14530 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eters..**.** If 
14540 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
14550 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
14560 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
14570 2a 70 70 56 66 73 20 69 73 20 73 65 74 20 74 6f  *ppVfs is set to
14580 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65   point to.** the
14590 20 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64   VFS that should
145a0 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e   be used to open
145b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
145c0 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73  le. *pzFile is s
145d0 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74  et to.** point t
145e0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
145f0 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f  ining the name o
14600 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70  f the file to op
14610 65 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  en. It is the .*
14620 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
14630 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
14640 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c  o eventually cal
14650 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  l sqlite3_free()
14660 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74   to release.** t
14670 68 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  his buffer..**.*
14680 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
14690 63 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51  curs, then an SQ
146a0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
146b0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
146c0 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79  *pzErrMsg.** may
146d0 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   be set to point
146e0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
146f0 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69  taining an Engli
14700 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f  sh language erro
14710 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49  r .** message. I
14720 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
14730 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
14740 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
14750 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74  lly release.** t
14760 68 69 73 20 62 75 66 66 65 72 20 62 79 20 63 61  his buffer by ca
14770 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  lling sqlite3_fr
14780 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ee()..*/.int sql
14790 69 74 65 33 50 61 72 73 65 55 72 69 28 0a 20 20  ite3ParseUri(.  
147a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66  const char *zDef
147b0 61 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20  aultVfs,        
147c0 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69 66  /* VFS to use if
147d0 20 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75   no "vfs=xxx" qu
147e0 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20  ery option */.  
147f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69  const char *zUri
14800 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14810 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  /* Nul-terminate
14820 64 20 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a  d URI to parse *
14830 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
14840 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20   *pFlags,       
14850 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
14860 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
14870 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lags */.  sqlite
14880 33 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20  3_vfs **ppVfs,  
14890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
148a0 3a 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20  : VFS to use */ 
148b0 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65  .  char **pzFile
148c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
148d0 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e     /* OUT: Filen
148e0 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ame component of
148f0 20 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a   URI */.  char *
14900 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20  *pzErrMsg       
14910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
14920 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  : Error message 
14930 28 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  (if rc!=SQLITE_O
14940 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  K) */.){.  int r
14950 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14960 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c   unsigned int fl
14970 61 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20  ags = *pFlags;. 
14980 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
14990 73 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b  s = zDefaultVfs;
149a0 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  .  char *zFile;.
149b0 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20    char c;.  int 
149c0 6e 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74  nUri = sqlite3St
149d0 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20  rlen30(zUri);.. 
149e0 20 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d   assert( *pzErrM
149f0 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  sg==0 );..  if( 
14a00 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ((flags & SQLITE
14a10 5f 4f 50 45 4e 5f 55 52 49 29 20 20 20 20 20 20  _OPEN_URI)      
14a20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
14a30 2d 34 38 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a  -48725-32206 */.
14a40 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
14a50 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
14a60 69 67 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20  ig.bOpenUri) /* 
14a70 49 4d 50 3a 20 52 2d 35 31 36 38 39 2d 34 36 35  IMP: R-51689-465
14a80 34 38 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69  48 */.   && nUri
14a90 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55  >=5 && memcmp(zU
14aa0 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d  ri, "file:", 5)=
14ab0 3d 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38  =0 /* IMP: R-578
14ac0 38 34 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b  84-37496 */.  ){
14ad0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b  .    char *zOpt;
14ae0 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b  .    int eState;
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b00 20 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61     /* Parser sta
14b10 74 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  te when parsing 
14b20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  URI */.    int i
14b30 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  In;             
14b40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
14b50 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65  t character inde
14b60 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75  x */.    int iOu
14b70 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
14b80 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
14b90 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78   character index
14ba0 20 2a 2f 0a 20 20 20 20 75 36 34 20 6e 42 79 74   */.    u64 nByt
14bb0 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20  e = nUri+2;     
14bc0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
14bd0 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  f space to alloc
14be0 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d  ate */..    /* M
14bf0 61 6b 65 20 73 75 72 65 20 74 68 65 20 53 51 4c  ake sure the SQL
14c00 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61  ITE_OPEN_URI fla
14c10 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69  g is set to indi
14c20 63 61 74 65 20 74 6f 20 74 68 65 20 56 46 53 20  cate to the VFS 
14c30 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65  xOpen .    ** me
14c40 74 68 6f 64 20 74 68 61 74 20 74 68 65 72 65 20  thod that there 
14c50 6d 61 79 20 62 65 20 65 78 74 72 61 20 70 61 72  may be extra par
14c60 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e  ameters followin
14c70 67 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e  g the file-name.
14c80 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c    */.    flags |
14c90 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  = SQLITE_OPEN_UR
14ca0 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d  I;..    for(iIn=
14cb0 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e  0; iIn<nUri; iIn
14cc0 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55  ++) nByte += (zU
14cd0 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20  ri[iIn]=='&');. 
14ce0 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74     zFile = sqlit
14cf0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74  e3_malloc64(nByt
14d00 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69  e);.    if( !zFi
14d10 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
14d20 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20 69  TE_NOMEM;..    i
14d30 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65 66 20 53  In = 5;.#ifdef S
14d40 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f  QLITE_ALLOW_URI_
14d50 41 55 54 48 4f 52 49 54 59 0a 20 20 20 20 69 66  AUTHORITY.    if
14d60 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35  ( strncmp(zUri+5
14d70 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29  , "///", 3)==0 )
14d80 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b  {.      iIn = 7;
14d90 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
14da0 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f  llowing conditio
14db0 6e 20 63 61 75 73 65 73 20 55 52 49 73 20 77 69  n causes URIs wi
14dc0 74 68 20 66 69 76 65 20 6c 65 61 64 69 6e 67 20  th five leading 
14dd0 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20  / characters.   
14de0 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69 6c 65 3a     ** like file:
14df0 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 20 74  /////host/path t
14e00 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  o be converted i
14e10 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65 20 2f 2f  nto UNCs like //
14e20 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20 20 20 20  host/path..     
14e30 20 2a 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20   ** The correct 
14e40 55 52 49 20 66 6f 72 20 74 68 61 74 20 55 4e 43  URI for that UNC
14e50 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f 20 6f 72   has only two or
14e60 20 66 6f 75 72 20 6c 65 61 64 69 6e 67 20 2f 20   four leading / 
14e70 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20 20  characters.     
14e80 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73 74 2f   ** file://host/
14e90 70 61 74 68 20 6f 72 20 66 69 6c 65 3a 2f 2f 2f  path or file:///
14ea0 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20 42 75 74  /host/path.  But
14eb0 20 35 20 6c 65 61 64 69 6e 67 20 73 6c 61 73 68   5 leading slash
14ec0 65 73 20 69 73 20 61 20 0a 20 20 20 20 20 20 2a  es is a .      *
14ed0 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72 2c 20  * common error, 
14ee0 77 65 20 61 72 65 20 74 6f 6c 64 2c 20 73 6f 20  we are told, so 
14ef0 77 65 20 68 61 6e 64 6c 65 20 69 74 20 61 73 20  we handle it as 
14f00 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2e 20  a special case. 
14f10 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  */.      if( str
14f20 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20 22 2f 2f  ncmp(zUri+7, "//
14f30 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20 69 49 6e  /", 3)==0 ){ iIn
14f40 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20  ++; }.    }else 
14f50 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69  if( strncmp(zUri
14f60 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f 73 74  +5, "//localhost
14f70 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a 20 20  /", 12)==0 ){.  
14f80 20 20 20 20 69 49 6e 20 3d 20 31 36 3b 0a 20 20      iIn = 16;.  
14f90 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a    }.#else.    /*
14fa0 20 44 69 73 63 61 72 64 20 74 68 65 20 73 63 68   Discard the sch
14fb0 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69 74  eme and authorit
14fc0 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74 68  y segments of th
14fd0 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66  e URI. */.    if
14fe0 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26  ( zUri[5]=='/' &
14ff0 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29  & zUri[6]=='/' )
15000 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b  {.      iIn = 7;
15010 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55  .      while( zU
15020 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b  ri[iIn] && zUri[
15030 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b  iIn]!='/' ) iIn+
15040 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 49 6e  +;.      if( iIn
15050 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36 20  !=7 && (iIn!=16 
15060 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c  || memcmp("local
15070 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c  host", &zUri[7],
15080 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   9)) ){.        
15090 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
150a0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76  te3_mprintf("inv
150b0 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72 69  alid uri authori
150c0 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20  ty: %.*s", .    
150d0 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20 26          iIn-7, &
150e0 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20  zUri[7]);.      
150f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
15100 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ROR;.        got
15110 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b  o parse_uri_out;
15120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
15130 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f  endif..    /* Co
15140 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  py the filename 
15150 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70 61  and any query pa
15160 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68  rameters into th
15170 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20  e zFile buffer. 
15180 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25  .    ** Decode %
15190 48 48 20 65 73 63 61 70 65 20 63 6f 64 65 73 20  HH escape codes 
151a0 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a  along the way. .
151b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69      **.    ** Wi
151c0 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20  thin this loop, 
151d0 76 61 72 69 61 62 6c 65 20 65 53 74 61 74 65 20  variable eState 
151e0 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c  may be set to 0,
151f0 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69   1 or 2, dependi
15200 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ng.    ** on the
15210 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
15220 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  . As follows:.  
15230 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a    **.    **   0:
15240 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61   Parsing file-na
15250 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20  me..    **   1: 
15260 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63  Parsing name sec
15270 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76  tion of a name=v
15280 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d  alue query param
15290 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32  eter..    **   2
152a0 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20  : Parsing value 
152b0 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d  section of a nam
152c0 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61  e=value query pa
152d0 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a  rameter..    */.
152e0 20 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a      eState = 0;.
152f0 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
15300 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26  zUri[iIn])!=0 &&
15310 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20   c!='#' ){.     
15320 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66   iIn++;.      if
15330 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20  ( c=='%' .      
15340 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
15350 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a  git(zUri[iIn]) .
15360 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
15370 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69  3Isxdigit(zUri[i
15380 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b  In+1]) .      ){
15390 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74  .        int oct
153a0 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78  et = (sqlite3Hex
153b0 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b  ToInt(zUri[iIn++
153c0 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20  ]) << 4);.      
153d0 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74    octet += sqlit
153e0 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b  e3HexToInt(zUri[
153f0 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20  iIn++]);..      
15400 20 20 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e    assert( octet>
15410 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20  =0 && octet<256 
15420 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  );.        if( o
15430 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ctet==0 ){.     
15440 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
15450 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
15460 6e 20 22 25 30 30 22 20 61 70 70 65 61 72 73 20  n "%00" appears 
15470 77 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20  within the URI. 
15480 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  In this.        
15490 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e    ** case we ign
154a0 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20  ore all text in 
154b0 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
154c0 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20   the path, name 
154d0 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
154e0 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20  value currently 
154f0 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f  being parsed. So
15500 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72   ignore the curr
15510 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 20  ent character.  
15520 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73          ** and s
15530 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  kip to the next 
15540 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c  "?", "=" or "&",
15550 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
15560 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68   */.          wh
15570 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69  ile( (c = zUri[i
15580 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23  In])!=0 && c!='#
15590 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
155a0 20 26 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c   && (eState!=0 |
155b0 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20  | c!='?').      
155c0 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
155d0 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27  te!=1 || (c!='='
155e0 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20   && c!='&')).   
155f0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
15600 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27  State!=2 || c!='
15610 26 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  &').          ){
15620 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e  .            iIn
15630 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
15640 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
15650 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
15660 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b        c = octet;
15670 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
15680 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63   eState==1 && (c
15690 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29  =='&' || c=='=')
156a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
156b0 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30  zFile[iOut-1]==0
156c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
156d0 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e   An empty option
156e0 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68   name. Ignore th
156f0 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65  is option altoge
15700 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ther. */.       
15710 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69     while( zUri[i
15720 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d  In] && zUri[iIn]
15730 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49  !='#' && zUri[iI
15740 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b  n-1]!='&' ) iIn+
15750 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  +;.          con
15760 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
15770 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
15780 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '&' ){.         
15790 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
157a0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d   '\0';.        }
157b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
157c0 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20  eState = 2;.    
157d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20      }.        c 
157e0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
157f0 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20   if( (eState==0 
15800 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65  && c=='?') || (e
15810 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27  State==2 && c=='
15820 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  &') ){.        c
15830 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53   = 0;.        eS
15840 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tate = 1;.      
15850 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f  }.      zFile[iO
15860 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d  ut++] = c;.    }
15870 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 3d  .    if( eState=
15880 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  =1 ) zFile[iOut+
15890 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  +] = '\0';.    z
158a0 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
158b0 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69  \0';.    zFile[i
158c0 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a  Out++] = '\0';..
158d0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
158e0 74 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f  there were any o
158f0 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64  ptions specified
15900 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
15910 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20 20  interpreted .   
15920 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e   ** here. Option
15930 73 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 72  s that are inter
15940 70 72 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c  preted here incl
15950 75 64 65 20 22 76 66 73 22 20 61 6e 64 20 74 68  ude "vfs" and th
15960 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ose that.    ** 
15970 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c  correspond to fl
15980 61 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ags that may be 
15990 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71  passed to the sq
159a0 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a  lite3_open_v2().
159b0 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a      ** method. *
159c0 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46  /.    zOpt = &zF
159d0 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ile[sqlite3Strle
159e0 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20  n30(zFile)+1];. 
159f0 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30     while( zOpt[0
15a00 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ] ){.      int n
15a10 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Opt = sqlite3Str
15a20 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20  len30(zOpt);.   
15a30 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20     char *zVal = 
15a40 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20  &zOpt[nOpt+1];. 
15a50 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20       int nVal = 
15a60 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
15a70 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66  zVal);..      if
15a80 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d  ( nOpt==3 && mem
15a90 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c  cmp("vfs", zOpt,
15aa0 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   3)==0 ){.      
15ab0 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20    zVfs = zVal;. 
15ac0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15ad0 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d      struct OpenM
15ae0 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ode {.          
15af0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
15b00 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64           int mod
15b10 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d  e;.        } *aM
15b20 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
15b30 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65   char *zModeType
15b40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
15b50 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  t mask = 0;.    
15b60 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20      int limit = 
15b70 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  0;..        if( 
15b80 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d  nOpt==5 && memcm
15b90 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c  p("cache", zOpt,
15ba0 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   5)==0 ){.      
15bb0 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63      static struc
15bc0 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68  t OpenMode aCach
15bd0 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  eMode[] = {.    
15be0 20 20 20 20 20 20 20 20 7b 20 22 73 68 61 72 65          { "share
15bf0 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  d",  SQLITE_OPEN
15c00 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a  _SHAREDCACHE },.
15c10 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 70              { "p
15c20 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  rivate", SQLITE_
15c30 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
15c40 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
15c50 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20   { 0, 0 }.      
15c60 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20      };..        
15c70 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f    mask = SQLITE_
15c80 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
15c90 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49  |SQLITE_OPEN_PRI
15ca0 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20  VATECACHE;.     
15cb0 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61       aMode = aCa
15cc0 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20  cheMode;.       
15cd0 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b     limit = mask;
15ce0 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65  .          zMode
15cf0 54 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a  Type = "cache";.
15d00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15d10 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26    if( nOpt==4 &&
15d20 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20   memcmp("mode", 
15d30 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20  zOpt, 4)==0 ){. 
15d40 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
15d50 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
15d60 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a  aOpenMode[] = {.
15d70 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72              { "r
15d80 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  o",  SQLITE_OPEN
15d90 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20  _READONLY },.   
15da0 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c           { "rw",
15db0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
15dc0 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20  ADWRITE }, .    
15dd0 20 20 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c          { "rwc",
15de0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
15df0 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
15e00 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20  OPEN_CREATE },. 
15e10 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d 65             { "me
15e20 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50  mory", SQLITE_OP
15e30 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20  EN_MEMORY },.   
15e40 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20           { 0, 0 
15e50 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a  }.          };..
15e60 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d            mask =
15e70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
15e80 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f  DONLY | SQLITE_O
15e90 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20  PEN_READWRITE.  
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15eb0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
15ec0 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
15ed0 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20  PEN_MEMORY;.    
15ee0 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f        aMode = aO
15ef0 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20  penMode;.       
15f00 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20     limit = mask 
15f10 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  & flags;.       
15f20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22     zModeType = "
15f30 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20  access";.       
15f40 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
15f50 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  aMode ){.       
15f60 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
15f70 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30      int mode = 0
15f80 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
15f90 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b  i=0; aMode[i].z;
15fa0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
15fb0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15fc0 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20   = aMode[i].z;. 
15fd0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
15fe0 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  Val==sqlite3Strl
15ff0 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65  en30(z) && 0==me
16000 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56  mcmp(zVal, z, nV
16010 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  al) ){.         
16020 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64       mode = aMod
16030 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20  e[i].mode;.     
16040 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
16050 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
16060 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16070 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20      if( mode==0 
16080 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
16090 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
160a0 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73  e3_mprintf("no s
160b0 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22  uch %s mode: %s"
160c0 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61  , zModeType, zVa
160d0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
160e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
160f0 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  R;.            g
16100 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
16110 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
16120 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 6f           if( (mo
16130 64 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  de & ~SQLITE_OPE
16140 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20  N_MEMORY)>limit 
16150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
16160 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
16170 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d  e3_mprintf("%s m
16180 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a  ode not allowed:
16190 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d                zM
161c0 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a  odeType, zVal);.
161d0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
161e0 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
161f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
16200 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
16210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16220 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61      flags = (fla
16230 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f  gs & ~mask) | mo
16240 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  de;.        }.  
16250 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70      }..      zOp
16260 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31  t = &zVal[nVal+1
16270 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  ];.    }..  }els
16280 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73  e{.    zFile = s
16290 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
162a0 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28  nUri+2);.    if(
162b0 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e   !zFile ) return
162c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
162d0 20 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c     memcpy(zFile,
162e0 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20   zUri, nUri);.  
162f0 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20    zFile[nUri] = 
16300 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
16310 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a  nUri+1] = '\0';.
16320 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
16330 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
16340 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73   }..  *ppVfs = s
16350 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
16360 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70  zVfs);.  if( *pp
16370 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  Vfs==0 ){.    *p
16380 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
16390 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
163a0 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66  ch vfs: %s", zVf
163b0 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  s);.    rc = SQL
163c0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
163d0 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20  parse_uri_out:. 
163e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
163f0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
16400 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20  3_free(zFile);. 
16410 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20     zFile = 0;.  
16420 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c  }.  *pFlags = fl
16430 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d  ags;.  *pzFile =
16440 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e   zFile;.  return
16450 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69   rc;.}..#if defi
16460 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
16470 45 5f 41 55 54 4f 5f 50 52 4f 46 49 4c 45 29 0a  E_AUTO_PROFILE).
16480 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 41  #define SQLITE_A
16490 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44 45 52  UTOLOGGING_STDER
164a0 52 20 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  R 1.#define SQLI
164b0 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
164c0 59 53 4c 4f 47 20 32 0a 73 74 61 74 69 63 20 76  YSLOG 2.static v
164d0 6f 69 64 20 65 6e 61 62 6c 65 41 75 74 6f 4c 6f  oid enableAutoLo
164e0 67 67 69 6e 67 28 0a 20 20 73 71 6c 69 74 65 33  gging(.  sqlite3
164f0 20 2a 64 62 0a 29 7b 0a 20 20 63 68 61 72 20 2a   *db.){.  char *
16500 65 6e 76 70 72 6f 66 69 6c 65 20 3d 20 67 65 74  envprofile = get
16510 65 6e 76 28 22 53 51 4c 49 54 45 5f 41 55 54 4f  env("SQLITE_AUTO
16520 5f 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20 0a 20  _PROFILE");.  . 
16530 20 69 66 28 20 65 6e 76 70 72 6f 66 69 6c 65 21   if( envprofile!
16540 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74  =NULL ){.    int
16550 20 77 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20   where = 0;.    
16560 69 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70  if( !strncasecmp
16570 28 22 31 22 2c 20 65 6e 76 70 72 6f 66 69 6c 65  ("1", envprofile
16580 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 69 66  , 1) ){.      if
16590 28 20 69 73 61 74 74 79 28 32 29 20 29 7b 0a 20  ( isatty(2) ){. 
165a0 20 20 20 20 20 20 20 77 68 65 72 65 20 3d 20 53         where = S
165b0 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e  QLITE_AUTOLOGGIN
165c0 47 5f 53 54 44 45 52 52 3b 0a 20 20 20 20 20 20  G_STDERR;.      
165d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77  }else{.        w
165e0 68 65 72 65 20 3d 20 53 51 4c 49 54 45 5f 41 55  here = SQLITE_AU
165f0 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47  TOLOGGING_SYSLOG
16600 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
16610 65 6c 73 65 20 69 66 28 20 21 73 74 72 6e 63 61  else if( !strnca
16620 73 65 63 6d 70 28 22 73 74 64 65 72 72 22 2c 20  secmp("stderr", 
16630 65 6e 76 70 72 6f 66 69 6c 65 2c 20 36 29 20 29  envprofile, 6) )
16640 7b 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d 20  {.      where = 
16650 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
16660 4e 47 5f 53 54 44 45 52 52 3b 0a 20 20 20 20 7d  NG_STDERR;.    }
16670 20 65 6c 73 65 20 69 66 28 20 21 73 74 72 6e 63   else if( !strnc
16680 61 73 65 63 6d 70 28 22 73 79 73 6c 6f 67 22 2c  asecmp("syslog",
16690 20 65 6e 76 70 72 6f 66 69 6c 65 2c 20 36 29 20   envprofile, 6) 
166a0 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d  ){.      where =
166b0 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47   SQLITE_AUTOLOGG
166c0 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20 20 20 20  ING_SYSLOG;.    
166d0 7d 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 3d  }.    if( where=
166e0 3d 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47  =SQLITE_AUTOLOGG
166f0 49 4e 47 5f 53 54 44 45 52 52 20 29 7b 0a 20 20  ING_STDERR ){.  
16700 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66      sqlite3_prof
16710 69 6c 65 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f  ile(db, _sqlite_
16720 61 75 74 6f 5f 70 72 6f 66 69 6c 65 2c 20 64 62  auto_profile, db
16730 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
16740 20 77 68 65 72 65 3d 3d 53 51 4c 49 54 45 5f 41   where==SQLITE_A
16750 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f  UTOLOGGING_SYSLO
16760 47 20 29 7b 0a 20 20 20 20 20 20 5f 6f 70 65 6e  G ){.      _open
16770 5f 61 73 6c 5f 6c 6f 67 28 29 3b 0a 20 20 20 20  _asl_log();.    
16780 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c    sqlite3_profil
16790 65 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75  e(db, _sqlite_au
167a0 74 6f 5f 70 72 6f 66 69 6c 65 5f 73 79 73 6c 6f  to_profile_syslo
167b0 67 2c 20 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  g, db);.    }.  
167c0 7d 0a 20 20 63 68 61 72 20 2a 65 6e 76 74 72 61  }.  char *envtra
167d0 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  ce = getenv("SQL
167e0 49 54 45 5f 41 55 54 4f 5f 54 52 41 43 45 22 29  ITE_AUTO_TRACE")
167f0 3b 0a 20 20 69 66 28 20 65 6e 76 74 72 61 63 65  ;.  if( envtrace
16800 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 6e  !=NULL ){.    in
16810 74 20 77 68 65 72 65 20 3d 20 30 3b 0a 20 20 20  t where = 0;.   
16820 20 69 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d   if( !strncasecm
16830 70 28 22 31 22 2c 20 65 6e 76 74 72 61 63 65 2c  p("1", envtrace,
16840 20 31 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28   1) ){.      if(
16850 20 69 73 61 74 74 79 28 32 29 20 29 7b 0a 20 20   isatty(2) ){.  
16860 20 20 20 20 20 20 77 68 65 72 65 20 3d 20 53 51        where = SQ
16870 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47  LITE_AUTOLOGGING
16880 5f 53 54 44 45 52 52 3b 0a 20 20 20 20 20 20 7d  _STDERR;.      }
16890 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68  else{.        wh
168a0 65 72 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54  ere = SQLITE_AUT
168b0 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 3b  OLOGGING_SYSLOG;
168c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
168d0 6c 73 65 20 69 66 28 20 21 73 74 72 6e 63 61 73  lse if( !strncas
168e0 65 63 6d 70 28 22 73 74 64 65 72 72 22 2c 20 65  ecmp("stderr", e
168f0 6e 76 74 72 61 63 65 2c 20 36 29 20 29 7b 0a 20  nvtrace, 6) ){. 
16900 20 20 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c       where = SQL
16910 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f  ITE_AUTOLOGGING_
16920 53 54 44 45 52 52 3b 0a 20 20 20 20 7d 20 65 6c  STDERR;.    } el
16930 73 65 20 69 66 28 20 21 73 74 72 6e 63 61 73 65  se if( !strncase
16940 63 6d 70 28 22 73 79 73 6c 6f 67 22 2c 20 65 6e  cmp("syslog", en
16950 76 74 72 61 63 65 2c 20 36 29 20 29 7b 0a 20 20  vtrace, 6) ){.  
16960 20 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49      where = SQLI
16970 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
16980 59 53 4c 4f 47 3b 0a 20 20 20 20 7d 0a 20 20 20  YSLOG;.    }.   
16990 20 69 66 28 20 77 68 65 72 65 3d 3d 53 51 4c 49   if( where==SQLI
169a0 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
169b0 54 44 45 52 52 20 29 7b 0a 20 20 20 20 20 20 73  TDERR ){.      s
169c0 71 6c 69 74 65 33 5f 74 72 61 63 65 28 64 62 2c  qlite3_trace(db,
169d0 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72   _sqlite_auto_tr
169e0 61 63 65 2c 20 64 62 29 3b 0a 20 20 20 20 7d 65  ace, db);.    }e
169f0 6c 73 65 20 69 66 28 20 77 68 65 72 65 3d 3d 53  lse if( where==S
16a00 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e  QLITE_AUTOLOGGIN
16a10 47 5f 53 59 53 4c 4f 47 20 29 7b 0a 20 20 20 20  G_SYSLOG ){.    
16a20 20 20 5f 6f 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28    _open_asl_log(
16a30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16a40 5f 74 72 61 63 65 28 64 62 2c 20 5f 73 71 6c 69  _trace(db, _sqli
16a50 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 5f 73 79  te_auto_trace_sy
16a60 73 6c 6f 67 2c 20 64 62 29 3b 0a 20 20 20 20 7d  slog, db);.    }
16a70 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
16a80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16a90 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20  e does the work 
16aa0 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74  of opening a dat
16ab0 61 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20  abase on behalf 
16ac0 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70  of.** sqlite3_op
16ad0 65 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  en() and sqlite3
16ae0 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64  _open16(). The d
16af0 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
16b00 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a   "zFilename"  .*
16b10 2a 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64  * is UTF-8 encod
16b20 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
16b30 74 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a  t openDatabase(.
16b40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
16b50 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61  ilename, /* Data
16b60 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54  base filename UT
16b70 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20  F-8 encoded */. 
16b80 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c   sqlite3 **ppDb,
16b90 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
16ba0 52 65 74 75 72 6e 65 64 20 64 61 74 61 62 61 73  Returned databas
16bb0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e  e handle */.  un
16bc0 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73  signed int flags
16bd0 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f  ,    /* Operatio
16be0 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63  nal flags */.  c
16bf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
16c00 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
16c10 20 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20   the VFS to use 
16c20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
16c30 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
16c40 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
16c50 20 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c   allocated handl
16c60 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
16c70 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
16c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16c90 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
16ca0 69 6e 74 20 69 73 54 68 72 65 61 64 73 61 66 65  int isThreadsafe
16cb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16cc0 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72 65  /* True for thre
16cd0 61 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f  adsafe connectio
16ce0 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f  ns */.  char *zO
16cf0 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pen = 0;        
16d00 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e          /* Filen
16d10 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ame argument to 
16d20 70 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65  pass to BtreeOpe
16d30 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  n() */.  char *z
16d40 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20  ErrMsg = 0;     
16d50 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
16d60 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73  r message from s
16d70 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 29  qlite3ParseUri()
16d80 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
16d90 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
16da0 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d  MOR.  if( ppDb==
16db0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
16dc0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
16dd0 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20  endif.  *ppDb = 
16de0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
16df0 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
16e00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69    rc = sqlite3_i
16e10 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69  nitialize();.  i
16e20 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
16e30 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  c;.#endif..  /* 
16e40 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69  Only allow sensi
16e50 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ble combinations
16e60 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20   of bits in the 
16e70 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e 20  flags argument. 
16e80 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20   .  ** Throw an 
16e90 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e  error if any non
16ea0 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69  -sense combinati
16eb0 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66 20  on is used.  If 
16ec0 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62  we.  ** do not b
16ed0 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d  lock illegal com
16ee0 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c 20  binations here, 
16ef0 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65 72  it could trigger
16f00 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 73  .  ** assert() s
16f10 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65 65  tatements in dee
16f20 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65 6e  per layers.  Sen
16f30 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f  sible combinatio
16f40 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a  ns.  ** are:.  *
16f50 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49  *.  **  1:  SQLI
16f60 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
16f70 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54  .  **  2:  SQLIT
16f80 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16f90 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54  .  **  6:  SQLIT
16fa0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16fb0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
16fc0 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73 73  REATE.  */.  ass
16fd0 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
16fe0 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78  _READONLY  == 0x
16ff0 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  01 );.  assert( 
17000 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
17010 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29 3b  WRITE == 0x02 );
17020 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
17030 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20 20  E_OPEN_CREATE   
17040 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74 65   == 0x04 );.  te
17050 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61  stcase( (1<<(fla
17060 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b 20  gs&7))==0x02 ); 
17070 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20  /* READONLY */. 
17080 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28   testcase( (1<<(
17090 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34 20  flags&7))==0x04 
170a0 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20  ); /* READWRITE 
170b0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
170c0 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
170d0 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x40 ); /* READWR
170e0 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a  ITE | CREATE */.
170f0 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61 67    if( ((1<<(flag
17100 73 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d 30  s&7)) & 0x46)==0
17110 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
17120 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
17130 54 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 35  T;  /* IMP: R-65
17140 34 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20 20 7d  497-44594 */.  }
17150 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ..  if( sqlite3G
17160 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
17170 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  eMutex==0 ){.   
17180 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
17190 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  0;.  }else if( f
171a0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
171b0 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20  EN_NOMUTEX ){.  
171c0 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
171d0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
171e0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
171f0 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b  PEN_FULLMUTEX ){
17200 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
17210 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
17220 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
17230 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
17240 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
17250 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  x;.  }.  if( fla
17260 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
17270 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 29 7b  _PRIVATECACHE ){
17280 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53  .    flags &= ~S
17290 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
172a0 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20  DCACHE;.  }else 
172b0 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
172c0 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61  lConfig.sharedCa
172d0 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20  cheEnabled ){.  
172e0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
172f0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
17300 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  HE;.  }..  /* Re
17310 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74  move harmful bit
17320 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73  s from the flags
17330 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a   parameter.  **.
17340 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f    ** The SQLITE_
17350 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64  OPEN_NOMUTEX and
17360 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
17370 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65 72  LMUTEX flags wer
17380 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74  e.  ** dealt wit
17390 68 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  h in the previou
173a0 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42  s code block.  B
173b0 65 73 69 64 65 73 20 74 68 65 73 65 2c 20 74 68  esides these, th
173c0 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69  e only.  ** vali
173d0 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f  d input flags fo
173e0 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
173f0 32 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f  2() are SQLITE_O
17400 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20  PEN_READONLY,.  
17410 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ** SQLITE_OPEN_R
17420 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45  EADWRITE, SQLITE
17430 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51  _OPEN_CREATE, SQ
17440 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
17450 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49  CACHE,.  ** SQLI
17460 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
17470 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72  ACHE, and some r
17480 65 73 65 72 76 65 64 20 62 69 74 73 2e 20 20 53  eserved bits.  S
17490 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a  ilently mask.  *
174a0 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20  * off all other 
174b0 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c  flags..  */.  fl
174c0 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54  ags &=  ~( SQLIT
174d0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
174e0 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
174f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
17500 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
17510 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17520 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
17530 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
17540 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
17550 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  MP_DB | .       
17560 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
17570 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
17580 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
17590 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
175a0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  AIN_JOURNAL | . 
175b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
175c0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
175d0 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
175e0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
175f0 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
17600 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
17610 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
17620 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20  STER_JOURNAL |. 
17630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
17640 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
17650 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X |.            
17660 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46     SQLITE_OPEN_F
17670 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20  ULLMUTEX |.     
17680 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
17690 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20  _OPEN_WAL.      
176a0 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20         );..  /* 
176b0 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
176c0 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ite data structu
176d0 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c  re */.  db = sql
176e0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
176f0 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20  sizeof(sqlite3) 
17700 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29  );.  if( db==0 )
17710 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
17720 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61 64  ;.  if( isThread
17730 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e  safe ){.    db->
17740 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
17750 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
17760 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
17770 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
17780 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
17790 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
177a0 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b  );.      db = 0;
177b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
177c0 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  db_out;.    }.  
177d0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
177e0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
177f0 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73  x);.  db->errMas
17800 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e  k = 0xff;.  db->
17810 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d  nDb = 2;.  db->m
17820 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
17830 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e  GIC_BUSY;.  db->
17840 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61  aDb = db->aDbSta
17850 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  tic;..  assert( 
17860 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
17870 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64  t)==sizeof(aHard
17880 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63  Limit) );.  memc
17890 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61  py(db->aLimit, a
178a0 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f  HardLimit, sizeo
178b0 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a  f(db->aLimit));.
178c0 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c    db->aLimit[SQL
178d0 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
178e0 5f 54 48 52 45 41 44 53 5d 20 3d 20 53 51 4c 49  _THREADS] = SQLI
178f0 54 45 5f 44 45 46 41 55 4c 54 5f 57 4f 52 4b 45  TE_DEFAULT_WORKE
17900 52 5f 54 48 52 45 41 44 53 3b 0a 20 20 64 62 2d  R_THREADS;.  db-
17910 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
17920 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76  .  db->nextAutov
17930 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73  ac = -1;.  db->s
17940 7a 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65 33 47  zMmap = sqlite3G
17950 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
17960 61 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61  ap;.  db->nextPa
17970 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62  gesize = 0;.  db
17980 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70  ->nMaxSorterMmap
17990 20 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20   = 0x7FFFFFFF;. 
179a0 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
179b0 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
179c0 65 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62  es | SQLITE_Enab
179d0 6c 65 54 72 69 67 67 65 72 20 7c 20 53 51 4c 49  leTrigger | SQLI
179e0 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a 23 69  TE_CacheSpill.#i
179f0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
17a00 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41  E_DEFAULT_AUTOMA
17a10 54 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51  TIC_INDEX) || SQ
17a20 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
17a30 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20  OMATIC_INDEX.   
17a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
17a50 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78  SQLITE_AutoIndex
17a60 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
17a70 54 45 5f 44 45 46 41 55 4c 54 5f 43 4b 50 54 46  TE_DEFAULT_CKPTF
17a80 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 20 20 20  ULLFSYNC.       
17a90 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
17aa0 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63  TE_CkptFullFSync
17ab0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
17ac0 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
17ad0 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20  FORMAT<4.       
17ae0 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
17af0 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
17b00 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
17b10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41  QLITE_ENABLE_LOA
17b20 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
17b30 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
17b40 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73  QLITE_LoadExtens
17b50 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  ion.#endif.#if S
17b60 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45  QLITE_DEFAULT_RE
17b70 43 55 52 53 49 56 45 5f 54 52 49 47 47 45 52 53  CURSIVE_TRIGGERS
17b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17b90 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72    | SQLITE_RecTr
17ba0 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69  iggers.#endif.#i
17bb0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
17bc0 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e  _DEFAULT_FOREIGN
17bd0 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54 45  _KEYS) && SQLITE
17be0 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e  _DEFAULT_FOREIGN
17bf0 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20 20  _KEYS.          
17c00 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
17c10 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64  ForeignKeys.#end
17c20 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
17c30 51 4c 49 54 45 5f 52 45 56 45 52 53 45 5f 55 4e  QLITE_REVERSE_UN
17c40 4f 52 44 45 52 45 44 5f 53 45 4c 45 43 54 53 29  ORDERED_SELECTS)
17c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17c60 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 76 65 72    | SQLITE_Rever
17c70 73 65 4f 72 64 65 72 0a 23 65 6e 64 69 66 0a 23  seOrder.#endif.#
17c80 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
17c90 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
17ca0 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17cc0 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65   SQLITE_CellSize
17cd0 43 6b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  Ck.#endif.      
17ce0 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  ;.  sqlite3HashI
17cf0 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  nit(&db->aCollSe
17d00 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
17d10 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
17d20 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61  ABLE.  sqlite3Ha
17d30 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64  shInit(&db->aMod
17d40 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ule);.#endif..  
17d50 2f 2a 20 41 64 64 20 74 68 65 20 64 65 66 61 75  /* Add the defau
17d60 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
17d70 75 65 6e 63 65 20 42 49 4e 41 52 59 2e 20 42 49  uence BINARY. BI
17d80 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f 72 20 62  NARY works for b
17d90 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61  oth UTF-8.  ** a
17da0 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f 20 61 64  nd UTF-16, so ad
17db0 64 20 61 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  d a version for 
17dc0 65 61 63 68 20 74 6f 20 61 76 6f 69 64 20 61 6e  each to avoid an
17dd0 79 20 75 6e 6e 65 63 65 73 73 61 72 79 0a 20 20  y unnecessary.  
17de0 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20  ** conversions. 
17df0 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74  The only error t
17e00 68 61 74 20 63 61 6e 20 6f 63 63 75 72 20 68 65  hat can occur he
17e10 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29  re is a malloc()
17e20 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20   failure..  **. 
17e30 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
17e40 20 52 2d 35 32 37 38 36 2d 34 34 38 37 38 20 53   R-52786-44878 S
17e50 51 4c 69 74 65 20 64 65 66 69 6e 65 73 20 74 68  QLite defines th
17e60 72 65 65 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c  ree built-in col
17e70 6c 61 74 69 6e 67 0a 20 20 2a 2a 20 66 75 6e 63  lating.  ** func
17e80 74 69 6f 6e 73 3a 0a 20 20 2a 2f 0a 20 20 63 72  tions:.  */.  cr
17e90 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
17ea0 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
17eb0 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43  TE_UTF8, 0, binC
17ec0 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
17ed0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
17ee0 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c  b, "BINARY", SQL
17ef0 49 54 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20  ITE_UTF16BE, 0, 
17f00 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
17f10 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
17f20 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c  on(db, "BINARY",
17f30 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
17f40 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
17f50 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
17f60 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41  lation(db, "NOCA
17f70 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  SE", SQLITE_UTF8
17f80 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61  , 0, nocaseColla
17f90 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 20 20  tingFunc, 0);.  
17fa0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
17fb0 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c  db, "RTRIM", SQL
17fc0 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a  ITE_UTF8, (void*
17fd0 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c  )1, binCollFunc,
17fe0 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
17ff0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
18000 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
18010 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45 56 49  ut;.  }.  /* EVI
18020 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 33 30  DENCE-OF: R-0830
18030 38 2d 31 37 32 32 34 20 54 68 65 20 64 65 66 61  8-17224 The defa
18040 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  ult collating fu
18050 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 0a 20  nction for all. 
18060 20 2a 2a 20 73 74 72 69 6e 67 73 20 69 73 20 42   ** strings is B
18070 49 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a 20 20 64  INARY. .  */.  d
18080 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73  b->pDfltColl = s
18090 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
180a0 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46  q(db, SQLITE_UTF
180b0 38 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b  8, "BINARY", 0);
180c0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
180d0 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a  DfltColl!=0 );..
180e0 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66    /* Parse the f
180f0 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72 67 75  ilename/URI argu
18100 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6f  ment. */.  db->o
18110 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  penFlags = flags
18120 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
18130 50 61 72 73 65 55 72 69 28 7a 56 66 73 2c 20 7a  ParseUri(zVfs, z
18140 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61 67 73  Filename, &flags
18150 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f  , &db->pVfs, &zO
18160 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  pen, &zErrMsg);.
18170 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18180 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
18190 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
181a0 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ) db->mallocFail
181b0 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69  ed = 1;.    sqli
181c0 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
181d0 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67 20  db, rc, zErrMsg 
181e0 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a 45 72 72  ? "%s" : 0, zErr
181f0 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
18200 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
18210 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
18220 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
18230 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64  Open the backend
18240 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65 72   database driver
18250 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
18260 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e  e3BtreeOpen(db->
18270 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c  pVfs, zOpen, db,
18280 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74   &db->aDb[0].pBt
18290 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
182a0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 61               fla
182b0 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs | SQLITE_OPEN
182c0 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28  _MAIN_DB);.  if(
182d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
182e0 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
182f0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
18300 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
18310 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
18320 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
18330 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 20  ror(db, rc);.   
18340 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
18350 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
18360 74 72 65 65 45 6e 74 65 72 28 64 62 2d 3e 61 44  treeEnter(db->aD
18370 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d  b[0].pBt);.  db-
18380 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20  >aDb[0].pSchema 
18390 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47  = sqlite3SchemaG
183a0 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30  et(db, db->aDb[0
183b0 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20 21 64  ].pBt);.  if( !d
183c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
183d0 29 20 45 4e 43 28 64 62 29 20 3d 20 53 43 48 45  ) ENC(db) = SCHE
183e0 4d 41 5f 45 4e 43 28 64 62 29 3b 0a 20 20 73 71  MA_ENC(db);.  sq
183f0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18400 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
18410 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  .  db->aDb[1].pS
18420 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53  chema = sqlite3S
18430 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b  chemaGet(db, 0);
18440 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75  ..  /* The defau
18450 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  lt safety_level 
18460 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
18470 61 62 61 73 65 20 69 73 20 27 66 75 6c 6c 27 3b  abase is 'full';
18480 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20   for the temp.  
18490 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74 20 69  ** database it i
184a0 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d  s 'NONE'. This m
184b0 61 74 63 68 65 73 20 74 68 65 20 70 61 67 65 72  atches the pager
184c0 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73 2e   layer defaults.
184d0 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44    .  */.  db->aD
184e0 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61  b[0].zName = "ma
184f0 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30  in";.  db->aDb[0
18500 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ].safety_level =
18510 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d   3;.  db->aDb[1]
18520 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b  .zName = "temp";
18530 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61  .  db->aDb[1].sa
18540 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a  fety_level = 1;.
18550 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
18560 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
18570 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
18580 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
18590 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
185a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73  .  }..  /* Regis
185b0 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e  ter all built-in
185c0 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20   functions, but 
185d0 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  do not attempt t
185e0 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20  o read the.  ** 
185f0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
18600 79 65 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c  yet. This is del
18610 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66  ayed until the f
18620 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 64 61  irst time the da
18630 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61  tabase.  ** is a
18640 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ccessed..  */.  
18650 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
18660 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73   SQLITE_OK);.  s
18670 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 42 75  qlite3RegisterBu
18680 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64  iltinFunctions(d
18690 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61  b);..  /* Load a
186a0 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69  utomatic extensi
186b0 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73  ons - extensions
186c0 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
186d0 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20  registered.  ** 
186e0 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
186f0 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65  3_automatic_exte
18700 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a  nsion() API..  *
18710 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
18720 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
18730 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18740 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
18750 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f  AutoLoadExtensio
18760 6e 73 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d  ns(db);.    rc =
18770 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
18780 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63  (db);.    if( rc
18790 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
187a0 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62       goto opendb
187b0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
187c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
187d0 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28  NABLE_FTS1.  if(
187e0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
187f0 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  ed ){.    extern
18800 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31   int sqlite3Fts1
18810 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a  Init(sqlite3*);.
18820 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18830 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts1Init(db);.  
18840 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
18850 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
18860 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS2.  if( !db->m
18870 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
18880 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18890 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
188a0 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 73  qlite3Fts2Init(s
188b0 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63  qlite3*);.    rc
188c0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e   = sqlite3Fts2In
188d0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
188e0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
188f0 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 20 2f 2a  E_ENABLE_FTS3 /*
18900 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
18910 65 66 69 6e 65 64 20 62 79 20 53 51 4c 49 54 45  efined by SQLITE
18920 5f 45 4e 41 42 4c 45 5f 46 54 53 34 20 2a 2f 0a  _ENABLE_FTS4 */.
18930 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
18940 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
18950 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18960 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
18970 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
18980 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
18990 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a  ITE_ENABLE_FTS5.
189a0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
189b0 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
189c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
189d0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
189e0 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
189f0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
18a00 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20  ITE_ENABLE_ICU. 
18a10 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
18a20 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
18a30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
18a40 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e  c = sqlite3IcuIn
18a50 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
18a60 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
18a70 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20  E_ENABLE_RTREE. 
18a80 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
18a90 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
18aa0 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63  LITE_OK){.    rc
18ab0 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65 49   = sqlite3RtreeI
18ac0 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
18ad0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
18ae0 54 45 5f 45 4e 41 42 4c 45 5f 44 42 53 54 41 54  TE_ENABLE_DBSTAT
18af0 5f 56 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d  _VTAB.  if( !db-
18b00 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
18b10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b   rc==SQLITE_OK){
18b20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18b30 33 44 62 73 74 61 74 52 65 67 69 73 74 65 72 28  3DbstatRegister(
18b40 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
18b50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18b60 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a 20 20 69 66  NABLE_JSON1.  if
18b70 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
18b80 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
18b90 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20  E_OK){.    rc = 
18ba0 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74  sqlite3Json1Init
18bb0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
18bc0 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f  ..  /* -DSQLITE_
18bd0 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
18be0 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43  MODE=1 makes EXC
18bf0 4c 55 53 49 56 45 20 74 68 65 20 64 65 66 61 75  LUSIVE the defau
18c00 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20  lt locking.  ** 
18c10 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f  mode.  -DSQLITE_
18c20 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
18c30 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d  MODE=0 make NORM
18c40 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c  AL the default l
18c50 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65  ocking.  ** mode
18c60 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67  .  Doing nothing
18c70 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b   at all also mak
18c80 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65  es NORMAL the de
18c90 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64  fault..  */.#ifd
18ca0 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
18cb0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20  T_LOCKING_MODE. 
18cc0 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64   db->dfltLockMod
18cd0 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
18ce0 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b  LT_LOCKING_MODE;
18cf0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  .  sqlite3PagerL
18d00 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74  ockingMode(sqlit
18d10 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d  e3BtreePager(db-
18d20 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20  >aDb[0].pBt),.  
18d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d40 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
18d50 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
18d60 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ODE);.#endif..  
18d70 69 66 28 20 72 63 20 29 20 73 71 6c 69 74 65 33  if( rc ) sqlite3
18d80 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a  Error(db, rc);..
18d90 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20    /* Enable the 
18da0 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63  lookaside-malloc
18db0 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20   subsystem */.  
18dc0 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64  setupLookaside(d
18dd0 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f  b, 0, sqlite3Glo
18de0 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b  balConfig.szLook
18df0 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  aside,.         
18e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
18e10 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18e20 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a  ig.nLookaside);.
18e30 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  .  sqlite3_wal_a
18e40 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  utocheckpoint(db
18e50 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
18e60 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f  _WAL_AUTOCHECKPO
18e70 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75  INT);..opendb_ou
18e80 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  t:.  sqlite3_fre
18e90 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28 20  e(zOpen);.  if( 
18ea0 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  db ){.    assert
18eb0 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c  ( db->mutex!=0 |
18ec0 7c 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d  | isThreadsafe==
18ed0 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
18ee0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
18ef0 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d  fig.bFullMutex==
18f00 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
18f10 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
18f20 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72  >mutex);.  }.  r
18f30 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
18f40 6f 64 65 28 64 62 29 3b 0a 20 20 61 73 73 65 72  ode(db);.  asser
18f50 74 28 20 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d  t( db!=0 || rc==
18f60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
18f70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18f80 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71  _NOMEM ){.    sq
18f90 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
18fa0 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d  .    db = 0;.  }
18fb0 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
18fc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62  ITE_OK ){.    db
18fd0 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
18fe0 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d  _MAGIC_SICK;.  }
18ff0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
19000 50 50 4c 45 5f 5f 29 20 26 26 20 45 4e 41 42 4c  PPLE__) && ENABL
19010 45 5f 46 4f 52 43 45 5f 57 41 4c 0a 20 20 69 66  E_FORCE_WAL.  if
19020 28 20 64 62 20 26 26 20 21 72 63 20 29 7b 0a 20  ( db && !rc ){. 
19030 20 20 20 69 66 20 28 28 30 20 3d 3d 20 61 63 63     if ((0 == acc
19040 65 73 73 28 22 2f 76 61 72 2f 64 62 2f 65 6e 61  ess("/var/db/ena
19050 62 6c 65 46 6f 72 63 65 57 41 4c 22 2c 20 52 5f  bleForceWAL", R_
19060 4f 4b 29 29 29 20 7b 0a 23 69 66 64 65 66 20 53  OK))) {.#ifdef S
19070 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
19080 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
19090 2c 20 22 53 51 4c 69 74 65 20 57 41 4c 20 6a 6f  , "SQLite WAL jo
190a0 75 72 6e 61 6c 5f 6d 6f 64 65 20 45 4e 41 42 4c  urnal_mode ENABL
190b0 45 44 20 62 79 20 64 65 66 61 75 6c 74 2e 5c 6e  ED by default.\n
190c0 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ");.#endif.     
190d0 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f   .      sqlite3_
190e0 65 78 65 63 28 64 62 2c 20 22 70 72 61 67 6d 61  exec(db, "pragma
190f0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
19100 6c 22 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  l", NULL, NULL, 
19110 4e 55 4c 4c 29 3b 0a 23 69 66 64 65 66 20 53 51  NULL);.#ifdef SQ
19120 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2f 20 20 20  LITE_DEBUG.//   
19130 20 7d 20 65 6c 73 65 20 7b 0a 2f 2f 20 20 20 20   } else {.//    
19140 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
19150 2c 20 22 53 51 4c 69 74 65 20 57 41 4c 20 6a 6f  , "SQLite WAL jo
19160 75 72 6e 61 6c 5f 6d 6f 64 65 20 4e 4f 54 20 45  urnal_mode NOT E
19170 4e 41 42 4c 45 44 20 62 79 20 64 65 66 61 75 6c  NABLED by defaul
19180 74 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20  t.\n");.#endif. 
19190 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
191a0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
191b0 54 45 5f 45 4e 41 42 4c 45 5f 41 55 54 4f 5f 50  TE_ENABLE_AUTO_P
191c0 52 4f 46 49 4c 45 29 0a 20 20 69 66 28 20 64 62  ROFILE).  if( db
191d0 20 26 26 20 21 72 63 20 29 7b 0a 20 20 20 20 65   && !rc ){.    e
191e0 6e 61 62 6c 65 41 75 74 6f 4c 6f 67 67 69 6e 67  nableAutoLogging
191f0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
19200 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23  .  *ppDb = db;.#
19210 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
19220 42 4c 45 5f 53 51 4c 52 52 0a 20 20 53 52 52 65  BLE_SQLRR.  SRRe
19230 63 4f 70 65 6e 28 64 62 2c 20 7a 46 69 6c 65 6e  cOpen(db, zFilen
19240 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 23 65 6e  ame, flags);.#en
19250 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
19260 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
19270 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
19280 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
19290 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  g ){.    /* Open
192a0 69 6e 67 20 61 20 64 62 20 68 61 6e 64 6c 65 2e  ing a db handle.
192b0 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65   Fourth paramete
192c0 72 20 69 73 20 70 61 73 73 65 64 20 30 2e 20 2a  r is passed 0. *
192d0 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67  /.    void *pArg
192e0 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
192f0 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
19300 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  g;.    sqlite3Gl
19310 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
19320 6f 67 28 70 41 72 67 2c 20 64 62 2c 20 7a 46 69  og(pArg, db, zFi
19330 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  lename, 0);.  }.
19340 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
19350 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ed(SQLITE_HAS_CO
19360 44 45 43 29 0a 20 20 69 66 28 20 72 63 3d 3d 53  DEC).  if( rc==S
19370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19380 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 48 65 78  const char *zHex
19390 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72  Key = sqlite3_ur
193a0 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 4f 70 65  i_parameter(zOpe
193b0 6e 2c 20 22 68 65 78 6b 65 79 22 29 3b 0a 20 20  n, "hexkey");.  
193c0 20 20 69 66 28 20 7a 48 65 78 4b 65 79 20 26 26    if( zHexKey &&
193d0 20 7a 48 65 78 4b 65 79 5b 30 5d 20 29 7b 0a 20   zHexKey[0] ){. 
193e0 20 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20       u8 iByte;. 
193f0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
19400 20 20 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b    char zKey[40];
19410 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
19420 69 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f  iByte=0; i<sizeo
19430 66 28 7a 4b 65 79 29 2a 32 20 26 26 20 73 71 6c  f(zKey)*2 && sql
19440 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 48 65  ite3Isxdigit(zHe
19450 78 4b 65 79 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a  xKey[i]); i++){.
19460 20 20 20 20 20 20 20 20 69 42 79 74 65 20 3d 20          iByte = 
19470 28 69 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c  (iByte<<4) + sql
19480 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 48 65  ite3HexToInt(zHe
19490 78 4b 65 79 5b 69 5d 29 3b 0a 20 20 20 20 20 20  xKey[i]);.      
194a0 20 20 69 66 28 20 28 69 26 31 29 21 3d 30 20 29    if( (i&1)!=0 )
194b0 20 7a 4b 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79   zKey[i/2] = iBy
194c0 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
194d0 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32    sqlite3_key_v2
194e0 28 64 62 2c 20 30 2c 20 7a 4b 65 79 2c 20 69 2f  (db, 0, zKey, i/
194f0 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  2);.    }.  }.#e
19500 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
19510 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xff;.}../*.*
19520 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
19530 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
19540 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
19550 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
19560 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
19570 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29  qlite3 **ppDb .)
19580 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44  {.  return openD
19590 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d  atabase(zFilenam
195a0 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20  e, ppDb,.       
195b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
195c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
195d0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
195e0 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d  EN_CREATE, 0);.}
195f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
19600 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68  n_v2(.  const ch
19610 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20  ar *filename,   
19620 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
19630 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  name (UTF-8) */.
19640 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
19650 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
19660 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64  : SQLite db hand
19670 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
19680 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
19690 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  /* Flags */.  co
196a0 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
196b0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
196c0 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75   VFS module to u
196d0 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  se */.){.  retur
196e0 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66  n openDatabase(f
196f0 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28  ilename, ppDb, (
19700 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61  unsigned int)fla
19710 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69  gs, zVfs);.}..#i
19720 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19730 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70  T_UTF16./*.** Op
19740 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
19750 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
19760 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
19770 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
19780 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
19790 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20  ite3 **ppDb.){. 
197a0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
197b0 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46  lename8;   /* zF
197c0 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20  ilename encoded 
197d0 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64  in UTF-8 instead
197e0 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20   of UTF-16 */.  
197f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
19800 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Val;.  int rc;..
19810 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19820 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
19830 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72   if( ppDb==0 ) r
19840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
19850 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
19860 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
19870 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19880 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
19890 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
198a0 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
198b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
198c0 6e 64 69 66 0a 20 20 69 66 28 20 7a 46 69 6c 65  ndif.  if( zFile
198d0 6e 61 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65 6e  name==0 ) zFilen
198e0 61 6d 65 20 3d 20 22 5c 30 30 30 5c 30 30 30 22  ame = "\000\000"
198f0 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
19900 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
19910 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
19920 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46  Str(pVal, -1, zF
19930 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  ilename, SQLITE_
19940 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c  UTF16NATIVE, SQL
19950 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a  ITE_STATIC);.  z
19960 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69  Filename8 = sqli
19970 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
19980 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  l, SQLITE_UTF8);
19990 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
199a0 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70  8 ){.    rc = op
199b0 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
199c0 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20  name8, ppDb,.   
199d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199e0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
199f0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
19a00 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
19a10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  );.    assert( *
19a20 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  ppDb || rc==SQLI
19a30 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
19a40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19a50 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65  K && !DbHasPrope
19a60 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42  rty(*ppDb, 0, DB
19a70 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29  _SchemaLoaded) )
19a80 7b 0a 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45  {.      SCHEMA_E
19a90 4e 43 28 2a 70 70 44 62 29 20 3d 20 45 4e 43 28  NC(*ppDb) = ENC(
19aa0 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f  *ppDb) = SQLITE_
19ab0 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20  UTF16NATIVE;.   
19ac0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
19ad0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
19ae0 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  M;.  }.  sqlite3
19af0 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
19b00 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26 20  ..  return rc & 
19b10 30 78 66 66 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  0xff;.}.#endif /
19b20 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
19b30 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
19b40 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
19b50 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
19b60 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
19b70 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
19b80 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
19b90 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  te_collation(.  
19ba0 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
19bb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
19bc0 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  e, .  int enc, .
19bd0 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
19be0 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
19bf0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
19c00 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
19c10 6f 69 64 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72  oid*).){.  retur
19c20 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  n sqlite3_create
19c30 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62  _collation_v2(db
19c40 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43  , zName, enc, pC
19c50 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
19c60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
19c70 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
19c80 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
19c90 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
19ca0 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
19cb0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
19cc0 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20  collation_v2(.  
19cd0 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
19ce0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
19cf0 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  e, .  int enc, .
19d00 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
19d10 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
19d20 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
19d30 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
19d40 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  oid*),.  void(*x
19d50 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20  Del)(void*).){. 
19d60 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66   int rc;..#ifdef
19d70 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
19d80 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
19d90 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
19da0 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d  ckOk(db) || zNam
19db0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
19dc0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
19dd0 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
19de0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
19df0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
19e00 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
19e10 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d  Failed );.  rc =
19e20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
19e30 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29  (db, zName, (u8)
19e40 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
19e50 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63  are, xDel);.  rc
19e60 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
19e70 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
19e80 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
19e90 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
19ea0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
19eb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19ec0 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67  _UTF16./*.** Reg
19ed0 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
19ee0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
19ef0 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
19f00 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
19f10 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
19f20 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20  e_collation16(. 
19f30 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
19f40 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61   const void *zNa
19f50 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  me,.  int enc, .
19f60 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
19f70 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
19f80 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
19f90 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
19fa0 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  oid*).){.  int r
19fb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19fc0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 0a   char *zName8;..
19fd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19fe0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
19ff0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1a000 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c  etyCheckOk(db) |
1a010 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  | zName==0 ) ret
1a020 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1a030 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
1a040 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1a050 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1a060 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
1a070 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1a080 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74    zName8 = sqlit
1a090 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a  e3Utf16to8(db, z
1a0a0 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
1a0b0 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
1a0c0 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20   if( zName8 ){. 
1a0d0 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f     rc = createCo
1a0e0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
1a0f0 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74  e8, (u8)enc, pCt
1a100 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b  x, xCompare, 0);
1a110 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1a120 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a  ee(db, zName8);.
1a130 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
1a140 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
1a150 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
1a160 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1a170 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
1a180 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
1a190 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1a1a0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
1a1b0 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  er a collation s
1a1c0 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20  equence factory 
1a1d0 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68  callback with th
1a1e0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
1a1f0 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65  e.** db. Replace
1a200 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20   any previously 
1a210 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74  installed collat
1a220 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
1a230 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tory..*/.int sql
1a240 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
1a250 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33  eeded(.  sqlite3
1a260 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *db, .  void *p
1a270 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a  CollNeededArg, .
1a280 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65    void(*xCollNee
1a290 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  ded)(void*,sqlit
1a2a0 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
1a2b0 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b  ,const char*).){
1a2c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1a2d0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1a2e0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1a2f0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1a300 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1a310 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
1a320 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
1a330 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1a340 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  tex);.  db->xCol
1a350 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e  lNeeded = xCollN
1a360 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f  eeded;.  db->xCo
1a370 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a  llNeeded16 = 0;.
1a380 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
1a390 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
1a3a0 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
1a3b0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1a3c0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1a3d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1a3e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a3f0 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
1a400 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61  Register a colla
1a410 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
1a420 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77  ctory callback w
1a430 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
1a440 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52   handle.** db. R
1a450 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69  eplace any previ
1a460 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20  ously installed 
1a470 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1a480 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69  ce factory..*/.i
1a490 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61  nt sqlite3_colla
1a4a0 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20  tion_needed16(. 
1a4b0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
1a4c0 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64   void *pCollNeed
1a4d0 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a  edArg, .  void(*
1a4e0 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76  xCollNeeded16)(v
1a4f0 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
1a500 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74  t eTextRep,const
1a510 20 76 6f 69 64 2a 29 0a 29 7b 0a 23 69 66 64 65   void*).){.#ifde
1a520 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1a530 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1a540 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1a550 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
1a560 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1a570 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
1a580 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1a590 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1a5a0 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
1a5b0 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f  d = 0;.  db->xCo
1a5c0 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f  llNeeded16 = xCo
1a5d0 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62  llNeeded16;.  db
1a5e0 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
1a5f0 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72   = pCollNeededAr
1a600 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
1a610 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1a620 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
1a630 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1a640 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1a650 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64  _UTF16 */..#ifnd
1a660 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
1a670 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
1a680 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1a690 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e   now an anachron
1a6a0 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f 20  ism. It used to 
1a6b0 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f 76  be used to recov
1a6c0 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c  er from a.** mal
1a6d0 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20 62  loc() failure, b
1a6e0 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f  ut SQLite now do
1a6f0 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74 69  es this automati
1a700 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cally..*/.int sq
1a710 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63  lite3_global_rec
1a720 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72 65  over(void){.  re
1a730 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a740 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1a750 54 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74  Test to see whet
1a760 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 64  her or not the d
1a770 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1a780 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d  on is in autocom
1a790 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65  mit.** mode.  Re
1a7a0 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
1a7b0 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20  is and FALSE if 
1a7c0 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74  not.  Autocommit
1a7d0 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62   mode is on.** b
1a7e0 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74 6f  y default.  Auto
1a7f0 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62 6c  commit is disabl
1a800 65 64 20 62 79 20 61 20 42 45 47 49 4e 20 73 74  ed by a BEGIN st
1a810 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e  atement and reen
1a820 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  abled.** by the 
1a830 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52  next COMMIT or R
1a840 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20  OLLBACK..*/.int 
1a850 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
1a860 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  commit(sqlite3 *
1a870 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
1a880 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1a890 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1a8a0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1a8b0 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
1a8c0 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
1a8d0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
1a8e0 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
1a8f0 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43  return db->autoC
1a900 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ommit;.}../*.** 
1a910 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
1a920 75 74 69 6e 65 73 20 61 72 65 20 73 75 62 73 74  utines are subst
1a930 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74  itutes for const
1a940 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  ants SQLITE_CORR
1a950 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  UPT,.** SQLITE_M
1a960 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41  ISUSE, SQLITE_CA
1a970 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49  NTOPEN, SQLITE_I
1a980 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c  OERR and possibl
1a990 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a  y other error.**
1a9a0 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65   constants.  The
1a9b0 79 20 73 65 72 76 65 20 74 77 6f 20 70 75 72 70  y serve two purp
1a9c0 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  oses:.**.**   1.
1a9d0 20 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e    Serve as a con
1a9e0 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f  venient place to
1a9f0 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
1aa00 74 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a  t in a debugger.
1aa10 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65  **       to dete
1aa20 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20  ct when version 
1aa30 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73  error conditions
1aa40 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20   occurs..**.**  
1aa50 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69   2.  Invoke sqli
1aa60 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f  te3_log() to pro
1aa70 76 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20  vide the source 
1aa80 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68  code location wh
1aa90 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c  ere.**       a l
1aaa0 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69  ow-level error i
1aab0 73 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64  s first detected
1aac0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1aad0 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74  CorruptError(int
1aae0 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
1aaf0 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
1ab00 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
1ab10 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
1ab20 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  og(SQLITE_CORRUP
1ab30 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
1ab40 20 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75   "database corru
1ab50 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25 64  ption at line %d
1ab60 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20   of [%.10s]",.  
1ab70 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
1ab80 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73  no, 20+sqlite3_s
1ab90 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65  ourceid());.  re
1aba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1abb0 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  UPT;.}.int sqlit
1abc0 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e  e3MisuseError(in
1abd0 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
1abe0 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
1abf0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
1ac00 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
1ac10 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55 53  log(SQLITE_MISUS
1ac20 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
1ac30 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69 6e    "misuse at lin
1ac40 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
1ac50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ac60 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
1ac70 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
1ac80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ac90 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73 71  MISUSE;.}.int sq
1aca0 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72 72  lite3CantopenErr
1acb0 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
1acc0 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1acd0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1ace0 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c  xLog!=0 );.  sql
1acf0 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
1ad00 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20 20  CANTOPEN, .     
1ad10 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
1ad20 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c 69   open file at li
1ad30 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d  ne %d of [%.10s]
1ad40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1ad50 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69   lineno, 20+sqli
1ad60 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b  te3_sourceid());
1ad70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1ad80 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23  _CANTOPEN;.}...#
1ad90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ada0 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
1adb0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f  .** This is a co
1adc0 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e  nvenience routin
1add0 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
1ade0 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61  e that all threa
1adf0 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61  d-specific.** da
1ae00 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65  ta for this thre
1ae10 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c  ad has been deal
1ae20 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  located..**.** S
1ae30 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  QLite no longer 
1ae40 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63  uses thread-spec
1ae50 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69  ific data so thi
1ae60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77  s routine is now
1ae70 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74   a.** no-op.  It
1ae80 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72   is retained for
1ae90 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
1aea0 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f  atibility..*/.vo
1aeb0 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  id sqlite3_threa
1aec0 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b  d_cleanup(void){
1aed0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1aee0 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66   Return meta inf
1aef0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
1af00 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e   specific column
1af10 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74   of a database t
1af20 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  able..** See com
1af30 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e  ment in sqlite3.
1af40 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20  h (sqlite.h.in) 
1af50 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
1af60 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  int sqlite3_tabl
1af70 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
1af80 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  a(.  sqlite3 *db
1af90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1afa0 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
1afb0 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
1afc0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20   char *zDbName, 
1afd0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1afe0 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20  se name or NULL 
1aff0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1b000 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20  *zTableName,    
1b010 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a   /* Table name *
1b020 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1b030 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20  zColumnName,    
1b040 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
1b050 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
1b060 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20  *pzDataType,    
1b070 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61  /* OUTPUT: Decla
1b080 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f  red data type */
1b090 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
1b0a0 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f  pzCollSeq,     /
1b0b0 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74  * OUTPUT: Collat
1b0c0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
1b0d0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74  e */.  int *pNot
1b0e0 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Null,           
1b0f0 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
1b100 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63  ue if NOT NULL c
1b110 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73  onstraint exists
1b120 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d   */.  int *pPrim
1b130 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20  aryKey,         
1b140 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
1b150 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74  e if column part
1b160 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20   of PK */.  int 
1b170 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20  *pAutoinc       
1b180 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
1b190 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
1b1a0 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d  n is auto-increm
1b1b0 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
1b1c0 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
1b1d0 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65  Msg = 0;.  Table
1b1e0 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f   *pTab = 0;.  Co
1b1f0 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a  lumn *pCol = 0;.
1b200 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30 3b 0a    int iCol = 0;.
1b210 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44    char const *zD
1b220 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63  ataType = 0;.  c
1b230 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
1b240 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Seq = 0;.  int n
1b250 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e  otnull = 0;.  in
1b260 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30  t primarykey = 0
1b270 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20  ;.  int autoinc 
1b280 3d 20 30 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51  = 0;...#ifdef SQ
1b290 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1b2a0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1b2b0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1b2c0 6b 28 64 62 29 20 7c 7c 20 7a 54 61 62 6c 65 4e  k(db) || zTableN
1b2d0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
1b2e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
1b2f0 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e  SE_BKPT;.  }.#en
1b300 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  dif..  /* Ensure
1b310 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1b320 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f  hema has been lo
1b330 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  aded */.  sqlite
1b340 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1b350 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69  ->mutex);.  sqli
1b360 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
1b370 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (db);.  rc = sql
1b380 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45  ite3Init(db, &zE
1b390 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 53 51  rrMsg);.  if( SQ
1b3a0 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20  LITE_OK!=rc ){. 
1b3b0 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
1b3c0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  t;.  }..  /* Loc
1b3d0 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
1b3e0 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70   question */.  p
1b3f0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
1b400 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c  dTable(db, zTabl
1b410 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b  eName, zDbName);
1b420 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20  .  if( !pTab || 
1b430 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
1b440 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20  .    pTab = 0;. 
1b450 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
1b460 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  t;.  }..  /* Fin
1b470 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72  d the column for
1b480 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72   which info is r
1b490 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66  equested */.  if
1b4a0 28 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30  ( zColumnName==0
1b4b0 20 29 7b 0a 20 20 20 20 2f 2a 20 51 75 65 72 79   ){.    /* Query
1b4c0 20 66 6f 72 20 65 78 69 73 74 61 6e 63 65 20 6f   for existance o
1b4d0 66 20 74 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a  f table only */.
1b4e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
1b4f0 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
1b500 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
1b510 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20  ){.      pCol = 
1b520 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
1b530 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ];.      if( 0==
1b540 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1b550 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
1b560 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
1b570 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b580 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1b590 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f   iCol==pTab->nCo
1b5a0 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48  l ){.      if( H
1b5b0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26  asRowid(pTab) &&
1b5c0 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
1b5d0 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
1b5e0 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 70          iCol = p
1b5f0 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
1b600 20 20 20 20 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e      pCol = iCol>
1b610 3d 30 20 3f 20 26 70 54 61 62 2d 3e 61 43 6f 6c  =0 ? &pTab->aCol
1b620 5b 69 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20 20  [iCol] : 0;.    
1b630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b640 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20   pTab = 0;.     
1b650 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
1b660 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1b670 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
1b680 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73  ollowing block s
1b690 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20 69  tores the meta i
1b6a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
1b6b0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
1b6c0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  .  ** to the cal
1b6d0 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72  ler in local var
1b6e0 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65  iables zDataType
1b6f0 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e  , zCollSeq, notn
1b700 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a  ull, primarykey.
1b710 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63    ** and autoinc
1b720 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
1b730 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f  there are two po
1b740 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a  ssibilities:.  *
1b750 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54  * .  **     1. T
1b760 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  he specified col
1b770 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77  umn name was row
1b780 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f  id", "oid" or "_
1b790 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20  rowid_" .  **   
1b7a0 20 20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69       and there i
1b7b0 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20  s no explicitly 
1b7c0 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c  declared IPK col
1b7d0 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  umn. .  **.  ** 
1b7e0 20 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65      2. The table
1b7f0 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61   is not a view a
1b800 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  nd the column na
1b810 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e  me identified an
1b820 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78   .  **        ex
1b830 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65  plicitly declare
1b840 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d  d column. Copy m
1b850 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
1b860 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f  from *pCol..  */
1b870 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a   .  if( pCol ){.
1b880 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20      zDataType = 
1b890 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20  pCol->zType;.   
1b8a0 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c   zCollSeq = pCol
1b8b0 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74  ->zColl;.    not
1b8c0 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74  null = pCol->not
1b8d0 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69  Null!=0;.    pri
1b8e0 6d 61 72 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c  marykey  = (pCol
1b8f0 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ->colFlags & COL
1b900 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30  FLAG_PRIMKEY)!=0
1b910 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20  ;.    autoinc = 
1b920 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f  pTab->iPKey==iCo
1b930 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  l && (pTab->tabF
1b940 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
1b950 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d  crement)!=0;.  }
1b960 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54  else{.    zDataT
1b970 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
1b980 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20  .    primarykey 
1b990 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  = 1;.  }.  if( !
1b9a0 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  zCollSeq ){.    
1b9b0 7a 43 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41  zCollSeq = "BINA
1b9c0 52 59 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f  RY";.  }..error_
1b9d0 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74  out:.  sqlite3Bt
1b9e0 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
1b9f0 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74  ..  /* Whether t
1ba00 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  he function call
1ba10 20 73 75 63 63 65 65 64 65 64 20 6f 72 20 66 61   succeeded or fa
1ba20 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75  iled, set the ou
1ba30 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a  tput parameters.
1ba40 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72    ** to whatever
1ba50 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75   their local cou
1ba60 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69  nterparts contai
1ba70 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  n. If an error d
1ba80 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74  id occur,.  ** t
1ba90 68 69 73 20 68 61 73 20 74 68 65 20 65 66 66 65  his has the effe
1baa0 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c  ct of zeroing al
1bab0 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  l output paramet
1bac0 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ers..  */.  if( 
1bad0 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a  pzDataType ) *pz
1bae0 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61  DataType = zData
1baf0 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f  Type;.  if( pzCo
1bb00 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53  llSeq ) *pzCollS
1bb10 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20  eq = zCollSeq;. 
1bb20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20   if( pNotNull ) 
1bb30 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e  *pNotNull = notn
1bb40 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d  ull;.  if( pPrim
1bb50 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61  aryKey ) *pPrima
1bb60 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b  ryKey = primaryk
1bb70 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69  ey;.  if( pAutoi
1bb80 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d  nc ) *pAutoinc =
1bb90 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28   autoinc;..  if(
1bba0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26   SQLITE_OK==rc &
1bbb0 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73  & !pTab ){.    s
1bbc0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1bbd0 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a   zErrMsg);.    z
1bbe0 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
1bbf0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20  MPrintf(db, "no 
1bc00 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d  such table colum
1bc10 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c  n: %s.%s", zTabl
1bc20 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a  eName,.        z
1bc30 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20  ColumnName);.   
1bc40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1bc50 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OR;.  }.  sqlite
1bc60 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
1bc70 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22  , rc, (zErrMsg?"
1bc80 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29  %s":0), zErrMsg)
1bc90 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1bca0 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  e(db, zErrMsg);.
1bcb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
1bcc0 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
1bcd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1bce0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1bcf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bd00 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
1bd10 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
1bd20 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
1bd30 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
1bd40 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1bd50 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b  3_sleep(int ms){
1bd60 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1bd70 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pVfs;.  int rc;.
1bd80 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33    pVfs = sqlite3
1bd90 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
1bda0 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65  if( pVfs==0 ) re
1bdb0 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  turn 0;..  /* Th
1bdc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  is function work
1bdd0 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  s in millisecond
1bde0 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65 72  s, but the under
1bdf0 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20  lying OsSleep() 
1be00 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d  .  ** API uses m
1be10 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e  icroseconds. Hen
1be20 63 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20  ce the 1000's.. 
1be30 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69   */.  rc = (sqli
1be40 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c  te3OsSleep(pVfs,
1be50 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b   1000*ms)/1000);
1be60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1be70 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72  ./*.** Enable or
1be80 20 64 69 73 61 62 6c 65 20 74 68 65 20 65 78 74   disable the ext
1be90 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64  ended result cod
1bea0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
1beb0 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
1bec0 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33  lt_codes(sqlite3
1bed0 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29   *db, int onoff)
1bee0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1bef0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1bf00 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1bf10 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1bf20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1bf30 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
1bf40 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
1bf50 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1bf60 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72  utex);.  db->err
1bf70 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30  Mask = onoff ? 0
1bf80 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66 66  xffffffff : 0xff
1bf90 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1bfa0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1bfb0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
1bfc0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1bfd0 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c   Invoke the xFil
1bfe0 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20  eControl method 
1bff0 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
1c000 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
1c010 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
1c020 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64  ntrol(sqlite3 *d
1c030 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1c040 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20  DbName, int op, 
1c050 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69  void *pArg){.  i
1c060 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
1c070 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70  RROR;.  Btree *p
1c080 42 74 72 65 65 3b 0a 0a 23 69 66 64 65 66 20 53  Btree;..#ifdef S
1c090 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1c0a0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1c0b0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1c0c0 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
1c0d0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1c0e0 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
1c0f0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1c100 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
1c110 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  Btree = sqlite3D
1c120 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
1c130 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28   zDbName);.  if(
1c140 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50   pBtree ){.    P
1c150 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
1c160 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1c170 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  fd;.    sqlite3B
1c180 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1c190 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  );.    pPager = 
1c1a0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
1c1b0 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61  r(pBtree);.    a
1c1c0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
1c1d0 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c   );.    fd = sql
1c1e0 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50  ite3PagerFile(pP
1c1f0 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
1c200 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20  t( fd!=0 );.    
1c210 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46  if( op==SQLITE_F
1c220 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  CNTL_FILE_POINTE
1c230 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c  R ){.      *(sql
1c240 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67  ite3_file**)pArg
1c250 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20   = fd;.      rc 
1c260 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1c270 20 7d 65 6c 73 65 20 69 66 28 20 66 64 2d 3e 70   }else if( fd->p
1c280 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
1c290 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1c2a0 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f  ileControl(fd, o
1c2b0 70 2c 20 70 41 72 67 29 3b 0a 23 69 66 6e 64 65  p, pArg);.#ifnde
1c2c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1c2d0 4c 0a 20 20 20 20 20 20 69 66 28 20 28 72 63 3d  L.      if( (rc=
1c2e0 3d 53 51 4c 49 54 45 5f 4f 4b 29 26 26 28 6f 70  =SQLITE_OK)&&(op
1c2f0 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  ==SQLITE_FCNTL_L
1c300 41 53 54 5f 45 52 52 4e 4f 29 26 26 28 2a 28 69  AST_ERRNO)&&(*(i
1c310 6e 74 20 2a 29 70 41 72 67 3d 3d 30 29 20 29 7b  nt *)pArg==0) ){
1c320 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c330 5f 66 69 6c 65 20 2a 70 57 61 6c 46 64 20 3d 20  _file *pWalFd = 
1c340 73 71 6c 69 74 65 33 50 61 67 65 72 57 61 6c 46  sqlite3PagerWalF
1c350 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ile(pPager);.   
1c360 20 20 20 20 20 69 66 28 20 70 57 61 6c 46 64 26       if( pWalFd&
1c370 26 28 70 57 61 6c 46 64 2d 3e 70 4d 65 74 68 6f  &(pWalFd->pMetho
1c380 64 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ds) ){.         
1c390 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1c3a0 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 57 61 6c 46  ileControl(pWalF
1c3b0 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20  d, op, pArg);.  
1c3c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c3d0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1c3e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1c3f0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
1c400 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
1c410 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
1c420 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1c430 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20  Error(db, rc);. 
1c440 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1c450 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1c460 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c470 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
1c480 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20   to the testing 
1c490 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71  logic..*/.int sq
1c4a0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1c4b0 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  ol(int op, ...){
1c4c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23  .  int rc = 0;.#
1c4d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
1c4e0 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20  T_BUILTIN_TEST. 
1c4f0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1c500 52 28 6f 70 29 3b 0a 23 65 6c 73 65 0a 20 20 76  R(op);.#else.  v
1c510 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f  a_list ap;.  va_
1c520 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
1c530 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a   switch( op ){..
1c540 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61      /*.    ** Sa
1c550 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ve the current s
1c560 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47  tate of the PRNG
1c570 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1c580 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1c590 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20  L_PRNG_SAVE: {. 
1c5a0 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67       sqlite3Prng
1c5b0 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20  SaveState();.   
1c5c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c5d0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
1c5e0 65 73 74 6f 72 65 20 74 68 65 20 73 74 61 74 65  estore the state
1c5f0 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20   of the PRNG to 
1c600 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 20 73  the last state s
1c610 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a  aved using.    *
1c620 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66  * PRNG_SAVE.  If
1c630 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e   PRNG_SAVE has n
1c640 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e  ever before been
1c650 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20   called, then.  
1c660 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61    ** this verb a
1c670 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45  cts like PRNG_RE
1c680 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  SET..    */.    
1c690 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1c6a0 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52  CTRL_PRNG_RESTOR
1c6b0 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1c6c0 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61  e3PrngRestoreSta
1c6d0 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
1c6e0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1c6f0 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68  .    ** Reset th
1c700 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69  e PRNG back to i
1c710 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ts uninitialized
1c720 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78   state.  The nex
1c730 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
1c740 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
1c750 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65  ess() will resee
1c760 64 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67  d the PRNG using
1c770 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20   a single call. 
1c780 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61     ** to the xRa
1c790 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20  ndomness method 
1c7a0 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  of the default V
1c7b0 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  FS..    */.    c
1c7c0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1c7d0 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20  TRL_PRNG_RESET: 
1c7e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1c7f0 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b  randomness(0,0);
1c800 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c810 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1c820 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
1c830 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f  _control(BITVEC_
1c840 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67  TEST, size, prog
1c850 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ram).    **.    
1c860 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61 67  ** Run a test ag
1c870 61 69 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f  ainst a Bitvec o
1c880 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20  bject of size.  
1c890 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75  The program argu
1c8a0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61  ment.    ** is a
1c8b0 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67  n array of integ
1c8c0 65 72 73 20 74 68 61 74 20 64 65 66 69 6e 65 73  ers that defines
1c8d0 20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74 75   the test.  Retu
1c8e0 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a  rn -1 on a.    *
1c8f0 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  * memory allocat
1c900 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20  ion error, 0 on 
1c910 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d  success, or non-
1c920 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f  zero for an erro
1c930 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68  r..    ** See th
1c940 65 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42  e sqlite3BitvecB
1c950 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72  uiltinTest() for
1c960 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1c970 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
1c980 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c990 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f  TESTCTRL_BITVEC_
1c9a0 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  TEST: {.      in
1c9b0 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  t sz = va_arg(ap
1c9c0 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e  , int);.      in
1c9d0 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72  t *aProg = va_ar
1c9e0 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20  g(ap, int*);.   
1c9f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1ca00 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74  itvecBuiltinTest
1ca10 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20  (sz, aProg);.   
1ca20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ca30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1ca40 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1ca50 74 72 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41  trol(FAULT_INSTA
1ca60 4c 4c 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20  LL, xCallback). 
1ca70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72     **.    ** Arr
1ca80 61 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78  ange to invoke x
1ca90 43 61 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e 65  Callback() whene
1caa0 76 65 72 20 73 71 6c 69 74 65 33 46 61 75 6c 74  ver sqlite3Fault
1cab0 53 69 6d 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  Sim() is called,
1cac0 0a 20 20 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c  .    ** if xCall
1cad0 62 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  back is not NULL
1cae0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1caf0 41 73 20 61 20 74 65 73 74 20 6f 66 20 74 68 65  As a test of the
1cb00 20 66 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72   fault simulator
1cb10 20 6d 65 63 68 61 6e 69 73 6d 20 69 74 73 65 6c   mechanism itsel
1cb20 66 2c 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53  f, sqlite3FaultS
1cb30 69 6d 28 30 29 0a 20 20 20 20 2a 2a 20 69 73 20  im(0).    ** is 
1cb40 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65  called immediate
1cb50 6c 79 20 61 66 74 65 72 20 69 6e 73 74 61 6c 6c  ly after install
1cb60 69 6e 67 20 74 68 65 20 6e 65 77 20 63 61 6c 6c  ing the new call
1cb70 62 61 63 6b 20 61 6e 64 20 74 68 65 20 72 65 74  back and the ret
1cb80 75 72 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  urn.    ** value
1cb90 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 46 61 75   from sqlite3Fau
1cba0 6c 74 53 69 6d 28 30 29 20 62 65 63 6f 6d 65 73  ltSim(0) becomes
1cbb0 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d   the return from
1cbc0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
1cbd0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a  test_control()..
1cbe0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1cbf0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1cc00 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b  FAULT_INSTALL: {
1cc10 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69  .      /* MSVC i
1cc20 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75  s picky about pu
1cc30 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20  lling func ptrs 
1cc40 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20  from va lists.. 
1cc50 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73       ** http://s
1cc60 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74  upport.microsoft
1cc70 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20  .com/kb/47961.  
1cc80 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c      ** sqlite3Gl
1cc90 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74  obalConfig.xTest
1cca0 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72  Callback = va_ar
1ccb0 67 28 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74  g(ap, int(*)(int
1ccc0 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ));.      */.   
1ccd0 20 20 20 74 79 70 65 64 65 66 20 69 6e 74 28 2a     typedef int(*
1cce0 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43  TESTCALLBACKFUNC
1ccf0 5f 74 29 28 69 6e 74 29 3b 0a 20 20 20 20 20 20  _t)(int);.      
1cd00 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1cd10 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63  fig.xTestCallbac
1cd20 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 54  k = va_arg(ap, T
1cd30 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f  ESTCALLBACKFUNC_
1cd40 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
1cd50 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30  qlite3FaultSim(0
1cd60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1cd70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1cd80 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1cd90 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47  st_control(BENIG
1cda0 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20  N_MALLOC_HOOKS, 
1cdb0 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20  xBegin, xEnd).  
1cdc0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69    **.    ** Regi
1cdd0 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61  ster hooks to ca
1cde0 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  ll to indicate w
1cdf0 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61  hich malloc() fa
1ce00 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61  ilures .    ** a
1ce10 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a  re benign..    *
1ce20 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1ce30 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47  E_TESTCTRL_BENIG
1ce40 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20  N_MALLOC_HOOKS: 
1ce50 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20  {.      typedef 
1ce60 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63  void (*void_func
1ce70 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20  tion)(void);.   
1ce80 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e     void_function
1ce90 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20   xBenignBegin;. 
1cea0 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69       void_functi
1ceb0 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20  on xBenignEnd;. 
1cec0 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69       xBenignBegi
1ced0 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  n = va_arg(ap, v
1cee0 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20  oid_function);. 
1cef0 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20       xBenignEnd 
1cf00 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
1cf10 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20  d_function);.   
1cf20 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e     sqlite3Benign
1cf30 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e  MallocHooks(xBen
1cf40 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67  ignBegin, xBenig
1cf50 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65  nEnd);.      bre
1cf60 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1cf70 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1cf80 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1cf90 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
1cfa0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73  ENDING_BYTE, uns
1cfb0 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20  igned int X).   
1cfc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74   **.    ** Set t
1cfd0 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20  he PENDING byte 
1cfe0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  to the value in 
1cff0 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66  the argument, if
1d000 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b   X>0..    ** Mak
1d010 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
1d020 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68  X==0.  Return th
1d030 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70  e value of the p
1d040 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20  ending byte.    
1d050 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74 69 6e  ** as it existin
1d060 67 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  g before this ro
1d070 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
1d080 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1d090 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e  IMPORTANT:  Chan
1d0a0 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47  ging the PENDING
1d0b0 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30   byte from 0x400
1d0c0 30 30 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e  00000 results in
1d0d0 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d  .    ** an incom
1d0e0 70 61 74 69 62 6c 65 20 64 61 74 61 62 61 73 65  patible database
1d0f0 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43   file format.  C
1d100 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44  hanging the PEND
1d110 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  ING byte.    ** 
1d120 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61  while any databa
1d130 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  se connection is
1d140 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e   open results in
1d150 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20   undefined and. 
1d160 20 20 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f 75     ** deleteriou
1d170 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20  s behavior..    
1d180 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1d190 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
1d1a0 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20  ING_BYTE: {.    
1d1b0 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42    rc = PENDING_B
1d1c0 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  YTE;.#ifndef SQL
1d1d0 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20  ITE_OMIT_WSD.   
1d1e0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73     {.        uns
1d1f0 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c  igned int newVal
1d200 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e   = va_arg(ap, un
1d210 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20  signed int);.   
1d220 20 20 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20       if( newVal 
1d230 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67  ) sqlite3Pending
1d240 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20  Byte = newVal;. 
1d250 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1d260 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d270 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1d280 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1d290 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1d2a0 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e  TCTRL_ASSERT, in
1d2b0 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
1d2c0 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70  ** This action p
1d2d0 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69  rovides a run-ti
1d2e0 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 77  me test to see w
1d2f0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20  hether or not.  
1d300 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61    ** assert() wa
1d310 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  s enabled at com
1d320 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58  pile-time.  If X
1d330 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 73 73   is true and ass
1d340 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20  ert().    ** is 
1d350 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  enabled, then th
1d360 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1d370 73 20 74 72 75 65 2e 20 20 49 66 20 58 20 69 73  s true.  If X is
1d380 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a   true and.    **
1d390 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
1d3a0 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
1d3b0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1d3c0 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20  zero.  If X is. 
1d3d0 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20     ** false and 
1d3e0 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62  assert() is enab
1d3f0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73  led, then the as
1d400 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e  sertion fires an
1d410 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f  d the.    ** pro
1d420 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66  cess aborts.  If
1d430 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20   X is false and 
1d440 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61  assert() is disa
1d450 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20  bled, then the. 
1d460 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c     ** return val
1d470 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20  ue is zero..    
1d480 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1d490 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
1d4a0 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61  RT: {.      vola
1d4b0 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a  tile int x = 0;.
1d4c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 78        assert( (x
1d4d0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
1d4e0 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ))!=0 );.      r
1d4f0 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65  c = x;.      bre
1d500 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ak;.    }...    
1d510 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1d520 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1d530 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1d540 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20  ALWAYS, int X). 
1d550 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
1d560 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  s action provide
1d570 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  s a run-time tes
1d580 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65  t to see how the
1d590 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20   ALWAYS and.    
1d5a0 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20  ** NEVER macros 
1d5b0 77 65 72 65 20 64 65 66 69 6e 65 64 20 61 74 20  were defined at 
1d5c0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20  compile-time..  
1d5d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1d5e0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1d5f0 41 4c 57 41 59 53 28 58 29 2e 20 20 0a 20 20 20  ALWAYS(X).  .   
1d600 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
1d610 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20  ecommended test 
1d620 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65  is X==2.  If the
1d630 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1d640 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20   2, that means. 
1d650 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61     ** ALWAYS() a
1d660 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 62  nd NEVER() are b
1d670 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74  oth no-op pass-t
1d680 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77  hrough macros, w
1d690 68 69 63 68 20 69 73 20 74 68 65 0a 20 20 20 20  hich is the.    
1d6a0 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  ** default setti
1d6b0 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65 74 75  ng.  If the retu
1d6c0 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74  rn value is 1, t
1d6d0 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20  hen ALWAYS() is 
1d6e0 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61  either.    ** ha
1d6f0 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65  rd-coded to true
1d700 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73 73 65   or else it asse
1d710 72 74 73 20 69 66 20 69 74 73 20 61 72 67 75 6d  rts if its argum
1d720 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  ent is false..  
1d730 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62    ** The first b
1d740 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f  ehavior (hard-co
1d750 64 65 64 20 74 6f 20 74 72 75 65 29 20 69 73 20  ded to true) is 
1d760 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20  the case if.    
1d770 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ** SQLITE_TESTCT
1d780 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20  RL_ASSERT shows 
1d790 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73  that assert() is
1d7a0 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68   disabled and th
1d7b0 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20  e second.    ** 
1d7c0 62 65 68 61 76 69 6f 72 20 28 61 73 73 65 72 74  behavior (assert
1d7d0 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   if the argument
1d7e0 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20   to ALWAYS() is 
1d7f0 66 61 6c 73 65 29 20 69 73 20 74 68 65 20 63 61  false) is the ca
1d800 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c  se if.    ** SQL
1d810 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1d820 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61  ERT shows that a
1d830 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c  ssert() is enabl
1d840 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
1d850 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74  * The run-time t
1d860 65 73 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69  est procedure mi
1d870 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69  ght look somethi
1d880 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ng like this:.  
1d890 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69    **.    **    i
1d8a0 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  f( sqlite3_test_
1d8b0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1d8c0 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20  ESTCTRL_ALWAYS, 
1d8d0 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20  2)==2 ){.    ** 
1d8e0 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29       // ALWAYS()
1d8f0 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65   and NEVER() are
1d900 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
1d910 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a  ugh macros.    *
1d920 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  *    }else if( s
1d930 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1d940 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1d950 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29  TRL_ASSERT, 1) )
1d960 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
1d970 20 41 4c 57 41 59 53 28 78 29 20 61 73 73 65 72   ALWAYS(x) asser
1d980 74 73 20 74 68 61 74 20 78 20 69 73 20 74 72 75  ts that x is tru
1d990 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73 73 65  e. NEVER(x) asse
1d9a0 72 74 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a  rts x is false..
1d9b0 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b      **    }else{
1d9c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
1d9d0 41 4c 57 41 59 53 28 78 29 20 69 73 20 61 20 63  ALWAYS(x) is a c
1d9e0 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45  onstant 1.  NEVE
1d9f0 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61  R(x) is a consta
1da00 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20  nt 0..    **    
1da10 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  }.    */.    cas
1da20 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1da30 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20  L_ALWAYS: {.    
1da40 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67    int x = va_arg
1da50 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
1da60 72 63 20 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a  rc = ALWAYS(x);.
1da70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1da80 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1da90 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1daa0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1dab0 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44  TESTCTRL_BYTEORD
1dac0 45 52 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ER);.    **.    
1dad0 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 72  ** The integer r
1dae0 65 74 75 72 6e 65 64 20 72 65 76 65 61 6c 73 20  eturned reveals 
1daf0 74 68 65 20 62 79 74 65 2d 6f 72 64 65 72 20 6f  the byte-order o
1db00 66 20 74 68 65 20 63 6f 6d 70 75 74 65 72 20 6f  f the computer o
1db10 6e 20 77 68 69 63 68 0a 20 20 20 20 2a 2a 20 53  n which.    ** S
1db20 51 4c 69 74 65 20 69 73 20 72 75 6e 6e 69 6e 67  QLite is running
1db30 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1db40 20 20 20 20 20 20 31 20 20 20 20 20 62 69 67 2d        1     big-
1db50 65 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72  endian,    deter
1db60 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d  mined at run-tim
1db70 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 31 30  e.    **      10
1db80 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69       little-endi
1db90 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61  an, determined a
1dba0 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a  t run-time.    *
1dbb0 2a 20 20 34 33 32 31 30 31 20 20 20 20 20 62 69  *  432101     bi
1dbc0 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65 74  g-endian,    det
1dbd0 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69  ermined at compi
1dbe0 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20  le-time.    **  
1dbf0 31 32 33 34 31 30 20 20 20 20 20 6c 69 74 74 6c  123410     littl
1dc00 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d  e-endian, determ
1dc10 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
1dc20 74 69 6d 65 0a 20 20 20 20 2a 2f 20 0a 20 20 20  time.    */ .   
1dc30 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1dc40 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a  TCTRL_BYTEORDER:
1dc50 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   {.      rc = SQ
1dc60 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52 2a 31  LITE_BYTEORDER*1
1dc70 30 30 20 2b 20 53 51 4c 49 54 45 5f 4c 49 54 54  00 + SQLITE_LITT
1dc80 4c 45 45 4e 44 49 41 4e 2a 31 30 20 2b 20 53 51  LEENDIAN*10 + SQ
1dc90 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e 3b 0a  LITE_BIGENDIAN;.
1dca0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dcb0 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
1dcc0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1dcd0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1dce0 4c 5f 52 45 53 45 52 56 45 2c 20 73 71 6c 69 74  L_RESERVE, sqlit
1dcf0 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20  e3 *db, int N). 
1dd00 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
1dd10 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 69   the nReserve si
1dd20 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74 68 65 20  ze to N for the 
1dd30 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e  main database on
1dd40 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1dd50 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20    ** connection 
1dd60 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  db..    */.    c
1dd70 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1dd80 54 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20  TRL_RESERVE: {. 
1dd90 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
1dda0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
1ddb0 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 69  lite3*);.      i
1ddc0 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
1ddd0 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ,int);.      sql
1dde0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1ddf0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
1de00 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
1de10 65 74 50 61 67 65 53 69 7a 65 28 64 62 2d 3e 61  etPageSize(db->a
1de20 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c  Db[0].pBt, 0, x,
1de30 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1de40 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
1de50 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
1de60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1de70 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74     /*  sqlite3_t
1de80 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1de90 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
1dea0 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74  MIZATIONS, sqlit
1deb0 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20  e3 *db, int N). 
1dec0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61     **.    ** Ena
1ded0 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 76  ble or disable v
1dee0 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
1def0 69 6f 6e 73 20 66 6f 72 20 74 65 73 74 69 6e 67  ions for testing
1df00 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20   purposes.  The 
1df10 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74  .    ** argument
1df20 20 4e 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20   N is a bitmask 
1df30 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  of optimizations
1df40 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e   to be disabled.
1df50 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20    For normal.   
1df60 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20   ** operation N 
1df70 73 68 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68  should be 0.  Th
1df80 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 61  e idea is that a
1df90 20 74 65 73 74 20 70 72 6f 67 72 61 6d 20 28 6c   test program (l
1dfa0 69 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53  ike the.    ** S
1dfb0 51 4c 20 4c 6f 67 69 63 20 54 65 73 74 20 6f 72  QL Logic Test or
1dfc0 20 53 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c 65   SLT test module
1dfd0 29 20 63 61 6e 20 72 75 6e 20 74 68 65 20 73 61  ) can run the sa
1dfe0 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20  me SQL multiple 
1dff0 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69 74  times.    ** wit
1e000 68 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69  h various optimi
1e010 7a 61 74 69 6f 6e 73 20 64 69 73 61 62 6c 65 64  zations disabled
1e020 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
1e030 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a  the same answer.
1e040 20 20 20 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e      ** is obtain
1e050 65 64 20 69 6e 20 65 76 65 72 79 20 63 61 73 65  ed in every case
1e060 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1e070 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1e080 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a  L_OPTIMIZATIONS:
1e090 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1e0a0 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70   *db = va_arg(ap
1e0b0 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  , sqlite3*);.   
1e0c0 20 20 20 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67     db->dbOptFlag
1e0d0 73 20 3d 20 28 75 31 36 29 28 76 61 5f 61 72 67  s = (u16)(va_arg
1e0e0 28 61 70 2c 20 69 6e 74 29 20 26 20 30 78 66 66  (ap, int) & 0xff
1e0f0 66 66 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ff);.      break
1e100 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
1e110 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44  SQLITE_N_KEYWORD
1e120 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
1e130 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1e140 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b  ITE_TESTCTRL_ISK
1e150 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68  EYWORD, const ch
1e160 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a  ar *zWord).    *
1e170 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72  *.    ** If zWor
1e180 64 20 69 73 20 61 20 6b 65 79 77 6f 72 64 20 72  d is a keyword r
1e190 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 74 68 65  ecognized by the
1e1a0 20 70 61 72 73 65 72 2c 20 74 68 65 6e 20 72 65   parser, then re
1e1b0 74 75 72 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  turn the.    ** 
1e1c0 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 77 6f 72  number of keywor
1e1d0 64 73 2e 20 20 4f 72 20 69 66 20 7a 57 6f 72 64  ds.  Or if zWord
1e1e0 20 69 73 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72   is not a keywor
1e1f0 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 20  d, return 0..   
1e200 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54 68 69 73   ** .    ** This
1e210 20 74 65 73 74 20 66 65 61 74 75 72 65 20 69 73   test feature is
1e220 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
1e230 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74  in the amalgamat
1e240 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a  ion since.    **
1e250 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45   the SQLITE_N_KE
1e260 59 57 4f 52 44 20 6d 61 63 72 6f 20 69 73 20 6e  YWORD macro is n
1e270 6f 74 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  ot defined in th
1e280 69 73 20 66 69 6c 65 20 69 66 20 53 51 4c 69 74  is file if SQLit
1e290 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 75 69 6c  e.    ** is buil
1e2a0 74 20 75 73 69 6e 67 20 73 65 70 61 72 61 74 65  t using separate
1e2b0 20 73 6f 75 72 63 65 20 66 69 6c 65 73 2e 0a 20   source files.. 
1e2c0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1e2d0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
1e2e0 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20  SKEYWORD: {.    
1e2f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57    const char *zW
1e300 6f 72 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ord = va_arg(ap,
1e310 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20   const char*);. 
1e320 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
1e330 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f  ite3Strlen30(zWo
1e340 72 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rd);.      rc = 
1e350 28 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43  (sqlite3KeywordC
1e360 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20  ode((u8*)zWord, 
1e370 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c  n)!=TK_ID) ? SQL
1e380 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20  ITE_N_KEYWORD : 
1e390 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1e3a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20      }.#endif .. 
1e3b0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
1e3c0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1e3d0 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54  E_TESTCTRL_SCRAT
1e3e0 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70  CHMALLOC, sz, &p
1e3f0 4e 65 77 2c 20 70 46 72 65 65 29 3b 0a 20 20 20  New, pFree);.   
1e400 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73 20   **.    ** Pass 
1e410 70 46 72 65 65 20 69 6e 74 6f 20 73 71 6c 69 74  pFree into sqlit
1e420 65 33 53 63 72 61 74 63 68 46 72 65 65 28 29 2e  e3ScratchFree().
1e430 20 0a 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30   .    ** If sz>0
1e440 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61   then allocate a
1e450 20 73 63 72 61 74 63 68 20 62 75 66 66 65 72 20   scratch buffer 
1e460 69 6e 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20  into pNew.  .   
1e470 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1e480 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52  ITE_TESTCTRL_SCR
1e490 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  ATCHMALLOC: {.  
1e4a0 20 20 20 20 76 6f 69 64 20 2a 70 46 72 65 65 2c      void *pFree,
1e4b0 20 2a 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20 20   **ppNew;.      
1e4c0 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a  int sz;.      sz
1e4d0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1e4e0 74 29 3b 0a 20 20 20 20 20 20 70 70 4e 65 77 20  t);.      ppNew 
1e4f0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
1e500 64 2a 2a 29 3b 0a 20 20 20 20 20 20 70 46 72 65  d**);.      pFre
1e510 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  e = va_arg(ap, v
1e520 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 66 28  oid*);.      if(
1e530 20 73 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20 73   sz ) *ppNew = s
1e540 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c  qlite3ScratchMal
1e550 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 73  loc(sz);.      s
1e560 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
1e570 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  e(pFree);.      
1e580 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1e590 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1e5a0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1e5b0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
1e5c0 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74  LTIME_FAULT, int
1e5d0 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a   onoff);.    **.
1e5e0 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65      ** If parame
1e5f0 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e  ter onoff is non
1e600 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65  -zero, configure
1e610 20 74 68 65 20 77 72 61 70 70 65 72 73 20 73 6f   the wrappers so
1e620 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a   that all.    **
1e630 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
1e640 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29  s to localtime()
1e650 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20 66 61   and variants fa
1e660 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73 20  il. If onoff is 
1e670 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64  zero,.    ** und
1e680 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e 0a  o this setting..
1e690 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1e6a0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e6b0 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a  LOCALTIME_FAULT:
1e6c0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1e6d0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f  GlobalConfig.bLo
1e6e0 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20 76  caltimeFault = v
1e6f0 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
1e700 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e710 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
1e720 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1e730 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1e740 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c  L_NEVER_CORRUPT,
1e750 20 69 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20   int);.    **.  
1e760 20 20 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61    ** Set or clea
1e770 72 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e  r a flag that in
1e780 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1e790 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1e7a0 73 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20  s always well-. 
1e7b0 20 20 20 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64     ** formed and
1e7c0 20 6e 65 76 65 72 20 63 6f 72 72 75 70 74 2e 20   never corrupt. 
1e7d0 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 63 6c   This flag is cl
1e7e0 65 61 72 20 62 79 20 64 65 66 61 75 6c 74 2c 20  ear by default, 
1e7f0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 0a  indicating that.
1e800 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1e810 66 69 6c 65 73 20 6d 69 67 68 74 20 68 61 76 65  files might have
1e820 20 61 72 62 69 74 72 61 72 79 20 63 6f 72 72 75   arbitrary corru
1e830 70 74 69 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20  ption.  Setting 
1e840 74 68 65 20 66 6c 61 67 20 64 75 72 69 6e 67 0a  the flag during.
1e850 20 20 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 63      ** testing c
1e860 61 75 73 65 73 20 63 65 72 74 61 69 6e 20 61 73  auses certain as
1e870 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1e880 73 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 6f  s in the code to
1e890 20 62 65 20 61 63 74 69 76 61 74 65 64 0a 20 20   be activated.  
1e8a0 20 20 2a 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73    ** that demons
1e8b0 74 72 61 74 20 69 6e 76 61 72 69 61 6e 74 73 20  trat invariants 
1e8c0 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  on well-formed d
1e8d0 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 20  atabase files.. 
1e8e0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1e8f0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
1e900 45 56 45 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a  EVER_CORRUPT: {.
1e910 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1e920 62 61 6c 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43  balConfig.neverC
1e930 6f 72 72 75 70 74 20 3d 20 76 61 5f 61 72 67 28  orrupt = va_arg(
1e940 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1e950 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20  break;.    }... 
1e960 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1e970 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1e980 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42  ITE_TESTCTRL_VDB
1e990 45 5f 43 4f 56 45 52 41 47 45 2c 20 78 43 61 6c  E_COVERAGE, xCal
1e9a0 6c 62 61 63 6b 2c 20 70 74 72 29 3b 0a 20 20 20  lback, ptr);.   
1e9b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74   **.    ** Set t
1e9c0 68 65 20 56 44 42 45 20 63 6f 76 65 72 61 67 65  he VDBE coverage
1e9d0 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
1e9e0 6f 6e 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 20  on to xCallback 
1e9f0 77 69 74 68 20 63 6f 6e 74 65 78 74 20 0a 20 20  with context .  
1ea00 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 70 74 72    ** pointer ptr
1ea10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1ea20 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1ea30 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 3a  L_VDBE_COVERAGE:
1ea40 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   {.#ifdef SQLITE
1ea50 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20  _VDBE_COVERAGE. 
1ea60 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
1ea70 64 20 28 2a 62 72 61 6e 63 68 5f 63 61 6c 6c 62  d (*branch_callb
1ea80 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 75  ack)(void*,int,u
1ea90 38 2c 75 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  8,u8);.      sql
1eaa0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1eab0 2e 78 56 64 62 65 42 72 61 6e 63 68 20 3d 20 76  .xVdbeBranch = v
1eac0 61 5f 61 72 67 28 61 70 2c 62 72 61 6e 63 68 5f  a_arg(ap,branch_
1ead0 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20  callback);.     
1eae0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1eaf0 6e 66 69 67 2e 70 56 64 62 65 42 72 61 6e 63 68  nfig.pVdbeBranch
1eb00 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Arg = va_arg(ap,
1eb10 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20  void*);.#endif. 
1eb20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1eb30 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
1eb40 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1eb50 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1eb60 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62  _SORTER_MMAP, db
1eb70 2c 20 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20 20 20  , nMax); */.    
1eb80 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1eb90 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50  CTRL_SORTER_MMAP
1eba0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1ebb0 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61  3 *db = va_arg(a
1ebc0 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  p, sqlite3*);.  
1ebd0 20 20 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74      db->nMaxSort
1ebe0 65 72 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  erMmap = va_arg(
1ebf0 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1ec00 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1ec10 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1ec20 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1ec30 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e  TE_TESTCTRL_ISIN
1ec40 49 54 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  IT);.    **.    
1ec50 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1ec60 5f 4f 4b 20 69 66 20 53 51 4c 69 74 65 20 68 61  _OK if SQLite ha
1ec70 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  s been initializ
1ec80 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 45 52  ed and SQLITE_ER
1ec90 52 4f 52 20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f  ROR if.    ** no
1eca0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
1ecb0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1ecc0 52 4c 5f 49 53 49 4e 49 54 3a 20 7b 0a 20 20 20  RL_ISINIT: {.   
1ecd0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
1ece0 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69  obalConfig.isIni
1ecf0 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  t==0 ) rc = SQLI
1ed00 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
1ed10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1ed20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    /*  sqlite3_te
1ed30 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1ed40 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
1ed50 54 45 52 2c 20 64 62 2c 20 64 62 4e 61 6d 65 2c  TER, db, dbName,
1ed60 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a 20   onOff, tnum);. 
1ed70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
1ed80 73 20 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20 69  s test control i
1ed90 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  s used to create
1eda0 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73   imposter tables
1edb0 2e 20 20 22 64 62 22 20 69 73 20 61 20 70 6f 69  .  "db" is a poi
1edc0 6e 74 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74  nter.    ** to t
1edd0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1ede0 65 63 74 69 6f 6e 2e 20 20 64 62 4e 61 6d 65 20  ection.  dbName 
1edf0 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
1ee00 6e 61 6d 65 20 28 65 78 3a 20 22 6d 61 69 6e 22  name (ex: "main"
1ee10 20 6f 72 0a 20 20 20 20 2a 2a 20 22 74 65 6d 70   or.    ** "temp
1ee20 22 29 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65  ") which will re
1ee30 63 65 69 76 65 20 74 68 65 20 69 6d 70 6f 73 74  ceive the impost
1ee40 65 72 2e 20 20 22 6f 6e 4f 66 66 22 20 74 75 72  er.  "onOff" tur
1ee50 6e 73 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65  ns imposter mode
1ee60 20 6f 6e 0a 20 20 20 20 2a 2a 20 6f 72 20 6f 66   on.    ** or of
1ee70 66 2e 20 20 22 74 6e 75 6d 22 20 69 73 20 74 68  f.  "tnum" is th
1ee80 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1ee90 68 65 20 62 2d 74 72 65 65 20 74 6f 20 77 68 69  he b-tree to whi
1eea0 63 68 20 74 68 65 20 69 6d 70 6f 73 74 65 72 0a  ch the imposter.
1eeb0 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73 68 6f      ** table sho
1eec0 75 6c 64 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20  uld connect..   
1eed0 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c   **.    ** Enabl
1eee0 65 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20  e imposter mode 
1eef0 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 20 73 63  only when the sc
1ef00 68 65 6d 61 20 68 61 73 20 61 6c 72 65 61 64 79  hema has already
1ef10 20 62 65 65 6e 20 70 61 72 73 65 64 2e 20 20 54   been parsed.  T
1ef20 68 65 6e 0a 20 20 20 20 2a 2a 20 72 75 6e 20 61  hen.    ** run a
1ef30 20 73 69 6e 67 6c 65 20 43 52 45 41 54 45 20 54   single CREATE T
1ef40 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 74  ABLE statement t
1ef50 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
1ef60 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 69  imposter table i
1ef70 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 72  n.    ** the par
1ef80 73 65 64 20 73 63 68 65 6d 61 2e 20 20 54 68 65  sed schema.  The
1ef90 6e 20 74 75 72 6e 20 69 6d 70 6f 73 74 65 72 20  n turn imposter 
1efa0 6d 6f 64 65 20 62 61 63 6b 20 6f 66 66 20 61 67  mode back off ag
1efb0 61 69 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ain..    **.    
1efc0 2a 2a 20 49 66 20 6f 6e 4f 66 66 3d 3d 30 20 61  ** If onOff==0 a
1efd0 6e 64 20 74 6e 75 6d 3e 30 20 74 68 65 6e 20 72  nd tnum>0 then r
1efe0 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20  eset the schema 
1eff0 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
1f000 73 2c 20 63 61 75 73 69 6e 67 0a 20 20 20 20 2a  s, causing.    *
1f010 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
1f020 62 65 20 72 65 70 61 72 73 65 64 20 74 68 65 20  be reparsed the 
1f030 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20  next time it is 
1f040 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20 68 61  needed.  This ha
1f050 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 66 66  s the.    ** eff
1f060 65 63 74 20 6f 66 20 65 72 61 73 69 6e 67 20 61  ect of erasing a
1f070 6c 6c 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  ll imposter tabl
1f080 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  es..    */.    c
1f090 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1f0a0 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 20 7b 0a  TRL_IMPOSTER: {.
1f0b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1f0c0 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1f0d0 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1f0e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1f0f0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1f100 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 69        db->init.i
1f110 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
1f120 44 62 4e 61 6d 65 28 64 62 2c 20 76 61 5f 61 72  DbName(db, va_ar
1f130 67 28 61 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a  g(ap,const char*
1f140 29 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e  ));.      db->in
1f150 69 74 2e 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e  it.busy = db->in
1f160 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65  it.imposterTable
1f170 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
1f180 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69  );.      db->ini
1f190 74 2e 6e 65 77 54 6e 75 6d 20 3d 20 76 61 5f 61  t.newTnum = va_a
1f1a0 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
1f1b0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
1f1c0 75 73 79 3d 3d 30 20 26 26 20 64 62 2d 3e 69 6e  usy==0 && db->in
1f1d0 69 74 2e 6e 65 77 54 6e 75 6d 3e 30 20 29 7b 0a  it.newTnum>0 ){.
1f1e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
1f1f0 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
1f200 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a  Connection(db);.
1f210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1f220 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1f230 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1f240 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f250 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
1f260 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
1f270 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
1f280 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74 75 72  _TEST */.  retur
1f290 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1f2a0 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
1f2b0 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75 6c   routine, useful
1f2c0 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e   to VFS implemen
1f2d0 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63 68  tations, that ch
1f2e0 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69  ecks.** to see i
1f2f0 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
1f300 65 20 77 61 73 20 61 20 55 52 49 20 74 68 61 74  e was a URI that
1f310 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70 65   contained a spe
1f320 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a 20  cific query .** 
1f330 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20 69  parameter, and i
1f340 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68 65  f so obtains the
1f350 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71 75   value of the qu
1f360 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
1f370 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
1f380 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
1f390 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e  he filename poin
1f3a0 74 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ter passed into 
1f3b0 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d  the xOpen().** m
1f3c0 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20 69  ethod of a VFS i
1f3d0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
1f3e0 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75 6d  The zParam argum
1f3f0 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
1f400 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20  of the.** query 
1f410 70 61 72 61 6d 65 74 65 72 20 77 65 20 73 65 65  parameter we see
1f420 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  k.  This routine
1f430 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
1f440 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61 6d  ue of the zParam
1f450 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 66  .** parameter if
1f460 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66 20   it exists.  If 
1f470 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 64 6f  the parameter do
1f480 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
1f490 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
1f4a0 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69  turns a NULL poi
1f4b0 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  nter..*/.const c
1f4c0 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72 69  har *sqlite3_uri
1f4d0 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74  _parameter(const
1f4e0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1f4f0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
1f500 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69  aram){.  if( zFi
1f510 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61  lename==0 || zPa
1f520 72 61 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ram==0 ) return 
1f530 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  0;.  zFilename +
1f540 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1f550 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
1f560 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c 65  ;.  while( zFile
1f570 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69  name[0] ){.    i
1f580 6e 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a 46  nt x = strcmp(zF
1f590 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29  ilename, zParam)
1f5a0 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
1f5b0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
1f5c0 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  30(zFilename) + 
1f5d0 31 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30 20  1;.    if( x==0 
1f5e0 29 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61  ) return zFilena
1f5f0 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  me;.    zFilenam
1f600 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
1f610 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
1f620 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  + 1;.  }.  retur
1f630 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
1f640 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76  turn a boolean v
1f650 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79  alue for a query
1f660 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69   parameter..*/.i
1f670 6e 74 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  nt sqlite3_uri_b
1f680 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61  oolean(const cha
1f690 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
1f6a0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
1f6b0 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20  , int bDflt){.  
1f6c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1f6d0 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
1f6e0 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c  meter(zFilename,
1f6f0 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c   zParam);.  bDfl
1f700 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20  t = bDflt!=0;.  
1f710 72 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74  return z ? sqlit
1f720 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20  e3GetBoolean(z, 
1f730 62 44 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a  bDflt) : bDflt;.
1f740 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1f750 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
1f760 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65   value for a que
1f770 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f  ry parameter..*/
1f780 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73  .sqlite3_int64 s
1f790 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36 34  qlite3_uri_int64
1f7a0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
1f7b0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a  zFilename,    /*
1f7c0 20 46 69 6c 65 6e 61 6d 65 20 61 73 20 70 61 73   Filename as pas
1f7d0 73 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a  sed to xOpen */.
1f7e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1f7f0 61 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55  aram,       /* U
1f800 52 49 20 70 61 72 61 6d 65 74 65 72 20 73 6f 75  RI parameter sou
1f810 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ght */.  sqlite3
1f820 5f 69 6e 74 36 34 20 62 44 66 6c 74 20 20 20 20  _int64 bDflt    
1f830 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66 20     /* return if 
1f840 70 61 72 61 6d 65 74 65 72 20 69 73 20 6d 69 73  parameter is mis
1f850 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  sing */.){.  con
1f860 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  st char *z = sql
1f870 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
1f880 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  er(zFilename, zP
1f890 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  aram);.  sqlite3
1f8a0 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69 66 28 20  _int64 v;.  if( 
1f8b0 7a 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f  z && sqlite3DecO
1f8c0 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 29  rHexToI64(z, &v)
1f8d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f8e0 20 20 20 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20     bDflt = v;.  
1f8f0 7d 0a 20 20 72 65 74 75 72 6e 20 62 44 66 6c 74  }.  return bDflt
1f900 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1f910 6e 20 74 68 65 20 42 74 72 65 65 20 70 6f 69 6e  n the Btree poin
1f920 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62  ter identified b
1f930 79 20 7a 44 62 4e 61 6d 65 2e 20 20 52 65 74 75  y zDbName.  Retu
1f940 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
1f950 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a  ound..*/.Btree *
1f960 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
1f970 74 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  tree(sqlite3 *db
1f980 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1f990 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  bName){.  int i;
1f9a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
1f9b0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1f9c0 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
1f9d0 70 42 74 0a 20 20 20 20 20 26 26 20 28 7a 44 62  pBt.     && (zDb
1f9e0 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  Name==0 || sqlit
1f9f0 65 33 53 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d  e3StrICmp(zDbNam
1fa00 65 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e  e, db->aDb[i].zN
1fa10 61 6d 65 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a  ame)==0).    ){.
1fa20 20 20 20 20 20 20 72 65 74 75 72 6e 20 64 62 2d        return db-
1fa30 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
1fa40 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1fa50 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
1fa60 72 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  rn the filename 
1fa70 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1fa80 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1fa90 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
1faa0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e  nnection..*/.con
1fab0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1fac0 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c  _db_filename(sql
1fad0 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1fae0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
1faf0 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69    Btree *pBt;.#i
1fb00 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1fb10 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1fb20 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1fb30 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
1fb40 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
1fb50 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
1fb60 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1fb70 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20 73  #endif.  pBt = s
1fb80 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
1fb90 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
1fba0 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f  ;.  return pBt ?
1fbb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1fbc0 46 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20  Filename(pBt) : 
1fbd0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
1fbe0 72 6e 20 31 20 69 66 20 64 61 74 61 62 61 73 65  rn 1 if database
1fbf0 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72   is read-only or
1fc00 20 30 20 69 66 20 72 65 61 64 2f 77 72 69 74 65   0 if read/write
1fc10 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a  .  Return -1 if.
1fc20 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62  ** no such datab
1fc30 61 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69  ase exists..*/.i
1fc40 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
1fc50 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a  adonly(sqlite3 *
1fc60 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1fc70 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
1fc80 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53  e *pBt;.#ifdef S
1fc90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1fca0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1fcb0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1fcc0 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
1fcd0 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
1fce0 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
1fcf0 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn -1;.  }.#endi
1fd00 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65  f.  pBt = sqlite
1fd10 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
1fd20 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72  b, zDbName);.  r
1fd30 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69  eturn pBt ? sqli
1fd40 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e  te3BtreeIsReadon
1fd50 6c 79 28 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a  ly(pBt) : -1;.}.
1fd60 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41  .#if (SQLITE_ENA
1fd70 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29  BLE_APPLE_SPI>0)
1fd80 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1fd90 50 4c 45 5f 5f 29 0a 0a 23 69 6e 63 6c 75 64 65  PLE__)..#include
1fda0 20 22 73 71 6c 69 74 65 33 5f 70 72 69 76 61 74   "sqlite3_privat
1fdb0 65 2e 68 22 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 73  e.h"../* .** Tes
1fdc0 74 69 6e 67 20 61 20 66 69 6c 65 20 70 61 74 68  ting a file path
1fdd0 20 66 6f 72 20 73 71 6c 69 74 65 20 6c 6f 63 6b   for sqlite lock
1fde0 73 20 68 65 6c 64 20 62 79 20 61 20 70 72 6f 63  s held by a proc
1fdf0 65 73 73 20 49 44 2e 20 0a 2a 2a 20 52 65 74 75  ess ID. .** Retu
1fe00 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53  rns SQLITE_LOCKS
1fe10 54 41 54 45 5f 4f 4e 20 69 66 20 6c 6f 63 6b 73  TATE_ON if locks
1fe20 20 61 72 65 20 70 72 65 73 65 6e 74 20 6f 6e 20   are present on 
1fe30 70 61 74 68 0a 2a 2a 20 74 68 61 74 20 77 6f 75  path.** that wou
1fe40 6c 64 20 70 72 65 76 65 6e 74 20 77 72 69 74 69  ld prevent writi
1fe50 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
1fe60 73 65 2e 0a 2a 2f 0a 69 6e 74 20 5f 73 71 6c 69  se..*/.int _sqli
1fe70 74 65 33 5f 6c 6f 63 6b 73 74 61 74 65 28 63 6f  te3_lockstate(co
1fe80 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20  nst char *path, 
1fe90 70 69 64 5f 74 20 70 69 64 29 7b 0a 20 20 73 71  pid_t pid){.  sq
1fea0 6c 69 74 65 33 20 2a 64 62 20 3d 20 4e 55 4c 4c  lite3 *db = NULL
1feb0 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74  ;.  .  if( sqlit
1fec0 65 33 5f 6f 70 65 6e 5f 76 32 28 70 61 74 68 2c  e3_open_v2(path,
1fed0 20 26 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45   &db, SQLITE_OPE
1fee0 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 4e 55 4c 4c  N_READONLY, NULL
1fef0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  ) == SQLITE_OK )
1ff00 7b 0a 20 20 20 20 4c 6f 63 6b 73 74 61 74 65 50  {.    LockstateP
1ff10 49 44 20 6c 6f 63 6b 73 74 61 74 65 20 3d 20 7b  ID lockstate = {
1ff20 70 69 64 2c 20 2d 31 7d 3b 0a 20 20 20 20 73 71  pid, -1};.    sq
1ff30 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
1ff40 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c  ol(db, NULL, SQL
1ff50 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
1ff60 41 54 45 5f 50 49 44 2c 20 26 6c 6f 63 6b 73 74  ATE_PID, &lockst
1ff70 61 74 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ate);.    sqlite
1ff80 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20  3_close(db);.   
1ff90 20 69 6e 74 20 73 74 61 74 65 20 3d 20 6c 6f 63   int state = loc
1ffa0 6b 73 74 61 74 65 2e 73 74 61 74 65 3b 0a 20 20  kstate.state;.  
1ffb0 20 20 72 65 74 75 72 6e 20 73 74 61 74 65 3b 0a    return state;.
1ffc0 20 20 7d 0a 20 20 69 66 28 20 4e 55 4c 4c 21 3d    }.  if( NULL!=
1ffd0 64 62 20 29 7b 20 0a 20 20 20 20 73 71 6c 69 74  db ){ .    sqlit
1ffe0 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 20 2f 2a  e3_close(db); /*
1fff0 20 6e 65 65 64 20 74 6f 20 63 6c 6f 73 65 20 65   need to close e
20000 76 65 6e 20 69 66 20 6f 70 65 6e 20 72 65 74 75  ven if open retu
20010 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  rns an error */.
20020 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
20030 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 45 52  ITE_LOCKSTATE_ER
20040 52 4f 52 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  ROR;.}..#endif /
20050 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
20060 41 50 50 4c 45 5f 53 50 49 20 2a 2f 0a           APPLE_SPI */.