/ Hex Artifact Content
Login

Artifact 9bef1b75e748da9b66b5dd7c51151e7c14a45d7b:


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 31 38 37 36 31 2d 33 36  E-OF: R-18761-36
3f90: 36 30 31 20 54 68 65 72 65 20 61 72 65 20 74 68  601 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 20 28 70 4d 65 6d 29 2c 0a 20 20  emory (pMem),.  
4000: 20 20 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20      ** the size 
4010: 6f 66 20 65 61 63 68 20 70 61 67 65 20 63 61 63  of each page cac
4020: 68 65 20 6c 69 6e 65 20 28 73 7a 29 2c 20 61 6e  he line (sz), an
4030: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
4040: 63 61 63 68 65 20 6c 69 6e 65 73 0a 20 20 20 20  cache lines.    
4050: 20 20 2a 2a 20 28 4e 29 2e 20 2a 2f 0a 20 20 20    ** (N). */.   
4060: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4070: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
4080: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4090: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
40a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
40b0: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
40c0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
40d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
40e0: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
40f0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
4100: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4110: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
4120: 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 3a  IG_PCACHE_HDRSZ:
4130: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
4140: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30 30  ENCE-OF: R-39100
4150: 2d 32 37 33 31 37 20 54 68 65 20 53 51 4c 49 54  -27317 The SQLIT
4160: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f  E_CONFIG_PCACHE_
4170: 48 44 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61 6b  HDRSZ option tak
4180: 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69  es.      ** a si
4190: 6e 67 6c 65 20 70 61 72 61 6d 65 74 65 72 20 77  ngle parameter w
41a0: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
41b0: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
41c0: 61 6e 64 20 77 72 69 74 65 73 20 69 6e 74 6f 0a  and writes into.
41d0: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e        ** that in
41e0: 74 65 67 65 72 20 74 68 65 20 6e 75 6d 62 65 72  teger the number
41f0: 20 6f 66 20 65 78 74 72 61 20 62 79 74 65 73 20   of extra bytes 
4200: 70 65 72 20 70 61 67 65 20 72 65 71 75 69 72 65  per page require
4210: 64 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 0a  d for each page.
4220: 20 20 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c 49        ** in SQLI
4230: 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41  TE_CONFIG_PAGECA
4240: 43 48 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 76  CHE. */.      *v
4250: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 20  a_arg(ap, int*) 
4260: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  = .          sql
4270: 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 42 74  ite3HeaderSizeBt
4280: 72 65 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20  ree() +.        
4290: 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53    sqlite3HeaderS
42a0: 69 7a 65 50 63 61 63 68 65 28 29 20 2b 0a 20 20  izePcache() +.  
42b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
42c0: 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 31  eaderSizePcache1
42d0: 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
42e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
42f0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4300: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
4310: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
4320: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4330: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
4340: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20  NFIG_GETPCACHE: 
4350: 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61  {.      /* now a
4360: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
4370: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
4380: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
4390: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
43a0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
43b0: 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20  CACHE2: {.      
43c0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
43d0: 52 2d 36 33 33 32 35 2d 34 38 33 37 38 20 54 68  R-63325-48378 Th
43e0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
43f0: 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74  PCACHE2 option t
4400: 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  akes a.      ** 
4410: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
4420: 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74  which is a point
4430: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
4440: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
4450: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74  .      ** object
4460: 2e 20 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70  . This object sp
4470: 65 63 69 66 69 65 73 20 74 68 65 20 69 6e 74 65  ecifies the inte
4480: 72 66 61 63 65 20 74 6f 20 61 20 63 75 73 74 6f  rface to a custo
4490: 6d 20 70 61 67 65 20 63 61 63 68 65 0a 20 20 20  m page cache.   
44a0: 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61     ** implementa
44b0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 73  tion. */.      s
44c0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
44d0: 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61  ig.pcache2 = *va
44e0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
44f0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
4500: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
4510: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4520: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
4530: 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20  TPCACHE2: {.    
4540: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4550: 3a 20 52 2d 32 32 30 33 35 2d 34 36 31 38 32 20  : R-22035-46182 
4560: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
4570: 47 5f 47 45 54 50 43 41 43 48 45 32 20 6f 70 74  G_GETPCACHE2 opt
4580: 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20  ion takes a.    
4590: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75    ** single argu
45a0: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20  ment which is a 
45b0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
45c0: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
45d0: 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f  hods2.      ** o
45e0: 62 6a 65 63 74 2e 20 53 51 4c 69 74 65 20 63 6f  bject. SQLite co
45f0: 70 69 65 73 20 6f 66 20 74 68 65 20 63 75 72 72  pies of the curr
4600: 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 69  ent page cache i
4610: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
4620: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  to.      ** that
4630: 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
4640: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
4650: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
4660: 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  2.xInit==0 ){.  
4670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
4680: 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b  cheSetDefault();
4690: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
46a0: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
46b0: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
46c0: 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  s2*) = sqlite3Gl
46d0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
46e0: 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e2;.      break;
46f0: 0a 20 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44 45  .    }../* EVIDE
4700: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36 2d  NCE-OF: R-06626-
4710: 31 32 39 31 31 20 54 68 65 20 53 51 4c 49 54 45  12911 The SQLITE
4720: 5f 43 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70 74  _CONFIG_HEAP opt
4730: 69 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61  ion is only.** a
4740: 76 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69  vailable if SQLi
4750: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  te is compiled w
4760: 69 74 68 20 65 69 74 68 65 72 20 53 51 4c 49 54  ith either SQLIT
4770: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4780: 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e   or.** SQLITE_EN
4790: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e 64  ABLE_MEMSYS5 and
47a0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
47b0: 45 52 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65 64  ERROR if invoked
47c0: 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 23   otherwise. */.#
47d0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
47e0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
47f0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
4800: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4810: 53 35 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  S5).    case SQL
4820: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
4830: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
4840: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35 34  ENCE-OF: R-19854
4850: 2d 34 32 31 32 36 20 54 68 65 72 65 20 61 72 65  -42126 There are
4860: 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73   three arguments
4870: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   to.      ** SQL
4880: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
4890: 20 41 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   An 8-byte align
48a0: 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ed pointer to th
48b0: 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20 20  e memory, the.  
48c0: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
48d0: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 65   bytes in the me
48e0: 6d 6f 72 79 20 62 75 66 66 65 72 2c 20 61 6e 64  mory buffer, and
48f0: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
4900: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 20 20  ocation size..  
4910: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
4920: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4930: 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .pHeap = va_arg(
4940: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
4950: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4960: 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61  onfig.nHeap = va
4970: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4980: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4990: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d  alConfig.mnReq =
49a0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
49b0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ;..      if( sql
49c0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
49d0: 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20  .mnReq<1 ){.    
49e0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
49f0: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4a00: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
4a10: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
4a20: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c  Config.mnReq>(1<
4a30: 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  <12) ){.        
4a40: 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65  /* cap min reque
4a50: 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20  st size at 2^12 
4a60: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
4a70: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4a80: 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a  nReq = (1<<12);.
4a90: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
4aa0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
4ab0: 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20  Config.pHeap==0 
4ac0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
4ad0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39  IDENCE-OF: R-499
4ae0: 32 30 2d 36 30 31 38 39 20 49 66 20 74 68 65 20  20-60189 If the 
4af0: 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74  first pointer (t
4b00: 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65  he memory pointe
4b10: 72 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  r).        ** is
4b20: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69   NULL, then SQLi
4b30: 74 65 20 72 65 76 65 72 74 73 20 74 6f 20 75 73  te reverts to us
4b40: 69 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74 20  ing its default 
4b50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4b60: 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65  .        ** (the
4b70: 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29   system malloc()
4b80: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29   implementation)
4b90: 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72  , undoing any pr
4ba0: 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ior invocation o
4bb0: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c  f.        ** SQL
4bc0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
4bd0: 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  C..        **.  
4be0: 20 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67        ** Setting
4bf0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4c00: 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65  nfig.m to all ze
4c10: 72 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d  ros will cause m
4c20: 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20  alloc to.       
4c30: 20 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74   ** revert to it
4c40: 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d  s default implem
4c50: 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71  entation when sq
4c60: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
4c70: 28 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20  () is run.      
4c80: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d    */.        mem
4c90: 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62  set(&sqlite3Glob
4ca0: 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73  alConfig.m, 0, s
4cb0: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f  izeof(sqlite3Glo
4cc0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20  balConfig.m));. 
4cd0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4ce0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4cf0: 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31  OF: R-61006-0891
4d00: 38 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  8 If the memory 
4d10: 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e  pointer is not N
4d20: 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ULL then the.   
4d30: 20 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74       ** alternat
4d40: 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ive memory alloc
4d50: 61 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20  ator is engaged 
4d60: 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66  to handle all of
4d70: 20 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20   SQLites.       
4d80: 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
4d90: 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a  ation needs. */.
4da0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4db0: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20  ABLE_MEMSYS3.   
4dc0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4dd0: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
4de0: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
4df0: 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  s3();.#endif.#if
4e00: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4e10: 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20  E_MEMSYS5.      
4e20: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4e30: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
4e40: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28  e3MemGetMemsys5(
4e50: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
4e60: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4e70: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
4e80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4e90: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
4ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4eb0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
4ec0: 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28  kaside = va_arg(
4ed0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
4ee0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4ef0: 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  fig.nLookaside =
4f00: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4f10: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4f20: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a     }.    .    /*
4f30: 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   Record a pointe
4f40: 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20  r to the logger 
4f50: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73  function and its
4f60: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4f70: 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61  .    ** The defa
4f80: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f  ult is NULL.  Lo
4f90: 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65  gging is disable
4fa0: 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  d if the functio
4fb0: 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20  n pointer is.   
4fc0: 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f   ** NULL..    */
4fd0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4fe0: 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20  _CONFIG_LOG: {. 
4ff0: 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
5000: 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
5010: 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
5020: 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
5030: 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
5040: 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
5050: 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
5060: 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
5070: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20  alConfig.xLog = 
5080: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28  va_arg(ap, void(
5090: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  *)(void*,int,con
50a0: 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20  st char*));.    
50b0: 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
50c0: 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43  ef void(*LOGFUNC
50d0: 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  _t)(void*,int,co
50e0: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
50f0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5100: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
5110: 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f  arg(ap, LOGFUNC_
5120: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
5130: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c  3GlobalConfig.pL
5140: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
5150: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
5160: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
5170: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5180: 46 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37  F: R-55548-33817
5190: 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   The compile-tim
51a0: 65 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52  e setting for UR
51b0: 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20  I filenames.    
51c0: 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ** can be change
51d0: 64 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20  d at start-time 
51e0: 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  using the.    **
51f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
5200: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
5210: 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  I,1) or.    ** s
5220: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
5230: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c  LITE_CONFIG_URI,
5240: 30 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  0) configuration
5250: 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   calls..    */. 
5260: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5270: 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20  ONFIG_URI: {.   
5280: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5290: 46 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35  F: R-25451-61125
52a0: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
52b0: 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61  IG_URI option ta
52c0: 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20  kes a single.   
52d0: 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f     ** argument o
52e0: 66 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e  f type int. If n
52f0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52  on-zero, then UR
5300: 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c  I handling is gl
5310: 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  obally.      ** 
5320: 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20  enabled. If the 
5330: 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72  parameter is zer
5340: 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64  o, then URI hand
5350: 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79  ling is globally
5360: 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
5370: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ed. */.      sql
5380: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5390: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
53a0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
53b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
53c0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
53d0: 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47  _CONFIG_COVERING
53e0: 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20  _INDEX_SCAN: {. 
53f0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5400: 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37  -OF: R-36592-027
5410: 37 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  72 The SQLITE_CO
5420: 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e  NFIG_COVERING_IN
5430: 44 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a  DEX_SCAN.      *
5440: 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  * option takes a
5450: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
5460: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
5470: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
5480: 20 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c   a.      ** bool
5490: 65 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ean in order to 
54a0: 65 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  enable or disabl
54b0: 65 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76  e the use of cov
54c0: 65 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f  ering indices fo
54d0: 72 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20  r.      ** full 
54e0: 74 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74  table scans in t
54f0: 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  he query optimiz
5500: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
5510: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5520: 2e 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72  .bUseCis = va_ar
5530: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
5540: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5550: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
5560: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20  ABLE_SQLLOG.    
5570: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
5580: 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20  IG_SQLLOG: {.   
5590: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
55a0: 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76  *SQLLOGFUNC_t)(v
55b0: 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  oid*, sqlite3*, 
55c0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
55d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
55e0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
55f0: 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  llog = va_arg(ap
5600: 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b  , SQLLOGFUNC_t);
5610: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
5620: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
5630: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
5640: 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20  p, void *);.    
5650: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
5660: 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20  endif..    case 
5670: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
5680: 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
5690: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
56a0: 20 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53   R-58063-38258 S
56b0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
56c0: 50 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f  P_SIZE takes two
56d0: 20 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   64-bit.      **
56e0: 20 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65   integer (sqlite
56f0: 33 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20  3_int64) values 
5700: 74 68 61 74 20 61 72 65 20 74 68 65 20 64 65 66  that are the def
5710: 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c  ault mmap size l
5720: 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  imit.      ** (t
5730: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
5740: 6e 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d  ng for PRAGMA mm
5750: 61 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65  ap_size) and the
5760: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
5770: 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73  .      ** mmap s
5780: 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20  ize limit. */.  
5790: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
57a0: 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72  4 szMmap = va_ar
57b0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  g(ap, sqlite3_in
57c0: 74 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t64);.      sqli
57d0: 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70  te3_int64 mxMmap
57e0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
57f0: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
5800: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5810: 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39  OF: R-53367-4319
5820: 30 20 49 66 20 65 69 74 68 65 72 20 61 72 67 75  0 If either argu
5830: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74  ment to this opt
5840: 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
5850: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
5860: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  hat argument is 
5870: 63 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63  changed to its c
5880: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
5890: 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ult..      **.  
58a0: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
58b0: 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33  OF: R-34993-4503
58c0: 31 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  1 The maximum al
58d0: 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20  lowed mmap size 
58e0: 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
58f0: 20 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61   silently trunca
5900: 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  ted if necessary
5910: 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73   so that it does
5920: 20 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a   not exceed the.
5930: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
5940: 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d  -time maximum mm
5950: 61 70 20 73 69 7a 65 20 73 65 74 20 62 79 20 74  ap size set by t
5960: 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  he SQLITE_MAX_MM
5970: 41 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a  AP_SIZE.      **
5980: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
5990: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
59a0: 20 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c       if( mxMmap<
59b0: 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49  0 || mxMmap>SQLI
59c0: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
59d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d 6d   ){.        mxMm
59e0: 61 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ap = SQLITE_MAX_
59f0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
5a00: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
5a10: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
5a20: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
5a30: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
5a40: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
5a50: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
5a60: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
5a70: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
5a80: 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a  xMmap = mxMmap;.
5a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5aa0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
5ab0: 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20   = szMmap;.     
5ac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5ad0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
5ae0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5af0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29  TE_WIN32_MALLOC)
5b00: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30   /* IMP: R-04780
5b10: 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61  -55815 */.    ca
5b20: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5b30: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a  _WIN32_HEAPSIZE:
5b40: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
5b50: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36  ENCE-OF: R-34926
5b60: 2d 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f  -03360 SQLITE_CO
5b70: 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53  NFIG_WIN32_HEAPS
5b80: 49 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62  IZE takes a 32-b
5b90: 69 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69  it.      ** unsi
5ba0: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
5bb0: 75 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  ue that specifie
5bc0: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  s the maximum si
5bd0: 7a 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65  ze of the create
5be0: 64 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e  d.      ** heap.
5bf0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5c00: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
5c10: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
5c20: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5c30: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5c40: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5c50: 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20  E_CONFIG_PMASZ: 
5c60: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
5c70: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d  lobalConfig.szPm
5c80: 61 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  a = va_arg(ap, u
5c90: 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
5ca0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5cb0: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  ..    default: {
5cc0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
5cd0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
5ce0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
5cf0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
5d00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5d10: 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20  *.** Set up the 
5d20: 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72  lookaside buffer
5d30: 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  s for a database
5d40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20   connection..** 
5d50: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
5d60: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a   on success.  .*
5d70: 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69  * If lookaside i
5d80: 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
5d90: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
5da0: 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  BUSY..**.** The 
5db0: 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  sz parameter is 
5dc0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
5dd0: 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b  tes in each look
5de0: 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54  aside slot..** T
5df0: 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72  he cnt parameter
5e00: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
5e10: 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74  f slots.  If pSt
5e20: 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a  art is NULL the.
5e30: 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ** space for the
5e40: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
5e50: 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  y is obtained fr
5e60: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
5e70: 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72  c()..** If pStar
5e80: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
5e90: 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20  en it is sz*cnt 
5ea0: 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
5eb0: 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68  to use for.** th
5ec0: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
5ed0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
5ee0: 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65  t setupLookaside
5ef0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f  (sqlite3 *db, vo
5f00: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a  id *pBuf, int sz
5f10: 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 23 69 66 6e  , int cnt){.#ifn
5f20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5f30: 4c 4f 4f 4b 41 53 49 44 45 0a 20 20 76 6f 69 64  LOOKASIDE.  void
5f40: 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28 20   *pStart;.  if( 
5f50: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
5f60: 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ut ){.    return
5f70: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
5f80: 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  }.  /* Free any 
5f90: 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69  existing lookasi
5fa0: 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68  de buffer for th
5fb0: 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72 65  is handle before
5fc0: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67  .  ** allocating
5fd0: 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65   a new one so we
5fe0: 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 68   don't have to h
5ff0: 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a 20  ave space for . 
6000: 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65 20   ** both at the 
6010: 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a  same time..  */.
6020: 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73    if( db->lookas
6030: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b  ide.bMalloced ){
6040: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
6050: 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  e(db->lookaside.
6060: 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f  pStart);.  }.  /
6070: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20  * The size of a 
6080: 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20 61  lookaside slot a
6090: 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20  fter ROUNDDOWN8 
60a0: 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67  needs to be larg
60b0: 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 70  er.  ** than a p
60c0: 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73 65  ointer to be use
60d0: 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d  ful..  */.  sz =
60e0: 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b   ROUNDDOWN8(sz);
60f0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33    /* IMP: R-3303
6100: 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66 28  8-09382 */.  if(
6110: 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66   sz<=(int)sizeof
6120: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
6130: 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28   ) sz = 0;.  if(
6140: 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30   cnt<0 ) cnt = 0
6150: 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c  ;.  if( sz==0 ||
6160: 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73   cnt==0 ){.    s
6170: 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72  z = 0;.    pStar
6180: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  t = 0;.  }else i
6190: 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20  f( pBuf==0 ){.  
61a0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
61b0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
61c0: 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74    pStart = sqlit
61d0: 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74  e3Malloc( sz*cnt
61e0: 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36   );  /* IMP: R-6
61f0: 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20  1949-35727 */.  
6200: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
6210: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
6220: 69 66 28 20 70 53 74 61 72 74 20 29 20 63 6e 74  if( pStart ) cnt
6230: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
6240: 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a 3b  Size(pStart)/sz;
6250: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
6260: 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d  tart = pBuf;.  }
6270: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
6280: 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61 72 74  .pStart = pStart
6290: 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ;.  db->lookasid
62a0: 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64  e.pFree = 0;.  d
62b0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20  b->lookaside.sz 
62c0: 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28  = (u16)sz;.  if(
62d0: 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69   pStart ){.    i
62e0: 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73  nt i;.    Lookas
62f0: 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20  ideSlot *p;.    
6300: 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e  assert( sz > (in
6310: 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69  t)sizeof(Lookasi
6320: 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20  deSlot*) );.    
6330: 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  p = (LookasideSl
6340: 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20  ot*)pStart;.    
6350: 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d  for(i=cnt-1; i>=
6360: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70  0; i--){.      p
6370: 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f  ->pNext = db->lo
6380: 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20  okaside.pFree;. 
6390: 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69       db->lookasi
63a0: 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20  de.pFree = p;.  
63b0: 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69      p = (Lookasi
63c0: 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70  deSlot*)&((u8*)p
63d0: 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  )[sz];.    }.   
63e0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
63f0: 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d  End = p;.    db-
6400: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
6410: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d  led = 1;.    db-
6420: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
6430: 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f  oced = pBuf==0 ?
6440: 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1:0;.  }else{.  
6450: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6460: 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20 20 20  pStart = db;.   
6470: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
6480: 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20 64 62  End = db;.    db
6490: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
64a0: 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62  bled = 0;.    db
64b0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
64c0: 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 23  loced = 0;.  }.#
64d0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
64e0: 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 20 2a  OMIT_LOOKASIDE *
64f0: 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  /.  return SQLIT
6500: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
6510: 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20  eturn the mutex 
6520: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6530: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
6540: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65  ction..*/.sqlite
6550: 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33  3_mutex *sqlite3
6560: 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65  _db_mutex(sqlite
6570: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
6580: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
6590: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
65a0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
65b0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
65c0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
65d0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
65e0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
65f0: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75  .  return db->mu
6600: 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  tex;.}../*.** Fr
6610: 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65  ee up as much me
6620: 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20 66  mory as we can f
6630: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64 61  rom the given da
6640: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
6650: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
6660: 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f  ite3_db_release_
6670: 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20 2a  memory(sqlite3 *
6680: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  db){.  int i;..#
6690: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
66a0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
66b0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
66c0: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
66d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
66e0: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
66f0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
6700: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
6710: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
6720: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
6730: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
6740: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
6750: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
6760: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
6770: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
6780: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
6790: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
67a0: 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ger(pBt);.      
67b0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69  sqlite3PagerShri
67c0: 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nk(pPager);.    
67d0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
67e0: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
67f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
6800: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
6810: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
6820: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6830: 20 46 6c 75 73 68 20 61 6e 79 20 64 69 72 74 79   Flush any dirty
6840: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
6850: 67 65 72 2d 63 61 63 68 65 20 66 6f 72 20 61 6e  ger-cache for an
6860: 79 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  y attached datab
6870: 61 73 65 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a  ase.** to disk..
6880: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
6890: 62 5f 63 61 63 68 65 66 6c 75 73 68 28 73 71 6c  b_cacheflush(sql
68a0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
68b0: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
68c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
68d0: 62 53 65 65 6e 42 75 73 79 20 3d 20 30 3b 0a 0a  bSeenBusy = 0;..
68e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
68f0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
6900: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
6910: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
6920: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
6930: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
6940: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
6950: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
6960: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
6970: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6980: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
6990: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
69a0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
69b0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
69c0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
69d0: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
69e0: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
69f0: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
6a00: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
6a10: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
6a20: 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ger(pBt);.      
6a30: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6a40: 72 46 6c 75 73 68 28 70 50 61 67 65 72 29 3b 0a  rFlush(pPager);.
6a50: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
6a60: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
6a70: 20 20 20 20 20 62 53 65 65 6e 42 75 73 79 20 3d       bSeenBusy =
6a80: 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   1;.        rc =
6a90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
6aa0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
6ab0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
6ac0: 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69  eAll(db);.  sqli
6ad0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
6ae0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
6af0: 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54  turn ((rc==SQLIT
6b00: 45 5f 4f 4b 20 26 26 20 62 53 65 65 6e 42 75 73  E_OK && bSeenBus
6b10: 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59  y) ? SQLITE_BUSY
6b20: 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   : rc);.}../*.**
6b30: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73   Configuration s
6b40: 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69  ettings for an i
6b50: 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61  ndividual databa
6b60: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f  se connection.*/
6b70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f  .int sqlite3_db_
6b80: 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a  config(sqlite3 *
6b90: 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  db, int op, ...)
6ba0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
6bb0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73    int rc;.  va_s
6bc0: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
6bd0: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
6be0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42    case SQLITE_DB
6bf0: 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45  CONFIG_LOOKASIDE
6c00: 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  : {.      void *
6c10: 70 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70  pBuf = va_arg(ap
6c20: 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50  , void*); /* IMP
6c30: 3a 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20  : R-26835-10964 
6c40: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20  */.      int sz 
6c50: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
6c60: 29 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a  );       /* IMP:
6c70: 20 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a   R-47871-25994 *
6c80: 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20  /.      int cnt 
6c90: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
6ca0: 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  );      /* IMP: 
6cb0: 52 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f  R-04460-53386 */
6cc0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75  .      rc = setu
6cd0: 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70  pLookaside(db, p
6ce0: 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20  Buf, sz, cnt);. 
6cf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6d00: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
6d10: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
6d20: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
6d30: 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20       int op;    
6d40: 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
6d50: 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d  */.        u32 m
6d60: 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ask;    /* Mask 
6d70: 6f 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71  of the bit in sq
6d80: 6c 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73  lite3.flags to s
6d90: 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20  et/clear */.    
6da0: 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20    } aFlagOp[] = 
6db0: 7b 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  {.        { SQLI
6dc0: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
6dd0: 4c 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c 49  LE_FKEY,    SQLI
6de0: 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20  TE_ForeignKeys  
6df0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
6e00: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
6e10: 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 53  NABLE_TRIGGER, S
6e20: 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67  QLITE_EnableTrig
6e30: 67 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b  ger  },.      };
6e40: 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20  .      unsigned 
6e50: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20  int i;.      rc 
6e60: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
6e70: 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d  /* IMP: R-42790-
6e80: 32 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66  23372 */.      f
6e90: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
6ea0: 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b  ize(aFlagOp); i+
6eb0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
6ec0: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f  aFlagOp[i].op==o
6ed0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  p ){.          i
6ee0: 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72  nt onoff = va_ar
6ef0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
6f00: 20 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20        int *pRes 
6f10: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
6f20: 2a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  *);.          in
6f30: 74 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d  t oldFlags = db-
6f40: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20  >flags;.        
6f50: 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b    if( onoff>0 ){
6f60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
6f70: 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f  >flags |= aFlagO
6f80: 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20  p[i].mask;.     
6f90: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
6fa0: 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  noff==0 ){.     
6fb0: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
6fc0: 20 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e   &= ~aFlagOp[i].
6fd0: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  mask;.          
6fe0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
6ff0: 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c  oldFlags!=db->fl
7000: 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ags ){.         
7010: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
7020: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
7030: 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
7040: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
7050: 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20  ( pRes ){.      
7060: 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64        *pRes = (d
7070: 62 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67  b->flags & aFlag
7080: 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a  Op[i].mask)!=0;.
7090: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
70a0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
70b0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
70c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
70d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
70e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
70f0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
7100: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
7110: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
7120: 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a   if the buffer z
7130: 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e  [0..n-1] contain
7140: 73 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f  s all spaces..*/
7150: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53  .static int allS
7160: 70 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72  paces(const char
7170: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77   *z, int n){.  w
7180: 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e  hile( n>0 && z[n
7190: 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b  -1]==' ' ){ n--;
71a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30   }.  return n==0
71b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
71c0: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  is the default c
71d0: 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
71e0: 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22  n named "BINARY"
71f0: 20 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73   which is always
7200: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  .** available..*
7210: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46  *.** If the padF
7220: 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
7230: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70  not NULL then sp
7240: 61 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74  ace padding at t
7250: 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72  he end.** of str
7260: 69 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e  ings is ignored.
7270: 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74    This implement
7280: 73 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c  s the RTRIM coll
7290: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
72a0: 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63   int binCollFunc
72b0: 28 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61  (.  void *padFla
72c0: 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g,.  int nKey1, 
72d0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
72e0: 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  1,.  int nKey2, 
72f0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
7300: 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e  2.){.  int rc, n
7310: 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b  ;.  n = nKey1<nK
7320: 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b  ey2 ? nKey1 : nK
7330: 65 79 32 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  ey2;.  /* EVIDEN
7340: 43 45 2d 4f 46 3a 20 52 2d 36 35 30 33 33 2d 32  CE-OF: R-65033-2
7350: 38 34 34 39 20 54 68 65 20 62 75 69 6c 74 2d 69  8449 The built-i
7360: 6e 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69  n BINARY collati
7370: 6f 6e 20 63 6f 6d 70 61 72 65 73 0a 20 20 2a 2a  on compares.  **
7380: 20 73 74 72 69 6e 67 73 20 62 79 74 65 20 62 79   strings byte by
7390: 20 62 79 74 65 20 75 73 69 6e 67 20 74 68 65 20   byte using the 
73a0: 6d 65 6d 63 6d 70 28 29 20 66 75 6e 63 74 69 6f  memcmp() functio
73b0: 6e 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  n from the stand
73c0: 61 72 64 20 43 0a 20 20 2a 2a 20 6c 69 62 72 61  ard C.  ** libra
73d0: 72 79 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6d 65  ry. */.  rc = me
73e0: 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79  mcmp(pKey1, pKey
73f0: 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d  2, n);.  if( rc=
7400: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61  =0 ){.    if( pa
7410: 64 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c  dFlag.     && al
7420: 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29  lSpaces(((char*)
7430: 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d  pKey1)+n, nKey1-
7440: 6e 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  n).     && allSp
7450: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
7460: 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a  y2)+n, nKey2-n).
7470: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
7480: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
7490: 31 36 32 34 2d 32 34 37 33 37 20 52 54 52 49 4d  1624-24737 RTRIM
74a0: 20 69 73 20 6c 69 6b 65 20 42 49 4e 41 52 59 20   is like BINARY 
74b0: 65 78 63 65 70 74 20 74 68 61 74 20 65 78 74 72  except that extr
74c0: 61 0a 20 20 20 20 20 20 2a 2a 20 73 70 61 63 65  a.      ** space
74d0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
74e0: 65 69 74 68 65 72 20 73 74 72 69 6e 67 20 64 6f  either string do
74f0: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
7500: 72 65 73 75 6c 74 2e 20 49 6e 20 6f 74 68 65 72  result. In other
7510: 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72 64 73 2c  .      ** words,
7520: 20 73 74 72 69 6e 67 73 20 77 69 6c 6c 20 63 6f   strings will co
7530: 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 6f  mpare equal to o
7540: 6e 65 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f  ne another as lo
7550: 6e 67 20 61 73 20 74 68 65 79 0a 20 20 20 20 20  ng as they.     
7560: 20 2a 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79 20   ** differ only 
7570: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
7580: 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20 65   spaces at the e
7590: 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
75a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
75b0: 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32   = nKey1 - nKey2
75c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
75d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
75e0: 2a 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d  * Another built-
75f0: 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  in collating seq
7600: 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a  uence: NOCASE. .
7610: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61  **.** This colla
7620: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  ting sequence is
7630: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
7640: 75 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69  used for "case i
7650: 6e 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f  ndependent.** co
7660: 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74  mparison". SQLit
7670: 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66  e's knowledge of
7680: 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72   upper and lower
7690: 20 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74   case equivalent
76a0: 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c  s.** extends onl
76b0: 79 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72  y to the 26 char
76c0: 61 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74  acters used in t
76d0: 68 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  he English langu
76e0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68  age..**.** At th
76f0: 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69  e moment there i
7700: 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69  s only a UTF-8 i
7710: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
7720: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63  /.static int noc
7730: 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63  aseCollatingFunc
7740: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
7750: 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  d,.  int nKey1, 
7760: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
7770: 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  1,.  int nKey2, 
7780: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
7790: 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73  2.){.  int r = s
77a0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a  qlite3StrNICmp(.
77b0: 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61        (const cha
77c0: 72 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73  r *)pKey1, (cons
77d0: 74 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20  t char *)pKey2, 
77e0: 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b  (nKey1<nKey2)?nK
77f0: 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e  ey1:nKey2);.  UN
7800: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
7810: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30  otUsed);.  if( 0
7820: 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e  ==r ){.    r = n
7830: 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a  Key1-nKey2;.  }.
7840: 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f    return r;.}../
7850: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7860: 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73  ROWID of the mos
7870: 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a  t recent insert.
7880: 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  */.sqlite_int64 
7890: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
78a0: 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65  ert_rowid(sqlite
78b0: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
78c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
78d0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
78e0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
78f0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
7900: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
7910: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
7920: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
7930: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61  .  return db->la
7940: 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  stRowid;.}../*.*
7950: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
7960: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69  ber of changes i
7970: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
7980: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
7990: 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74  3_exec()..*/.int
79a0: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
79b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
79c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
79d0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
79e0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
79f0: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
7a00: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
7a10: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
7a20: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7a30: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
7a40: 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a   db->nChange;.}.
7a50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
7a60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
7a70: 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 64 61  ges since the da
7a80: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61  tabase handle wa
7a90: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  s opened..*/.int
7aa0: 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63   sqlite3_total_c
7ab0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
7ac0: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
7ad0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
7ae0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
7af0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
7b00: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
7b10: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
7b20: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
7b30: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
7b40: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61  return db->nTota
7b50: 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  lChange;.}../*.*
7b60: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e  * Close all open
7b70: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69   savepoints. Thi
7b80: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
7b90: 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c  manipulates fiel
7ba0: 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ds of the.** dat
7bb0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a  abase handle obj
7bc0: 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  ect, it does not
7bd0: 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70   close any savep
7be0: 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62  oints that may b
7bf0: 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65  e open.** at the
7c00: 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65   b-tree/pager le
7c10: 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  vel..*/.void sql
7c20: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
7c30: 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
7c40: 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70  {.  while( db->p
7c50: 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
7c60: 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70   Savepoint *pTmp
7c70: 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
7c80: 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65  t;.    db->pSave
7c90: 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e  point = pTmp->pN
7ca0: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
7cb0: 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29  DbFree(db, pTmp)
7cc0: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76  ;.  }.  db->nSav
7cd0: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62  epoint = 0;.  db
7ce0: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
7cf0: 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61  ;.  db->isTransa
7d00: 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
7d10: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   0;.}../*.** Inv
7d20: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
7d30: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f  or function asso
7d40: 63 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63  ciated with Func
7d50: 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45  Def p, if any. E
7d60: 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69  xcept,.** if thi
7d70: 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  s is not the las
7d80: 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75  t copy of the fu
7d90: 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69  nction, do not i
7da0: 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70  nvoke it. Multip
7db0: 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20  le.** copies of 
7dc0: 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f  a single functio
7dd0: 6e 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68  n are created wh
7de0: 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69  en create_functi
7df0: 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a  on() is called.*
7e00: 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e  * with SQLITE_AN
7e10: 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  Y as the encodin
7e20: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
7e30: 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f  d functionDestro
7e40: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  y(sqlite3 *db, F
7e50: 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75  uncDef *p){.  Fu
7e60: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
7e70: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70  estructor = p->p
7e80: 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66  Destructor;.  if
7e90: 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ( pDestructor ){
7ea0: 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72  .    pDestructor
7eb0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
7ec0: 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e  ( pDestructor->n
7ed0: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
7ee0: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65  pDestructor->xDe
7ef0: 73 74 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f  stroy(pDestructo
7f00: 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20  r->pUserData);. 
7f10: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
7f20: 65 65 28 64 62 2c 20 70 44 65 73 74 72 75 63 74  ee(db, pDestruct
7f30: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  or);.    }.  }.}
7f40: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65  ../*.** Disconne
7f50: 63 74 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76  ct all sqlite3_v
7f60: 74 61 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74  tab objects that
7f70: 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62   belong to datab
7f80: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
7f90: 2a 20 64 62 2e 20 54 68 69 73 20 69 73 20 63 61  * db. This is ca
7fa0: 6c 6c 65 64 20 77 68 65 6e 20 64 62 20 69 73 20  lled when db is 
7fb0: 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f  being closed..*/
7fc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
7fd0: 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73  connectAllVtab(s
7fe0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
7ff0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8000: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
8010: 69 6e 74 20 69 3b 0a 20 20 48 61 73 68 45 6c 65  int i;.  HashEle
8020: 6d 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42  m *p;.  sqlite3B
8030: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
8040: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
8050: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
8060: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
8070: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  a = db->aDb[i].p
8080: 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20  Schema;.    if( 
8090: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65  db->aDb[i].pSche
80a0: 6d 61 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ma ){.      for(
80b0: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
80c0: 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
80d0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
80e0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
80f0: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
8100: 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29 73 71  ab = (Table *)sq
8110: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
8120: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
8130: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 73  irtual(pTab) ) s
8140: 71 6c 69 74 65 33 56 74 61 62 44 69 73 63 6f 6e  qlite3VtabDiscon
8150: 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29 3b 0a  nect(db, pTab);.
8160: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8170: 7d 0a 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65  }.  for(p=sqlite
8180: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
8190: 4d 6f 64 75 6c 65 29 3b 20 70 3b 20 70 3d 73 71  Module); p; p=sq
81a0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29  liteHashNext(p))
81b0: 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d  {.    Module *pM
81c0: 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73  od = (Module *)s
81d0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29  qliteHashData(p)
81e0: 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e  ;.    if( pMod->
81f0: 70 45 70 6f 54 61 62 20 29 7b 0a 20 20 20 20 20  pEpoTab ){.     
8200: 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63   sqlite3VtabDisc
8210: 6f 6e 6e 65 63 74 28 64 62 2c 20 70 4d 6f 64 2d  onnect(db, pMod-
8220: 3e 70 45 70 6f 54 61 62 29 3b 0a 20 20 20 20 7d  >pEpoTab);.    }
8230: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
8240: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
8250: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
8260: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65  LeaveAll(db);.#e
8270: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
8280: 41 4d 45 54 45 52 28 64 62 29 3b 0a 23 65 6e 64  AMETER(db);.#end
8290: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
82a0: 72 6e 20 54 52 55 45 20 69 66 20 64 61 74 61 62  rn TRUE if datab
82b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
82c0: 62 20 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65  b has unfinalize
82d0: 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  d prepared.** st
82e0: 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69  atements or unfi
82f0: 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62  nished sqlite3_b
8300: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20 20  ackup objects.  
8310: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
8320: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
8330: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
8340: 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28  int j;.  assert(
8350: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8360: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
8370: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62  ;.  if( db->pVdb
8380: 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  e ) return 1;.  
8390: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
83a0: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; j++){.    Bt
83b0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
83c0: 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[j].pBt;.    i
83d0: 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65  f( pBt && sqlite
83e0: 33 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70  3BtreeIsInBackup
83f0: 28 70 42 74 29 20 29 20 72 65 74 75 72 6e 20 31  (pBt) ) return 1
8400: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
8410: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
8420: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c   an existing SQL
8430: 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a  ite database.*/.
8440: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
8450: 65 33 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 20  e3Close(sqlite3 
8460: 2a 64 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f  *db, int forceZo
8470: 6d 62 69 65 29 7b 0a 20 20 69 66 28 20 21 64 62  mbie){.  if( !db
8480: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
8490: 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d  NCE-OF: R-63257-
84a0: 31 31 37 34 30 20 43 61 6c 6c 69 6e 67 20 73 71  11740 Calling sq
84b0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72  lite3_close() or
84c0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
84d0: 63 6c 6f 73 65 5f 76 32 28 29 20 77 69 74 68 20  close_v2() with 
84e0: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61  a NULL pointer a
84f0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 68 61 72  rgument is a har
8500: 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a  mless no-op. */.
8510: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8520: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
8530: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
8540: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
8550: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8560: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
8570: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
8580: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
8590: 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f  mutex);..  /* Fo
85a0: 72 63 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20  rce xDisconnect 
85b0: 63 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72  calls on all vir
85c0: 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20  tual tables */. 
85d0: 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74   disconnectAllVt
85e0: 61 62 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  ab(db);..  /* If
85f0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
8600: 73 20 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63  s open, the disc
8610: 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20  onnectAllVtab() 
8620: 63 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20  call above.  ** 
8630: 77 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61  will not have ca
8640: 6c 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e  lled the xDiscon
8650: 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e  nect() method on
8660: 20 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a   any virtual.  *
8670: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
8680: 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72  db->aVTrans[] ar
8690: 72 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ray. The followi
86a0: 6e 67 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  ng sqlite3VtabRo
86b0: 6c 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61  llback().  ** ca
86c0: 6c 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57  ll will do so. W
86d0: 65 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69  e need to do thi
86e0: 73 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 65  s before the che
86f0: 63 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20  ck for active.  
8700: 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
8710: 73 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20  s below, as the 
8720: 76 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e  v-table implemen
8730: 74 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74  tation may be st
8740: 6f 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20  oring.  ** some 
8750: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
8760: 6e 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  nts internally..
8770: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74    */.  sqlite3Vt
8780: 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a  abRollback(db);.
8790: 0a 20 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68  .  /* Legacy beh
87a0: 61 76 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63  avior (sqlite3_c
87b0: 6c 6f 73 65 28 29 20 62 65 68 61 76 69 6f 72 29  lose() behavior)
87c0: 20 69 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20   is to return.  
87d0: 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
87e0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
87f0: 20 63 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73   can not be clos
8800: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
8810: 20 20 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63    */.  if( !forc
8820: 65 5a 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65  eZombie && conne
8830: 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20  ctionIsBusy(db) 
8840: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8850: 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53  rorWithMsg(db, S
8860: 51 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61  QLITE_BUSY, "una
8870: 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65  ble to close due
8880: 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20   to unfinalized 
8890: 22 0a 20 20 20 20 20 20 20 22 73 74 61 74 65 6d  ".       "statem
88a0: 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68  ents or unfinish
88b0: 65 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20  ed backups");.  
88c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
88d0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
88e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
88f0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23  ITE_BUSY;.  }..#
8900: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8910: 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28  BLE_SQLLOG.  if(
8920: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
8930: 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a  nfig.xSqllog ){.
8940: 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74      /* Closing t
8950: 68 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74  he handle. Fourt
8960: 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  h parameter is p
8970: 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20  assed the value 
8980: 32 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  2. */.    sqlite
8990: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
89a0: 71 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f  qllog(sqlite3Glo
89b0: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
89c0: 67 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b  gArg, db, 0, 2);
89d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
89e0: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f  * Convert the co
89f0: 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20  nnection into a 
8a00: 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e 20  zombie and then 
8a10: 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  close it..  */. 
8a20: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
8a30: 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45  ITE_MAGIC_ZOMBIE
8a40: 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76 65  ;.  sqlite3Leave
8a50: 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d  MutexAndCloseZom
8a60: 62 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72  bie(db);.  retur
8a70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
8a80: 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61 74  /*.** Two variat
8a90: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62 6c  ions on the publ
8aa0: 69 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72  ic interface for
8ab0: 20 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61 62   closing a datab
8ac0: 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
8ad0: 6e 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63  n. The sqlite3_c
8ae0: 6c 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20 72  lose() version r
8af0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55  eturns SQLITE_BU
8b00: 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73  SY and.** leaves
8b10: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
8b20: 6f 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  option if there 
8b30: 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20  are unfinalized 
8b40: 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74  prepared.** stat
8b50: 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69  ements or unfini
8b60: 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63  shed sqlite3_bac
8b70: 6b 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69 74  kups.  The sqlit
8b80: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a  e3_close_v2().**
8b90: 20 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73 20   version forces 
8ba0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
8bb0: 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69  o become a zombi
8bc0: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a  e if there are.*
8bd0: 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75  * unclosed resou
8be0: 72 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e 67  rces, and arrang
8bf0: 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74  es for deallocat
8c00: 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ion when the las
8c10: 74 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74 61  t.** prepare sta
8c20: 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74 65  tement or sqlite
8c30: 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e  3_backup closes.
8c40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
8c50: 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64  close(sqlite3 *d
8c60: 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  b){ return sqlit
8c70: 65 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d  e3Close(db,0); }
8c80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .int sqlite3_clo
8c90: 73 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64  se_v2(sqlite3 *d
8ca0: 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  b){ return sqlit
8cb0: 65 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d  e3Close(db,1); }
8cc0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  .../*.** Close t
8cd0: 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61  he mutex on data
8ce0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
8cf0: 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65  db..**.** Furthe
8d00: 72 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62 61  rmore, if databa
8d10: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
8d20: 20 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65   is a zombie (me
8d30: 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72 65  aning that there
8d40: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20 70  .** has been a p
8d50: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
8d60: 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f  ite3_close(db) o
8d70: 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  r sqlite3_close_
8d80: 76 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65  v2(db)) and.** e
8d90: 76 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74 6d  very sqlite3_stm
8da0: 74 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 66  t has now been f
8db0: 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76 65  inalized and eve
8dc0: 72 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  ry sqlite3_backu
8dd0: 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65  p has.** finishe
8de0: 64 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c 6c  d, then free all
8df0: 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76   resources..*/.v
8e00: 6f 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76 65  oid sqlite3Leave
8e10: 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d  MutexAndCloseZom
8e20: 62 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  bie(sqlite3 *db)
8e30: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e50: 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c      /* Hash tabl
8e60: 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  e iterator */.  
8e70: 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20  int j;..  /* If 
8e80: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
8e90: 6e 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74  nding sqlite3_st
8ea0: 6d 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61  mt or sqlite3_ba
8eb0: 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a  ckup objects.  *
8ec0: 2a 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e 6e  * or if the conn
8ed0: 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  ection has not y
8ee0: 65 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 62  et been closed b
8ef0: 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  y sqlite3_close_
8f00: 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  v2(),.  ** then 
8f10: 6a 75 73 74 20 6c 65 61 76 65 20 74 68 65 20 6d  just leave the m
8f20: 75 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e 2e  utex and return.
8f30: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
8f40: 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41  magic!=SQLITE_MA
8f50: 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f  GIC_ZOMBIE || co
8f60: 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64  nnectionIsBusy(d
8f70: 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
8f80: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
8f90: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65  ->mutex);.    re
8fa0: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
8fb0: 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
8fc0: 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
8fd0: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
8fe0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  se connection ha
8ff0: 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c  s.  ** closed al
9000: 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 61  l sqlite3_stmt a
9010: 6e 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  nd sqlite3_backu
9020: 70 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68 61  p objects and ha
9030: 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73  s been.  ** pass
9040: 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c  ed to sqlite3_cl
9050: 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61  ose (meaning tha
9060: 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65  t it is a zombie
9070: 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20  ).  Therefore,. 
9080: 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64   ** go ahead and
9090: 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72   free all resour
90a0: 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  ces..  */..  /* 
90b0: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
90c0: 20 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69   is open, roll i
90d0: 74 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c 73  t back. This als
90e0: 6f 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 69  o ensures that i
90f0: 66 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61 62  f.  ** any datab
9100: 61 73 65 20 73 63 68 65 6d 61 73 20 68 61 76 65  ase schemas have
9110: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62   been modified b
9120: 79 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64  y an uncommitted
9130: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
9140: 2a 20 74 68 65 79 20 61 72 65 20 72 65 73 65 74  * they are reset
9150: 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 72  . And that the r
9160: 65 71 75 69 72 65 64 20 62 2d 74 72 65 65 20 6d  equired b-tree m
9170: 75 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f 20  utex is held to 
9180: 6d 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  make.  ** the pa
9190: 67 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  ger rollback and
91a0: 20 73 63 68 65 6d 61 20 72 65 73 65 74 20 61 6e   schema reset an
91b0: 20 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f   atomic operatio
91c0: 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52  n. */.  sqlite3R
91d0: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
91e0: 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a  QLITE_OK);..  /*
91f0: 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61   Free any outsta
9200: 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20  nding Savepoint 
9210: 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20  structures. */. 
9220: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
9230: 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20  epoints(db);..  
9240: 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74  /* Close all dat
9250: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
9260: 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  s */.  for(j=0; 
9270: 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b  j<db->nDb; j++){
9280: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
9290: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a  pDb = &db->aDb[j
92a0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
92b0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pBt ){.      sql
92c0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
92d0: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Db->pBt);.      
92e0: 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20  pDb->pBt = 0;.  
92f0: 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a      if( j!=1 ){.
9300: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63          pDb->pSc
9310: 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  hema = 0;.      
9320: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
9330: 20 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50 20   Clear the TEMP 
9340: 73 63 68 65 6d 61 20 73 65 70 61 72 61 74 65 6c  schema separatel
9350: 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20  y and last */.  
9360: 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
9370: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 71  Schema ){.    sq
9380: 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72  lite3SchemaClear
9390: 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  (db->aDb[1].pSch
93a0: 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ema);.  }.  sqli
93b0: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73  te3VtabUnlockLis
93c0: 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65  t(db);..  /* Fre
93d0: 65 20 75 70 20 74 68 65 20 61 72 72 61 79 20 6f  e up the array o
93e0: 66 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  f auxiliary data
93f0: 62 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  bases */.  sqlit
9400: 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61  e3CollapseDataba
9410: 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20 61  seArray(db);.  a
9420: 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d  ssert( db->nDb<=
9430: 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  2 );.  assert( d
9440: 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53  b->aDb==db->aDbS
9450: 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54  tatic );..  /* T
9460: 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ell the code in 
9470: 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74 68  notify.c that th
9480: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20  e connection no 
9490: 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79  longer holds any
94a0: 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20  .  ** locks and 
94b0: 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
94c0: 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c   any further unl
94d0: 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62  ock-notify callb
94e0: 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  acks..  */.  sql
94f0: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c  ite3ConnectionCl
9500: 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72  osed(db);..  for
9510: 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a  (j=0; j<ArraySiz
9520: 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20  e(db->aFunc.a); 
9530: 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  j++){.    FuncDe
9540: 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68  f *pNext, *pHash
9550: 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  , *p;.    for(p=
9560: 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20  db->aFunc.a[j]; 
9570: 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20  p; p=pHash){.   
9580: 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48     pHash = p->pH
9590: 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ash;.      while
95a0: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ( p ){.        f
95b0: 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64  unctionDestroy(d
95c0: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70  b, p);.        p
95d0: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
95e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
95f0: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
9600: 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74         p = pNext
9610: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9620: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69    }.  for(i=sqli
9630: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
9640: 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69  >aCollSeq); i; i
9650: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
9660: 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  i)){.    CollSeq
9670: 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53   *pColl = (CollS
9680: 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  eq *)sqliteHashD
9690: 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49  ata(i);.    /* I
96a0: 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75  nvoke any destru
96b0: 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64  ctors registered
96c0: 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   for collation s
96d0: 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74  equence user dat
96e0: 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d  a. */.    for(j=
96f0: 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<3; j++){.  
9700: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d      if( pColl[j]
9710: 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  .xDel ){.       
9720: 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70   pColl[j].xDel(p
9730: 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a  Coll[j].pUser);.
9740: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9750: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9760: 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  db, pColl);.  }.
9770: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
9780: 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  ar(&db->aCollSeq
9790: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
97a0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
97b0: 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  BLE.  for(i=sqli
97c0: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
97d0: 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d  >aModule); i; i=
97e0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
97f0: 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a  )){.    Module *
9800: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a  pMod = (Module *
9810: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
9820: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64  i);.    if( pMod
9830: 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ->xDestroy ){.  
9840: 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72      pMod->xDestr
9850: 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a  oy(pMod->pAux);.
9860: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9870: 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61  3VtabEponymousTa
9880: 62 6c 65 43 6c 65 61 72 28 64 62 2c 20 70 4d 6f  bleClear(db, pMo
9890: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  d);.    sqlite3D
98a0: 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b  bFree(db, pMod);
98b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
98c0: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f  shClear(&db->aMo
98d0: 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  dule);.#endif.. 
98e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
98f0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f 2a  , SQLITE_OK); /*
9900: 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79   Deallocates any
9910: 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73 74   cached error st
9920: 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  rings. */.  sqli
9930: 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d  te3ValueFree(db-
9940: 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65  >pErr);.  sqlite
9950: 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73  3CloseExtensions
9960: 28 64 62 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  (db);.#if SQLITE
9970: 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
9980: 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 66  TION.  sqlite3_f
9990: 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75  ree(db->auth.zAu
99a0: 74 68 55 73 65 72 29 3b 0a 20 20 73 71 6c 69 74  thUser);.  sqlit
99b0: 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68  e3_free(db->auth
99c0: 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65 6e 64 69  .zAuthPW);.#endi
99d0: 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  f..  db->magic =
99e0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52   SQLITE_MAGIC_ER
99f0: 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74  ROR;..  /* The t
9a00: 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63 68  emp-database sch
9a10: 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ema is allocated
9a20: 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f   differently fro
9a30: 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68 65  m the other sche
9a40: 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20  ma.  ** objects 
9a50: 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c  (using sqliteMal
9a60: 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c 20  loc() directly, 
9a70: 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74  instead of sqlit
9a80: 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29 29  e3BtreeSchema())
9a90: 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65  ..  ** So it nee
9aa0: 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 68  ds to be freed h
9ab0: 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e  ere. Todo: Why n
9ac0: 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70  ot roll the temp
9ad0: 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a   schema into.  *
9ae0: 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69 74  * the same sqlit
9af0: 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68 65  eMalloc() as the
9b00: 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63 61   one that alloca
9b10: 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  tes the database
9b20: 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65   .  ** structure
9b30: 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ?.  */.  sqlite3
9b40: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
9b50: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a  Db[1].pSchema);.
9b60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9b70: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
9b80: 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ;.  db->magic = 
9b90: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
9ba0: 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  SED;.  sqlite3_m
9bb0: 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75  utex_free(db->mu
9bc0: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
9bd0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
9be0: 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61 69  ut==0 );  /* Fai
9bf0: 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69 64  ls on a lookasid
9c00: 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f  e memory leak */
9c10: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
9c20: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
9c30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
9c40: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
9c50: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 23 69  .pStart);.  }.#i
9c60: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
9c70: 4c 45 5f 53 51 4c 52 52 0a 20 20 53 52 52 65 63  LE_SQLRR.  SRRec
9c80: 43 6c 6f 73 65 28 64 62 29 3b 0a 23 65 6e 64 69  Close(db);.#endi
9c90: 66 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 66  f.  .  sqlite3_f
9ca0: 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ree(db);.}../*.*
9cb0: 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64  * Rollback all d
9cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20  atabase files.  
9cd0: 49 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e  If tripCode is n
9ce0: 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68  ot SQLITE_OK, th
9cf0: 65 6e 0a 2a 2a 20 61 6e 79 20 77 72 69 74 65 20  en.** any write 
9d00: 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61  cursors are inva
9d10: 6c 69 64 61 74 65 64 20 28 22 74 72 69 70 70 65  lidated ("trippe
9d20: 64 22 20 2d 20 61 73 20 69 6e 20 22 74 72 69 70  d" - as in "trip
9d30: 70 69 6e 67 20 61 20 63 69 72 63 75 69 74 0a 2a  ping a circuit.*
9d40: 2a 20 62 72 65 61 6b 65 72 22 29 20 61 6e 64 20  * breaker") and 
9d50: 6d 61 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74  made to return t
9d60: 72 69 70 43 6f 64 65 20 69 66 20 74 68 65 72 65  ripCode if there
9d70: 20 61 72 65 20 61 6e 79 20 66 75 72 74 68 65 72   are any further
9d80: 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
9d90: 75 73 65 20 74 68 61 74 20 63 75 72 73 6f 72 2e  use that cursor.
9da0: 20 20 52 65 61 64 20 63 75 72 73 6f 72 73 20 72    Read cursors r
9db0: 65 6d 61 69 6e 20 6f 70 65 6e 20 61 6e 64 20 76  emain open and v
9dc0: 61 6c 69 64 0a 2a 2a 20 62 75 74 20 61 72 65 20  alid.** but are 
9dd0: 22 73 61 76 65 64 22 20 69 6e 20 63 61 73 65 20  "saved" in case 
9de0: 74 68 65 20 74 61 62 6c 65 20 70 61 67 65 73 20  the table pages 
9df0: 61 72 65 20 6d 6f 76 65 64 20 61 72 6f 75 6e 64  are moved around
9e00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9e10: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c  3RollbackAll(sql
9e20: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 74 72  ite3 *db, int tr
9e30: 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69  ipCode){.  int i
9e40: 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20  ;.  int inTrans 
9e50: 3d 20 30 3b 0a 20 20 69 6e 74 20 73 63 68 65 6d  = 0;.  int schem
9e60: 61 43 68 61 6e 67 65 3b 0a 20 20 61 73 73 65 72  aChange;.  asser
9e70: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
9e80: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
9e90: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67   );.  sqlite3Beg
9ea0: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
9eb0: 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  ;..  /* Obtain a
9ec0: 6c 6c 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65  ll b-tree mutexe
9ed0: 73 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20  s before making 
9ee0: 61 6e 79 20 63 61 6c 6c 73 20 74 6f 20 42 74 72  any calls to Btr
9ef0: 65 65 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 0a 20  eeRollback(). . 
9f00: 20 2a 2a 20 54 68 69 73 20 69 73 20 69 6d 70 6f   ** This is impo
9f10: 72 74 61 6e 74 20 69 6e 20 63 61 73 65 20 74 68  rtant in case th
9f20: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
9f30: 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
9f40: 68 61 73 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65  has.  ** modifie
9f50: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
9f60: 63 68 65 6d 61 2e 20 49 66 20 74 68 65 20 62 2d  chema. If the b-
9f70: 74 72 65 65 20 6d 75 74 65 78 65 73 20 61 72 65  tree mutexes are
9f80: 20 6e 6f 74 20 74 61 6b 65 6e 0a 20 20 2a 2a 20   not taken.  ** 
9f90: 68 65 72 65 2c 20 74 68 65 6e 20 61 6e 6f 74 68  here, then anoth
9fa0: 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  er shared-cache 
9fb0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69 67 68 74  connection might
9fc0: 20 73 6e 65 61 6b 20 69 6e 20 62 65 74 77 65 65   sneak in betwee
9fd0: 6e 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  n.  ** the datab
9fe0: 61 73 65 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  ase rollback and
9ff0: 20 73 63 68 65 6d 61 20 72 65 73 65 74 2c 20 77   schema reset, w
a000: 68 69 63 68 20 63 61 6e 20 63 61 75 73 65 20 66  hich can cause f
a010: 61 6c 73 65 0a 20 20 2a 2a 20 63 6f 72 72 75 70  alse.  ** corrup
a020: 74 69 6f 6e 20 72 65 70 6f 72 74 73 20 69 6e 20  tion reports in 
a030: 73 6f 6d 65 20 63 61 73 65 73 2e 20 20 2a 2f 0a  some cases.  */.
a040: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
a050: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 73 63  terAll(db);.  sc
a060: 68 65 6d 61 43 68 61 6e 67 65 20 3d 20 28 64 62  hemaChange = (db
a070: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
a080: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21  _InternChanges)!
a090: 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62  =0 && db->init.b
a0a0: 75 73 79 3d 3d 30 3b 0a 0a 20 20 66 6f 72 28 69  usy==0;..  for(i
a0b0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
a0c0: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
a0d0: 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  p = db->aDb[i].p
a0e0: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  Bt;.    if( p ){
a0f0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
a100: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
a110: 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  (p) ){.        i
a120: 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20  nTrans = 1;.    
a130: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a140: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
a150: 2c 20 74 72 69 70 43 6f 64 65 2c 20 21 73 63 68  , tripCode, !sch
a160: 65 6d 61 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  emaChange);.    
a170: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
a180: 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b  tabRollback(db);
a190: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
a1a0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20  ignMalloc();..  
a1b0: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 53  if( (db->flags&S
a1c0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
a1d0: 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d 3e 69  ges)!=0 && db->i
a1e0: 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20  nit.busy==0 ){. 
a1f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
a200: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
a210: 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ts(db);.    sqli
a220: 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d  te3ResetAllSchem
a230: 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64  asOfConnection(d
a240: 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
a250: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
a260: 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65  b);..  /* Any de
a270: 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
a280: 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76  t violations hav
a290: 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c  e now been resol
a2a0: 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44  ved. */.  db->nD
a2b0: 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b  eferredCons = 0;
a2c0: 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  .  db->nDeferred
a2d0: 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64  ImmCons = 0;.  d
a2e0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
a2f0: 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 0a 20  ITE_DeferFKs;.. 
a300: 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62   /* If one has b
a310: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  een configured, 
a320: 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62  invoke the rollb
a330: 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  ack-hook callbac
a340: 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78  k */.  if( db->x
a350: 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
a360: 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20   && (inTrans || 
a370: 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29  !db->autoCommit)
a380: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c   ){.    db->xRol
a390: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62  lbackCallback(db
a3a0: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b  ->pRollbackArg);
a3b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
a3c0: 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74  turn a static st
a3d0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
a3e0: 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65 73 70  the name corresp
a3f0: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 65 72  onding to the er
a400: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70 65 63  ror code.** spec
a410: 69 66 69 65 64 20 69 6e 20 74 68 65 20 61 72 67  ified in the arg
a420: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64 65  ument..*/.#if de
a430: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 45 45  fined(SQLITE_NEE
a440: 44 5f 45 52 52 5f 4e 41 4d 45 29 0a 63 6f 6e 73  D_ERR_NAME).cons
a450: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45  t char *sqlite3E
a460: 72 72 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a  rrName(int rc){.
a470: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
a480: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
a490: 2c 20 6f 72 69 67 52 63 20 3d 20 72 63 3b 0a 20  , origRc = rc;. 
a4a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20 26 26   for(i=0; i<2 &&
a4b0: 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20   zName==0; i++, 
a4c0: 72 63 20 26 3d 20 30 78 66 66 29 7b 0a 20 20 20  rc &= 0xff){.   
a4d0: 20 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20   switch( rc ){. 
a4e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a4f0: 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 20 20 20  _OK:            
a500: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a510: 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20  LITE_OK";       
a520: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a530: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a540: 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20 20 20  E_ERROR:        
a550: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a560: 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20  QLITE_ERROR";   
a570: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a580: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a590: 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20 20  TE_INTERNAL:    
a5a0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a5b0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22  SQLITE_INTERNAL"
a5c0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
a5d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a5e0: 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20  ITE_PERM:       
a5f0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a600: 22 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20  "SQLITE_PERM";  
a610: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a620: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a630: 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20  LITE_ABORT:     
a640: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
a650: 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b   "SQLITE_ABORT";
a660: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
a670: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a680: 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
a690: 42 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d 65 20  BACK:     zName 
a6a0: 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  = "SQLITE_ABORT_
a6b0: 52 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20 62 72  ROLLBACK";    br
a6c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a6d0: 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20  SQLITE_BUSY:    
a6e0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a6f0: 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 22   = "SQLITE_BUSY"
a700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
a710: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a720: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43   SQLITE_BUSY_REC
a730: 4f 56 45 52 59 3a 20 20 20 20 20 20 7a 4e 61 6d  OVERY:      zNam
a740: 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59  e = "SQLITE_BUSY
a750: 5f 52 45 43 4f 56 45 52 59 22 3b 20 20 20 20 20  _RECOVERY";     
a760: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a770: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e  e SQLITE_BUSY_SN
a780: 41 50 53 48 4f 54 3a 20 20 20 20 20 20 7a 4e 61  APSHOT:      zNa
a790: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53  me = "SQLITE_BUS
a7a0: 59 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20  Y_SNAPSHOT";    
a7b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a7c0: 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  se SQLITE_LOCKED
a7d0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
a7e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f  ame = "SQLITE_LO
a7f0: 43 4b 45 44 22 3b 20 20 20 20 20 20 20 20 20 20  CKED";          
a800: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a810: 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ase SQLITE_LOCKE
a820: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3a 20 7a  D_SHAREDCACHE: z
a830: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c  Name = "SQLITE_L
a840: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
a850: 45 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  E";break;.      
a860: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  case SQLITE_NOME
a870: 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M:              
a880: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a890: 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 20 20  NOMEM";         
a8a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a8b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
a8c0: 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20 20 20  DONLY:          
a8d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a8e0: 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20  _READONLY";     
a8f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a900: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
a910: 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 3a  ADONLY_RECOVERY:
a920: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a930: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56  E_READONLY_RECOV
a940: 45 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ERY"; break;.   
a950: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
a960: 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b  EADONLY_CANTLOCK
a970: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
a980: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54  TE_READONLY_CANT
a990: 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LOCK"; break;.  
a9a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a9b0: 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43  READONLY_ROLLBAC
a9c0: 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  K:  zName = "SQL
a9d0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
a9e0: 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  LBACK"; break;. 
a9f0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
aa00: 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
aa10: 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  D:   zName = "SQ
aa20: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
aa30: 4d 4f 56 45 44 22 3b 20 20 62 72 65 61 6b 3b 0a  MOVED";  break;.
aa40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
aa50: 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 20 20  E_INTERRUPT:    
aa60: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
aa70: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 22  QLITE_INTERRUPT"
aa80: 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;         break;
aa90: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
aaa0: 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 20  TE_IOERR:       
aab0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
aac0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20  SQLITE_IOERR";  
aad0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
aae0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
aaf0: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20  ITE_IOERR_READ: 
ab00: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ab10: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45  "SQLITE_IOERR_RE
ab20: 41 44 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  AD";        brea
ab30: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ab40: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
ab50: 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  _READ:   zName =
ab60: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
ab70: 48 4f 52 54 5f 52 45 41 44 22 3b 20 20 62 72 65  HORT_READ";  bre
ab80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ab90: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
aba0: 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  E:        zName 
abb0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
abc0: 57 52 49 54 45 22 3b 20 20 20 20 20 20 20 62 72  WRITE";       br
abd0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
abe0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
abf0: 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  NC:        zName
ac00: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ac10: 5f 46 53 59 4e 43 22 3b 20 20 20 20 20 20 20 62  _FSYNC";       b
ac20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ac30: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
ac40: 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e 61 6d  R_FSYNC:    zNam
ac50: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
ac60: 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20 20 20  R_DIR_FSYNC";   
ac70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ac80: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  e SQLITE_IOERR_T
ac90: 52 55 4e 43 41 54 45 3a 20 20 20 20 20 7a 4e 61  RUNCATE:     zNa
aca0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
acb0: 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20 20 20  RR_TRUNCATE";   
acc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
acd0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
ace0: 46 53 54 41 54 3a 20 20 20 20 20 20 20 20 7a 4e  FSTAT:        zN
acf0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
ad00: 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20 20 20  ERR_FSTAT";     
ad10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ad20: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
ad30: 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a  _UNLOCK:       z
ad40: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
ad50: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20  OERR_UNLOCK";   
ad60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ad70: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
ad80: 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20  R_RDLOCK:       
ad90: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ada0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20  IOERR_RDLOCK";  
adb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
adc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
add0: 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20 20 20  RR_DELETE:      
ade0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
adf0: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22 3b 20  _IOERR_DELETE"; 
ae00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ae10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
ae20: 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20  ERR_NOMEM:      
ae30: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ae40: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20  E_IOERR_NOMEM"; 
ae50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ae60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
ae70: 4f 45 52 52 5f 41 43 43 45 53 53 3a 20 20 20 20  OERR_ACCESS:    
ae80: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ae90: 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 22  TE_IOERR_ACCESS"
aea0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
aeb0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
aec0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
aed0: 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  VEDLOCK:.       
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
af00: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43   "SQLITE_IOERR_C
af10: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
af20: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
af30: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
af40: 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20  R_LOCK:         
af50: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
af60: 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20 20 20  IOERR_LOCK";    
af70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
af80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
af90: 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20 20 20 20  RR_CLOSE:       
afa0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
afb0: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22 3b 20 20  _IOERR_CLOSE";  
afc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
afd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
afe0: 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3a 20 20  ERR_DIR_CLOSE:  
aff0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b000: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
b010: 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  E";   break;.   
b020: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b030: 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a 20 20 20  OERR_SHMOPEN:   
b040: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b050: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
b060: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
b070: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b080: 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3a 20 20  IOERR_SHMSIZE:  
b090: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b0a0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
b0b0: 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
b0c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b0d0: 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20  _IOERR_SHMLOCK: 
b0e0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b0f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f  LITE_IOERR_SHMLO
b100: 43 4b 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  CK";     break;.
b110: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b120: 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 3a 20  E_IOERR_SHMMAP: 
b130: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b140: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
b150: 41 50 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  AP";      break;
b160: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b170: 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3a 20 20  TE_IOERR_SEEK:  
b180: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b190: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
b1a0: 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  K";        break
b1b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b1c0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
b1d0: 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20  _NOENT: zName = 
b1e0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  "SQLITE_IOERR_DE
b1f0: 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62 72 65 61  LETE_NOENT";brea
b200: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b210: 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a  LITE_IOERR_MMAP:
b220: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b230: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d   "SQLITE_IOERR_M
b240: 4d 41 50 22 3b 20 20 20 20 20 20 20 20 62 72 65  MAP";        bre
b250: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b260: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
b270: 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20  EMPPATH:  zName 
b280: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b290: 47 45 54 54 45 4d 50 50 41 54 48 22 3b 20 62 72  GETTEMPPATH"; br
b2a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b2b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e  SQLITE_IOERR_CON
b2c0: 56 50 41 54 48 3a 20 20 20 20 20 7a 4e 61 6d 65  VPATH:     zName
b2d0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b2e0: 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20 20 20 62  _CONVPATH";    b
b2f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b300: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a   SQLITE_CORRUPT:
b310: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b320: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52  e = "SQLITE_CORR
b330: 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  UPT";           
b340: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b350: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
b360: 5f 56 54 41 42 3a 20 20 20 20 20 20 20 7a 4e 61  _VTAB:       zNa
b370: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52  me = "SQLITE_COR
b380: 52 55 50 54 5f 56 54 41 42 22 3b 20 20 20 20 20  RUPT_VTAB";     
b390: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b3a0: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  se SQLITE_NOTFOU
b3b0: 4e 44 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  ND:           zN
b3c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
b3d0: 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20 20 20  TFOUND";        
b3e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b3f0: 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a  ase SQLITE_FULL:
b400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
b410: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
b420: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 20 20 20  ULL";           
b430: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b440: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
b450: 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20 20 20  OPEN:           
b460: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b470: 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20 20  CANTOPEN";      
b480: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b490: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
b4a0: 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a  TOPEN_NOTEMPDIR:
b4b0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b4c0: 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50  _CANTOPEN_NOTEMP
b4d0: 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  DIR";break;.    
b4e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
b4f0: 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a 20 20 20  NTOPEN_ISDIR:   
b500: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b510: 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
b520: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
b530: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b540: 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
b550: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
b560: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
b570: 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  PATH"; break;.  
b580: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b590: 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54  CANTOPEN_CONVPAT
b5a0: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
b5b0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
b5c0: 56 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  VPATH"; break;. 
b5d0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b5e0: 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20  _PROTOCOL:      
b5f0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b600: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20  LITE_PROTOCOL"; 
b610: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b620: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b630: 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20 20 20  E_EMPTY:        
b640: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b650: 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20 20 20  QLITE_EMPTY";   
b660: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b670: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b680: 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20 20  TE_SCHEMA:      
b690: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b6a0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b 20  SQLITE_SCHEMA"; 
b6b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b6c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b6d0: 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20  ITE_TOOBIG:     
b6e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b6f0: 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22 3b  "SQLITE_TOOBIG";
b700: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b710: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b720: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a  LITE_CONSTRAINT:
b730: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b740: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
b750: 49 4e 54 22 3b 20 20 20 20 20 20 20 20 62 72 65  INT";        bre
b760: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b770: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b780: 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61 6d 65 20  _UNIQUE:  zName 
b790: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
b7a0: 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b 20 62 72  AINT_UNIQUE"; br
b7b0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b7c0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b7d0: 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e 61 6d 65  T_TRIGGER: zName
b7e0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
b7f0: 52 41 49 4e 54 5f 54 52 49 47 47 45 52 22 3b 62  RAINT_TRIGGER";b
b800: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b810: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
b820: 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3a 0a 20  NT_FOREIGNKEY:. 
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
b850: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b860: 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
b870: 4e 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a  NKEY";   break;.
b880: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b890: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45  E_CONSTRAINT_CHE
b8a0: 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  CK:   zName = "S
b8b0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b8c0: 5f 43 48 45 43 4b 22 3b 20 20 62 72 65 61 6b 3b  _CHECK";  break;
b8d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b8e0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
b8f0: 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20 20 20  IMARYKEY:.      
b900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b910: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b920: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
b930: 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 22  AINT_PRIMARYKEY"
b940: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
b950: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
b960: 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a  STRAINT_NOTNULL:
b970: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b980: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e  _CONSTRAINT_NOTN
b990: 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  ULL";break;.    
b9a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
b9b0: 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
b9c0: 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  OOK:.           
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9e0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b9f0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
ba00: 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20 20 62  COMMITHOOK";   b
ba10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ba20: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
ba30: 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a 4e 61 6d  NT_VTAB:    zNam
ba40: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
ba50: 54 52 41 49 4e 54 5f 56 54 41 42 22 3b 20 20 20  TRAINT_VTAB";   
ba60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ba70: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
ba80: 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  INT_FUNCTION:.  
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
bab0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
bac0: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  NSTRAINT_FUNCTIO
bad0: 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  N";     break;. 
bae0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
baf0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49  _CONSTRAINT_ROWI
bb00: 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  D:   zName = "SQ
bb10: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
bb20: 52 4f 57 49 44 22 3b 20 20 62 72 65 61 6b 3b 0a  ROWID";  break;.
bb30: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bb40: 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 20 20  E_MISMATCH:     
bb50: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bb60: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b  QLITE_MISMATCH";
bb70: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bb80: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bb90: 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 20  TE_MISUSE:      
bba0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bbb0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20  SQLITE_MISUSE"; 
bbc0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
bbd0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bbe0: 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20  ITE_NOLFS:      
bbf0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bc00: 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20  "SQLITE_NOLFS"; 
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bc20: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bc30: 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20  LITE_AUTH:      
bc40: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bc50: 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20   "SQLITE_AUTH"; 
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
bc70: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bc80: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20  QLITE_FORMAT:   
bc90: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bca0: 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  = "SQLITE_FORMAT
bcb0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
bcc0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bcd0: 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20  SQLITE_RANGE:   
bce0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bcf0: 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e 47 45   = "SQLITE_RANGE
bd00: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
bd10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bd20: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20   SQLITE_NOTADB: 
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bd40: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 41  e = "SQLITE_NOTA
bd50: 44 42 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  DB";            
bd60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bd70: 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20  e SQLITE_ROW:   
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
bd90: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57  me = "SQLITE_ROW
bda0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
bdb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bdc0: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  se SQLITE_NOTICE
bdd0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
bde0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
bdf0: 54 49 43 45 22 3b 20 20 20 20 20 20 20 20 20 20  TICE";          
be00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
be10: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43  ase SQLITE_NOTIC
be20: 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a 20 7a  E_RECOVER_WAL: z
be30: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
be40: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41  OTICE_RECOVER_WA
be50: 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  L";break;.      
be60: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49  case SQLITE_NOTI
be70: 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42  CE_RECOVER_ROLLB
be80: 41 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ACK:.           
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bea0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
beb0: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
bec0: 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62  VER_ROLLBACK"; b
bed0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bee0: 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 3a   SQLITE_WARNING:
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bf00: 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e  e = "SQLITE_WARN
bf10: 49 4e 47 22 3b 20 20 20 20 20 20 20 20 20 20 20  ING";           
bf20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bf30: 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  e SQLITE_WARNING
bf40: 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a 4e 61  _AUTOINDEX:  zNa
bf50: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52  me = "SQLITE_WAR
bf60: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 22 3b  NING_AUTOINDEX";
bf70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bf80: 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20  se SQLITE_DONE: 
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
bfa0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f  ame = "SQLITE_DO
bfb0: 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  NE";            
bfc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
bfd0: 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d   }.  if( zName==
bfe0: 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
bff0: 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
c000: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
c010: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
c020: 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49 54 45 5f  , zBuf, "SQLITE_
c030: 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20 6f 72  UNKNOWN(%d)", or
c040: 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61 6d 65  igRc);.    zName
c050: 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20 72   = zBuf;.  }.  r
c060: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23  eturn zName;.}.#
c070: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
c080: 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72  urn a static str
c090: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
c0a0: 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65  es the kind of e
c0b0: 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  rror specified i
c0c0: 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  n the.** argumen
c0d0: 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  t..*/.const char
c0e0: 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72 28   *sqlite3ErrStr(
c0f0: 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74 69  int rc){.  stati
c100: 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f  c const char* co
c110: 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20  nst aMsg[] = {. 
c120: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20     /* SQLITE_OK 
c130: 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74           */ "not
c140: 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20 20   an error",.    
c150: 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  /* SQLITE_ERROR 
c160: 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f        */ "SQL lo
c170: 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73  gic error or mis
c180: 73 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a  sing database",.
c190: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e      /* SQLITE_IN
c1a0: 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a  TERNAL    */ 0,.
c1b0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45      /* SQLITE_PE
c1c0: 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61 63  RM        */ "ac
c1d0: 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20  cess permission 
c1e0: 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20  denied",.    /* 
c1f0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20 20  SQLITE_ABORT    
c200: 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b 20     */ "callback 
c210: 72 65 71 75 65 73 74 65 64 20 71 75 65 72 79 20  requested query 
c220: 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20 53  abort",.    /* S
c230: 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20 20  QLITE_BUSY      
c240: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 69    */ "database i
c250: 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f  s locked",.    /
c260: 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  * SQLITE_LOCKED 
c270: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
c280: 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65  e table is locke
c290: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
c2a0: 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f  E_NOMEM       */
c2b0: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
c2c0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c2d0: 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22  READONLY    */ "
c2e0: 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
c2f0: 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61   a readonly data
c300: 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  base",.    /* SQ
c310: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 20  LITE_INTERRUPT  
c320: 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65 64   */ "interrupted
c330: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c340: 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f 20  _IOERR       */ 
c350: 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22  "disk I/O error"
c360: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c370: 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20 22  CORRUPT     */ "
c380: 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d  database disk im
c390: 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  age is malformed
c3a0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c3b0: 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20  _NOTFOUND    */ 
c3c0: 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69  "unknown operati
c3d0: 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  on",.    /* SQLI
c3e0: 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 2a  TE_FULL        *
c3f0: 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72 20 64  / "database or d
c400: 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20  isk is full",.  
c410: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54    /* SQLITE_CANT
c420: 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62  OPEN    */ "unab
c430: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
c440: 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f  ase file",.    /
c450: 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  * SQLITE_PROTOCO
c460: 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67  L    */ "locking
c470: 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20   protocol",.    
c480: 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 20  /* SQLITE_EMPTY 
c490: 20 20 20 20 20 20 2a 2f 20 22 74 61 62 6c 65 20        */ "table 
c4a0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
c4b0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c4c0: 5f 53 43 48 45 4d 41 20 20 20 20 20 20 2a 2f 20  _SCHEMA      */ 
c4d0: 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61  "database schema
c4e0: 20 68 61 73 20 63 68 61 6e 67 65 64 22 2c 0a 20   has changed",. 
c4f0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f     /* SQLITE_TOO
c500: 42 49 47 20 20 20 20 20 20 2a 2f 20 22 73 74 72  BIG      */ "str
c510: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20  ing or blob too 
c520: 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  big",.    /* SQL
c530: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20  ITE_CONSTRAINT  
c540: 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66  */ "constraint f
c550: 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ailed",.    /* S
c560: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 20  QLITE_MISMATCH  
c570: 20 20 2a 2f 20 22 64 61 74 61 74 79 70 65 20 6d    */ "datatype m
c580: 69 73 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a  ismatch",.    /*
c590: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 20   SQLITE_MISUSE  
c5a0: 20 20 20 20 2a 2f 20 22 6c 69 62 72 61 72 79 20      */ "library 
c5b0: 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f  routine called o
c5c0: 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65 22 2c  ut of sequence",
c5d0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
c5e0: 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22 6c  OLFS       */ "l
c5f0: 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72  arge file suppor
c600: 74 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c 0a  t is disabled",.
c610: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55      /* SQLITE_AU
c620: 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75  TH        */ "au
c630: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69  thorization deni
c640: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c650: 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a  TE_FORMAT      *
c660: 2f 20 22 61 75 78 69 6c 69 61 72 79 20 64 61 74  / "auxiliary dat
c670: 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72 72  abase format err
c680: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
c690: 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a  TE_RANGE       *
c6a0: 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75 6d  / "bind or colum
c6b0: 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72  n index out of r
c6c0: 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  ange",.    /* SQ
c6d0: 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20  LITE_NOTADB     
c6e0: 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 65 6e 63   */ "file is enc
c6f0: 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f 74  rypted or is not
c700: 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20   a database",.  
c710: 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  };.  const char 
c720: 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e  *zErr = "unknown
c730: 20 65 72 72 6f 72 22 3b 0a 20 20 73 77 69 74 63   error";.  switc
c740: 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73  h( rc ){.    cas
c750: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  e SQLITE_ABORT_R
c760: 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20 20  OLLBACK: {.     
c770: 20 7a 45 72 72 20 3d 20 22 61 62 6f 72 74 20 64   zErr = "abort d
c780: 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b  ue to ROLLBACK";
c790: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c7a0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
c7b0: 20 7b 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30   {.      rc &= 0
c7c0: 78 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41  xff;.      if( A
c7d0: 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20  LWAYS(rc>=0) && 
c7e0: 72 63 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73  rc<ArraySize(aMs
c7f0: 67 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d  g) && aMsg[rc]!=
c800: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72  0 ){.        zEr
c810: 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20  r = aMsg[rc];.  
c820: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
c830: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
c840: 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f  eturn zErr;.}../
c850: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c860: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62  e implements a b
c870: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61  usy callback tha
c880: 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69  t sleeps and tri
c890: 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69  es.** again unti
c8a0: 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75  l a timeout valu
c8b0: 65 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 54  e is reached.  T
c8c0: 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65  he timeout value
c8d0: 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65   is.** an intege
c8e0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  r number of mill
c8f0: 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20  iseconds passed 
c900: 69 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 0a  in as the first.
c910: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
c920: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
c930: 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c  eDefaultBusyCall
c940: 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72  back(. void *ptr
c950: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c960: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
c970: 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63  ection */. int c
c980: 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  ount            
c990: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c9a0: 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73   times table has
c9b0: 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b   been busy */.){
c9c0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
c9d0: 49 4e 20 7c 7c 20 48 41 56 45 5f 55 53 4c 45 45  IN || HAVE_USLEE
c9e0: 50 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  P.  static const
c9f0: 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20   u8 delays[] =. 
ca00: 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31      { 1, 2, 5, 1
ca10: 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32  0, 15, 20, 25, 2
ca20: 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30  5,  25,  50,  50
ca30: 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69  , 100 };.  stati
ca40: 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c  c const u8 total
ca50: 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20  s[] =.     { 0, 
ca60: 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33  1, 3,  8, 18, 33
ca70: 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31  , 53, 78, 103, 1
ca80: 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a  28, 178, 228 };.
ca90: 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20  # define NDELAY 
caa0: 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61 79 73  ArraySize(delays
cab0: 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ).  sqlite3 *db 
cac0: 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72  = (sqlite3 *)ptr
cad0: 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20  ;.  int timeout 
cae0: 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75  = db->busyTimeou
caf0: 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20  t;.  int delay, 
cb00: 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74  prior;..  assert
cb10: 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20  ( count>=0 );.  
cb20: 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c  if( count < NDEL
cb30: 41 59 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20  AY ){.    delay 
cb40: 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b  = delays[count];
cb50: 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74  .    prior = tot
cb60: 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65  als[count];.  }e
cb70: 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  lse{.    delay =
cb80: 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31   delays[NDELAY-1
cb90: 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74  ];.    prior = t
cba0: 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20  otals[NDELAY-1] 
cbb0: 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28  + delay*(count-(
cbc0: 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a  NDELAY-1));.  }.
cbd0: 20 20 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65    if( prior + de
cbe0: 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b  lay > timeout ){
cbf0: 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74 69 6d  .    delay = tim
cc00: 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20  eout - prior;.  
cc10: 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30 20 29    if( delay<=0 )
cc20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
cc30: 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28   sqlite3OsSleep(
cc40: 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a  db->pVfs, delay*
cc50: 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  1000);.  return 
cc60: 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74  1;.#else.  sqlit
cc70: 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65  e3 *db = (sqlite
cc80: 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74  3 *)ptr;.  int t
cc90: 69 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c 69 74  imeout = ((sqlit
cca0: 65 33 20 2a 29 70 74 72 29 2d 3e 62 75 73 79 54  e3 *)ptr)->busyT
ccb0: 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20 28 63  imeout;.  if( (c
ccc0: 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74  ount+1)*1000 > t
ccd0: 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 72 65  imeout ){.    re
cce0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
ccf0: 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d  lite3OsSleep(db-
cd00: 3e 70 56 66 73 2c 20 31 30 30 30 30 30 30 29 3b  >pVfs, 1000000);
cd10: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
cd20: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  dif.}../*.** Inv
cd30: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 62 75  oke the given bu
cd40: 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a  sy handler..**.*
cd50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
cd60: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
cd70: 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 65   operation faile
cd80: 64 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a  d with a lock..*
cd90: 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
cda0: 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  e returns non-ze
cdb0: 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ro, the lock is 
cdc0: 72 65 74 72 69 65 64 2e 20 20 49 66 20 69 74 0a  retried.  If it.
cdd0: 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20 74 68  ** returns 0, th
cde0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72  e operation abor
cdf0: 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54  ts with an SQLIT
ce00: 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f  E_BUSY error..*/
ce10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 76 6f  .int sqlite3Invo
ce20: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 42 75  keBusyHandler(Bu
ce30: 73 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20  syHandler *p){. 
ce40: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 4e   int rc;.  if( N
ce50: 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d  EVER(p==0) || p-
ce60: 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e  >xFunc==0 || p->
ce70: 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e  nBusy<0 ) return
ce80: 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46   0;.  rc = p->xF
ce90: 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e  unc(p->pArg, p->
cea0: 6e 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63  nBusy);.  if( rc
ceb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42  ==0 ){.    p->nB
cec0: 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  usy = -1;.  }els
ced0: 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b  e{.    p->nBusy+
cee0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
cef0: 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc; .}../*.** Th
cf00: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
cf10: 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
cf20: 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20  k for an Sqlite 
cf30: 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a  database to the.
cf40: 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  ** given callbac
cf50: 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  k function with 
cf60: 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65  the given argume
cf70: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
cf80: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
cf90: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
cfa0: 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76    int (*xBusy)(v
cfb0: 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  oid*,int),.  voi
cfc0: 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65  d *pArg.){.#ifde
cfd0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
cfe0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
cff0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
d000: 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
d010: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
d020: 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
d030: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
d040: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
d050: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
d060: 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79 3b  r.xFunc = xBusy;
d070: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
d080: 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a  er.pArg = pArg;.
d090: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
d0a0: 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 64  r.nBusy = 0;.  d
d0b0: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d  b->busyTimeout =
d0c0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
d0d0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
d0e0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
d0f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
d100: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d110: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
d120: 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CK./*.** This ro
d130: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70  utine sets the p
d140: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
d150: 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64   for an Sqlite d
d160: 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a  atabase to the.*
d170: 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  * given callback
d180: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
d190: 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e  he given argumen
d1a0: 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73 20  t. The progress 
d1b0: 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a  callback will.**
d1c0: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72   be invoked ever
d1d0: 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a  y nOps opcodes..
d1e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
d1f0: 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
d200: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
d210: 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20   .  int nOps,.  
d220: 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29  int (*xProgress)
d230: 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64  (void*), .  void
d240: 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66   *pArg.){.#ifdef
d250: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
d260: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
d270: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
d280: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
d290: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
d2a0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
d2b0: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
d2c0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
d2d0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
d2e0: 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30 20  );.  if( nOps>0 
d2f0: 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67  ){.    db->xProg
d300: 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65 73 73  ress = xProgress
d310: 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72  ;.    db->nProgr
d320: 65 73 73 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e  essOps = (unsign
d330: 65 64 29 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d  ed)nOps;.    db-
d340: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
d350: 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pArg;.  }else{. 
d360: 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73     db->xProgress
d370: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50   = 0;.    db->nP
d380: 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a  rogressOps = 0;.
d390: 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73      db->pProgres
d3a0: 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  sArg = 0;.  }.  
d3b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
d3c0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
d3d0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
d3e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   This routine in
d3f0: 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74  stalls a default
d400: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68   busy handler th
d410: 61 74 20 77 61 69 74 73 20 66 6f 72 20 74 68 65  at waits for the
d420: 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75  .** specified nu
d430: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
d440: 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74 75  onds before retu
d450: 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rning 0..*/.int 
d460: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
d470: 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eout(sqlite3 *db
d480: 2c 20 69 6e 74 20 6d 73 29 7b 0a 23 69 66 64 65  , int ms){.#ifde
d490: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d4a0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
d4b0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
d4c0: 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
d4d0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
d4e0: 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
d4f0: 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20  if( ms>0 ){.    
d500: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
d510: 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44  dler(db, sqliteD
d520: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
d530: 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a  ck, (void*)db);.
d540: 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65      db->busyTime
d550: 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 7d 65 6c 73  out = ms;.  }els
d560: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  e{.    sqlite3_b
d570: 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20  usy_handler(db, 
d580: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  0, 0);.  }.  ret
d590: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d5a0: 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e  ../*.** Cause an
d5b0: 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74  y pending operat
d5c0: 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69  ion to stop at i
d5d0: 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f  ts earliest oppo
d5e0: 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64  rtunity..*/.void
d5f0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
d600: 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  pt(sqlite3 *db){
d610: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d620: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
d630: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
d640: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
d650: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
d660: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
d670: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
d680: 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e 75 31  .#endif.  db->u1
d690: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d  .isInterrupted =
d6a0: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   1;.}.../*.** Th
d6b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  is function is e
d6c0: 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
d6d0: 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  as sqlite3_creat
d6e0: 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78  e_function(), ex
d6f0: 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20  cept.** that it 
d700: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62  is designed to b
d710: 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65  e called by inte
d720: 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64  rnal code. The d
d730: 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20  ifference is.** 
d740: 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63  that if a malloc
d750: 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69  () fails in sqli
d760: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
d770: 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20  ion(), an error 
d780: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72  code.** is retur
d790: 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c  ned and the mall
d7a0: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c  ocFailed flag cl
d7b0: 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73  eared. .*/.int s
d7c0: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
d7d0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
d7e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
d7f0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
d800: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
d810: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73  enc,.  void *pUs
d820: 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28  erData,.  void (
d830: 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33  *xSFunc)(sqlite3
d840: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
d850: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
d860: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
d870: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
d880: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
d890: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
d8a0: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
d8b0: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46  3_context*),.  F
d8c0: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
d8d0: 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20  Destructor.){.  
d8e0: 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e  FuncDef *p;.  in
d8f0: 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65  t nName;.  int e
d900: 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73  xtraFlags;..  as
d910: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d920: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
d930: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75  ex) );.  if( zFu
d940: 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c  nctionName==0 ||
d950: 0a 20 20 20 20 20 20 28 78 53 46 75 6e 63 20 26  .      (xSFunc &
d960: 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74  & (xFinal || xSt
d970: 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28  ep)) || .      (
d980: 21 78 53 46 75 6e 63 20 26 26 20 28 78 46 69 6e  !xSFunc && (xFin
d990: 61 6c 20 26 26 20 21 78 53 74 65 70 29 29 20 7c  al && !xStep)) |
d9a0: 7c 0a 20 20 20 20 20 20 28 21 78 53 46 75 6e 63  |.      (!xSFunc
d9b0: 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20   && (!xFinal && 
d9c0: 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20  xStep)) ||.     
d9d0: 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72   (nArg<-1 || nAr
d9e0: 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  g>SQLITE_MAX_FUN
d9f0: 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20  CTION_ARG) ||.  
da00: 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20      (255<(nName 
da10: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
da20: 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  0( zFunctionName
da30: 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ))) ){.    retur
da40: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
da50: 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  BKPT;.  }..  ass
da60: 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
da70: 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c 49 54  _CONSTANT==SQLIT
da80: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20  E_DETERMINISTIC 
da90: 29 3b 0a 20 20 65 78 74 72 61 46 6c 61 67 73 20  );.  extraFlags 
daa0: 3d 20 65 6e 63 20 26 20 20 53 51 4c 49 54 45 5f  = enc &  SQLITE_
dab0: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20  DETERMINISTIC;. 
dac0: 20 65 6e 63 20 26 3d 20 28 53 51 4c 49 54 45 5f   enc &= (SQLITE_
dad0: 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c  FUNC_ENCMASK|SQL
dae0: 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a 23 69 66  ITE_ANY);.  .#if
daf0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
db00: 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53  _UTF16.  /* If S
db10: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73  QLITE_UTF16 is s
db20: 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20  pecified as the 
db30: 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74  encoding type, t
db40: 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20  ransform this.  
db50: 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c  ** to one of SQL
db60: 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
db70: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73  QLITE_UTF16BE us
db80: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  ing the.  ** SQL
db90: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
dba0: 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54  macro. SQLITE_UT
dbb0: 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20  F16 is not used 
dbc0: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a  internally..  **
dbd0: 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  ** If SQLITE_
dbe0: 41 4e 59 20 69 73 20 73 70 65 63 69 66 69 65 64  ANY is specified
dbf0: 2c 20 61 64 64 20 74 68 72 65 65 20 76 65 72 73  , add three vers
dc00: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63  ions of the func
dc10: 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tion.  ** to the
dc20: 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a   hash table..  *
dc30: 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c  /.  if( enc==SQL
dc40: 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20  ITE_UTF16 ){.   
dc50: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
dc60: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c  F16NATIVE;.  }el
dc70: 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49  se if( enc==SQLI
dc80: 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e  TE_ANY ){.    in
dc90: 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  t rc;.    rc = s
dca0: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
dcb0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
dcc0: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
dcd0: 5f 55 54 46 38 7c 65 78 74 72 61 46 6c 61 67 73  _UTF8|extraFlags
dce0: 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73 65 72  ,.         pUser
dcf0: 44 61 74 61 2c 20 78 53 46 75 6e 63 2c 20 78 53  Data, xSFunc, xS
dd00: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65  tep, xFinal, pDe
dd10: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 69  structor);.    i
dd20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
dd30: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
dd40: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
dd50: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
dd60: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
dd70: 5f 55 54 46 31 36 4c 45 7c 65 78 74 72 61 46 6c  _UTF16LE|extraFl
dd80: 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ags,.          p
dd90: 55 73 65 72 44 61 74 61 2c 20 78 53 46 75 6e 63  UserData, xSFunc
dda0: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
ddb0: 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20   pDestructor);. 
ddc0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
ddd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
dde0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ddf0: 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53     }.    enc = S
de00: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20  QLITE_UTF16BE;. 
de10: 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d   }.#else.  enc =
de20: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
de30: 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65  ndif.  .  /* Che
de40: 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ck if an existin
de50: 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  g function is be
de60: 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f  ing overridden o
de70: 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f  r deleted. If so
de80: 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65  ,.  ** and there
de90: 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c   are active VMs,
dea0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c   then return SQL
deb0: 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66  ITE_BUSY. If a f
dec0: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
ded0: 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e  being overridden
dee0: 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68 65  /deleted but the
def0: 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  re are no active
df00: 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a   VMs, allow the.
df10: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74    ** operation t
df20: 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69  o continue but i
df30: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
df40: 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  ecompiled statem
df50: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  ents..  */.  p =
df60: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
df70: 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69  tion(db, zFuncti
df80: 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e  onName, nName, n
df90: 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29  Arg, (u8)enc, 0)
dfa0: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 28 70 2d  ;.  if( p && (p-
dfb0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
dfc0: 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b  ITE_FUNC_ENCMASK
dfd0: 29 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72  )==enc && p->nAr
dfe0: 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69  g==nArg ){.    i
dff0: 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  f( db->nVdbeActi
e000: 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ve ){.      sqli
e010: 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
e020: 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
e030: 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c   .        "unabl
e040: 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69  e to delete/modi
e050: 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e  fy user-function
e060: 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73   due to active s
e070: 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
e080: 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
e090: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
e0a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e0b0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65  ITE_BUSY;.    }e
e0c0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
e0d0: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
e0e0: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
e0f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d      }.  }..  p =
e100: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
e110: 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69  tion(db, zFuncti
e120: 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e  onName, nName, n
e130: 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29  Arg, (u8)enc, 1)
e140: 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20  ;.  assert(p || 
e150: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e160: 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
e170: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e180: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
e190: 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72 20 76 65  * If an older ve
e1a0: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e  rsion of the fun
e1b0: 63 74 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e  ction with a con
e1c0: 66 69 67 75 72 65 64 20 64 65 73 74 72 75 63 74  figured destruct
e1d0: 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67  or is.  ** being
e1e0: 20 72 65 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65   replaced invoke
e1f0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
e200: 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a  function here. *
e210: 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74  /.  functionDest
e220: 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69  roy(db, p);..  i
e230: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29  f( pDestructor )
e240: 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f  {.    pDestructo
e250: 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  r->nRef++;.  }. 
e260: 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72 20   p->pDestructor 
e270: 3d 20 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20  = pDestructor;. 
e280: 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20   p->funcFlags = 
e290: 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  (p->funcFlags & 
e2a0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d  SQLITE_FUNC_ENCM
e2b0: 41 53 4b 29 20 7c 20 65 78 74 72 61 46 6c 61 67  ASK) | extraFlag
e2c0: 73 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  s;.  testcase( p
e2d0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
e2e0: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
e2f0: 49 43 20 29 3b 0a 20 20 70 2d 3e 78 53 46 75 6e  IC );.  p->xSFun
e300: 63 20 3d 20 78 53 46 75 6e 63 20 3f 20 78 53 46  c = xSFunc ? xSF
e310: 75 6e 63 20 3a 20 78 53 74 65 70 3b 0a 20 20 70  unc : xStep;.  p
e320: 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46  ->xFinalize = xF
e330: 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72  inal;.  p->pUser
e340: 44 61 74 61 20 3d 20 70 55 73 65 72 44 61 74 61  Data = pUserData
e350: 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75  ;.  p->nArg = (u
e360: 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72  16)nArg;.  retur
e370: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e380: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77  /*.** Create new
e390: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e   user functions.
e3a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
e3b0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
e3c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
e3d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
e3e0: 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  unc,.  int nArg,
e3f0: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
e400: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
e410: 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  xSFunc)(sqlite3_
e420: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
e430: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
e440: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
e450: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
e460: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
e470: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
e480: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
e490: 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20  _context*).){.  
e4a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63  return sqlite3_c
e4b0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
e4c0: 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72  2(db, zFunc, nAr
e4d0: 67 2c 20 65 6e 63 2c 20 70 2c 20 78 53 46 75 6e  g, enc, p, xSFun
e4e0: 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20  c, xStep,.      
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 46                xF
e510: 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74  inal, 0);.}..int
e520: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
e530: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73  function_v2(.  s
e540: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
e550: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
e560: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
e570: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
e580: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75  p,.  void (*xSFu
e590: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
e5a0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
e5b0: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
e5c0: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
e5d0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
e5e0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
e5f0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
e600: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
e610: 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28  text*),.  void (
e620: 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20  *xDestroy)(void 
e630: 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *).){.  int rc =
e640: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
e650: 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20   FuncDestructor 
e660: 2a 70 41 72 67 20 3d 20 30 3b 0a 0a 23 69 66 64  *pArg = 0;..#ifd
e670: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e680: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
e690: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
e6a0: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
e6b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e6c0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
e6d0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
e6e0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
e6f0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
e700: 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20  xDestroy ){.    
e710: 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65 73 74  pArg = (FuncDest
e720: 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74 65 33  ructor *)sqlite3
e730: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
e740: 20 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74   sizeof(FuncDest
e750: 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66  ructor));.    if
e760: 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20  ( !pArg ){.     
e770: 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20   xDestroy(p);.  
e780: 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20      goto out;.  
e790: 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78 44    }.    pArg->xD
e7a0: 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f  estroy = xDestro
e7b0: 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73  y;.    pArg->pUs
e7c0: 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a  erData = p;.  }.
e7d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
e7e0: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
e7f0: 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70  nc, nArg, enc, p
e800: 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c  , xSFunc, xStep,
e810: 20 78 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a   xFinal, pArg);.
e820: 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41    if( pArg && pA
e830: 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  rg->nRef==0 ){. 
e840: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
e850: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
e860: 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20  xDestroy(p);.   
e870: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e880: 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20  b, pArg);.  }.. 
e890: 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69  out:.  rc = sqli
e8a0: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
e8b0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
e8c0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
e8d0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
e8e0: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
e8f0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
e900: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
e910: 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20  te_function16(. 
e920: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
e930: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e  const void *zFun
e940: 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  ctionName,.  int
e950: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65   nArg,.  int eTe
e960: 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70  xtRep,.  void *p
e970: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e  ,.  void (*xSFun
e980: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
e990: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
e9a0: 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64  value**),.  void
e9b0: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
e9c0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e9d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c  qlite3_value**),
e9e0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
e9f0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
ea00: 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  t*).){.  int rc;
ea10: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b  .  char *zFunc8;
ea20: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ea30: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
ea40: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
ea50: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
ea60: 20 7c 7c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d   || zFunctionNam
ea70: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
ea80: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
ea90: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
eaa0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
eab0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
eac0: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
ead0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e  Failed );.  zFun
eae0: 63 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31  c8 = sqlite3Utf1
eaf0: 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69  6to8(db, zFuncti
eb00: 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49  onName, -1, SQLI
eb10: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
eb20: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43  .  rc = sqlite3C
eb30: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
eb40: 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78  unc8, nArg, eTex
eb50: 74 52 65 70 2c 20 70 2c 20 78 53 46 75 6e 63 2c  tRep, p, xSFunc,
eb60: 78 53 74 65 70 2c 78 46 69 6e 61 6c 2c 30 29 3b  xStep,xFinal,0);
eb70: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
eb80: 28 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20  (db, zFunc8);.  
eb90: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
eba0: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
ebb0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
ebc0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
ebd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
ebe0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  ndif.../*.** Dec
ebf0: 6c 61 72 65 20 74 68 61 74 20 61 20 66 75 6e 63  lare that a func
ec00: 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76  tion has been ov
ec10: 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69  erloaded by a vi
ec20: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
ec30: 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  ** If the functi
ec40: 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  on already exist
ec50: 73 20 61 73 20 61 20 72 65 67 75 6c 61 72 20 67  s as a regular g
ec60: 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20  lobal function, 
ec70: 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
ec80: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
ec90: 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f    If the functio
eca0: 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
ecb0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a  , then create.**
ecc0: 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20   a new one that 
ecd0: 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61 20  always throws a 
ece0: 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20  run-time error. 
ecf0: 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72   .**.** When vir
ed00: 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65  tual tables inte
ed10: 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  nd to provide an
ed20: 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63   overloaded func
ed30: 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68  tion, they.** sh
ed40: 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72  ould call this r
ed50: 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73  outine to make s
ed60: 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66  ure the global f
ed70: 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a  unction exists..
ed80: 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ** A global func
ed90: 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20  tion must exist 
eda0: 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d  in order for nam
edb0: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20  e resolution to 
edc0: 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79  work.** properly
edd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ede0: 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
edf0: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  on(.  sqlite3 *d
ee00: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
ee10: 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41  *zName,.  int nA
ee20: 72 67 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d  rg.){.  int nNam
ee30: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
ee40: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e  n30(zName);.  in
ee50: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
ee60: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
ee70: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
ee80: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
ee90: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
eea0: 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c  ) || zName==0 ||
eeb0: 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20   nArg<-2 ){.    
eec0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
eed0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
eee0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
eef0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
ef00: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71  mutex);.  if( sq
ef10: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
ef20: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  n(db, zName, nNa
ef30: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
ef40: 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a  _UTF8, 0)==0 ){.
ef50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ef60: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
ef70: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
ef80: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efa0: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e      0, sqlite3In
efb0: 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  validFunction, 0
efc0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
efd0: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
efe0: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
eff0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
f000: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
f010: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
f020: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f030: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65  T_TRACE./*.** Re
f040: 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66  gister a trace f
f050: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
f060: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
f070: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
f080: 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65  d trace.** is re
f090: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
f0a0: 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e  A NULL trace fun
f0b0: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
f0c0: 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65   no tracing is e
f0d0: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
f0e0: 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73  NULL.** trace is
f0f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
f100: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
f110: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
f120: 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a  start of each.**
f130: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
f140: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
f150: 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a  _trace(sqlite3 *
f160: 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63  db, void (*xTrac
f170: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
f180: 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
f190: 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  g){.  void *pOld
f1a0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
f1b0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
f1c0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
f1d0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
f1e0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
f1f0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
f200: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
f210: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
f220: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
f230: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
f240: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63  pOld = db->pTrac
f250: 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61  eArg;.  db->xTra
f260: 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64  ce = xTrace;.  d
f270: 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70  b->pTraceArg = p
f280: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
f290: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
f2a0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
f2b0: 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65  pOld;.}./*.** Re
f2c0: 67 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65  gister a profile
f2d0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
f2e0: 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
f2f0: 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
f300: 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  red .** profile 
f310: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75  function is retu
f320: 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20  rned.  .**.** A 
f330: 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e  NULL profile fun
f340: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
f350: 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73   no profiling is
f360: 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
f370: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c  n-NULL.** profil
f380: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
f390: 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
f3a0: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
f3b0: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
f3c0: 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74  f.** each SQL st
f3d0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
f3e0: 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  run..*/.void *sq
f3f0: 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20  lite3_profile(. 
f400: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
f410: 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29  void (*xProfile)
f420: 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
f430: 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34  r*,sqlite_uint64
f440: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  ),.  void *pArg.
f450: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
f460: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f470: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
f480: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
f490: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
f4a0: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
f4b0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
f4c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
f4d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
f4e0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
f4f0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
f500: 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69  Old = db->pProfi
f510: 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72  leArg;.  db->xPr
f520: 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65  ofile = xProfile
f530: 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  ;.  db->pProfile
f540: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
f550: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
f560: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
f570: 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23  return pOld;.}.#
f580: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
f590: 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f  OMIT_TRACE */../
f5a0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
f5b0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  function to be i
f5c0: 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72  nvoked when a tr
f5d0: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
f5e0: 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76  s..** If the inv
f5f0: 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65  oked function re
f600: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
f610: 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20  then the commit 
f620: 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c  becomes a.** rol
f630: 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  lback..*/.void *
f640: 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68  sqlite3_commit_h
f650: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
f660: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
f670: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
f680: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
f690: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  base */.  int (*
f6a0: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
f6b0: 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  ),  /* Function 
f6c0: 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63  to invoke on eac
f6d0: 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f  h commit */.  vo
f6e0: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
f6f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
f700: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
f710: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
f720: 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20   *pOld;..#ifdef 
f730: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
f740: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
f750: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
f760: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
f770: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
f780: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
f790: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
f7a0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
f7b0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
f7c0: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
f7d0: 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64  >pCommitArg;.  d
f7e0: 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
f7f0: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
f800: 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67    db->pCommitArg
f810: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
f820: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
f830: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
f840: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a  urn pOld;.}../*.
f850: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
f860: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
f870: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
f880: 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c   row is updated,
f890: 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20  .** inserted or 
f8a0: 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68  deleted using th
f8b0: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
f8c0: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
f8d0: 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f  *sqlite3_update_
f8e0: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
f8f0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
f900: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
f910: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
f920: 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20  abase */.  void 
f930: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
f940: 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73  d*,int,char cons
f950: 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a  t *,char const *
f960: 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a  ,sqlite_int64),.
f970: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
f980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f990: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
f9a0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
f9b0: 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66  void *pRet;..#if
f9c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
f9d0: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
f9e0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
f9f0: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
fa00: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
fa10: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
fa20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
fa30: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
fa40: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
fa50: 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
fa60: 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b   db->pUpdateArg;
fa70: 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61  .  db->xUpdateCa
fa80: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
fa90: 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74  ck;.  db->pUpdat
faa0: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
fab0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
fac0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
fad0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
fae0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
faf0: 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
fb00: 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
fb10: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
fb20: 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   is rolled.** ba
fb30: 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ck by this datab
fb40: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
fb50: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
fb60: 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a  _rollback_hook(.
fb70: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
fb90: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
fba0: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
fbb0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
fbc0: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f  lback)(void*), /
fbd0: 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  * Callback funct
fbe0: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
fbf0: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
fc00: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
fc10: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
fc20: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
fc30: 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t;..#ifdef SQLIT
fc40: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
fc50: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
fc60: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
fc70: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
fc80: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
fc90: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
fca0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
fcb0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
fcc0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
fcd0: 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c   pRet = db->pRol
fce0: 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e  lbackArg;.  db->
fcf0: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
fd00: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
fd10: 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72   db->pRollbackAr
fd20: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
fd30: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
fd40: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
fd50: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
fd60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fd70: 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20  T_WAL./*.** The 
fd80: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
fd90: 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69  () callback regi
fda0: 73 74 65 72 65 64 20 62 79 20 73 71 6c 69 74 65  stered by sqlite
fdb0: 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
fdc0: 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b  oint()..** Invok
fdd0: 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  e sqlite3_wal_ch
fde0: 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
fdf0: 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
fe00: 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   in the log file
fe10: 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
fe20: 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c  han sqlite3.pWal
fe30: 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69  Arg cast to an i
fe40: 6e 74 65 67 65 72 20 28 74 68 65 20 76 61 6c 75  nteger (the valu
fe50: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a  e configured by.
fe60: 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  ** wal_autocheck
fe70: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e  point())..*/ .in
fe80: 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61  t sqlite3WalDefa
fe90: 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20  ultHook(.  void 
fea0: 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20  *pClientData,   
feb0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f    /* Argument */
fec0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
fed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
fee0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  nection */.  con
fef0: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
ff00: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
ff10: 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20  */.  int nFrame 
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ff30: 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b  ize of WAL */.){
ff40: 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53  .  if( nFrame>=S
ff50: 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
ff60: 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b  (pClientData) ){
ff70: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
ff80: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
ff90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
ffa0: 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  _checkpoint(db, 
ffb0: 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  zDb);.    sqlite
ffc0: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
ffd0: 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
ffe0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
fff0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
10000 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
10010 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73  * Configure an s
10020 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
10030 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75  ) callback to au
10040 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63  tomatically chec
10050 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61  kpoint.** a data
10060 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69  base after commi
10070 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
10080 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ion if there are
10090 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f   nFrame or.** mo
100a0 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  re frames in the
100b0 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69   log file. Passi
100c0 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67  ng zero or a neg
100d0 61 74 69 76 65 20 76 61 6c 75 65 20 61 73 20 74  ative value as t
100e0 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72  he.** nFrame par
100f0 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73 20  ameter disables 
10100 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70  automatic checkp
10110 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a  oints entirely..
10120 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  **.** The callba
10130 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79  ck registered by
10140 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
10150 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73  eplaces any exis
10160 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  ting callback.**
10170 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69 6e   registered usin
10180 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  g sqlite3_wal_ho
10190 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20  ok(). Likewise, 
101a0 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 63 61  registering a ca
101b0 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  llback.** using 
101c0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
101d0 28 29 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  () disables the 
101e0 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70  automatic checkp
101f0 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a  oint mechanism.*
10200 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20  * configured by 
10210 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
10220 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  /.int sqlite3_wa
10230 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
10240 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
10250 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65  t nFrame){.#ifde
10260 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
10270 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  L.  UNUSED_PARAM
10280 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53  ETER(db);.  UNUS
10290 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72  ED_PARAMETER(nFr
102a0 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 23 69 66 64  ame);.#else.#ifd
102b0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
102c0 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
102d0 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
102e0 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
102f0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
10300 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
10310 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b   if( nFrame>0 ){
10320 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
10330 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65  _hook(db, sqlite
10340 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c  3WalDefaultHook,
10350 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
10360 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d  TR(nFrame));.  }
10370 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
10380 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30  3_wal_hook(db, 0
10390 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
103a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
103b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
103c0 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
103d0 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
103e0 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e  each time a tran
103f0 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74  saction is writt
10400 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77  en.** into the w
10410 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62  rite-ahead-log b
10420 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
10430 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
10440 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c  oid *sqlite3_wal
10450 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
10460 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
10470 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
10480 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
10490 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f  his db handle */
104a0 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63  .  int(*xCallbac
104b0 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74  k)(void *, sqlit
104c0 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  e3*, const char*
104d0 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  , int),.  void *
104e0 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
104f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
10500 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
10510 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28  ed to xCallback(
10520 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  ) */.){.#ifndef 
10530 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
10540 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 23 69    void *pRet;.#i
10550 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10560 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
10570 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
10580 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
10590 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
105a0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
105b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
105c0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
105d0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
105e0 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
105f0 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20  = db->pWalArg;. 
10600 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63   db->xWalCallbac
10610 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
10620 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70   db->pWalArg = p
10630 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
10640 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
10650 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
10660 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65  pRet;.#else.  re
10670 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
10680 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69  ../*.** Checkpoi
10690 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e  nt database zDb.
106a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
106b0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
106c0 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  2(.  sqlite3 *db
106d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
106e0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
106f0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e   handle */.  con
10700 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10720 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68 65 64  Name of attached
10730 20 64 61 74 61 62 61 73 65 20 28 6f 72 20 4e 55   database (or NU
10740 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f  LL) */.  int eMo
10750 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
10760 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
10770 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20  TE_CHECKPOINT_* 
10780 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
10790 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20  pnLog,          
107a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
107b0 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c  T: Size of WAL l
107c0 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a  og in frames */.
107d0 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20    int *pnCkpt   
107e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107f0 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20    /* OUT: Total 
10800 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
10810 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f   checkpointed */
10820 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
10830 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74  E_OMIT_WAL.  ret
10840 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
10850 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 20 20  else.  int rc;  
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10870 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10880 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
10890 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  Db = SQLITE_MAX_
108a0 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20 73 71  ATTACHED;  /* sq
108b0 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65  lite3.aDb[] inde
108c0 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65 63 6b  x of db to check
108d0 70 6f 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66  point */..#ifdef
108e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
108f0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
10900 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
10910 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
10920 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
10930 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  BKPT;.#endif..  
10940 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
10950 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
10960 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65  es to -1 in case
10970 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
10980 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67  . */.  if( pnLog
10990 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a   ) *pnLog = -1;.
109a0 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a    if( pnCkpt ) *
109b0 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20  pnCkpt = -1;..  
109c0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
109d0 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
109e0 45 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  E==0 );.  assert
109f0 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
10a00 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20  INT_FULL==1 );. 
10a10 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
10a20 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41  CHECKPOINT_RESTA
10a30 52 54 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72  RT==2 );.  asser
10a40 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
10a50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33  OINT_TRUNCATE==3
10a60 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c   );.  if( eMode<
10a70 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
10a80 54 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f  T_PASSIVE || eMo
10a90 64 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  de>SQLITE_CHECKP
10aa0 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 20 29 7b  OINT_TRUNCATE ){
10ab0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
10ac0 2d 4f 46 3a 20 52 2d 30 33 39 39 36 2d 31 32 30  -OF: R-03996-120
10ad0 38 38 20 54 68 65 20 4d 20 70 61 72 61 6d 65 74  88 The M paramet
10ae0 65 72 20 6d 75 73 74 20 62 65 20 61 20 76 61 6c  er must be a val
10af0 69 64 20 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20  id checkpoint.  
10b00 20 20 2a 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20    ** mode: */.  
10b10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10b20 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73  MISUSE;.  }..  s
10b30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
10b40 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
10b50 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b   if( zDb && zDb[
10b60 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20  0] ){.    iDb = 
10b70 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
10b80 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a  e(db, zDb);.  }.
10b90 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20    if( iDb<0 ){. 
10ba0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
10bb0 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
10bc0 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
10bd0 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  , SQLITE_ERROR, 
10be0 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73  "unknown databas
10bf0 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20  e: %s", zDb);.  
10c00 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 62  }else{.    db->b
10c10 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79  usyHandler.nBusy
10c20 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
10c30 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74  qlite3Checkpoint
10c40 28 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c  (db, iDb, eMode,
10c50 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b   pnLog, pnCkpt);
10c60 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
10c70 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  r(db, rc);.  }. 
10c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
10c90 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
10ca0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10cb0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
10cc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
10cd0 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  dif.}.../*.** Ch
10ce0 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73  eckpoint databas
10cf0 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73  e zDb. If zDb is
10d00 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65   NULL, or if the
10d10 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e   buffer zDb poin
10d20 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e  ts.** to contain
10d30 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20  s a zero-length 
10d40 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61  string, all atta
10d50 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61  ched databases a
10d60 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e  re .** checkpoin
10d70 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
10d80 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
10d90 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nt(sqlite3 *db, 
10da0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
10db0 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  {.  /* EVIDENCE-
10dc0 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32 30 35 35  OF: R-41613-2055
10dd0 33 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61  3 The sqlite3_wa
10de0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c 58  l_checkpoint(D,X
10df0 29 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  ) is equivalent 
10e00 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  to.  ** sqlite3_
10e10 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
10e20 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48 45  2(D,X,SQLITE_CHE
10e30 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
10e40 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75 72  0,0). */.  retur
10e50 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  n sqlite3_wal_ch
10e60 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 7a  eckpoint_v2(db,z
10e70 44 62 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  Db,SQLITE_CHECKP
10e80 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30  OINT_PASSIVE,0,0
10e90 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
10ea0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
10eb0 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b 70  .** Run a checkp
10ec0 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73 65  oint on database
10ed0 20 69 44 62 2e 20 54 68 69 73 20 69 73 20 61 20   iDb. This is a 
10ee0 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61 73  no-op if databas
10ef0 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20  e iDb is.** not 
10f00 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69  currently open i
10f10 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  n WAL mode..**.*
10f20 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
10f30 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68  on is open on th
10f40 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67  e database being
10f50 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74   checkpointed, t
10f60 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
10f70 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
10f80 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68 65  LOCKED and a che
10f90 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61  ckpoint is not a
10fa0 74 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a  ttempted. If .**
10fb0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
10fc0 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74   while running t
10fd0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61  he checkpoint, a
10fe0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
10ff0 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  ode is .** retur
11000 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54 45  ned (i.e. SQLITE
11010 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77 69  _IOERR). Otherwi
11020 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
11030 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f  *.** The mutex o
11040 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
11050 65 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20 68  e db should be h
11060 65 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eld by the calle
11070 72 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20  r. The mutex.** 
11080 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
11090 74 68 65 20 73 70 65 63 69 66 69 63 20 62 2d 74  the specific b-t
110a0 72 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70  ree being checkp
110b0 6f 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e 20  ointed is taken 
110c0 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  by.** this funct
110d0 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63 68  ion while the ch
110e0 65 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e  eckpoint is runn
110f0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  ing..**.** If iD
11100 62 20 69 73 20 70 61 73 73 65 64 20 53 51 4c 49  b is passed SQLI
11110 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c  TE_MAX_ATTACHED,
11120 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63 68   then all attach
11130 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ed databases are
11140 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  .** checkpointed
11150 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  . If an error is
11160 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
11170 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65  is returned imme
11180 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20  diately -.** no 
11190 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
111a0 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e  to checkpoint an
111b0 79 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61  y remaining data
111c0 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  bases..**.** Par
111d0 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20  ameter eMode is 
111e0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48  one of SQLITE_CH
111f0 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
11200 2c 20 46 55 4c 4c 20 6f 72 20 52 45 53 54 41 52  , FULL or RESTAR
11210 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
11220 33 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  3Checkpoint(sqli
11230 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
11240 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74  , int eMode, int
11250 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e   *pnLog, int *pn
11260 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Ckpt){.  int rc 
11270 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
11280 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
11290 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
112a0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112c0 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
112d0 74 68 72 6f 75 67 68 20 61 74 74 61 63 68 65 64  through attached
112e0 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42   dbs */.  int bB
112f0 75 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  usy = 0;        
11300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
11310 65 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59  e if SQLITE_BUSY
11320 20 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e   has been encoun
11330 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  tered */..  asse
11340 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11350 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
11360 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
11370 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d  pnLog || *pnLog=
11380 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =-1 );.  assert(
11390 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43   !pnCkpt || *pnC
113a0 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f  kpt==-1 );..  fo
113b0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
113c0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
113d0 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  K; i++){.    if(
113e0 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d   i==iDb || iDb==
113f0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
11400 48 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  HED ){.      rc 
11410 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 68  = sqlite3BtreeCh
11420 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62  eckpoint(db->aDb
11430 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20  [i].pBt, eMode, 
11440 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a  pnLog, pnCkpt);.
11450 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b        pnLog = 0;
11460 0a 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20  .      pnCkpt = 
11470 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  0;.      if( rc=
11480 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
11490 20 20 20 20 20 20 20 20 62 42 75 73 79 20 3d 20          bBusy = 
114a0 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  1;.        rc = 
114b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
114c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
114d0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
114e0 54 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20  TE_OK && bBusy) 
114f0 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
11500 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
11510 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
11520 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
11530 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
11540 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d  true if main-mem
11550 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73  ory should be us
11560 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
11570 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
11580 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20  e for transient 
11590 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20  pager files and 
115a0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
115b0 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ls..** The value
115c0 20 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64   returned depend
115d0 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  s on the value o
115e0 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  f db->temp_store
115f0 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72   (runtime.** par
11600 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65 20  ameter) and the 
11610 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c  compile time val
11620 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d  ue of SQLITE_TEM
11630 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20  P_STORE. The.** 
11640 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
11650 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72 65  describes the re
11660 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65  lationship betwe
11670 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c  en these two val
11680 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20  ues.** and this 
11690 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
116a0 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   value..**.**   
116b0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
116c0 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73  E     db->temp_s
116d0 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f  tore     Locatio
116e0 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64  n of temporary d
116f0 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d  atabase.**   ---
11700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
11710 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
11720 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
11730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11740 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20  ----.**   0     
11750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11760 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
11770 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
11780 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20  turn 0).**   1  
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117a0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
117b0 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
117c0 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
117d0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
117e0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
117f0 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
11800 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
11810 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
11820 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
11830 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
11840 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
11850 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
11860 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
11880 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
11890 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   0).**   2      
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
118d0 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20  urn 1).**   2   
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118f0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
11900 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
11910 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33  return 1).**   3
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11930 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20       any        
11940 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
11950 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a    (return 1).*/.
11960 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49  int sqlite3TempI
11970 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71  nMemory(const sq
11980 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20  lite3 *db){.#if 
11990 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
119a0 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20  E==1.  return ( 
119b0 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d  db->temp_store==
119c0 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  2 );.#endif.#if 
119d0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
119e0 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20  E==2.  return ( 
119f0 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d  db->temp_store!=
11a00 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  1 );.#endif.#if 
11a10 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
11a20 45 3d 3d 33 0a 20 20 55 4e 55 53 45 44 5f 50 41  E==3.  UNUSED_PA
11a30 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72  RAMETER(db);.  r
11a40 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
11a50 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
11a60 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54  STORE<1 || SQLIT
11a70 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20  E_TEMP_STORE>3. 
11a80 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
11a90 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  R(db);.  return 
11aa0 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
11ab0 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20  ** Return UTF-8 
11ac0 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20  encoded English 
11ad0 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61  language explana
11ae0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
11af0 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72   recent.** error
11b00 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
11b10 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  *sqlite3_errmsg(
11b20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
11b30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
11b40 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
11b50 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
11b60 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  rStr(SQLITE_NOME
11b70 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  M);.  }.  if( !s
11b80 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
11b90 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
11ba0 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
11bb0 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
11bc0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20  _MISUSE_BKPT);. 
11bd0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
11be0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
11bf0 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ex);.  if( db->m
11c00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
11c10 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72     z = sqlite3Er
11c20 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  rStr(SQLITE_NOME
11c30 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  M);.  }else{.   
11c40 20 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 70   testcase( db->p
11c50 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a 20  Err==0 );.    z 
11c60 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
11c70 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e  _value_text(db->
11c80 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72  pErr);.    asser
11c90 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
11ca0 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20  iled );.    if( 
11cb0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20  z==0 ){.      z 
11cc0 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  = sqlite3ErrStr(
11cd0 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20  db->errCode);.  
11ce0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
11cf0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
11d00 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
11d10 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn z;.}..#ifndef
11d20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
11d30 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  16./*.** Return 
11d40 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45  UTF-16 encoded E
11d50 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
11d60 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
11d70 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a  he most recent.*
11d80 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73  * error..*/.cons
11d90 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  t void *sqlite3_
11da0 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33  errmsg16(sqlite3
11db0 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20   *db){.  static 
11dc0 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d  const u16 outOfM
11dd0 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27  em[] = {.    'o'
11de0 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c  , 'u', 't', ' ',
11df0 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20   'o', 'f', ' ', 
11e00 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27  'm', 'e', 'm', '
11e10 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a  o', 'r', 'y', 0.
11e20 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f    };.  static co
11e30 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d  nst u16 misuse[]
11e40 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69   = {.    'l', 'i
11e50 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27  ', 'b', 'r', 'a'
11e60 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c  , 'r', 'y', ' ',
11e70 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20   .    'r', 'o', 
11e80 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27  'u', 't', 'i', '
11e90 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20  n', 'e', ' ', . 
11ea0 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27     'c', 'a', 'l'
11eb0 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c  , 'l', 'e', 'd',
11ec0 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20   ' ', .    'o', 
11ed0 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a  'u', 't', ' ', .
11ee0 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20      'o', 'f', ' 
11ef0 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27  ', .    's', 'e'
11f00 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c  , 'q', 'u', 'e',
11f10 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20   'n', 'c', 'e', 
11f20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20  0.  };..  const 
11f30 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21  void *z;.  if( !
11f40 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
11f50 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65   (void *)outOfMe
11f60 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  m;.  }.  if( !sq
11f70 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
11f80 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
11f90 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64      return (void
11fa0 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20   *)misuse;.  }. 
11fb0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
11fc0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
11fd0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
11fe0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a  cFailed ){.    z
11ff0 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66   = (void *)outOf
12000 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Mem;.  }else{.  
12010 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
12020 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70  lue_text16(db->p
12030 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  Err);.    if( z=
12040 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
12050 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
12060 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c  db, db->errCode,
12070 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
12080 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20 20  b->errCode));.  
12090 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
120a0 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d  value_text16(db-
120b0 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  >pErr);.    }.  
120c0 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20    /* A malloc() 
120d0 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20  may have failed 
120e0 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20  within the call 
120f0 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  to sqlite3_value
12100 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a  _text16().    **
12110 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20   above. If this 
12120 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
12130 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63  n the db->malloc
12140 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64  Failed flag need
12150 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63  s to.    ** be c
12160 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 72 65  leared before re
12170 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73  turning. Do this
12180 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65   directly, inste
12190 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a  ad of via.    **
121a0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
121b0 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74  ), to avoid sett
121c0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
121d0 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65   handle error me
121e0 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssage..    */.  
121f0 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
12200 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  ed = 0;.  }.  sq
12210 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
12220 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
12230 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64  return z;.}.#end
12240 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
12250 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
12260 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * Return the mos
12270 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63  t recent error c
12280 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
12290 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69   an SQLite routi
122a0 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a  ne. If NULL is.*
122b0 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  * passed to this
122c0 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73   function, we as
122d0 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20  sume a malloc() 
122e0 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71  failed during sq
122f0 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f  lite3_open()..*/
12300 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72  .int sqlite3_err
12310 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  code(sqlite3 *db
12320 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  ){.  if( db && !
12330 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
12340 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
12350 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12360 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
12370 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c  .  }.  if( !db |
12380 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
12390 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
123a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
123b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
123c0 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72  errCode & db->er
123d0 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rMask;.}.int sql
123e0 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
123f0 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
12400 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
12410 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
12420 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
12430 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12440 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
12450 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20  ;.  }.  if( !db 
12460 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
12470 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
12480 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
12490 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d    }.  return db-
124a0 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a  >errCode;.}../*.
124b0 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69  ** Return a stri
124c0 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
124d0 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72  s the kind of er
124e0 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  ror specified in
124f0 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   the.** argument
12500 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73  .  For now, this
12510 20 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68   simply calls th
12520 65 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74  e internal sqlit
12530 65 33 45 72 72 53 74 72 28 29 0a 2a 2a 20 66 75  e3ErrStr().** fu
12540 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74  nction..*/.const
12550 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65   char *sqlite3_e
12560 72 72 73 74 72 28 69 6e 74 20 72 63 29 7b 0a 20  rrstr(int rc){. 
12570 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
12580 72 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a  rrStr(rc);.}../*
12590 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
125a0 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
125b0 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65  ion for database
125c0 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65   "db".  The name
125d0 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64   is zName.** and
125e0 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73   the encoding is
125f0 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   enc..*/.static 
12600 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  int createCollat
12610 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  ion(.  sqlite3* 
12620 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
12630 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65   *zName, .  u8 e
12640 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  nc,.  void* pCtx
12650 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
12660 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
12670 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
12680 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
12690 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
126a0 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
126b0 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b  oll;.  int enc2;
126c0 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  .  .  assert( sq
126d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
126e0 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  (db->mutex) );..
126f0 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55    /* If SQLITE_U
12700 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65  TF16 is specifie
12710 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  d as the encodin
12720 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72  g type, transfor
12730 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f  m this.  ** to o
12740 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
12750 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
12760 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65  TF16BE using the
12770 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  .  ** SQLITE_UTF
12780 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20  16NATIVE macro. 
12790 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
127a0 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
127b0 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32  lly..  */.  enc2
127c0 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61   = enc;.  testca
127d0 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  se( enc2==SQLITE
127e0 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74  _UTF16 );.  test
127f0 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49  case( enc2==SQLI
12800 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
12810 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d   );.  if( enc2==
12820 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20  SQLITE_UTF16 || 
12830 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
12840 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20  16_ALIGNED ){.  
12850 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f    enc2 = SQLITE_
12860 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
12870 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49  .  if( enc2<SQLI
12880 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e  TE_UTF8 || enc2>
12890 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
128a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
128b0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
128c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
128d0 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73   if this call is
128e0 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70   removing or rep
128f0 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69  lacing an existi
12900 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20  ng collation .  
12910 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20  ** sequence. If 
12920 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  so, and there ar
12930 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65  e active VMs, re
12940 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68  turn busy. If th
12950 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20  ere.  ** are no 
12960 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61  active VMs, inva
12970 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63  lidate any pre-c
12980 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
12990 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c  ts..  */.  pColl
129a0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
129b0 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
129c0 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  c2, zName, 0);. 
129d0 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43   if( pColl && pC
129e0 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20  oll->xCmp ){.   
129f0 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63   if( db->nVdbeAc
12a00 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71  tive ){.      sq
12a10 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
12a20 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  g(db, SQLITE_BUS
12a30 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61  Y, .        "una
12a40 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f  ble to delete/mo
12a50 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  dify collation s
12a60 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20 61  equence due to a
12a70 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
12a80 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
12a90 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
12aa0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
12ab0 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
12ac0 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20  tements(db);..  
12ad0 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f    /* If collatio
12ae0 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  n sequence pColl
12af0 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69 72   was created dir
12b00 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c 20  ectly by a call 
12b10 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
12b20 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
12b30 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65  on, and not gene
12b40 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43 6f  rated by synthCo
12b50 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20  llSeq(),.    ** 
12b60 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73 20  then any copies 
12b70 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f 6c  made by synthCol
12b80 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20 62  lSeq() need to b
12b90 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20  e invalidated.. 
12ba0 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c     ** Also, coll
12bb0 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f 72  ation destructor
12bc0 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28   - CollSeq.xDel(
12bd0 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  ) - function may
12be0 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
12bf0 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  be called..    *
12c00 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c  / .    if( (pCol
12c10 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54 45  l->enc & ~SQLITE
12c20 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d  _UTF16_ALIGNED)=
12c30 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20 43  =enc2 ){.      C
12c40 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20  ollSeq *aColl = 
12c50 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
12c60 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a  &db->aCollSeq, z
12c70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  Name);.      int
12c80 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
12c90 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<3; j++){.  
12ca0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
12cb0 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20   = &aColl[j];.  
12cc0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63        if( p->enc
12cd0 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a  ==pColl->enc ){.
12ce0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
12cf0 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  >xDel ){.       
12d00 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e       p->xDel(p->
12d10 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pUser);.        
12d20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
12d30 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  >xCmp = 0;.     
12d40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12d50 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20   }.  }..  pColl 
12d60 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
12d70 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
12d80 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20  2, zName, 1);.  
12d90 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72  if( pColl==0 ) r
12da0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12db0 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d  EM;.  pColl->xCm
12dc0 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20  p = xCompare;.  
12dd0 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70  pColl->pUser = p
12de0 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44  Ctx;.  pColl->xD
12df0 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f  el = xDel;.  pCo
12e00 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65  ll->enc = (u8)(e
12e10 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c  nc2 | (enc & SQL
12e20 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
12e30 44 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72  D));.  sqlite3Er
12e40 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
12e50 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  K);.  return SQL
12e60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
12e70 2a 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66  * This array def
12e80 69 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20  ines hard upper 
12e90 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20  bounds on limit 
12ea0 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20  values.  The.** 
12eb0 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74  initializer must
12ec0 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63   be kept in sync
12ed0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
12ee0 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66  _LIMIT_*.** #def
12ef0 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e  ines in sqlite3.
12f00 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  h..*/.static con
12f10 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69  st int aHardLimi
12f20 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45  t[] = {.  SQLITE
12f30 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  _MAX_LENGTH,.  S
12f40 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
12f50 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  NGTH,.  SQLITE_M
12f60 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c  AX_COLUMN,.  SQL
12f70 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
12f80 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
12f90 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
12fa0 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
12fb0 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45  DBE_OP,.  SQLITE
12fc0 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
12fd0 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  G,.  SQLITE_MAX_
12fe0 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49  ATTACHED,.  SQLI
12ff0 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
13000 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  ERN_LENGTH,.  SQ
13010 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
13020 45 5f 4e 55 4d 42 45 52 2c 20 20 20 20 20 20 2f  E_NUMBER,      /
13030 2a 20 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33  * IMP: R-38091-3
13040 32 33 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45  2352 */.  SQLITE
13050 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
13060 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
13070 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c  _WORKER_THREADS,
13080 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  .};../*.** Make 
13090 73 75 72 65 20 74 68 65 20 68 61 72 64 20 6c 69  sure the hard li
130a0 6d 69 74 73 20 61 72 65 20 73 65 74 20 74 6f 20  mits are set to 
130b0 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65  reasonable value
130c0 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  s.*/.#if SQLITE_
130d0 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23  MAX_LENGTH<100.#
130e0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
130f0 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  X_LENGTH must be
13100 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65   at least 100.#e
13110 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
13120 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31  MAX_SQL_LENGTH<1
13130 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
13140 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
13150 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
13160 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66  t 100.#endif.#if
13170 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
13180 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41  LENGTH>SQLITE_MA
13190 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72  X_LENGTH.# error
131a0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
131b0 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20  LENGTH must not 
131c0 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
131d0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
131e0 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  H.#endif.#if SQL
131f0 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
13200 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f  _SELECT<2.# erro
13210 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  r SQLITE_MAX_COM
13220 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73  POUND_SELECT mus
13230 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a  t be at least 2.
13240 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
13250 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30  E_MAX_VDBE_OP<40
13260 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
13270 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74  MAX_VDBE_OP must
13280 20 62 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a   be at least 40.
13290 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
132a0 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
132b0 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  RG<0 || SQLITE_M
132c0 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e  AX_FUNCTION_ARG>
132d0 31 30 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  1000.# error SQL
132e0 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
132f0 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62 65 74  _ARG must be bet
13300 77 65 65 6e 20 30 20 61 6e 64 20 31 30 30 30 0a  ween 0 and 1000.
13310 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
13320 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30  E_MAX_ATTACHED<0
13330 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41   || SQLITE_MAX_A
13340 54 54 41 43 48 45 44 3e 31 32 35 0a 23 20 65 72  TTACHED>125.# er
13350 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  ror SQLITE_MAX_A
13360 54 54 41 43 48 45 44 20 6d 75 73 74 20 62 65 20  TTACHED must be 
13370 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 32  between 0 and 12
13380 35 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  5.#endif.#if SQL
13390 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
133a0 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20  TERN_LENGTH<1.# 
133b0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
133c0 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
133d0 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
133e0 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23  least 1.#endif.#
133f0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
13400 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72  LUMN>32767.# err
13410 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  or SQLITE_MAX_CO
13420 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78  LUMN must not ex
13430 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69  ceed 32767.#endi
13440 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
13450 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31  _TRIGGER_DEPTH<1
13460 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
13470 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
13480 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
13490 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 1.#endif.#if 
134a0 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
134b0 52 5f 54 48 52 45 41 44 53 3c 30 20 7c 7c 20 53  R_THREADS<0 || S
134c0 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
134d0 5f 54 48 52 45 41 44 53 3e 35 30 0a 23 20 65 72  _THREADS>50.# er
134e0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  ror SQLITE_MAX_W
134f0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 6d 75  ORKER_THREADS mu
13500 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  st be between 0 
13510 61 6e 64 20 35 30 0a 23 65 6e 64 69 66 0a 0a 0a  and 50.#endif...
13520 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
13530 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69   value of a limi
13540 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f  t.  Report the o
13550 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20  ld value..** If 
13560 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74  an invalid limit
13570 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69   index is suppli
13580 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a  ed, report -1..*
13590 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
135a0 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f  s but still repo
135b0 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  rt the old value
135c0 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c   if the.** new l
135d0 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
135e0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f  ..**.** A new lo
135f0 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e  wer limit does n
13600 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69  ot shrink existi
13610 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a  ng constructs..*
13620 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76  * It merely prev
13630 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75  ents new constru
13640 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64 20  cts that exceed 
13650 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f  the limit.** fro
13660 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e  m forming..*/.in
13670 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28  t sqlite3_limit(
13680 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
13690 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65   limitId, int ne
136a0 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f  wLimit){.  int o
136b0 6c 64 4c 69 6d 69 74 3b 0a 0a 23 69 66 64 65 66  ldLimit;..#ifdef
136c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
136d0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
136e0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
136f0 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
13700 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
13710 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
13720 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e  turn -1;.  }.#en
13730 64 69 66 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e  dif..  /* EVIDEN
13740 43 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35  CE-OF: R-30189-5
13750 34 30 39 37 20 46 6f 72 20 65 61 63 68 20 6c 69  4097 For each li
13760 6d 69 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c  mit category SQL
13770 49 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20  ITE_LIMIT_NAME. 
13780 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68   ** there is a h
13790 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64 20  ard upper bound 
137a0 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  set at compile-t
137b0 69 6d 65 20 62 79 20 61 20 43 20 70 72 65 70 72  ime by a C prepr
137c0 6f 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63  ocessor.  ** mac
137d0 72 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49 54 45  ro called SQLITE
137e0 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20  _MAX_NAME. (The 
137f0 22 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68 65  "_LIMIT_" in the
13800 20 6e 61 6d 65 20 69 73 20 63 68 61 6e 67 65 64   name is changed
13810 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22   to.  ** "_MAX_"
13820 2e 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  .).  */.  assert
13830 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
13840 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
13850 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  ]==SQLITE_MAX_LE
13860 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  NGTH );.  assert
13870 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
13880 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45  ITE_LIMIT_SQL_LE
13890 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  NGTH]==SQLITE_MA
138a0 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a  X_SQL_LENGTH );.
138b0 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
138c0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
138d0 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54  T_COLUMN]==SQLIT
138e0 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  E_MAX_COLUMN );.
138f0 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
13900 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
13910 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53  T_EXPR_DEPTH]==S
13920 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
13930 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
13940 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
13950 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55  ITE_LIMIT_COMPOU
13960 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49  ND_SELECT]==SQLI
13970 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
13980 53 45 4c 45 43 54 29 3b 0a 20 20 61 73 73 65 72  SELECT);.  asser
13990 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
139a0 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f  LITE_LIMIT_VDBE_
139b0 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  OP]==SQLITE_MAX_
139c0 56 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73  VDBE_OP );.  ass
139d0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
139e0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e  SQLITE_LIMIT_FUN
139f0 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49  CTION_ARG]==SQLI
13a00 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
13a10 41 52 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ARG );.  assert(
13a20 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
13a30 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45  TE_LIMIT_ATTACHE
13a40 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41  D]==SQLITE_MAX_A
13a50 54 54 41 43 48 45 44 20 29 3b 0a 20 20 61 73 73  TTACHED );.  ass
13a60 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
13a70 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
13a80 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
13a90 5d 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]==.            
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ac0 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49     SQLITE_MAX_LI
13ad0 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
13ae0 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
13af0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
13b00 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
13b10 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f  NUMBER]==SQLITE_
13b20 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
13b30 42 45 52 29 3b 0a 20 20 61 73 73 65 72 74 28 20  BER);.  assert( 
13b40 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13b50 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
13b60 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d  DEPTH]==SQLITE_M
13b70 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
13b80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
13b90 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
13ba0 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
13bb0 45 41 44 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  EADS]==SQLITE_MA
13bc0 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
13bd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
13be0 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45  LITE_LIMIT_WORKE
13bf0 52 5f 54 48 52 45 41 44 53 3d 3d 28 53 51 4c 49  R_THREADS==(SQLI
13c00 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b  TE_N_LIMIT-1) );
13c10 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69 74 49 64  ...  if( limitId
13c20 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53  <0 || limitId>=S
13c30 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b  QLITE_N_LIMIT ){
13c40 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
13c50 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d    }.  oldLimit =
13c60 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69   db->aLimit[limi
13c70 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c  tId];.  if( newL
13c80 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20 20 20 20  imit>=0 ){      
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13ca0 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d 32 38 37  IMP: R-52476-287
13cb0 33 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65  32 */.    if( ne
13cc0 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69  wLimit>aHardLimi
13cd0 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20  t[limitId] ){.  
13ce0 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61      newLimit = a
13cf0 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  HardLimit[limitI
13d00 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35  d];  /* IMP: R-5
13d10 31 34 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20  1463-25634 */.  
13d20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d    }.    db->aLim
13d30 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65  it[limitId] = ne
13d40 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65  wLimit;.  }.  re
13d50 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20  turn oldLimit;  
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d70 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33     /* IMP: R-533
13d80 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 23 69  41-35419 */.}.#i
13d90 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
13da0 5f 45 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f  _ENABLE_AUTO_PRO
13db0 46 49 4c 45 29 0a 2f 2a 20 73 74 64 65 72 72 20  FILE)./* stderr 
13dc0 6c 6f 67 67 69 6e 67 20 2a 2f 0a 76 6f 69 64 20  logging */.void 
13dd0 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f  _sqlite_auto_pro
13de0 66 69 6c 65 28 76 6f 69 64 20 2a 61 75 78 2c 20  file(void *aux, 
13df0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 2c  const char *sql,
13e00 20 75 36 34 20 6e 73 29 3b 0a 76 6f 69 64 20 5f   u64 ns);.void _
13e10 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63  sqlite_auto_trac
13e20 65 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e  e(void *aux, con
13e30 73 74 20 63 68 61 72 20 2a 73 71 6c 29 3b 0a 76  st char *sql);.v
13e40 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f  oid _sqlite_auto
13e50 5f 70 72 6f 66 69 6c 65 28 76 6f 69 64 20 2a 61  _profile(void *a
13e60 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ux, const char *
13e70 73 71 6c 2c 20 75 36 34 20 6e 73 29 20 7b 0a 23  sql, u64 ns) {.#
13e80 70 72 61 67 6d 61 20 75 6e 75 73 65 64 28 61 75  pragma unused(au
13e90 78 29 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65  x)..fprintf(stde
13ea0 72 72 2c 20 22 51 75 65 72 79 3a 20 25 73 5c 6e  rr, "Query: %s\n
13eb0 20 45 78 65 63 75 74 69 6f 6e 20 54 69 6d 65 3a   Execution Time:
13ec0 20 25 6c 6c 75 20 6d 73 5c 6e 22 2c 20 73 71 6c   %llu ms\n", sql
13ed0 2c 20 6e 73 20 2f 20 31 30 30 30 30 30 30 29 3b  , ns / 1000000);
13ee0 0a 7d 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f  .}.void _sqlite_
13ef0 61 75 74 6f 5f 74 72 61 63 65 28 76 6f 69 64 20  auto_trace(void 
13f00 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72  *aux, const char
13f10 20 2a 73 71 6c 29 20 7b 0a 09 66 70 72 69 6e 74   *sql) {..fprint
13f20 66 28 73 74 64 65 72 72 2c 20 22 54 72 61 63 65  f(stderr, "Trace
13f30 53 51 4c 28 25 70 29 3a 20 25 73 5c 6e 22 2c 20  SQL(%p): %s\n", 
13f40 61 75 78 2c 20 73 71 6c 29 3b 0a 7d 0a 0a 2f 2a  aux, sql);.}../*
13f50 20 73 79 73 6c 6f 67 20 6c 6f 67 67 69 6e 67 20   syslog logging 
13f60 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 6c  */.#include <asl
13f70 2e 68 3e 0a 73 74 61 74 69 63 20 61 73 6c 63 6c  .h>.static aslcl
13f80 69 65 6e 74 20 61 75 74 6f 6c 6f 67 5f 63 6c 69  ient autolog_cli
13f90 65 6e 74 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  ent = NULL;.stat
13fa0 69 63 20 76 6f 69 64 20 5f 63 6c 6f 73 65 5f 61  ic void _close_a
13fb0 73 6c 5f 6c 6f 67 28 29 20 7b 0a 20 20 69 66 28  sl_log() {.  if(
13fc0 20 4e 55 4c 4c 21 3d 61 75 74 6f 6c 6f 67 5f 63   NULL!=autolog_c
13fd0 6c 69 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 6c  lient ){.    asl
13fe0 5f 63 6c 6f 73 65 28 61 75 74 6f 6c 6f 67 5f 63  _close(autolog_c
13ff0 6c 69 65 6e 74 29 3b 0a 20 20 20 20 61 75 74 6f  lient);.    auto
14000 6c 6f 67 5f 63 6c 69 65 6e 74 20 3d 20 4e 55 4c  log_client = NUL
14010 4c 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  L;.  }.}.static 
14020 76 6f 69 64 20 5f 6f 70 65 6e 5f 61 73 6c 5f 6c  void _open_asl_l
14030 6f 67 28 29 20 7b 0a 20 20 69 66 28 20 4e 55 4c  og() {.  if( NUL
14040 4c 3d 3d 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e  L==autolog_clien
14050 74 20 29 7b 0a 20 20 20 20 61 75 74 6f 6c 6f 67  t ){.    autolog
14060 5f 63 6c 69 65 6e 74 20 3d 20 61 73 6c 5f 6f 70  _client = asl_op
14070 65 6e 28 22 53 51 4c 69 74 65 22 2c 20 4e 55 4c  en("SQLite", NUL
14080 4c 2c 20 30 29 3b 0a 20 20 20 20 61 74 65 78 69  L, 0);.    atexi
14090 74 28 5f 63 6c 6f 73 65 5f 61 73 6c 5f 6c 6f 67  t(_close_asl_log
140a0 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 5f  );.  }.}..void _
140b0 73 71 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66  sqlite_auto_prof
140c0 69 6c 65 5f 73 79 73 6c 6f 67 28 76 6f 69 64 20  ile_syslog(void 
140d0 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72  *aux, const char
140e0 20 2a 73 71 6c 2c 20 75 36 34 20 6e 73 29 3b 0a   *sql, u64 ns);.
140f0 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74  void _sqlite_aut
14100 6f 5f 74 72 61 63 65 5f 73 79 73 6c 6f 67 28 76  o_trace_syslog(v
14110 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20  oid *aux, const 
14120 63 68 61 72 20 2a 73 71 6c 29 3b 0a 76 6f 69 64  char *sql);.void
14130 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 70 72   _sqlite_auto_pr
14140 6f 66 69 6c 65 5f 73 79 73 6c 6f 67 28 76 6f 69  ofile_syslog(voi
14150 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68  d *aux, const ch
14160 61 72 20 2a 73 71 6c 2c 20 75 36 34 20 6e 73 29  ar *sql, u64 ns)
14170 20 7b 0a 23 70 72 61 67 6d 61 20 75 6e 75 73 65   {.#pragma unuse
14180 64 28 61 75 78 29 0a 09 61 73 6c 5f 6c 6f 67 28  d(aux)..asl_log(
14190 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 2c 20  autolog_client, 
141a0 4e 55 4c 4c 2c 20 41 53 4c 5f 4c 45 56 45 4c 5f  NULL, ASL_LEVEL_
141b0 4e 4f 54 49 43 45 2c 20 22 51 75 65 72 79 3a 20  NOTICE, "Query: 
141c0 25 73 5c 6e 20 45 78 65 63 75 74 69 6f 6e 20 54  %s\n Execution T
141d0 69 6d 65 3a 20 25 6c 6c 75 20 6d 73 5c 6e 22 2c  ime: %llu ms\n",
141e0 20 73 71 6c 2c 20 6e 73 20 2f 20 31 30 30 30 30   sql, ns / 10000
141f0 30 30 29 3b 0a 7d 0a 76 6f 69 64 20 5f 73 71 6c  00);.}.void _sql
14200 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 5f 73  ite_auto_trace_s
14210 79 73 6c 6f 67 28 76 6f 69 64 20 2a 61 75 78 2c  yslog(void *aux,
14220 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
14230 29 20 7b 0a 09 61 73 6c 5f 6c 6f 67 28 61 75 74  ) {..asl_log(aut
14240 6f 6c 6f 67 5f 63 6c 69 65 6e 74 2c 20 4e 55 4c  olog_client, NUL
14250 4c 2c 20 41 53 4c 5f 4c 45 56 45 4c 5f 4e 4f 54  L, ASL_LEVEL_NOT
14260 49 43 45 2c 20 22 54 72 61 63 65 53 51 4c 28 25  ICE, "TraceSQL(%
14270 70 29 3a 20 25 73 5c 6e 22 2c 20 61 75 78 2c 20  p): %s\n", aux, 
14280 73 71 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  sql);.}.#endif..
14290 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
142a0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
142b0 61 72 73 65 20 62 6f 74 68 20 55 52 49 73 20 61  arse both URIs a
142c0 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  nd non-URI filen
142d0 61 6d 65 73 20 70 61 73 73 65 64 20 62 79 20 74  ames passed by t
142e0 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41 50  he.** user to AP
142f0 49 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69  I functions sqli
14300 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71  te3_open() or sq
14310 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c  lite3_open_v2(),
14320 20 61 6e 64 20 66 6f 72 20 64 61 74 61 62 61 73   and for databas
14330 65 0a 2a 2a 20 55 52 49 73 20 73 70 65 63 69 66  e.** URIs specif
14340 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 41  ied as part of A
14350 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73  TTACH statements
14360 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
14370 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
14380 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
14390 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56  he name of the V
143a0 46 53 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a  FS to use (or.**
143b0 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69   a NULL to signi
143c0 66 79 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  fy the default V
143d0 46 53 29 20 69 66 20 74 68 65 20 55 52 49 20 64  FS) if the URI d
143e0 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
143f0 61 20 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71  a "vfs=xxx".** q
14400 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 20  uery parameter. 
14410 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
14420 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ent contains the
14430 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49   URI (or non-URI
14440 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74   filename).** it
14450 73 65 6c 66 2e 20 57 68 65 6e 20 74 68 69 73 20  self. When this 
14460 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
14470 65 64 20 74 68 65 20 2a 70 46 6c 61 67 73 20 76  ed the *pFlags v
14480 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 63  ariable should c
14490 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65  ontain.** the de
144a0 66 61 75 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f  fault flags to o
144b0 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
144c0 20 68 61 6e 64 6c 65 20 77 69 74 68 2e 20 54 68   handle with. Th
144d0 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
144e0 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79  n.** *pFlags may
144f0 20 62 65 20 75 70 64 61 74 65 64 20 62 65 66 6f   be updated befo
14500 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 66 20  re returning if 
14510 74 68 65 20 55 52 49 20 66 69 6c 65 6e 61 6d 65  the URI filename
14520 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63   contains .** "c
14530 61 63 68 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f  ache=xxx" or "mo
14540 64 65 3d 78 78 78 22 20 71 75 65 72 79 20 70 61  de=xxx" query pa
14550 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  rameters..**.** 
14560 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
14570 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
14580 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
14590 73 65 20 2a 70 70 56 66 73 20 69 73 20 73 65 74  se *ppVfs is set
145a0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
145b0 74 68 65 20 56 46 53 20 74 68 61 74 20 73 68 6f  the VFS that sho
145c0 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f  uld be used to o
145d0 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
145e0 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69   file. *pzFile i
145f0 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e  s set to.** poin
14600 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
14610 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
14620 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
14630 20 6f 70 65 6e 2e 20 49 74 20 69 73 20 74 68 65   open. It is the
14640 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c   .** responsibil
14650 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
14660 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
14670 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65  call sqlite3_fre
14680 65 28 29 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a  e() to release.*
14690 2a 20 74 68 69 73 20 62 75 66 66 65 72 2e 0a 2a  * this buffer..*
146a0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
146b0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 61 6e   occurs, then an
146c0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
146d0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
146e0 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20  nd *pzErrMsg.** 
146f0 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f  may be set to po
14700 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
14710 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e  containing an En
14720 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
14730 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65  rror .** message
14740 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
14750 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
14760 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
14770 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a  tually release.*
14780 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62 79  * this buffer by
14790 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
147a0 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _free()..*/.int 
147b0 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
147c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
147d0 44 65 66 61 75 6c 74 56 66 73 2c 20 20 20 20 20  DefaultVfs,     
147e0 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65     /* VFS to use
147f0 20 69 66 20 6e 6f 20 22 76 66 73 3d 78 78 78 22   if no "vfs=xxx"
14800 20 71 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f   query option */
14810 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14820 55 72 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  Uri,            
14830 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e     /* Nul-termin
14840 61 74 65 64 20 55 52 49 20 74 6f 20 70 61 72 73  ated URI to pars
14850 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
14860 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20  int *pFlags,    
14870 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
14880 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58  : SQLITE_OPEN_XX
14890 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c  X flags */.  sql
148a0 69 74 65 33 5f 76 66 73 20 2a 2a 70 70 56 66 73  ite3_vfs **ppVfs
148b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
148c0 4f 55 54 3a 20 56 46 53 20 74 6f 20 75 73 65 20  OUT: VFS to use 
148d0 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46  */ .  char **pzF
148e0 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
148f0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69        /* OUT: Fi
14900 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74  lename component
14910 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63 68 61   of URI */.  cha
14920 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20  r **pzErrMsg    
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14940 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61  OUT: Error messa
14950 67 65 20 28 69 66 20 72 63 21 3d 53 51 4c 49 54  ge (if rc!=SQLIT
14960 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  E_OK) */.){.  in
14970 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14980 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
14990 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67 73   flags = *pFlags
149a0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
149b0 7a 56 66 73 20 3d 20 7a 44 65 66 61 75 6c 74 56  zVfs = zDefaultV
149c0 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  fs;.  char *zFil
149d0 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69  e;.  char c;.  i
149e0 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c 69 74 65  nt nUri = sqlite
149f0 33 53 74 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b  3Strlen30(zUri);
14a00 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45  ..  assert( *pzE
14a10 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69  rrMsg==0 );..  i
14a20 66 28 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c  f( ((flags & SQL
14a30 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 20 20  ITE_OPEN_URI)   
14a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
14a50 3a 20 52 2d 34 38 37 32 35 2d 33 32 32 30 36 20  : R-48725-32206 
14a60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  */.            |
14a70 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  | sqlite3GlobalC
14a80 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 29 20  onfig.bOpenUri) 
14a90 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 36 38 39 2d  /* IMP: R-51689-
14aa0 34 36 35 34 38 20 2a 2f 0a 20 20 20 26 26 20 6e  46548 */.   && n
14ab0 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Uri>=5 && memcmp
14ac0 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20  (zUri, "file:", 
14ad0 35 29 3d 3d 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  5)==0 /* IMP: R-
14ae0 35 37 38 38 34 2d 33 37 34 39 36 20 2a 2f 0a 20  57884-37496 */. 
14af0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   ){.    char *zO
14b00 70 74 3b 0a 20 20 20 20 69 6e 74 20 65 53 74 61  pt;.    int eSta
14b10 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
14b20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
14b30 73 74 61 74 65 20 77 68 65 6e 20 70 61 72 73 69  state when parsi
14b40 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e  ng URI */.    in
14b50 74 20 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20  t iIn;          
14b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14b70 6e 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69  nput character i
14b80 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
14b90 69 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  iOut = 0;       
14ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
14bb0 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e  put character in
14bc0 64 65 78 20 2a 2f 0a 20 20 20 20 75 36 34 20 6e  dex */.    u64 n
14bd0 42 79 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20  Byte = nUri+2;  
14be0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
14bf0 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c  s of space to al
14c00 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f  locate */..    /
14c10 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
14c20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20  SQLITE_OPEN_URI 
14c30 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 69  flag is set to i
14c40 6e 64 69 63 61 74 65 20 74 6f 20 74 68 65 20 56  ndicate to the V
14c50 46 53 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a  FS xOpen .    **
14c60 20 6d 65 74 68 6f 64 20 74 68 61 74 20 74 68 65   method that the
14c70 72 65 20 6d 61 79 20 62 65 20 65 78 74 72 61 20  re may be extra 
14c80 70 61 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f  parameters follo
14c90 77 69 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e 61  wing the file-na
14ca0 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67  me.  */.    flag
14cb0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
14cc0 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69  _URI;..    for(i
14cd0 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20  In=0; iIn<nUri; 
14ce0 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20  iIn++) nByte += 
14cf0 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29  (zUri[iIn]=='&')
14d00 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71  ;.    zFile = sq
14d10 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
14d20 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Byte);.    if( !
14d30 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53  zFile ) return S
14d40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20  QLITE_NOMEM;..  
14d50 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65    iIn = 5;.#ifde
14d60 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55  f SQLITE_ALLOW_U
14d70 52 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20 20  RI_AUTHORITY.   
14d80 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72   if( strncmp(zUr
14d90 69 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d  i+5, "///", 3)==
14da0 30 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d  0 ){.      iIn =
14db0 20 37 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   7;.      /* The
14dc0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69   following condi
14dd0 74 69 6f 6e 20 63 61 75 73 65 73 20 55 52 49 73  tion causes URIs
14de0 20 77 69 74 68 20 66 69 76 65 20 6c 65 61 64 69   with five leadi
14df0 6e 67 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a  ng / characters.
14e00 20 20 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69        ** like fi
14e10 6c 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74  le://///host/pat
14e20 68 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65  h to be converte
14e30 64 20 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65  d into UNCs like
14e40 20 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20   //host/path..  
14e50 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 72 72 65      ** The corre
14e60 63 74 20 55 52 49 20 66 6f 72 20 74 68 61 74 20  ct URI for that 
14e70 55 4e 43 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f  UNC has only two
14e80 20 6f 72 20 66 6f 75 72 20 6c 65 61 64 69 6e 67   or four leading
14e90 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20   / characters.  
14ea0 20 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f      ** file://ho
14eb0 73 74 2f 70 61 74 68 20 6f 72 20 66 69 6c 65 3a  st/path or file:
14ec0 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20  ////host/path.  
14ed0 42 75 74 20 35 20 6c 65 61 64 69 6e 67 20 73 6c  But 5 leading sl
14ee0 61 73 68 65 73 20 69 73 20 61 20 0a 20 20 20 20  ashes is a .    
14ef0 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f    ** common erro
14f00 72 2c 20 77 65 20 61 72 65 20 74 6f 6c 64 2c 20  r, we are told, 
14f10 73 6f 20 77 65 20 68 61 6e 64 6c 65 20 69 74 20  so we handle it 
14f20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
14f30 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
14f40 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20  strncmp(zUri+7, 
14f50 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20  "///", 3)==0 ){ 
14f60 69 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c  iIn++; }.    }el
14f70 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  se if( strncmp(z
14f80 55 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68  Uri+5, "//localh
14f90 6f 73 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b  ost/", 12)==0 ){
14fa0 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 31 36 3b  .      iIn = 16;
14fb0 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
14fc0 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
14fd0 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f  scheme and autho
14fe0 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66  rity segments of
14ff0 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20   the URI. */.   
15000 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f   if( zUri[5]=='/
15010 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f  ' && zUri[6]=='/
15020 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d  ' ){.      iIn =
15030 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   7;.      while(
15040 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55   zUri[iIn] && zU
15050 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69  ri[iIn]!='/' ) i
15060 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  In++;.      if( 
15070 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d  iIn!=7 && (iIn!=
15080 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f  16 || memcmp("lo
15090 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b  calhost", &zUri[
150a0 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20  7], 9)) ){.     
150b0 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
150c0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
150d0 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74 68  invalid uri auth
150e0 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20  ority: %.*s", . 
150f0 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37             iIn-7
15100 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20  , &zUri[7]);.   
15110 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15120 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
15130 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
15140 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
15150 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
15160 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61   Copy the filena
15170 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79  me and any query
15180 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f   parameters into
15190 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65   the zFile buffe
151a0 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64  r. .    ** Decod
151b0 65 20 25 48 48 20 65 73 63 61 70 65 20 63 6f 64  e %HH escape cod
151c0 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79  es along the way
151d0 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
151e0 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   Within this loo
151f0 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74 61  p, variable eSta
15200 74 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  te may be set to
15210 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65   0, 1 or 2, depe
15220 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20  nding.    ** on 
15230 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  the parsing cont
15240 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a  ext. As follows:
15250 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
15260 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65   0: Parsing file
15270 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20  -name..    **   
15280 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20  1: Parsing name 
15290 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d  section of a nam
152a0 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61  e=value query pa
152b0 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20  rameter..    ** 
152c0 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c    2: Parsing val
152d0 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20  ue section of a 
152e0 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79  name=value query
152f0 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20   parameter..    
15300 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20  */.    eState = 
15310 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63  0;.    while( (c
15320 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30   = zUri[iIn])!=0
15330 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20   && c!='#' ){.  
15340 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20      iIn++;.     
15350 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20   if( c=='%' .   
15360 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73      && sqlite3Is
15370 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d  xdigit(zUri[iIn]
15380 29 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  ) .       && sql
15390 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55 72  ite3Isxdigit(zUr
153a0 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20  i[iIn+1]) .     
153b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
153c0 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33  octet = (sqlite3
153d0 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49  HexToInt(zUri[iI
153e0 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20  n++]) << 4);.   
153f0 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71       octet += sq
15400 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55  lite3HexToInt(zU
15410 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20  ri[iIn++]);..   
15420 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 74       assert( oct
15430 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32  et>=0 && octet<2
15440 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  56 );.        if
15450 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20  ( octet==0 ){.  
15460 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
15470 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
15480 77 68 65 6e 20 22 25 30 30 22 20 61 70 70 65 61  when "%00" appea
15490 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 55 52  rs within the UR
154a0 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20  I. In this.     
154b0 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77 65 20       ** case we 
154c0 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74 20  ignore all text 
154d0 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  in the remainder
154e0 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20 6e 61   of the path, na
154f0 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  me or.          
15500 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74  ** value current
15510 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e  ly being parsed.
15520 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63   So ignore the c
15530 75 72 72 65 6e 74 20 63 68 61 72 61 63 74 65 72  urrent character
15540 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
15550 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65  d skip to the ne
15560 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22  xt "?", "=" or "
15570 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61  &", as appropria
15580 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  te. */.         
15590 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72   while( (c = zUr
155a0 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21  i[iIn])!=0 && c!
155b0 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20 20 20  ='#' .          
155c0 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d      && (eState!=
155d0 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20  0 || c!='?').   
155e0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
155f0 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d  State!=1 || (c!=
15600 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29 29 0a  '=' && c!='&')).
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
15620 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c 20 63   (eState!=2 || c
15630 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20 20 20  !='&').         
15640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15650 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  iIn++;.         
15660 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   }.          con
15670 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
15680 0a 20 20 20 20 20 20 20 20 63 20 3d 20 6f 63 74  .        c = oct
15690 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  et;.      }else 
156a0 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 26 26  if( eState==1 &&
156b0 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27   (c=='&' || c=='
156c0 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  =') ){.        i
156d0 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d  f( zFile[iOut-1]
156e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
156f0 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70 74   /* An empty opt
15700 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65  ion name. Ignore
15710 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74   this option alt
15720 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  ogether. */.    
15730 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72        while( zUr
15740 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69  i[iIn] && zUri[i
15750 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55 72 69  In]!='#' && zUri
15760 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69  [iIn-1]!='&' ) i
15770 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  In++;.          
15780 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
15790 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
157a0 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20  c=='&' ){.      
157b0 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
157c0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
157d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
157e0 20 20 20 65 53 74 61 74 65 20 3d 20 32 3b 0a 20     eState = 2;. 
157f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15800 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65   c = 0;.      }e
15810 6c 73 65 20 69 66 28 20 28 65 53 74 61 74 65 3d  lse if( (eState=
15820 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c  =0 && c=='?') ||
15830 20 28 65 53 74 61 74 65 3d 3d 32 20 26 26 20 63   (eState==2 && c
15840 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20 20 20 20  =='&') ){.      
15850 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
15860 20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20   eState = 1;.   
15870 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65     }.      zFile
15880 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20  [iOut++] = c;.  
15890 20 20 7d 0a 20 20 20 20 69 66 28 20 65 53 74 61    }.    if( eSta
158a0 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f  te==1 ) zFile[iO
158b0 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut++] = '\0';.  
158c0 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
158d0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
158e0 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
158f0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
15900 69 66 20 74 68 65 72 65 20 77 65 72 65 20 61 6e  if there were an
15910 79 20 6f 70 74 69 6f 6e 73 20 73 70 65 63 69 66  y options specif
15920 69 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ied that should 
15930 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 0a  be interpreted .
15940 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74      ** here. Opt
15950 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e  ions that are in
15960 74 65 72 70 72 65 74 65 64 20 68 65 72 65 20 69  terpreted here i
15970 6e 63 6c 75 64 65 20 22 76 66 73 22 20 61 6e 64  nclude "vfs" and
15980 20 74 68 6f 73 65 20 74 68 61 74 0a 20 20 20 20   those that.    
15990 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ** correspond to
159a0 20 66 6c 61 67 73 20 74 68 61 74 20 6d 61 79 20   flags that may 
159b0 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  be passed to the
159c0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
159d0 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  ().    ** method
159e0 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20  . */.    zOpt = 
159f0 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33 53 74  &zFile[sqlite3St
15a00 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d  rlen30(zFile)+1]
15a10 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4f 70  ;.    while( zOp
15a20 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e  t[0] ){.      in
15a30 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65 33  t nOpt = sqlite3
15a40 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a  Strlen30(zOpt);.
15a50 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c        char *zVal
15a60 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d   = &zOpt[nOpt+1]
15a70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c  ;.      int nVal
15a80 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
15a90 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20  30(zVal);..     
15aa0 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20   if( nOpt==3 && 
15ab0 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f  memcmp("vfs", zO
15ac0 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20  pt, 3)==0 ){.   
15ad0 20 20 20 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c       zVfs = zVal
15ae0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15af0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 4f 70         struct Op
15b00 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20 20  enMode {.       
15b10 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15b20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
15b30 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 20  mode;.        } 
15b40 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  *aMode = 0;.    
15b50 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54      char *zModeT
15b60 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ype = 0;.       
15b70 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20   int mask = 0;. 
15b80 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74         int limit
15b90 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 69   = 0;..        i
15ba0 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65  f( nOpt==5 && me
15bb0 6d 63 6d 70 28 22 63 61 63 68 65 22 2c 20 7a 4f  mcmp("cache", zO
15bc0 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20  pt, 5)==0 ){.   
15bd0 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74         static st
15be0 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43  ruct OpenMode aC
15bf0 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20  acheMode[] = {. 
15c00 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 73 68             { "sh
15c10 61 72 65 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f  ared",  SQLITE_O
15c20 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
15c30 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
15c40 20 22 70 72 69 76 61 74 65 22 2c 20 53 51 4c 49   "private", SQLI
15c50 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
15c60 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20  ACHE },.        
15c70 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20      { 0, 0 }.   
15c80 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20         };..     
15c90 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49       mask = SQLI
15ca0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
15cb0 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  CHE|SQLITE_OPEN_
15cc0 50 52 49 56 41 54 45 43 41 43 48 45 3b 0a 20 20  PRIVATECACHE;.  
15cd0 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20          aMode = 
15ce0 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20  aCacheMode;.    
15cf0 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61        limit = ma
15d00 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d  sk;.          zM
15d10 6f 64 65 54 79 70 65 20 3d 20 22 63 61 63 68 65  odeType = "cache
15d20 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
15d30 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34       if( nOpt==4
15d40 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65   && memcmp("mode
15d50 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29  ", zOpt, 4)==0 )
15d60 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
15d70 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f  ic struct OpenMo
15d80 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d  de aOpenMode[] =
15d90 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b   {.            {
15da0 20 22 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f   "ro",  SQLITE_O
15db0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a  PEN_READONLY },.
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72              { "r
15dd0 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  w",  SQLITE_OPEN
15de0 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 20 0a 20  _READWRITE }, . 
15df0 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77             { "rw
15e00 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  c", SQLITE_OPEN_
15e10 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
15e20 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d  TE_OPEN_CREATE }
15e30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
15e40 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45  "memory", SQLITE
15e50 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a  _OPEN_MEMORY },.
15e60 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c              { 0,
15e70 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d   0 }.          }
15e80 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73  ;..          mas
15e90 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  k = SQLITE_OPEN_
15ea0 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54  READONLY | SQLIT
15eb0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
15ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15ed0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45      | SQLITE_OPE
15ee0 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54  N_CREATE | SQLIT
15ef0 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20  E_OPEN_MEMORY;. 
15f00 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d           aMode =
15f10 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20   aOpenMode;.    
15f20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61        limit = ma
15f30 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20 20 20  sk & flags;.    
15f40 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20        zModeType 
15f50 3d 20 22 61 63 63 65 73 73 22 3b 0a 20 20 20 20  = "access";.    
15f60 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
15f70 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20  f( aMode ){.    
15f80 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
15f90 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 20         int mode 
15fa0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
15fb0 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d  or(i=0; aMode[i]
15fc0 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .z; i++){.      
15fd0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
15fe0 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a   *z = aMode[i].z
15ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
16000 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53  ( nVal==sqlite3S
16010 74 72 6c 65 6e 33 30 28 7a 29 20 26 26 20 30 3d  trlen30(z) && 0=
16020 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c  =memcmp(zVal, z,
16030 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20   nVal) ){.      
16040 20 20 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 61          mode = a
16050 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20  Mode[i].mode;.  
16060 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
16070 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
16080 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
16090 20 20 20 20 20 20 20 69 66 28 20 6d 6f 64 65 3d         if( mode=
160a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
160b0 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
160c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e  lite3_mprintf("n
160d0 6f 20 73 75 63 68 20 25 73 20 6d 6f 64 65 3a 20  o such %s mode: 
160e0 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20  %s", zModeType, 
160f0 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zVal);.         
16100 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
16110 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
16120 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69    goto parse_uri
16130 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  _out;.          
16140 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
16150 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49 54 45 5f  (mode & ~SQLITE_
16160 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d  OPEN_MEMORY)>lim
16170 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  it ){.          
16180 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
16190 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
161a0 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77  s mode not allow
161b0 65 64 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20  ed: %s",.       
161c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c   zModeType, zVal
161f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
16200 63 20 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  c = SQLITE_PERM;
16210 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
16220 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b  o parse_uri_out;
16230 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
16240 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28         flags = (
16250 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c  flags & ~mask) |
16260 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d   mode;.        }
16270 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
16280 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61  zOpt = &zVal[nVa
16290 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  l+1];.    }..  }
162a0 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20  else{.    zFile 
162b0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
162c0 36 34 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20  64(nUri+2);.    
162d0 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74  if( !zFile ) ret
162e0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
162f0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 69  ;.    memcpy(zFi
16300 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b  le, zUri, nUri);
16310 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d  .    zFile[nUri]
16320 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69   = '\0';.    zFi
16330 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30  le[nUri+1] = '\0
16340 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20  ';.    flags &= 
16350 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  ~SQLITE_OPEN_URI
16360 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20  ;.  }..  *ppVfs 
16370 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
16380 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20  nd(zVfs);.  if( 
16390 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20  *ppVfs==0 ){.   
163a0 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
163b0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f  ite3_mprintf("no
163c0 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20   such vfs: %s", 
163d0 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d 20  zVfs);.    rc = 
163e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
163f0 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  }. parse_uri_out
16400 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
16410 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
16420 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 29  ite3_free(zFile)
16430 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b  ;.    zFile = 0;
16440 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d  .  }.  *pFlags =
16450 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c   flags;.  *pzFil
16460 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74  e = zFile;.  ret
16470 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64  urn rc;.}..#if d
16480 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
16490 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49 4c  ABLE_AUTO_PROFIL
164a0 45 29 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54  E).#define SQLIT
164b0 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54  E_AUTOLOGGING_ST
164c0 44 45 52 52 20 31 0a 23 64 65 66 69 6e 65 20 53  DERR 1.#define S
164d0 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e  QLITE_AUTOLOGGIN
164e0 47 5f 53 59 53 4c 4f 47 20 32 0a 73 74 61 74 69  G_SYSLOG 2.stati
164f0 63 20 76 6f 69 64 20 65 6e 61 62 6c 65 41 75 74  c void enableAut
16500 6f 4c 6f 67 67 69 6e 67 28 0a 20 20 73 71 6c 69  oLogging(.  sqli
16510 74 65 33 20 2a 64 62 0a 29 7b 0a 20 20 63 68 61  te3 *db.){.  cha
16520 72 20 2a 65 6e 76 70 72 6f 66 69 6c 65 20 3d 20  r *envprofile = 
16530 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 41  getenv("SQLITE_A
16540 55 54 4f 5f 50 52 4f 46 49 4c 45 22 29 3b 0a 20  UTO_PROFILE");. 
16550 20 0a 20 20 69 66 28 20 65 6e 76 70 72 6f 66 69   .  if( envprofi
16560 6c 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  le!=NULL ){.    
16570 69 6e 74 20 77 68 65 72 65 20 3d 20 30 3b 0a 20  int where = 0;. 
16580 20 20 20 69 66 28 20 21 73 74 72 6e 63 61 73 65     if( !strncase
16590 63 6d 70 28 22 31 22 2c 20 65 6e 76 70 72 6f 66  cmp("1", envprof
165a0 69 6c 65 2c 20 31 29 20 29 7b 0a 20 20 20 20 20  ile, 1) ){.     
165b0 20 69 66 28 20 69 73 61 74 74 79 28 32 29 20 29   if( isatty(2) )
165c0 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 20  {.        where 
165d0 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47  = SQLITE_AUTOLOG
165e0 47 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20 20 20  GING_STDERR;.   
165f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16600 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45    where = SQLITE
16610 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53  _AUTOLOGGING_SYS
16620 4c 4f 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LOG;.      }.   
16630 20 7d 20 65 6c 73 65 20 69 66 28 20 21 73 74 72   } else if( !str
16640 6e 63 61 73 65 63 6d 70 28 22 73 74 64 65 72 72  ncasecmp("stderr
16650 22 2c 20 65 6e 76 70 72 6f 66 69 6c 65 2c 20 36  ", envprofile, 6
16660 29 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ) ){.      where
16670 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f   = SQLITE_AUTOLO
16680 47 47 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20 20  GGING_STDERR;.  
16690 20 20 7d 20 65 6c 73 65 20 69 66 28 20 21 73 74    } else if( !st
166a0 72 6e 63 61 73 65 63 6d 70 28 22 73 79 73 6c 6f  rncasecmp("syslo
166b0 67 22 2c 20 65 6e 76 70 72 6f 66 69 6c 65 2c 20  g", envprofile, 
166c0 36 29 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72  6) ){.      wher
166d0 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c  e = SQLITE_AUTOL
166e0 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20  OGGING_SYSLOG;. 
166f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 68 65     }.    if( whe
16700 72 65 3d 3d 53 51 4c 49 54 45 5f 41 55 54 4f 4c  re==SQLITE_AUTOL
16710 4f 47 47 49 4e 47 5f 53 54 44 45 52 52 20 29 7b  OGGING_STDERR ){
16720 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70  .      sqlite3_p
16730 72 6f 66 69 6c 65 28 64 62 2c 20 5f 73 71 6c 69  rofile(db, _sqli
16740 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65 2c  te_auto_profile,
16750 20 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20   db);.    }else 
16760 69 66 28 20 77 68 65 72 65 3d 3d 53 51 4c 49 54  if( where==SQLIT
16770 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59  E_AUTOLOGGING_SY
16780 53 4c 4f 47 20 29 7b 0a 20 20 20 20 20 20 5f 6f  SLOG ){.      _o
16790 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28 29 3b 0a 20  pen_asl_log();. 
167a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
167b0 66 69 6c 65 28 64 62 2c 20 5f 73 71 6c 69 74 65  file(db, _sqlite
167c0 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65 5f 73 79  _auto_profile_sy
167d0 73 6c 6f 67 2c 20 64 62 29 3b 0a 20 20 20 20 7d  slog, db);.    }
167e0 0a 20 20 7d 0a 20 20 63 68 61 72 20 2a 65 6e 76  .  }.  char *env
167f0 74 72 61 63 65 20 3d 20 67 65 74 65 6e 76 28 22  trace = getenv("
16800 53 51 4c 49 54 45 5f 41 55 54 4f 5f 54 52 41 43  SQLITE_AUTO_TRAC
16810 45 22 29 3b 0a 20 20 69 66 28 20 65 6e 76 74 72  E");.  if( envtr
16820 61 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  ace!=NULL ){.   
16830 20 69 6e 74 20 77 68 65 72 65 20 3d 20 30 3b 0a   int where = 0;.
16840 20 20 20 20 69 66 28 20 21 73 74 72 6e 63 61 73      if( !strncas
16850 65 63 6d 70 28 22 31 22 2c 20 65 6e 76 74 72 61  ecmp("1", envtra
16860 63 65 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20  ce, 1) ){.      
16870 69 66 28 20 69 73 61 74 74 79 28 32 29 20 29 7b  if( isatty(2) ){
16880 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 20 3d  .        where =
16890 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47   SQLITE_AUTOLOGG
168a0 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20 20 20 20  ING_STDERR;.    
168b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
168c0 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45 5f   where = SQLITE_
168d0 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c  AUTOLOGGING_SYSL
168e0 4f 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OG;.      }.    
168f0 7d 20 65 6c 73 65 20 69 66 28 20 21 73 74 72 6e  } else if( !strn
16900 63 61 73 65 63 6d 70 28 22 73 74 64 65 72 72 22  casecmp("stderr"
16910 2c 20 65 6e 76 74 72 61 63 65 2c 20 36 29 20 29  , envtrace, 6) )
16920 7b 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d 20  {.      where = 
16930 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
16940 4e 47 5f 53 54 44 45 52 52 3b 0a 20 20 20 20 7d  NG_STDERR;.    }
16950 20 65 6c 73 65 20 69 66 28 20 21 73 74 72 6e 63   else if( !strnc
16960 61 73 65 63 6d 70 28 22 73 79 73 6c 6f 67 22 2c  asecmp("syslog",
16970 20 65 6e 76 74 72 61 63 65 2c 20 36 29 20 29 7b   envtrace, 6) ){
16980 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d 20 53  .      where = S
16990 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e  QLITE_AUTOLOGGIN
169a0 47 5f 53 59 53 4c 4f 47 3b 0a 20 20 20 20 7d 0a  G_SYSLOG;.    }.
169b0 20 20 20 20 69 66 28 20 77 68 65 72 65 3d 3d 53      if( where==S
169c0 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e  QLITE_AUTOLOGGIN
169d0 47 5f 53 54 44 45 52 52 20 29 7b 0a 20 20 20 20  G_STDERR ){.    
169e0 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28    sqlite3_trace(
169f0 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f  db, _sqlite_auto
16a00 5f 74 72 61 63 65 2c 20 64 62 29 3b 0a 20 20 20  _trace, db);.   
16a10 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72 65   }else if( where
16a20 3d 3d 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47  ==SQLITE_AUTOLOG
16a30 47 49 4e 47 5f 53 59 53 4c 4f 47 20 29 7b 0a 20  GING_SYSLOG ){. 
16a40 20 20 20 20 20 5f 6f 70 65 6e 5f 61 73 6c 5f 6c       _open_asl_l
16a50 6f 67 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  og();.      sqli
16a60 74 65 33 5f 74 72 61 63 65 28 64 62 2c 20 5f 73  te3_trace(db, _s
16a70 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65  qlite_auto_trace
16a80 5f 73 79 73 6c 6f 67 2c 20 64 62 29 3b 0a 20 20  _syslog, db);.  
16a90 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
16aa0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
16ab0 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f  tine does the wo
16ac0 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20  rk of opening a 
16ad0 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61  database on beha
16ae0 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lf of.** sqlite3
16af0 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69  _open() and sqli
16b00 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68  te3_open16(). Th
16b10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e  e database filen
16b20 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20  ame "zFilename" 
16b30 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e   .** is UTF-8 en
16b40 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  coded..*/.static
16b50 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73   int openDatabas
16b60 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
16b70 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44  *zFilename, /* D
16b80 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
16b90 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a   UTF-8 encoded *
16ba0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70  /.  sqlite3 **pp
16bb0 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  Db,        /* OU
16bc0 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74 61  T: Returned data
16bd0 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
16be0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c   unsigned int fl
16bf0 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61  ags,    /* Opera
16c00 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a  tional flags */.
16c10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
16c20 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  fs       /* Name
16c30 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75   of the VFS to u
16c40 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  se */.){.  sqlit
16c50 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
16c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
16c70 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68 61  ore allocated ha
16c80 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  ndle here */.  i
16c90 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
16ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16cb0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
16cc0 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61 64 73  .  int isThreads
16cd0 61 66 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  afe;            
16ce0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74     /* True for t
16cf0 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65 63  hreadsafe connec
16d00 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  tions */.  char 
16d10 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20  *zOpen = 0;     
16d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
16d30 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
16d40 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65 65  to pass to Btree
16d50 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72  Open() */.  char
16d60 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20   *zErrMsg = 0;  
16d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
16d80 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f  rror message fro
16d90 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72  m sqlite3ParseUr
16da0 69 28 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  i() */..#ifdef S
16db0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
16dc0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44  _ARMOR.  if( ppD
16dd0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  b==0 ) return SQ
16de0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
16df0 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62  ;.#endif.  *ppDb
16e00 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
16e10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
16e20 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  IT.  rc = sqlite
16e30 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
16e40 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
16e50 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  n rc;.#endif..  
16e60 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65  /* Only allow se
16e70 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69  nsible combinati
16e80 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74  ons of bits in t
16e90 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
16ea0 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20  t.  .  ** Throw 
16eb0 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20  an error if any 
16ec0 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e  non-sense combin
16ed0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20  ation is used.  
16ee0 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f  If we.  ** do no
16ef0 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20  t block illegal 
16f00 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72  combinations her
16f10 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67  e, it could trig
16f20 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  ger.  ** assert(
16f30 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  ) statements in 
16f40 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20  deeper layers.  
16f50 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61  Sensible combina
16f60 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a  tions.  ** are:.
16f70 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53    **.  **  1:  S
16f80 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
16f90 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51  NLY.  **  2:  SQ
16fa0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
16fb0 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51  ITE.  **  6:  SQ
16fc0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
16fd0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
16fe0 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20  N_CREATE.  */.  
16ff0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
17000 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d  PEN_READONLY  ==
17010 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72   0x01 );.  asser
17020 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  t( SQLITE_OPEN_R
17030 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32  EADWRITE == 0x02
17040 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
17050 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
17060 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20      == 0x04 );. 
17070 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28   testcase( (1<<(
17080 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20  flags&7))==0x02 
17090 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a  ); /* READONLY *
170a0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31  /.  testcase( (1
170b0 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78  <<(flags&7))==0x
170c0 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49  04 ); /* READWRI
170d0 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  TE */.  testcase
170e0 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
170f0 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41  ==0x40 ); /* REA
17100 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20  DWRITE | CREATE 
17110 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66  */.  if( ((1<<(f
17120 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36 29  lags&7)) & 0x46)
17130 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
17140 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
17150 42 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  BKPT;  /* IMP: R
17160 2d 36 35 34 39 37 2d 34 34 35 39 34 20 2a 2f 0a  -65497-44594 */.
17170 20 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69 74    }..  if( sqlit
17180 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
17190 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a  CoreMutex==0 ){.
171a0 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
171b0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
171c0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
171d0 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b  _OPEN_NOMUTEX ){
171e0 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
171f0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
17200 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
17210 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
17220 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64   ){.    isThread
17230 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  safe = 1;.  }els
17240 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  e{.    isThreads
17250 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  afe = sqlite3Glo
17260 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
17270 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  utex;.  }.  if( 
17280 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
17290 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
172a0 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d   ){.    flags &=
172b0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48   ~SQLITE_OPEN_SH
172c0 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c  AREDCACHE;.  }el
172d0 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  se if( sqlite3Gl
172e0 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65  obalConfig.share
172f0 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b  dCacheEnabled ){
17300 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
17310 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
17320 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  CACHE;.  }..  /*
17330 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20   Remove harmful 
17340 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c  bits from the fl
17350 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20  ags parameter.  
17360 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49  **.  ** The SQLI
17370 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
17380 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  and SQLITE_OPEN_
17390 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20  FULLMUTEX flags 
173a0 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20  were.  ** dealt 
173b0 77 69 74 68 20 69 6e 20 74 68 65 20 70 72 65 76  with in the prev
173c0 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e  ious code block.
173d0 20 20 42 65 73 69 64 65 73 20 74 68 65 73 65 2c    Besides these,
173e0 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76   the only.  ** v
173f0 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73  alid input flags
17400 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65   for sqlite3_ope
17410 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c 49 54  n_v2() are SQLIT
17420 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c  E_OPEN_READONLY,
17430 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45  .  ** SQLITE_OPE
17440 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53 51 4c  N_READWRITE, SQL
17450 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
17460 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
17470 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53  REDCACHE,.  ** S
17480 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
17490 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d  TECACHE, and som
174a0 65 20 72 65 73 65 72 76 65 64 20 62 69 74 73 2e  e reserved bits.
174b0 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a    Silently mask.
174c0 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68    ** off all oth
174d0 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20  er flags..  */. 
174e0 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51   flags &=  ~( SQ
174f0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
17500 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20  ONCLOSE |.      
17510 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
17520 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
17530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17540 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
17550 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20  _DB |.          
17560 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
17570 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20  _TEMP_DB | .    
17580 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
17590 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
175a0 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20  _DB | .         
175b0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
175c0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
175d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
175e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
175f0 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  P_JOURNAL | .   
17600 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
17610 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
17620 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  AL | .          
17630 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
17640 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
17650 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
17660 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
17670 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20  UTEX |.         
17680 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
17690 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20  N_FULLMUTEX |.  
176a0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
176b0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20  ITE_OPEN_WAL.   
176c0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20            );..  
176d0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
176e0 73 71 6c 69 74 65 20 64 61 74 61 20 73 74 72 75  sqlite data stru
176f0 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20  cture */.  db = 
17700 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
17710 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  o( sizeof(sqlite
17720 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d  3) );.  if( db==
17730 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f  0 ) goto opendb_
17740 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72  out;.  if( isThr
17750 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64  eadsafe ){.    d
17760 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  b->mutex = sqlit
17770 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
17780 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53  ITE_MUTEX_RECURS
17790 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62  IVE);.    if( db
177a0 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
177b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
177c0 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d  (db);.      db =
177d0 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f   0;.      goto o
177e0 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d  pendb_out;.    }
177f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
17800 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
17810 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72  utex);.  db->err
17820 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64  Mask = 0xff;.  d
17830 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62  b->nDb = 2;.  db
17840 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
17850 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64  _MAGIC_BUSY;.  d
17860 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  b->aDb = db->aDb
17870 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65 72  Static;..  asser
17880 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c  t( sizeof(db->aL
17890 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48  imit)==sizeof(aH
178a0 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d  ardLimit) );.  m
178b0 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74  emcpy(db->aLimit
178c0 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69  , aHardLimit, si
178d0 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29  zeof(db->aLimit)
178e0 29 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  );.  db->aLimit[
178f0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
17900 4b 45 52 5f 54 48 52 45 41 44 53 5d 20 3d 20 53  KER_THREADS] = S
17910 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 4f  QLITE_DEFAULT_WO
17920 52 4b 45 52 5f 54 48 52 45 41 44 53 3b 0a 20 20  RKER_THREADS;.  
17930 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
17940 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75   1;.  db->nextAu
17950 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62  tovac = -1;.  db
17960 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c 69 74  ->szMmap = sqlit
17970 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
17980 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e 65 78  zMmap;.  db->nex
17990 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20  tPagesize = 0;. 
179a0 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d   db->nMaxSorterM
179b0 6d 61 70 20 3d 20 30 78 37 46 46 46 46 46 46 46  map = 0x7FFFFFFF
179c0 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  ;.  db->flags |=
179d0 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
179e0 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f 45  Names | SQLITE_E
179f0 6e 61 62 6c 65 54 72 69 67 67 65 72 20 7c 20 53  nableTrigger | S
17a00 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c  QLITE_CacheSpill
17a10 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(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 29 20 7c 7c  OMATIC_INDEX) ||
17a40 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
17a50 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
17a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a70 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e   | SQLITE_AutoIn
17a80 64 65 78 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  dex.#endif.#if S
17a90 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 4b  QLITE_DEFAULT_CK
17aa0 50 54 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20  PTFULLFSYNC.    
17ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
17ac0 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53  QLITE_CkptFullFS
17ad0 79 6e 63 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  ync.#endif.#if S
17ae0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
17af0 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20  LE_FORMAT<4.    
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
17b10 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65  QLITE_LegacyFile
17b20 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  Fmt.#endif.#ifde
17b30 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17b40 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
17b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b60 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74  | SQLITE_LoadExt
17b70 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69  ension.#endif.#i
17b80 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
17b90 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49 47 47  _RECURSIVE_TRIGG
17ba0 45 52 53 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERS.            
17bb0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65       | SQLITE_Re
17bc0 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66  cTriggers.#endif
17bd0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
17be0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45  ITE_DEFAULT_FORE
17bf0 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c  IGN_KEYS) && SQL
17c00 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45  ITE_DEFAULT_FORE
17c10 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20  IGN_KEYS.       
17c20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
17c30 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23  TE_ForeignKeys.#
17c40 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
17c50 64 28 53 51 4c 49 54 45 5f 52 45 56 45 52 53 45  d(SQLITE_REVERSE
17c60 5f 55 4e 4f 52 44 45 52 45 44 5f 53 45 4c 45 43  _UNORDERED_SELEC
17c70 54 53 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS).            
17c80 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65       | SQLITE_Re
17c90 76 65 72 73 65 4f 72 64 65 72 0a 23 65 6e 64 69  verseOrder.#endi
17ca0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
17cb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
17cc0 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
17cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17ce0 20 20 7c 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53    | SQLITE_CellS
17cf0 69 7a 65 43 6b 0a 23 65 6e 64 69 66 0a 20 20 20  izeCk.#endif.   
17d00 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48 61     ;.  sqlite3Ha
17d10 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c  shInit(&db->aCol
17d20 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53  lSeq);.#ifndef S
17d30 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
17d40 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65  ALTABLE.  sqlite
17d50 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61  3HashInit(&db->a
17d60 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  Module);.#endif.
17d70 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65  .  /* Add the de
17d80 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
17d90 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e  sequence BINARY.
17da0 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f   BINARY works fo
17db0 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a  r both UTF-8.  *
17dc0 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f  * and UTF-16, so
17dd0 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66   add a version f
17de0 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64  or each to avoid
17df0 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79   any unnecessary
17e00 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e  .  ** conversion
17e10 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f  s. The only erro
17e20 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72  r that can occur
17e30 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f   here is a mallo
17e40 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a  c() failure..  *
17e50 2a 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d  *.  ** EVIDENCE-
17e60 4f 46 3a 20 52 2d 35 32 37 38 36 2d 34 34 38 37  OF: R-52786-4487
17e70 38 20 53 51 4c 69 74 65 20 64 65 66 69 6e 65 73  8 SQLite defines
17e80 20 74 68 72 65 65 20 62 75 69 6c 74 2d 69 6e 20   three built-in 
17e90 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 2a 2a 20 66  collating.  ** f
17ea0 75 6e 63 74 69 6f 6e 73 3a 0a 20 20 2a 2f 0a 20  unctions:.  */. 
17eb0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
17ec0 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42  (db, sqlite3StrB
17ed0 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54  INARY, SQLITE_UT
17ee0 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75  F8, 0, binCollFu
17ef0 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
17f00 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71  Collation(db, sq
17f10 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20  lite3StrBINARY, 
17f20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
17f30 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  0, binCollFunc, 
17f40 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
17f50 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65  ation(db, sqlite
17f60 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49  3StrBINARY, SQLI
17f70 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62  TE_UTF16LE, 0, b
17f80 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
17f90 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
17fa0 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20  n(db, "NOCASE", 
17fb0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
17fc0 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46  nocaseCollatingF
17fd0 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
17fe0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
17ff0 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55  RTRIM", SQLITE_U
18000 54 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62  TF8, (void*)1, b
18010 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
18020 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
18030 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
18040 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
18050 20 7d 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45   }.  /* EVIDENCE
18060 2d 4f 46 3a 20 52 2d 30 38 33 30 38 2d 31 37 32  -OF: R-08308-172
18070 32 34 20 54 68 65 20 64 65 66 61 75 6c 74 20 63  24 The default c
18080 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
18090 6e 20 66 6f 72 20 61 6c 6c 0a 20 20 2a 2a 20 73  n for all.  ** s
180a0 74 72 69 6e 67 73 20 69 73 20 42 49 4e 41 52 59  trings is BINARY
180b0 2e 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 70 44  . .  */.  db->pD
180c0 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  fltColl = sqlite
180d0 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
180e0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 73 71   SQLITE_UTF8, sq
180f0 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20  lite3StrBINARY, 
18100 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  0);.  assert( db
18110 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29  ->pDfltColl!=0 )
18120 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  ;..  /* Parse th
18130 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61  e filename/URI a
18140 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64 62  rgument. */.  db
18150 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c  ->openFlags = fl
18160 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ags;.  rc = sqli
18170 74 65 33 50 61 72 73 65 55 72 69 28 7a 56 66 73  te3ParseUri(zVfs
18180 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c  , zFilename, &fl
18190 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20  ags, &db->pVfs, 
181a0 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67  &zOpen, &zErrMsg
181b0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
181c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
181d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
181e0 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  EM ) db->mallocF
181f0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 73  ailed = 1;.    s
18200 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
18210 73 67 28 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d  sg(db, rc, zErrM
18220 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a  sg ? "%s" : 0, z
18230 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  ErrMsg);.    sql
18240 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
18250 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65  g);.    goto ope
18260 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ndb_out;.  }..  
18270 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b  /* Open the back
18280 65 6e 64 20 64 61 74 61 62 61 73 65 20 64 72 69  end database dri
18290 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ver */.  rc = sq
182a0 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64  lite3BtreeOpen(d
182b0 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20  b->pVfs, zOpen, 
182c0 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e  db, &db->aDb[0].
182d0 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  pBt, 0,.        
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182f0 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f  flags | SQLITE_O
18300 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20  PEN_MAIN_DB);.  
18310 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18320 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
18330 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
18340 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  MEM ){.      rc 
18350 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
18360 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
18370 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a  3Error(db, rc);.
18380 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
18390 6f 75 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  out;.  }.  sqlit
183a0 65 33 42 74 72 65 65 45 6e 74 65 72 28 64 62 2d  e3BtreeEnter(db-
183b0 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
183c0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65  db->aDb[0].pSche
183d0 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  ma = sqlite3Sche
183e0 6d 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44  maGet(db, db->aD
183f0 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28  b[0].pBt);.  if(
18400 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
18410 65 64 20 29 20 45 4e 43 28 64 62 29 20 3d 20 53  ed ) ENC(db) = S
18420 43 48 45 4d 41 5f 45 4e 43 28 64 62 29 3b 0a 20  CHEMA_ENC(db);. 
18430 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18440 76 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  ve(db->aDb[0].pB
18450 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  t);.  db->aDb[1]
18460 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  .pSchema = sqlit
18470 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
18480 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65  0);..  /* The de
18490 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76  fault safety_lev
184a0 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  el for the main 
184b0 64 61 74 61 62 61 73 65 20 69 73 20 27 66 75 6c  database is 'ful
184c0 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70  l'; for the temp
184d0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69  .  ** database i
184e0 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69  t is 'NONE'. Thi
184f0 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61  s matches the pa
18500 67 65 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c  ger layer defaul
18510 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d  ts.  .  */.  db-
18520 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  >aDb[0].zName = 
18530 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44  "main";.  db->aD
18540 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[0].safety_leve
18550 6c 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62  l = 3;.  db->aDb
18560 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d  [1].zName = "tem
18570 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  p";.  db->aDb[1]
18580 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
18590 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  1;..  db->magic 
185a0 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f  = SQLITE_MAGIC_O
185b0 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  PEN;.  if( db->m
185c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
185d0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
185e0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ut;.  }..  /* Re
185f0 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74  gister all built
18600 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62  -in functions, b
18610 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ut do not attemp
18620 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20  t to read the.  
18630 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65  ** database sche
18640 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20  ma yet. This is 
18650 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68  delayed until th
18660 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
18670 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69   database.  ** i
18680 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f  s accessed..  */
18690 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
186a0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
186b0 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65    sqlite3Registe
186c0 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e  rBuiltinFunction
186d0 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61  s(db);..  /* Loa
186e0 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65  d automatic exte
186f0 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69  nsions - extensi
18700 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 62 65  ons that have be
18710 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20 20  en registered.  
18720 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
18730 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65  ite3_automatic_e
18740 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a  xtension() API..
18750 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
18760 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
18770 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18780 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
18790 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e  te3AutoLoadExten
187a0 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20 72  sions(db);.    r
187b0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
187c0 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66 28  ode(db);.    if(
187d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
187e0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  {.      goto ope
187f0 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ndb_out;.    }. 
18800 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
18810 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20  E_ENABLE_FTS1.  
18820 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
18830 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74  ailed ){.    ext
18840 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46  ern int sqlite3F
18850 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a  ts1Init(sqlite3*
18860 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
18870 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b  te3Fts1Init(db);
18880 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
18890 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
188a0 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64 62  E_FTS2.  if( !db
188b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
188c0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
188d0 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ){.    extern in
188e0 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69  t sqlite3Fts2Ini
188f0 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  t(sqlite3*);.   
18900 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
18910 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  2Init(db);.  }.#
18920 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
18930 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
18940 20 2f 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   /* automaticall
18950 79 20 64 65 66 69 6e 65 64 20 62 79 20 53 51 4c  y defined by SQL
18960 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 20  ITE_ENABLE_FTS4 
18970 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  */.  if( !db->ma
18980 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
18990 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
189a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
189b0 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts3Init(db);.  }
189c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
189d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
189e0 53 35 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S5.  if( !db->ma
189f0 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
18a00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18a10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
18a20 74 73 35 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts5Init(db);.  }
18a30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
18a40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
18a50 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  U.  if( !db->mal
18a60 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
18a70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18a80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63    rc = sqlite3Ic
18a90 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  uInit(db);.  }.#
18aa0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
18ab0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45  LITE_ENABLE_RTRE
18ac0 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  E.  if( !db->mal
18ad0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
18ae0 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
18af0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72   rc = sqlite3Rtr
18b00 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  eeInit(db);.  }.
18b10 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
18b20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 53  QLITE_ENABLE_DBS
18b30 54 41 54 5f 56 54 41 42 0a 20 20 69 66 28 20 21  TAT_VTAB.  if( !
18b40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18b50 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
18b60 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
18b70 69 74 65 33 44 62 73 74 61 74 52 65 67 69 73 74  ite3DbstatRegist
18b80 65 72 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  er(db);.  }.#end
18b90 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
18ba0 45 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a 20  E_ENABLE_JSON1. 
18bb0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
18bc0 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
18bd0 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63  LITE_OK){.    rc
18be0 20 3d 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49   = sqlite3Json1I
18bf0 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
18c00 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49  dif..  /* -DSQLI
18c10 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
18c20 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20  NG_MODE=1 makes 
18c30 45 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65  EXCLUSIVE the de
18c40 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20  fault locking.  
18c50 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49  ** mode.  -DSQLI
18c60 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
18c70 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e  NG_MODE=0 make N
18c80 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c  ORMAL the defaul
18c90 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d  t locking.  ** m
18ca0 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68  ode.  Doing noth
18cb0 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20  ing at all also 
18cc0 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65  makes NORMAL the
18cd0 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23   default..  */.#
18ce0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  ifdef SQLITE_DEF
18cf0 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
18d00 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b  E.  db->dfltLock
18d10 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mode = SQLITE_DE
18d20 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
18d30 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  DE;.  sqlite3Pag
18d40 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71  erLockingMode(sq
18d50 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
18d60 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c  db->aDb[0].pBt),
18d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18d80 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18d90 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
18da0 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a  G_MODE);.#endif.
18db0 0a 20 20 69 66 28 20 72 63 20 29 20 73 71 6c 69  .  if( rc ) sqli
18dc0 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29  te3Error(db, rc)
18dd0 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74  ;..  /* Enable t
18de0 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c  he lookaside-mal
18df0 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f  loc subsystem */
18e00 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64  .  setupLookasid
18e10 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33  e(db, 0, sqlite3
18e20 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c  GlobalConfig.szL
18e30 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20  ookaside,.      
18e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e50 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
18e60 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65  onfig.nLookaside
18e70 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77 61  );..  sqlite3_wa
18e80 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
18e90 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  (db, SQLITE_DEFA
18ea0 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43  ULT_WAL_AUTOCHEC
18eb0 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62  KPOINT);..opendb
18ec0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 62 20 29  _out:.  if( db )
18ed0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
18ee0 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73  ->mutex!=0 || is
18ef0 54 68 72 65 61 64 73 61 66 65 3d 3d 30 0a 20 20  Threadsafe==0.  
18f00 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
18f10 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
18f20 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b  bFullMutex==0 );
18f30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
18f40 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
18f50 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ex);.  }.  rc = 
18f60 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
18f70 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  db);.  assert( d
18f80 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  b!=0 || rc==SQLI
18f90 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66  TE_NOMEM );.  if
18fa0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
18fb0 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EM ){.    sqlite
18fc0 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20  3_close(db);.   
18fd0 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65   db = 0;.  }else
18fe0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18ff0 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  OK ){.    db->ma
19000 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
19010 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 23 69 66  IC_SICK;.  }.#if
19020 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
19030 5f 5f 29 20 26 26 20 45 4e 41 42 4c 45 5f 46 4f  __) && ENABLE_FO
19040 52 43 45 5f 57 41 4c 0a 20 20 69 66 28 20 64 62  RCE_WAL.  if( db
19050 20 26 26 20 21 72 63 20 29 7b 0a 20 20 20 20 69   && !rc ){.    i
19060 66 20 28 28 30 20 3d 3d 20 61 63 63 65 73 73 28  f ((0 == access(
19070 22 2f 76 61 72 2f 64 62 2f 65 6e 61 62 6c 65 46  "/var/db/enableF
19080 6f 72 63 65 57 41 4c 22 2c 20 52 5f 4f 4b 29 29  orceWAL", R_OK))
19090 29 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ) {.#ifdef SQLIT
190a0 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 66 70  E_DEBUG.      fp
190b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
190c0 51 4c 69 74 65 20 57 41 4c 20 6a 6f 75 72 6e 61  QLite WAL journa
190d0 6c 5f 6d 6f 64 65 20 45 4e 41 42 4c 45 44 20 62  l_mode ENABLED b
190e0 79 20 64 65 66 61 75 6c 74 2e 5c 6e 22 29 3b 0a  y default.\n");.
190f0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 0a 20 20  #endif.      .  
19100 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
19110 28 64 62 2c 20 22 70 72 61 67 6d 61 20 6a 6f 75  (db, "pragma jou
19120 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 2c 20  rnal_mode=wal", 
19130 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
19140 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
19150 5f 44 45 42 55 47 0a 2f 2f 20 20 20 20 7d 20 65  _DEBUG.//    } e
19160 6c 73 65 20 7b 0a 2f 2f 20 20 20 20 20 20 66 70  lse {.//      fp
19170 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
19180 51 4c 69 74 65 20 57 41 4c 20 6a 6f 75 72 6e 61  QLite WAL journa
19190 6c 5f 6d 6f 64 65 20 4e 4f 54 20 45 4e 41 42 4c  l_mode NOT ENABL
191a0 45 44 20 62 79 20 64 65 66 61 75 6c 74 2e 5c 6e  ED by default.\n
191b0 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  ");.#endif.    }
191c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20  .  }.#endif.#if 
191d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
191e0 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49  NABLE_AUTO_PROFI
191f0 4c 45 29 0a 20 20 69 66 28 20 64 62 20 26 26 20  LE).  if( db && 
19200 21 72 63 20 29 7b 0a 20 20 20 20 65 6e 61 62 6c  !rc ){.    enabl
19210 65 41 75 74 6f 4c 6f 67 67 69 6e 67 28 64 62 29  eAutoLogging(db)
19220 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  ;.  }.#endif.  *
19230 70 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65  ppDb = db;.#ifde
19240 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
19250 53 51 4c 52 52 0a 20 20 53 52 52 65 63 4f 70 65  SQLRR.  SRRecOpe
19260 6e 28 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  n(db, zFilename,
19270 20 66 6c 61 67 73 29 3b 0a 23 65 6e 64 69 66 0a   flags);.#endif.
19280 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19290 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66  ABLE_SQLLOG.  if
192a0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
192b0 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b  onfig.xSqllog ){
192c0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e 67 20  .    /* Opening 
192d0 61 20 64 62 20 68 61 6e 64 6c 65 2e 20 46 6f 75  a db handle. Fou
192e0 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73  rth parameter is
192f0 20 70 61 73 73 65 64 20 30 2e 20 2a 2f 0a 20 20   passed 0. */.  
19300 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 73    void *pArg = s
19310 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
19320 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 3b 0a 20  ig.pSqllogArg;. 
19330 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
19340 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 70  Config.xSqllog(p
19350 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c 65 6e 61  Arg, db, zFilena
19360 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  me, 0);.  }.#end
19370 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
19380 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
19390 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
193a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
193b0 74 20 63 68 61 72 20 2a 7a 48 65 78 4b 65 79 20  t char *zHexKey 
193c0 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  = sqlite3_uri_pa
193d0 72 61 6d 65 74 65 72 28 7a 4f 70 65 6e 2c 20 22  rameter(zOpen, "
193e0 68 65 78 6b 65 79 22 29 3b 0a 20 20 20 20 69 66  hexkey");.    if
193f0 28 20 7a 48 65 78 4b 65 79 20 26 26 20 7a 48 65  ( zHexKey && zHe
19400 78 4b 65 79 5b 30 5d 20 29 7b 0a 20 20 20 20 20  xKey[0] ){.     
19410 20 75 38 20 69 42 79 74 65 3b 0a 20 20 20 20 20   u8 iByte;.     
19420 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 68   int i;.      ch
19430 61 72 20 7a 4b 65 79 5b 34 30 5d 3b 0a 20 20 20  ar zKey[40];.   
19440 20 20 20 66 6f 72 28 69 3d 30 2c 20 69 42 79 74     for(i=0, iByt
19450 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 4b  e=0; i<sizeof(zK
19460 65 79 29 2a 32 20 26 26 20 73 71 6c 69 74 65 33  ey)*2 && sqlite3
19470 49 73 78 64 69 67 69 74 28 7a 48 65 78 4b 65 79  Isxdigit(zHexKey
19480 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [i]); i++){.    
19490 20 20 20 20 69 42 79 74 65 20 3d 20 28 69 42 79      iByte = (iBy
194a0 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74 65 33  te<<4) + sqlite3
194b0 48 65 78 54 6f 49 6e 74 28 7a 48 65 78 4b 65 79  HexToInt(zHexKey
194c0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [i]);.        if
194d0 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a 4b 65  ( (i&1)!=0 ) zKe
194e0 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b 0a  y[i/2] = iByte;.
194f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
19500 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c  lite3_key_v2(db,
19510 20 30 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a   0, zKey, i/2);.
19520 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
19530 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
19540 7a 4f 70 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e  zOpen);.  return
19550 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f   rc & 0xff;.}../
19560 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
19570 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
19580 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
19590 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  open(.  const ch
195a0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a  ar *zFilename, .
195b0 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
195c0 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70   .){.  return op
195d0 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
195e0 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20  name, ppDb,.    
195f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19600 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
19610 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
19620 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29  _OPEN_CREATE, 0)
19630 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
19640 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74  open_v2(.  const
19650 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c   char *filename,
19660 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
19670 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20  ilename (UTF-8) 
19680 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
19690 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pDb,         /* 
196a0 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68  OUT: SQLite db h
196b0 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  andle */.  int f
196c0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
196d0 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20     /* Flags */. 
196e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
196f0 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  s        /* Name
19700 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74   of VFS module t
19710 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65  o use */.){.  re
19720 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73  turn openDatabas
19730 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62  e(filename, ppDb
19740 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
19750 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a  flags, zVfs);.}.
19760 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19770 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
19780 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
19790 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
197a0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
197b0 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  16(.  const void
197c0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20   *zFilename, .  
197d0 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29  sqlite3 **ppDb.)
197e0 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
197f0 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a  zFilename8;   /*
19800 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64   zFilename encod
19810 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74  ed in UTF-8 inst
19820 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f  ead of UTF-16 */
19830 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
19840 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63   *pVal;.  int rc
19850 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
19860 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
19870 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20  R.  if( ppDb==0 
19880 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
19890 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
198a0 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b  dif.  *ppDb = 0;
198b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
198c0 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
198d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
198e0 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
198f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
19900 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 46  .#endif.  if( zF
19910 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 7a 46 69  ilename==0 ) zFi
19920 6c 65 6e 61 6d 65 20 3d 20 22 5c 30 30 30 5c 30  lename = "\000\0
19930 30 30 22 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  00";.  pVal = sq
19940 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
19950 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
19960 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
19970 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49   zFilename, SQLI
19980 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20  TE_UTF16NATIVE, 
19990 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
199a0 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73    zFilename8 = s
199b0 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
199c0 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46  pVal, SQLITE_UTF
199d0 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  8);.  if( zFilen
199e0 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  ame8 ){.    rc =
199f0 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46   openDatabase(zF
19a00 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a  ilename8, ppDb,.
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
19a30 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
19a40 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
19a50 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
19a60 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53  ( *ppDb || rc==S
19a70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
19a80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19a90 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72  E_OK && !DbHasPr
19aa0 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c  operty(*ppDb, 0,
19ab0 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
19ac0 29 20 29 7b 0a 20 20 20 20 20 20 53 43 48 45 4d  ) ){.      SCHEM
19ad0 41 5f 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 45  A_ENC(*ppDb) = E
19ae0 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49  NC(*ppDb) = SQLI
19af0 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
19b00 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
19b10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
19b20 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  OMEM;.  }.  sqli
19b30 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
19b40 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  l);..  return rc
19b50 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e 64 69   & 0xff;.}.#endi
19b60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
19b70 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
19b80 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
19b90 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
19ba0 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
19bb0 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
19bc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
19bd0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
19be0 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
19bf0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
19c00 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
19c10 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
19c20 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
19c30 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
19c40 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
19c50 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72 65  t void*).){.  re
19c60 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
19c70 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
19c80 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c  (db, zName, enc,
19c90 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
19ca0 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   0);.}../*.** Re
19cb0 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
19cc0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
19cd0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
19ce0 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
19cf0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
19d00 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
19d10 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
19d20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
19d30 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
19d40 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
19d50 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
19d60 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
19d70 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
19d80 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
19d90 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
19da0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
19db0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
19dc0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
19dd0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
19de0 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
19df0 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
19e00 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
19e10 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
19e20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
19e30 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
19e40 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
19e50 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
19e60 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
19e70 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  ion(db, zName, (
19e80 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  u8)enc, pCtx, xC
19e90 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20  ompare, xDel);. 
19ea0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
19eb0 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
19ec0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
19ed0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
19ee0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19ef0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19f00 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
19f10 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
19f20 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
19f30 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
19f40 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
19f50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
19f60 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36  eate_collation16
19f70 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
19f80 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
19f90 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63  zName,.  int enc
19fa0 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
19fb0 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
19fc0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
19fd0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
19fe0 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  t void*).){.  in
19ff0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1a000 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38  ;.  char *zName8
1a010 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1a020 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1a030 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1a040 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1a050 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20  ) || zName==0 ) 
1a060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1a070 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1a080 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1a090 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1a0a0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
1a0b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a0c0 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71  );.  zName8 = sq
1a0d0 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62  lite3Utf16to8(db
1a0e0 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
1a0f0 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
1a100 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29  ;.  if( zName8 )
1a110 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74  {.    rc = creat
1a120 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
1a130 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20  Name8, (u8)enc, 
1a140 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
1a150 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
1a160 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38  bFree(db, zName8
1a170 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
1a180 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
1a190 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
1a1a0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1a1b0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1a1c0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
1a1d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1a1e0 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
1a1f0 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
1a200 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
1a210 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
1a220 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1a230 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
1a240 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
1a250 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
1a260 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1a270 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
1a280 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
1a290 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69  n_needed(.  sqli
1a2a0 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
1a2b0 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
1a2c0 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
1a2d0 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71  Needed)(void*,sq
1a2e0 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
1a2f0 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  Rep,const char*)
1a300 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
1a310 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1a320 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1a330 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1a340 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1a350 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1a360 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1a370 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1a380 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78  >mutex);.  db->x
1a390 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f  CollNeeded = xCo
1a3a0 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e  llNeeded;.  db->
1a3b0 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
1a3c0 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65  0;.  db->pCollNe
1a3d0 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e  ededArg = pCollN
1a3e0 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69  eededArg;.  sqli
1a3f0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1a400 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1a410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a420 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1a430 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
1a440 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
1a450 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1a460 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
1a470 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
1a480 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
1a490 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
1a4a0 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
1a4b0 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
1a4c0 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
1a4d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
1a4e0 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36  llation_needed16
1a4f0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1a500 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e   .  void *pCollN
1a510 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69  eededArg, .  voi
1a520 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  d(*xCollNeeded16
1a530 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a  )(void*,sqlite3*
1a540 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f  ,int eTextRep,co
1a550 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23 69  nst void*).){.#i
1a560 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1a570 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1a580 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1a590 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
1a5a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1a5b0 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1a5c0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a5d0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1a5e0 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
1a5f0 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  eded = 0;.  db->
1a600 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
1a610 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20  xCollNeeded16;. 
1a620 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
1a630 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
1a640 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
1a650 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1a660 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1a670 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1a680 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1a690 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69  MIT_UTF16 */..#i
1a6a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a6b0 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
1a6c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1a6d0 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68   is now an anach
1a6e0 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20  ronism. It used 
1a6f0 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  to be used to re
1a700 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20  cover from a.** 
1a710 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
1a720 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77  , but SQLite now
1a730 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d   does this autom
1a740 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  atically..*/.int
1a750 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f   sqlite3_global_
1a760 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20  recover(void){. 
1a770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a780 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
1a790 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77  ** Test to see w
1a7a0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
1a7b0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1a7c0 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f  ction is in auto
1a7d0 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20  commit.** mode. 
1a7e0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1a7f0 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20  it is and FALSE 
1a800 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d  if not.  Autocom
1a810 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a  mit mode is on.*
1a820 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41  * by default.  A
1a830 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73  utocommit is dis
1a840 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e  abled by a BEGIN
1a850 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
1a860 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74  eenabled.** by t
1a870 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f  he next COMMIT o
1a880 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69  r ROLLBACK..*/.i
1a890 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  nt sqlite3_get_a
1a8a0 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65  utocommit(sqlite
1a8b0 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
1a8c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1a8d0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1a8e0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1a8f0 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
1a900 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
1a910 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
1a920 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
1a930 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75  .  return db->au
1a940 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a  toCommit;.}../*.
1a950 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1a960 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75   routines are su
1a970 62 73 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f  bstitutes for co
1a980 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43  nstants SQLITE_C
1a990 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54  ORRUPT,.** SQLIT
1a9a0 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45  E_MISUSE, SQLITE
1a9b0 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54  _CANTOPEN, SQLIT
1a9c0 45 5f 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73  E_IOERR and poss
1a9d0 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72  ibly other error
1a9e0 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20  .** constants.  
1a9f0 54 68 65 79 20 73 65 72 76 65 20 74 77 6f 20 70  They serve two p
1aa00 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  urposes:.**.**  
1aa10 20 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20   1.  Serve as a 
1aa20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65  convenient place
1aa30 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
1aa40 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67  oint in a debugg
1aa50 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64  er.**       to d
1aa60 65 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69  etect when versi
1aa70 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  on error conditi
1aa80 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ons occurs..**.*
1aa90 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73  *   2.  Invoke s
1aaa0 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20  qlite3_log() to 
1aab0 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72  provide the sour
1aac0 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e  ce code location
1aad0 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20   where.**       
1aae0 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  a low-level erro
1aaf0 72 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63  r is first detec
1ab00 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
1ab10 74 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28  te3CorruptError(
1ab20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
1ab30 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
1ab40 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
1ab50 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  g!=0 );.  sqlite
1ab60 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52  3_log(SQLITE_COR
1ab70 52 55 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20  RUPT,.          
1ab80 20 20 20 20 22 64 61 74 61 62 61 73 65 20 63 6f      "database co
1ab90 72 72 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65  rruption at line
1aba0 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c   %d of [%.10s]",
1abb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
1abc0 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65  ineno, 20+sqlite
1abd0 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
1abe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1abf0 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71  ORRUPT;.}.int sq
1ac00 6c 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72  lite3MisuseError
1ac10 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
1ac20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
1ac30 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
1ac40 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  og!=0 );.  sqlit
1ac50 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49  e3_log(SQLITE_MI
1ac60 53 55 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20  SUSE, .         
1ac70 20 20 20 20 20 22 6d 69 73 75 73 65 20 61 74 20       "misuse at 
1ac80 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
1ac90 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
1aca0 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
1acb0 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
1acc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1acd0 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74  TE_MISUSE;.}.int
1ace0 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e   sqlite3Cantopen
1acf0 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
1ad00 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
1ad10 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1ad20 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
1ad30 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
1ad40 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20  TE_CANTOPEN, .  
1ad50 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e              "can
1ad60 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74  not open file at
1ad70 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31   line %d of [%.1
1ad80 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  0s]",.          
1ad90 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73      lineno, 20+s
1ada0 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
1adb0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
1adc0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a  ITE_CANTOPEN;.}.
1add0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1ade0 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
1adf0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
1ae00 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75   convenience rou
1ae10 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20  tine that makes 
1ae20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68  sure that all th
1ae30 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a  read-specific.**
1ae40 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74   data for this t
1ae50 68 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64  hread has been d
1ae60 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a  eallocated..**.*
1ae70 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67  * SQLite no long
1ae80 65 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73  er uses thread-s
1ae90 70 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20  pecific data so 
1aea0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1aeb0 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20  now a.** no-op. 
1aec0 20 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20   It is retained 
1aed0 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63  for historical c
1aee0 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f  ompatibility..*/
1aef0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68  .void sqlite3_th
1af00 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69  read_cleanup(voi
1af10 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  d){.}.#endif../*
1af20 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20  .** Return meta 
1af30 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
1af40 74 20 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c  t a specific col
1af50 75 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73  umn of a databas
1af60 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20  e table..** See 
1af70 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74  comment in sqlit
1af80 65 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69  e3.h (sqlite.h.i
1af90 6e 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  n) for details..
1afa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
1afb0 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
1afc0 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33 20  data(.  sqlite3 
1afd0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
1afe0 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1aff0 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f  n handle */.  co
1b000 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
1b010 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  e,        /* Dat
1b020 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55  abase name or NU
1b030 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  LL */.  const ch
1b040 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20  ar *zTableName, 
1b050 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d      /* Table nam
1b060 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1b070 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20  r *zColumnName, 
1b080 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d     /* Column nam
1b090 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  e */.  char cons
1b0a0 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20  t **pzDataType, 
1b0b0 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65     /* OUTPUT: De
1b0c0 63 6c 61 72 65 64 20 64 61 74 61 20 74 79 70 65  clared data type
1b0d0 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
1b0e0 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20   **pzCollSeq,   
1b0f0 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c    /* OUTPUT: Col
1b100 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1b110 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  name */.  int *p
1b120 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20  NotNull,        
1b130 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
1b140 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c   True if NOT NUL
1b150 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69  L constraint exi
1b160 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50  sts */.  int *pP
1b170 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20 20  rimaryKey,      
1b180 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
1b190 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70  True if column p
1b1a0 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69  art of PK */.  i
1b1b0 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20 20  nt *pAutoinc    
1b1c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1b1d0 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f  TPUT: True if co
1b1e0 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63  lumn is auto-inc
1b1f0 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  rement */.){.  i
1b200 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
1b210 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61  ErrMsg = 0;.  Ta
1b220 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20  ble *pTab = 0;. 
1b230 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20   Column *pCol = 
1b240 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
1b250 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
1b260 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a  *zDataType = 0;.
1b270 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43    char const *zC
1b280 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e  ollSeq = 0;.  in
1b290 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20  t notnull = 0;. 
1b2a0 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20   int primarykey 
1b2b0 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69  = 0;.  int autoi
1b2c0 6e 63 20 3d 20 30 3b 0a 0a 0a 23 69 66 64 65 66  nc = 0;...#ifdef
1b2d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1b2e0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1b2f0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1b300 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 54 61 62  ckOk(db) || zTab
1b310 6c 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  leName==0 ){.   
1b320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1b330 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
1b340 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73  #endif..  /* Ens
1b350 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
1b360 20 73 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e   schema has been
1b370 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c   loaded */.  sql
1b380 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1b390 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
1b3a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1b3b0 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20  All(db);.  rc = 
1b3c0 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20  sqlite3Init(db, 
1b3d0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
1b3e0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
1b3f0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72  {.    goto error
1b400 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
1b410 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
1b420 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a   in question */.
1b430 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
1b440 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54  FindTable(db, zT
1b450 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d  ableName, zDbNam
1b460 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20  e);.  if( !pTab 
1b470 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
1b480 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30   ){.    pTab = 0
1b490 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72  ;.    goto error
1b4a0 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
1b4b0 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Find the column 
1b4c0 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69  for which info i
1b4d0 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  s requested */. 
1b4e0 20 69 66 28 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65   if( zColumnName
1b4f0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 51 75  ==0 ){.    /* Qu
1b500 65 72 79 20 66 6f 72 20 65 78 69 73 74 61 6e 63  ery for existanc
1b510 65 20 6f 66 20 74 61 62 6c 65 20 6f 6e 6c 79 20  e of table only 
1b520 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
1b530 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
1b540 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
1b550 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  l++){.      pCol
1b560 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = &pTab->aCol[i
1b570 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Col];.      if( 
1b580 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
1b590 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pCol->zName, z
1b5a0 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20  ColumnName) ){. 
1b5b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b5c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b5d0 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e  if( iCol==pTab->
1b5e0 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  nCol ){.      if
1b5f0 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
1b600 20 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77   && sqlite3IsRow
1b610 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  id(zColumnName) 
1b620 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20  ){.        iCol 
1b630 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
1b640 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 69 43         pCol = iC
1b650 6f 6c 3e 3d 30 20 3f 20 26 70 54 61 62 2d 3e 61  ol>=0 ? &pTab->a
1b660 43 6f 6c 5b 69 43 6f 6c 5d 20 3a 20 30 3b 0a 20  Col[iCol] : 0;. 
1b670 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b680 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20      pTab = 0;.  
1b690 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72        goto error
1b6a0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
1b6b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
1b6c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
1b6d0 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65 74  k stores the met
1b6e0 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  a information th
1b6f0 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
1b700 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ned.  ** to the 
1b710 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20  caller in local 
1b720 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61 54  variables zDataT
1b730 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e  ype, zCollSeq, n
1b740 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b  otnull, primaryk
1b750 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f  ey.  ** and auto
1b760 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f 69  inc. At this poi
1b770 6e 74 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  nt there are two
1b780 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a 0a   possibilities:.
1b790 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31    ** .  **     1
1b7a0 2e 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20  . The specified 
1b7b0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20  column name was 
1b7c0 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f 72  rowid", "oid" or
1b7d0 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a   "_rowid_" .  **
1b7e0 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 72          and ther
1b7f0 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69 74  e is no explicit
1b800 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b 20  ly declared IPK 
1b810 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20  column. .  **.  
1b820 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74 61  **     2. The ta
1b830 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65  ble is not a vie
1b840 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e  w and the column
1b850 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65 64   name identified
1b860 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20 20   an .  **       
1b870 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c   explicitly decl
1b880 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70  ared column. Cop
1b890 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69  y meta informati
1b8a0 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20  on from *pCol.. 
1b8b0 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c 20   */ .  if( pCol 
1b8c0 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65  ){.    zDataType
1b8d0 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a   = pCol->zType;.
1b8e0 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70      zCollSeq = p
1b8f0 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  Col->zColl;.    
1b900 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e  notnull = pCol->
1b910 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20  notNull!=0;.    
1b920 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 28 70  primarykey  = (p
1b930 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20  Col->colFlags & 
1b940 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29  COLFLAG_PRIMKEY)
1b950 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63  !=0;.    autoinc
1b960 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d   = pTab->iPKey==
1b970 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e 74  iCol && (pTab->t
1b980 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
1b990 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a  oincrement)!=0;.
1b9a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61    }else{.    zDa
1b9b0 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45  taType = "INTEGE
1b9c0 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b  R";.    primaryk
1b9d0 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  ey = 1;.  }.  if
1b9e0 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20  ( !zCollSeq ){. 
1b9f0 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 73 71     zCollSeq = sq
1ba00 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
1ba10 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a    }..error_out:.
1ba20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1ba30 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f  aveAll(db);..  /
1ba40 2a 20 57 68 65 74 68 65 72 20 74 68 65 20 66 75  * Whether the fu
1ba50 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63  nction call succ
1ba60 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c  eeded or failed,
1ba70 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   set the output 
1ba80 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20  parameters.  ** 
1ba90 74 6f 20 77 68 61 74 65 76 65 72 20 74 68 65 69  to whatever thei
1baa0 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70  r local counterp
1bab0 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66  arts contain. If
1bac0 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63   an error did oc
1bad0 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68  cur,.  ** this h
1bae0 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
1baf0 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74   zeroing all out
1bb00 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a  put parameters..
1bb10 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74    */.  if( pzDat
1bb20 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54  aType ) *pzDataT
1bb30 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b  ype = zDataType;
1bb40 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71  .  if( pzCollSeq
1bb50 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20   ) *pzCollSeq = 
1bb60 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20  zCollSeq;.  if( 
1bb70 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74  pNotNull ) *pNot
1bb80 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a  Null = notnull;.
1bb90 20 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65    if( pPrimaryKe
1bba0 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79  y ) *pPrimaryKey
1bbb0 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20   = primarykey;. 
1bbc0 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20   if( pAutoinc ) 
1bbd0 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f  *pAutoinc = auto
1bbe0 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49  inc;..  if( SQLI
1bbf0 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54  TE_OK==rc && !pT
1bc00 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
1bc10 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
1bc20 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73  Msg);.    zErrMs
1bc30 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
1bc40 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20  tf(db, "no such 
1bc50 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73  table column: %s
1bc60 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65  .%s", zTableName
1bc70 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d  ,.        zColum
1bc80 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  nName);.    rc =
1bc90 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1bca0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
1bcb0 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c  rWithMsg(db, rc,
1bcc0 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a 30   (zErrMsg?"%s":0
1bcd0 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  ), zErrMsg);.  s
1bce0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1bcf0 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63 20   zErrMsg);.  rc 
1bd00 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
1bd10 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
1bd20 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1bd30 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1bd40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1bd50 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
1bd60 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
1bd70 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
1bd80 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f  f time slept..*/
1bd90 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c 65  .int sqlite3_sle
1bda0 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71  ep(int ms){.  sq
1bdb0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
1bdc0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 56 66  .  int rc;.  pVf
1bdd0 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  s = sqlite3_vfs_
1bde0 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 70  find(0);.  if( p
1bdf0 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Vfs==0 ) return 
1be00 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  0;..  /* This fu
1be10 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20  nction works in 
1be20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75  milliseconds, bu
1be30 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  t the underlying
1be40 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a   OsSleep() .  **
1be50 20 41 50 49 20 75 73 65 73 20 6d 69 63 72 6f 73   API uses micros
1be60 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74 68  econds. Hence th
1be70 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20  e 1000's..  */. 
1be80 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4f 73   rc = (sqlite3Os
1be90 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30 30 30  Sleep(pVfs, 1000
1bea0 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20 72 65  *ms)/1000);.  re
1beb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1bec0 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
1bed0 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64 65 64  ble the extended
1bee0 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a   result codes..*
1bef0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  /.int sqlite3_ex
1bf00 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f  tended_result_co
1bf10 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  des(sqlite3 *db,
1bf20 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 23 69 66   int onoff){.#if
1bf30 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1bf40 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1bf50 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1bf60 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
1bf70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
1bf80 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
1bf90 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1bfa0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1bfb0 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
1bfc0 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66  = onoff ? 0xffff
1bfd0 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73  ffff : 0xff;.  s
1bfe0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1bff0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1c000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c010 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  K;.}../*.** Invo
1c020 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74  ke the xFileCont
1c030 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20  rol method on a 
1c040 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
1c050 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
1c060 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
1c070 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
1c080 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
1c090 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
1c0a0 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  *pArg){.  int rc
1c0b0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1c0c0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
1c0d0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1c0e0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1c0f0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1c100 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1c110 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
1c120 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
1c130 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
1c140 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1c150 6d 75 74 65 78 29 3b 0a 20 20 70 42 74 72 65 65  mutex);.  pBtree
1c160 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65   = sqlite3DbName
1c170 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e  ToBtree(db, zDbN
1c180 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 42 74 72  ame);.  if( pBtr
1c190 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  ee ){.    Pager 
1c1a0 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c  *pPager;.    sql
1c1b0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20  ite3_file *fd;. 
1c1c0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1c1d0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
1c1e0 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
1c1f0 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
1c200 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ree);.    assert
1c210 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
1c220 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50     fd = sqlite3P
1c230 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29  agerFile(pPager)
1c240 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 64  ;.    assert( fd
1c250 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6f  !=0 );.    if( o
1c260 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  p==SQLITE_FCNTL_
1c270 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a  FILE_POINTER ){.
1c280 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f        *(sqlite3_
1c290 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66 64  file**)pArg = fd
1c2a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1c2b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1c2c0 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45  e if( op==SQLITE
1c2d0 5f 46 43 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e 54  _FCNTL_VFS_POINT
1c2e0 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71  ER ){.      *(sq
1c2f0 6c 69 74 65 33 5f 76 66 73 2a 2a 29 70 41 72 67  lite3_vfs**)pArg
1c300 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 56   = sqlite3PagerV
1c310 66 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  fs(pPager);.    
1c320 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1c330 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1c340 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
1c350 5f 4a 4f 55 52 4e 41 4c 5f 50 4f 49 4e 54 45 52  _JOURNAL_POINTER
1c360 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69   ){.      *(sqli
1c370 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20  te3_file**)pArg 
1c380 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 72  = sqlite3PagerJr
1c390 6e 6c 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a  nlFile(pPager);.
1c3a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c3b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
1c3c0 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73  if( fd->pMethods
1c3d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1c3e0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
1c3f0 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67  rol(fd, op, pArg
1c400 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1c410 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
1c420 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
1c430 5f 4f 4b 29 26 26 28 6f 70 3d 3d 53 51 4c 49 54  _OK)&&(op==SQLIT
1c440 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52  E_FCNTL_LAST_ERR
1c450 4e 4f 29 26 26 28 2a 28 69 6e 74 20 2a 29 70 41  NO)&&(*(int *)pA
1c460 72 67 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  rg==0) ){.      
1c470 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1c480 70 57 61 6c 46 64 20 3d 20 73 71 6c 69 74 65 33  pWalFd = sqlite3
1c490 50 61 67 65 72 57 61 6c 46 69 6c 65 28 70 50 61  PagerWalFile(pPa
1c4a0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
1c4b0 28 20 70 57 61 6c 46 64 26 26 28 70 57 61 6c 46  ( pWalFd&&(pWalF
1c4c0 64 2d 3e 70 4d 65 74 68 6f 64 73 29 20 29 7b 0a  d->pMethods) ){.
1c4d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1c4e0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
1c4f0 72 6f 6c 28 70 57 61 6c 46 64 2c 20 6f 70 2c 20  rol(pWalFd, op, 
1c500 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  pArg);.        }
1c510 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1c520 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c530 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
1c540 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20 20 20  FOUND;.    }.   
1c550 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1c560 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
1c570 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
1c580 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
1c590 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1c5a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1c5b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c5c0 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65  Interface to the
1c5d0 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a   testing logic..
1c5e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
1c5f0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20  est_control(int 
1c600 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20  op, ...){.  int 
1c610 72 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  rc = 0;.#ifdef S
1c620 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54  QLITE_OMIT_BUILT
1c630 49 4e 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44  IN_TEST.  UNUSED
1c640 5f 50 41 52 41 4d 45 54 45 52 28 6f 70 29 3b 0a  _PARAMETER(op);.
1c650 23 65 6c 73 65 0a 20 20 76 61 5f 6c 69 73 74 20  #else.  va_list 
1c660 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
1c670 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
1c680 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a  ( op ){..    /*.
1c690 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20      ** Save the 
1c6a0 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
1c6b0 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a   the PRNG..    *
1c6c0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1c6d0 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
1c6e0 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SAVE: {.      sq
1c6f0 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61  lite3PrngSaveSta
1c700 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
1c710 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1c720 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20  .    ** Restore 
1c730 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
1c740 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73   PRNG to the las
1c750 74 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73  t state saved us
1c760 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f  ing.    ** PRNG_
1c770 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53  SAVE.  If PRNG_S
1c780 41 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65  AVE has never be
1c790 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64  fore been called
1c7a0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
1c7b0 69 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b  is verb acts lik
1c7c0 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20  e PRNG_RESET..  
1c7d0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1c7e0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
1c7f0 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20  NG_RESTORE: {.  
1c800 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52      sqlite3PrngR
1c810 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20  estoreState();. 
1c820 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c830 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1c840 20 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20   Reset the PRNG 
1c850 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e  back to its unin
1c860 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e  itialized state.
1c870 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a    The next call.
1c880 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
1c890 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77  3_randomness() w
1c8a0 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50  ill reseed the P
1c8b0 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67  RNG using a sing
1c8c0 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  le call.    ** t
1c8d0 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73  o the xRandomnes
1c8e0 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  s method of the 
1c8f0 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20  default VFS..   
1c900 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1c910 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
1c920 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20  G_RESET: {.     
1c930 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
1c940 65 73 73 28 30 2c 30 29 3b 0a 20 20 20 20 20 20  ess(0,0);.      
1c950 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1c960 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1c970 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1c980 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73  l(BITVEC_TEST, s
1c990 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20  ize, program).  
1c9a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20    **.    ** Run 
1c9b0 61 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61  a test against a
1c9c0 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f   Bitvec object o
1c9d0 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f  f size.  The pro
1c9e0 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20  gram argument.  
1c9f0 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79    ** is an array
1ca00 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61   of integers tha
1ca10 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65  t defines the te
1ca20 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f  st.  Return -1 o
1ca30 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72  n a.    ** memor
1ca40 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
1ca50 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73  or, 0 on success
1ca60 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  , or non-zero fo
1ca70 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  r an error..    
1ca80 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74  ** See the sqlit
1ca90 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
1caa0 65 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  est() for additi
1cab0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1cac0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1cad0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1cae0 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b  L_BITVEC_TEST: {
1caf0 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  .      int sz = 
1cb00 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1cb10 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f  .      int *aPro
1cb20 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  g = va_arg(ap, i
1cb30 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt*);.      rc =
1cb40 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
1cb50 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50  iltinTest(sz, aP
1cb60 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rog);.      brea
1cb70 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1cb80 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
1cb90 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41  _test_control(FA
1cba0 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 78 43 61  ULT_INSTALL, xCa
1cbb0 6c 6c 62 61 63 6b 29 0a 20 20 20 20 2a 2a 0a 20  llback).    **. 
1cbc0 20 20 20 2a 2a 20 41 72 72 61 6e 67 65 20 74 6f     ** Arrange to
1cbd0 20 69 6e 76 6f 6b 65 20 78 43 61 6c 6c 62 61 63   invoke xCallbac
1cbe0 6b 28 29 20 77 68 65 6e 65 76 65 72 20 73 71 6c  k() whenever sql
1cbf0 69 74 65 33 46 61 75 6c 74 53 69 6d 28 29 20 69  ite3FaultSim() i
1cc00 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a  s called,.    **
1cc10 20 69 66 20 78 43 61 6c 6c 62 61 63 6b 20 69 73   if xCallback is
1cc20 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a   not NULL..    *
1cc30 2a 0a 20 20 20 20 2a 2a 20 41 73 20 61 20 74 65  *.    ** As a te
1cc40 73 74 20 6f 66 20 74 68 65 20 66 61 75 6c 74 20  st of the fault 
1cc50 73 69 6d 75 6c 61 74 6f 72 20 6d 65 63 68 61 6e  simulator mechan
1cc60 69 73 6d 20 69 74 73 65 6c 66 2c 20 73 71 6c 69  ism itself, sqli
1cc70 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 0a 20  te3FaultSim(0). 
1cc80 20 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20     ** is called 
1cc90 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
1cca0 72 20 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65  r installing the
1ccb0 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b 20 61 6e   new callback an
1ccc0 64 20 74 68 65 20 72 65 74 75 72 6e 0a 20 20 20  d the return.   
1ccd0 20 2a 2a 20 76 61 6c 75 65 20 66 72 6f 6d 20 73   ** value from s
1cce0 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30  qlite3FaultSim(0
1ccf0 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65  ) becomes the re
1cd00 74 75 72 6e 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  turn from.    **
1cd10 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1cd20 6e 74 72 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a  ntrol()..    */.
1cd30 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1cd40 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49  TESTCTRL_FAULT_I
1cd50 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  NSTALL: {.      
1cd60 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79  /* MSVC is picky
1cd70 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66   about pulling f
1cd80 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61  unc ptrs from va
1cd90 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a   lists..      **
1cda0 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e   http://support.
1cdb0 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62  microsoft.com/kb
1cdc0 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20  /47961.      ** 
1cdd0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1cde0 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63  fig.xTestCallbac
1cdf0 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  k = va_arg(ap, i
1ce00 6e 74 28 2a 29 28 69 6e 74 29 29 3b 0a 20 20 20  nt(*)(int));.   
1ce10 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65     */.      type
1ce20 64 65 66 20 69 6e 74 28 2a 54 45 53 54 43 41 4c  def int(*TESTCAL
1ce30 4c 42 41 43 4b 46 55 4e 43 5f 74 29 28 69 6e 74  LBACKFUNC_t)(int
1ce40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ce50 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65  GlobalConfig.xTe
1ce60 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f  stCallback = va_
1ce70 61 72 67 28 61 70 2c 20 54 45 53 54 43 41 4c 4c  arg(ap, TESTCALL
1ce80 42 41 43 4b 46 55 4e 43 5f 74 29 3b 0a 20 20 20  BACKFUNC_t);.   
1ce90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
1cea0 61 75 6c 74 53 69 6d 28 30 29 3b 0a 20 20 20 20  aultSim(0);.    
1ceb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1cec0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1ced0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1cee0 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  rol(BENIGN_MALLO
1cef0 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c  C_HOOKS, xBegin,
1cf00 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20   xEnd).    **.  
1cf10 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f    ** Register ho
1cf20 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69  oks to call to i
1cf30 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61  ndicate which ma
1cf40 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20  lloc() failures 
1cf50 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69  .    ** are beni
1cf60 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  gn..    */.    c
1cf70 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1cf80 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  TRL_BENIGN_MALLO
1cf90 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20  C_HOOKS: {.     
1cfa0 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
1cfb0 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76  void_function)(v
1cfc0 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64  oid);.      void
1cfd0 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67  _function xBenig
1cfe0 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f  nBegin;.      vo
1cff0 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
1d000 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42  ignEnd;.      xB
1d010 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f  enignBegin = va_
1d020 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
1d030 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42  ction);.      xB
1d040 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72  enignEnd = va_ar
1d050 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74  g(ap, void_funct
1d060 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
1d070 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48  te3BenignMallocH
1d080 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69  ooks(xBenignBegi
1d090 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a  n, xBenignEnd);.
1d0a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d0b0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1d0c0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1d0d0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1d0e0 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
1d0f0 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69  BYTE, unsigned i
1d100 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
1d110 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44   ** Set the PEND
1d120 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20  ING byte to the 
1d130 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67  value in the arg
1d140 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20  ument, if X>0.. 
1d150 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68     ** Make no ch
1d160 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20  anges if X==0.  
1d170 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
1d180 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20   of the pending 
1d190 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69  byte.    ** as i
1d1a0 74 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72  t existing befor
1d1b0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
1d1c0 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
1d1d0 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41  *.    ** IMPORTA
1d1e0 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68  NT:  Changing th
1d1f0 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66  e PENDING byte f
1d200 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72  rom 0x40000000 r
1d210 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a  esults in.    **
1d220 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
1d230 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1d240 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67  ormat.  Changing
1d250 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
1d260 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61  e.    ** while a
1d270 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ny database conn
1d280 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72  ection is open r
1d290 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69  esults in undefi
1d2a0 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  ned and.    ** d
1d2b0 65 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76  eleterious behav
1d2c0 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ior..    */.    
1d2d0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1d2e0 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
1d2f0 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E: {.      rc = 
1d300 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69  PENDING_BYTE;.#i
1d310 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d320 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20  T_WSD.      {.  
1d330 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
1d340 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61  nt newVal = va_a
1d350 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20  rg(ap, unsigned 
1d360 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  int);.        if
1d370 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74  ( newVal ) sqlit
1d380 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20  e3PendingByte = 
1d390 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  newVal;.      }.
1d3a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
1d3b0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1d3c0 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1d3d0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1d3e0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1d3f0 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20  SSERT, int X).  
1d400 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
1d410 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
1d420 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
1d430 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
1d440 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73  or not.    ** as
1d450 73 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c  sert() was enabl
1d460 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1d470 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  me.  If X is tru
1d480 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20  e and assert(). 
1d490 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64     ** is enabled
1d4a0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
1d4b0 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e  n value is true.
1d4c0 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61    If X is true a
1d4d0 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74  nd.    ** assert
1d4e0 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  () is disabled, 
1d4f0 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
1d500 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20  value is zero.  
1d510 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66  If X is.    ** f
1d520 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
1d530 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  ) is enabled, th
1d540 65 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e  en the assertion
1d550 20 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20   fires and the. 
1d560 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62     ** process ab
1d570 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66  orts.  If X is f
1d580 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
1d590 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
1d5a0 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
1d5b0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a  eturn value is z
1d5c0 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
1d5d0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1d5e0 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20  CTRL_ASSERT: {. 
1d5f0 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e       volatile in
1d600 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  t x = 0;.      a
1d610 73 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61  ssert( (x = va_a
1d620 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29  rg(ap,int))!=0 )
1d630 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a  ;.      rc = x;.
1d640 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d650 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   }...    /*.    
1d660 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
1d670 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1d680 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c  TESTCTRL_ALWAYS,
1d690 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
1d6a0 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f     ** This actio
1d6b0 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e  n provides a run
1d6c0 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65  -time test to se
1d6d0 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53  e how the ALWAYS
1d6e0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45   and.    ** NEVE
1d6f0 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65  R macros were de
1d700 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  fined at compile
1d710 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  -time..    **.  
1d720 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20    ** The return 
1d730 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28  value is ALWAYS(
1d740 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  X).  .    **.   
1d750 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e   ** The recommen
1d760 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32  ded test is X==2
1d770 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
1d780 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61   value is 2, tha
1d790 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41  t means.    ** A
1d7a0 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45  LWAYS() and NEVE
1d7b0 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d  R() are both no-
1d7c0 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
1d7d0 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73  macros, which is
1d7e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
1d7f0 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66  ult setting.  If
1d800 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1d810 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57  e is 1, then ALW
1d820 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a  AYS() is either.
1d830 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65      ** hard-code
1d840 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73  d to true or els
1d850 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20  e it asserts if 
1d860 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  its argument is 
1d870 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68  false..    ** Th
1d880 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72  e first behavior
1d890 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20   (hard-coded to 
1d8a0 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73  true) is the cas
1d8b0 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49  e if.    ** SQLI
1d8c0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
1d8d0 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73  RT shows that as
1d8e0 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
1d8f0 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ed and the secon
1d900 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f  d.    ** behavio
1d910 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65  r (assert if the
1d920 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57   argument to ALW
1d930 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20  AYS() is false) 
1d940 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
1d950 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
1d960 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
1d970 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
1d980 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20   is enabled..   
1d990 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
1d9a0 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f  un-time test pro
1d9b0 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f  cedure might loo
1d9c0 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  k something like
1d9d0 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
1d9e0 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69    **    if( sqli
1d9f0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1da00 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1da10 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29  _ALWAYS, 2)==2 )
1da20 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
1da30 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45   ALWAYS() and NE
1da40 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20  VER() are no-op 
1da50 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63  pass-through mac
1da60 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65  ros.    **    }e
1da70 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f  lse if( sqlite3_
1da80 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1da90 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1daa0 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a  ERT, 1) ){.    *
1dab0 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
1dac0 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74  (x) asserts that
1dad0 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45   x is true. NEVE
1dae0 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69  R(x) asserts x i
1daf0 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20  s false..    ** 
1db00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a     }else{.    **
1db10 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
1db20 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
1db30 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73   1.  NEVER(x) is
1db40 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20   a constant 0.. 
1db50 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a     **    }.    *
1db60 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1db70 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
1db80 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  S: {.      int x
1db90 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
1dba0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c  );.      rc = AL
1dbb0 57 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62  WAYS(x);.      b
1dbc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1dbd0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c   /*.    **   sql
1dbe0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1dbf0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1dc00 4c 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a 20 20  L_BYTEORDER);.  
1dc10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1dc20 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e 65 64  integer returned
1dc30 20 72 65 76 65 61 6c 73 20 74 68 65 20 62 79 74   reveals the byt
1dc40 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20 63  e-order of the c
1dc50 6f 6d 70 75 74 65 72 20 6f 6e 20 77 68 69 63 68  omputer on which
1dc60 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 69  .    ** SQLite i
1dc70 73 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a  s running:.    *
1dc80 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 31  *.    **       1
1dc90 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c       big-endian,
1dca0 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61      determined a
1dcb0 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a  t run-time.    *
1dcc0 2a 20 20 20 20 20 20 31 30 20 20 20 20 20 6c 69  *      10     li
1dcd0 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74  ttle-endian, det
1dce0 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74  ermined at run-t
1dcf0 69 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33 32 31  ime.    **  4321
1dd00 30 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61  01     big-endia
1dd10 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64  n,    determined
1dd20 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1dd30 0a 20 20 20 20 2a 2a 20 20 31 32 33 34 31 30 20  .    **  123410 
1dd40 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61      little-endia
1dd50 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74  n, determined at
1dd60 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20   compile-time.  
1dd70 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 53    */ .    case S
1dd80 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
1dd90 59 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20  YTEORDER: {.    
1dda0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 59    rc = SQLITE_BY
1ddb0 54 45 4f 52 44 45 52 2a 31 30 30 20 2b 20 53 51  TEORDER*100 + SQ
1ddc0 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41  LITE_LITTLEENDIA
1ddd0 4e 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f 42 49  N*10 + SQLITE_BI
1dde0 47 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20 62  GENDIAN;.      b
1ddf0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1de00 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1de10 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1de20 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
1de30 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  VE, sqlite3 *db,
1de40 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
1de50 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52     ** Set the nR
1de60 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e  eserve size to N
1de70 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
1de80 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61  tabase on the da
1de90 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f  tabase.    ** co
1dea0 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20  nnection db..   
1deb0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1dec0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
1ded0 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ERVE: {.      sq
1dee0 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
1def0 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
1df00 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  ;.      int x = 
1df10 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
1df20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
1df30 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1df40 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tex);.      sqli
1df50 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
1df60 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ize(db->aDb[0].p
1df70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20  Bt, 0, x, 0);.  
1df80 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1df90 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1dfa0 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
1dfb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1dfc0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1dfd0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1dfe0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
1dff0 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  NS, sqlite3 *db,
1e000 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
1e010 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20     ** Enable or 
1e020 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20  disable various 
1e030 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f  optimizations fo
1e040 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
1e050 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a  es.  The .    **
1e060 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61   argument N is a
1e070 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69   bitmask of opti
1e080 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20  mizations to be 
1e090 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e  disabled.  For n
1e0a0 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65  ormal.    ** ope
1e0b0 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20  ration N should 
1e0c0 62 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20  be 0.  The idea 
1e0d0 69 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70  is that a test p
1e0e0 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65  rogram (like the
1e0f0 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69  .    ** SQL Logi
1e100 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65  c Test or SLT te
1e110 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72  st module) can r
1e120 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20  un the same SQL 
1e130 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20  multiple times. 
1e140 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f     ** with vario
1e150 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  us optimizations
1e160 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72   disabled to ver
1e170 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d  ify that the sam
1e180 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20  e answer.    ** 
1e190 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65  is obtained in e
1e1a0 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a  very case..    *
1e1b0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1e1c0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
1e1d0 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20  IZATIONS: {.    
1e1e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1e1f0 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1e200 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  e3*);.      db->
1e210 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31  dbOptFlags = (u1
1e220 36 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e  6)(va_arg(ap, in
1e230 74 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20  t) & 0xffff);.  
1e240 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e250 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1e260 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a  N_KEYWORD.    /*
1e270 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1e280 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1e290 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c  TCTRL_ISKEYWORD,
1e2a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f   const char *zWo
1e2b0 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rd).    **.    *
1e2c0 2a 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61 20  * If zWord is a 
1e2d0 6b 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a  keyword recogniz
1e2e0 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
1e2f0 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  , then return th
1e300 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
1e310 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  of keywords.  Or
1e320 20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74   if zWord is not
1e330 20 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74 75   a keyword, retu
1e340 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  rn 0..    ** .  
1e350 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 66    ** This test f
1e360 65 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 61  eature is only a
1e370 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20  vailable in the 
1e380 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e  amalgamation sin
1e390 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53 51  ce.    ** the SQ
1e3a0 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d  LITE_N_KEYWORD m
1e3b0 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69  acro is not defi
1e3c0 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ned in this file
1e3d0 20 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20 2a   if SQLite.    *
1e3e0 2a 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e 67  * is built using
1e3f0 20 73 65 70 61 72 61 74 65 20 73 6f 75 72 63 65   separate source
1e400 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   files..    */. 
1e410 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1e420 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52  ESTCTRL_ISKEYWOR
1e430 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  D: {.      const
1e440 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76   char *zWord = v
1e450 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20  a_arg(ap, const 
1e460 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e  char*);.      in
1e470 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
1e480 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20  len30(zWord);.  
1e490 20 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65      rc = (sqlite
1e4a0 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75 38  3KeywordCode((u8
1e4b0 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f  *)zWord, n)!=TK_
1e4c0 49 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b  ID) ? SQLITE_N_K
1e4d0 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20  EYWORD : 0;.    
1e4e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1e4f0 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73  endif ..    /* s
1e500 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1e510 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1e520 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f  TRL_SCRATCHMALLO
1e530 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46  C, sz, &pNew, pF
1e540 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ree);.    **.   
1e550 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20 69   ** Pass pFree i
1e560 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61 74  nto sqlite3Scrat
1e570 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20 2a  chFree(). .    *
1e580 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20 61  * If sz>0 then a
1e590 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74 63  llocate a scratc
1e5a0 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70 4e  h buffer into pN
1e5b0 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ew.  .    */.   
1e5c0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1e5d0 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c  TCTRL_SCRATCHMAL
1e5e0 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69  LOC: {.      voi
1e5f0 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65  d *pFree, **ppNe
1e600 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  w;.      int sz;
1e610 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f 61  .      sz = va_a
1e620 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1e630 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61 72     ppNew = va_ar
1e640 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20  g(ap, void**);. 
1e650 20 20 20 20 20 70 46 72 65 65 20 3d 20 76 61 5f       pFree = va_
1e660 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
1e670 20 20 20 20 20 20 69 66 28 20 73 7a 20 29 20 2a        if( sz ) *
1e680 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53  ppNew = sqlite3S
1e690 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29  cratchMalloc(sz)
1e6a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
1e6b0 63 72 61 74 63 68 46 72 65 65 28 70 46 72 65 65  cratchFree(pFree
1e6c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e6d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
1e6e0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1e6f0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1e700 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
1e710 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29  AULT, int onoff)
1e720 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1e730 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f  If parameter ono
1e740 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ff is non-zero, 
1e750 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77 72  configure the wr
1e760 61 70 70 65 72 73 20 73 6f 20 74 68 61 74 20 61  appers so that a
1e770 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71  ll.    ** subseq
1e780 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f  uent calls to lo
1e790 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76 61  caltime() and va
1e7a0 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20  riants fail. If 
1e7b0 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20  onoff is zero,. 
1e7c0 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20     ** undo this 
1e7d0 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  setting..    */.
1e7e0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e7f0 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
1e800 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20  ME_FAULT: {.    
1e810 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1e820 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65  onfig.bLocaltime
1e830 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28 61  Fault = va_arg(a
1e840 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
1e850 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1e860 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1e870 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1e880 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52  E_TESTCTRL_NEVER
1e890 5f 43 4f 52 52 55 50 54 2c 20 69 6e 74 29 3b 0a  _CORRUPT, int);.
1e8a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65      **.    ** Se
1e8b0 74 20 6f 72 20 63 6c 65 61 72 20 61 20 66 6c 61  t or clear a fla
1e8c0 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73  g that indicates
1e8d0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1e8e0 73 65 20 66 69 6c 65 20 69 73 20 61 6c 77 61 79  se file is alway
1e8f0 73 20 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66  s well-.    ** f
1e900 6f 72 6d 65 64 20 61 6e 64 20 6e 65 76 65 72 20  ormed and never 
1e910 63 6f 72 72 75 70 74 2e 20 20 54 68 69 73 20 66  corrupt.  This f
1e920 6c 61 67 20 69 73 20 63 6c 65 61 72 20 62 79 20  lag is clear by 
1e930 64 65 66 61 75 6c 74 2c 20 69 6e 64 69 63 61 74  default, indicat
1e940 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ing that.    ** 
1e950 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 6d  database files m
1e960 69 67 68 74 20 68 61 76 65 20 61 72 62 69 74 72  ight have arbitr
1e970 61 72 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ary corruption. 
1e980 20 53 65 74 74 69 6e 67 20 74 68 65 20 66 6c 61   Setting the fla
1e990 67 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20  g during.    ** 
1e9a0 74 65 73 74 69 6e 67 20 63 61 75 73 65 73 20 63  testing causes c
1e9b0 65 72 74 61 69 6e 20 61 73 73 65 72 74 28 29 20  ertain assert() 
1e9c0 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68  statements in th
1e9d0 65 20 63 6f 64 65 20 74 6f 20 62 65 20 61 63 74  e code to be act
1e9e0 69 76 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 68  ivated.    ** th
1e9f0 61 74 20 64 65 6d 6f 6e 73 74 72 61 74 20 69 6e  at demonstrat in
1ea00 76 61 72 69 61 6e 74 73 20 6f 6e 20 77 65 6c 6c  variants on well
1ea10 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
1ea20 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   files..    */. 
1ea30 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1ea40 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f  ESTCTRL_NEVER_CO
1ea50 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 20 20 73  RRUPT: {.      s
1ea60 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1ea70 69 67 2e 6e 65 76 65 72 43 6f 72 72 75 70 74 20  ig.neverCorrupt 
1ea80 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1ea90 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1eaa0 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 20      }...    /*  
1eab0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1eac0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1ead0 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52  TCTRL_VDBE_COVER
1eae0 41 47 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20  AGE, xCallback, 
1eaf0 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ptr);.    **.   
1eb00 20 2a 2a 20 53 65 74 20 74 68 65 20 56 44 42 45   ** Set the VDBE
1eb10 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c 62 61   coverage callba
1eb20 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 78  ck function to x
1eb30 43 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 63 6f  Callback with co
1eb40 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a 20 70 6f  ntext .    ** po
1eb50 69 6e 74 65 72 20 70 74 72 2e 0a 20 20 20 20 2a  inter ptr..    *
1eb60 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1eb70 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f  E_TESTCTRL_VDBE_
1eb80 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23 69 66 64  COVERAGE: {.#ifd
1eb90 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
1eba0 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20 74 79  OVERAGE.      ty
1ebb0 70 65 64 65 66 20 76 6f 69 64 20 28 2a 62 72 61  pedef void (*bra
1ebc0 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76 6f  nch_callback)(vo
1ebd0 69 64 2a 2c 69 6e 74 2c 75 38 2c 75 38 29 3b 0a  id*,int,u8,u8);.
1ebe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1ebf0 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65 42  balConfig.xVdbeB
1ec00 72 61 6e 63 68 20 3d 20 76 61 5f 61 72 67 28 61  ranch = va_arg(a
1ec10 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63  p,branch_callbac
1ec20 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
1ec30 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56  3GlobalConfig.pV
1ec40 64 62 65 42 72 61 6e 63 68 41 72 67 20 3d 20 76  dbeBranchArg = v
1ec50 61 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a 29 3b  a_arg(ap,void*);
1ec60 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72  .#endif.      br
1ec70 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1ec80 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1ec90 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1eca0 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52  _TESTCTRL_SORTER
1ecb0 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78 29  _MMAP, db, nMax)
1ecc0 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51  ; */.    case SQ
1ecd0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
1ece0 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20  RTER_MMAP: {.   
1ecf0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1ed00 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
1ed10 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d  te3*);.      db-
1ed20 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20  >nMaxSorterMmap 
1ed30 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1ed40 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ed50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
1ed60 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1ed70 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1ed80 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20 20  CTRL_ISINIT);.  
1ed90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75    **.    ** Retu
1eda0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
1edb0 53 51 4c 69 74 65 20 68 61 73 20 62 65 65 6e 20  SQLite has been 
1edc0 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20  initialized and 
1edd0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 0a  SQLITE_ERROR if.
1ede0 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20 20      ** not..    
1edf0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1ee00 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e  TE_TESTCTRL_ISIN
1ee10 49 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  IT: {.      if( 
1ee20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1ee30 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29 20  fig.isInit==0 ) 
1ee40 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1ee50 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
1ee60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73      }..    /*  s
1ee70 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1ee80 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1ee90 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62  TRL_IMPOSTER, db
1eea0 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c  , dbName, onOff,
1eeb0 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a 20   tnum);.    **. 
1eec0 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20     ** This test 
1eed0 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73 65 64 20  control is used 
1eee0 74 6f 20 63 72 65 61 74 65 20 69 6d 70 6f 73 74  to create impost
1eef0 65 72 20 74 61 62 6c 65 73 2e 20 20 22 64 62 22  er tables.  "db"
1ef00 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 20 20   is a pointer.  
1ef10 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61    ** to the data
1ef20 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
1ef30 20 20 64 62 4e 61 6d 65 20 69 73 20 74 68 65 20    dbName is the 
1ef40 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28 65  database name (e
1ef50 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20 20  x: "main" or.   
1ef60 20 2a 2a 20 22 74 65 6d 70 22 29 20 77 68 69 63   ** "temp") whic
1ef70 68 20 77 69 6c 6c 20 72 65 63 65 69 76 65 20 74  h will receive t
1ef80 68 65 20 69 6d 70 6f 73 74 65 72 2e 20 20 22 6f  he imposter.  "o
1ef90 6e 4f 66 66 22 20 74 75 72 6e 73 20 69 6d 70 6f  nOff" turns impo
1efa0 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20 20  ster mode on.   
1efb0 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74 6e   ** or off.  "tn
1efc0 75 6d 22 20 69 73 20 74 68 65 20 72 6f 6f 74 20  um" is the root 
1efd0 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
1efe0 65 65 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ee to which the 
1eff0 69 6d 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a 20  imposter.    ** 
1f000 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e  table should con
1f010 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nect..    **.   
1f020 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f 73   ** Enable impos
1f030 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77 68  ter mode only wh
1f040 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 68 61  en the schema ha
1f050 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
1f060 61 72 73 65 64 2e 20 20 54 68 65 6e 0a 20 20 20  arsed.  Then.   
1f070 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c 65   ** run a single
1f080 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
1f090 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73 74  atement to const
1f0a0 72 75 63 74 20 74 68 65 20 69 6d 70 6f 73 74 65  ruct the imposte
1f0b0 72 20 74 61 62 6c 65 20 69 6e 0a 20 20 20 20 2a  r table in.    *
1f0c0 2a 20 74 68 65 20 70 61 72 73 65 64 20 73 63 68  * the parsed sch
1f0d0 65 6d 61 2e 20 20 54 68 65 6e 20 74 75 72 6e 20  ema.  Then turn 
1f0e0 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 62 61  imposter mode ba
1f0f0 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20 20  ck off again..  
1f100 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6f    **.    ** If o
1f110 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75 6d  nOff==0 and tnum
1f120 3e 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68  >0 then reset th
1f130 65 20 73 63 68 65 6d 61 20 66 6f 72 20 61 6c 6c  e schema for all
1f140 20 64 61 74 61 62 61 73 65 73 2c 20 63 61 75 73   databases, caus
1f150 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  ing.    ** the s
1f160 63 68 65 6d 61 20 74 6f 20 62 65 20 72 65 70 61  chema to be repa
1f170 72 73 65 64 20 74 68 65 20 6e 65 78 74 20 74 69  rsed the next ti
1f180 6d 65 20 69 74 20 69 73 20 6e 65 65 64 65 64 2e  me it is needed.
1f190 20 20 54 68 69 73 20 68 61 73 20 74 68 65 0a 20    This has the. 
1f1a0 20 20 20 2a 2a 20 65 66 66 65 63 74 20 6f 66 20     ** effect of 
1f1b0 65 72 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70 6f  erasing all impo
1f1c0 73 74 65 72 20 74 61 62 6c 65 73 2e 0a 20 20 20  ster tables..   
1f1d0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1f1e0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
1f1f0 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  OSTER: {.      s
1f200 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
1f210 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
1f220 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f230 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1f240 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 64  >mutex);.      d
1f250 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73 71  b->init.iDb = sq
1f260 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
1f270 64 62 2c 20 76 61 5f 61 72 67 28 61 70 2c 63 6f  db, va_arg(ap,co
1f280 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20  nst char*));.   
1f290 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79     db->init.busy
1f2a0 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f   = db->init.impo
1f2b0 73 74 65 72 54 61 62 6c 65 20 3d 20 76 61 5f 61  sterTable = va_a
1f2c0 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
1f2d0 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e    db->init.newTn
1f2e0 75 6d 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69  um = va_arg(ap,i
1f2f0 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  nt);.      if( d
1f300 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
1f310 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  && db->init.newT
1f320 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  num>0 ){.       
1f330 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
1f340 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
1f350 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  ion(db);.      }
1f360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1f370 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1f380 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  utex);.      bre
1f390 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1f3a0 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64  va_end(ap);.#end
1f3b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1f3c0 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a  T_BUILTIN_TEST *
1f3d0 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
1f3e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
1f3f0 61 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e  a utility routin
1f400 65 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53  e, useful to VFS
1f410 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
1f420 2c 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a  , that checks.**
1f430 20 74 6f 20 73 65 65 20 69 66 20 61 20 64 61 74   to see if a dat
1f440 61 62 61 73 65 20 66 69 6c 65 20 77 61 73 20 61  abase file was a
1f450 20 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69   URI that contai
1f460 6e 65 64 20 61 20 73 70 65 63 69 66 69 63 20 71  ned a specific q
1f470 75 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74  uery .** paramet
1f480 65 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62  er, and if so ob
1f490 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20  tains the value 
1f4a0 6f 66 20 74 68 65 20 71 75 65 72 79 20 70 61 72  of the query par
1f4b0 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ameter..**.** Th
1f4c0 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
1f4d0 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65  ment is the file
1f4e0 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73  name pointer pas
1f4f0 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70  sed into the xOp
1f500 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  en().** method o
1f510 66 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e  f a VFS implemen
1f520 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61  tation.  The zPa
1f530 72 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ram argument is 
1f540 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
1f550 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ** query paramet
1f560 65 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69  er we seek.  Thi
1f570 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1f580 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
1f590 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72  he zParam.** par
1f5a0 61 6d 65 74 65 72 20 69 66 20 69 74 20 65 78 69  ameter if it exi
1f5b0 73 74 73 2e 20 20 49 66 20 74 68 65 20 70 61 72  sts.  If the par
1f5c0 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20  ameter does not 
1f5d0 65 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74  exist, this rout
1f5e0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  ine.** returns a
1f5f0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a   NULL pointer..*
1f600 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1f610 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
1f620 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ter(const char *
1f630 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74  zFilename, const
1f640 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a   char *zParam){.
1f650 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
1f660 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30 20  =0 || zParam==0 
1f670 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46  ) return 0;.  zF
1f680 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74  ilename += sqlit
1f690 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
1f6a0 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68 69  name) + 1;.  whi
1f6b0 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  le( zFilename[0]
1f6c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20   ){.    int x = 
1f6d0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
1f6e0 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a  , zParam);.    z
1f6f0 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
1f700 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
1f710 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  ename) + 1;.    
1f720 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75 72  if( x==0 ) retur
1f730 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  n zFilename;.   
1f740 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
1f750 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
1f760 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
1f770 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1f780 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1f790 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f  boolean value fo
1f7a0 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65  r a query parame
1f7b0 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
1f7c0 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
1f7d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1f7e0 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  ename, const cha
1f7f0 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62  r *zParam, int b
1f800 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  Dflt){.  const c
1f810 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
1f820 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
1f830 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
1f840 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44 66  );.  bDflt = bDf
1f850 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20  lt!=0;.  return 
1f860 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42 6f  z ? sqlite3GetBo
1f870 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20  olean(z, bDflt) 
1f880 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  : bDflt;.}../*.*
1f890 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62 69  * Return a 64-bi
1f8a0 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  t integer value 
1f8b0 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61  for a query para
1f8c0 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65  meter..*/.sqlite
1f8d0 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f  3_int64 sqlite3_
1f8e0 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e  uri_int64(.  con
1f8f0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1f900 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  me,    /* Filena
1f910 6d 65 20 61 73 20 70 61 73 73 65 64 20 74 6f 20  me as passed to 
1f920 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  xOpen */.  const
1f930 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20   char *zParam,  
1f940 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72 61       /* URI para
1f950 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a  meter sought */.
1f960 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1f970 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20 72  bDflt       /* r
1f980 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65 74  eturn if paramet
1f990 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f  er is missing */
1f9a0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1f9b0 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72   *z = sqlite3_ur
1f9c0 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c  i_parameter(zFil
1f9d0 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a  ename, zParam);.
1f9e0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1f9f0 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73 71  v;.  if( z && sq
1fa00 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
1fa10 36 34 28 7a 2c 20 26 76 29 3d 3d 53 51 4c 49 54  64(z, &v)==SQLIT
1fa20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c  E_OK ){.    bDfl
1fa30 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74  t = v;.  }.  ret
1fa40 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a  urn bDflt;.}../*
1fa50 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42  .** Return the B
1fa60 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65  tree pointer ide
1fa70 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61  ntified by zDbNa
1fa80 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  me.  Return NULL
1fa90 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1faa0 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33  /.Btree *sqlite3
1fab0 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71  DbNameToBtree(sq
1fac0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1fad0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
1fae0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1faf0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1fb00 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62  i++){.    if( db
1fb10 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20 20  ->aDb[i].pBt.   
1fb20 20 20 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d 30    && (zDbName==0
1fb30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
1fb40 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d 3e  mp(zDbName, db->
1fb50 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  aDb[i].zName)==0
1fb60 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
1fb70 65 74 75 72 6e 20 64 62 2d 3e 61 44 62 5b 69 5d  eturn db->aDb[i]
1fb80 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  .pBt;.    }.  }.
1fb90 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1fba0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1fbb0 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20  filename of the 
1fbc0 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
1fbd0 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
1fbe0 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
1fbf0 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  n..*/.const char
1fc00 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c   *sqlite3_db_fil
1fc10 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64  ename(sqlite3 *d
1fc20 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1fc30 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65  DbName){.  Btree
1fc40 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51   *pBt;.#ifdef SQ
1fc50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1fc60 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1fc70 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1fc80 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
1fc90 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
1fca0 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
1fcb0 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
1fcc0 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44    pBt = sqlite3D
1fcd0 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
1fce0 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74   zDbName);.  ret
1fcf0 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65  urn pBt ? sqlite
1fd00 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
1fd10 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f  e(pBt) : 0;.}../
1fd20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
1fd30 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61   database is rea
1fd40 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72  d-only or 0 if r
1fd50 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75  ead/write.  Retu
1fd60 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73  rn -1 if.** no s
1fd70 75 63 68 20 64 61 74 61 62 61 73 65 20 65 78 69  uch database exi
1fd80 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sts..*/.int sqli
1fd90 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28  te3_db_readonly(
1fda0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
1fdb0 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
1fdc0 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  ){.  Btree *pBt;
1fdd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1fde0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1fdf0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1fe00 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1fe10 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
1fe20 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1fe30 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
1fe40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74    }.#endif.  pBt
1fe50 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65   = sqlite3DbName
1fe60 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e  ToBtree(db, zDbN
1fe70 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
1fe80 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65  Bt ? sqlite3Btre
1fe90 65 49 73 52 65 61 64 6f 6e 6c 79 28 70 42 74 29  eIsReadonly(pBt)
1fea0 20 3a 20 2d 31 3b 0a 7d 0a 23 69 66 20 28 53 51   : -1;.}.#if (SQ
1feb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c  LITE_ENABLE_APPL
1fec0 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69  E_SPI>0) && defi
1fed0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 0a  ned(__APPLE__)..
1fee0 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
1fef0 33 5f 70 72 69 76 61 74 65 2e 68 22 0a 0a 2f 2a  3_private.h"../*
1ff00 20 0a 2a 2a 20 54 65 73 74 69 6e 67 20 61 20 66   .** Testing a f
1ff10 69 6c 65 20 70 61 74 68 20 66 6f 72 20 73 71 6c  ile path for sql
1ff20 69 74 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite locks held b
1ff30 79 20 61 20 70 72 6f 63 65 73 73 20 49 44 2e 20  y a process ID. 
1ff40 0a 2a 2a 20 52 65 74 75 72 6e 73 20 53 51 4c 49  .** Returns SQLI
1ff50 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 4e 20  TE_LOCKSTATE_ON 
1ff60 69 66 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65  if locks are pre
1ff70 73 65 6e 74 20 6f 6e 20 70 61 74 68 0a 2a 2a 20  sent on path.** 
1ff80 74 68 61 74 20 77 6f 75 6c 64 20 70 72 65 76 65  that would preve
1ff90 6e 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  nt writing to th
1ffa0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  e database..*/.i
1ffb0 6e 74 20 5f 73 71 6c 69 74 65 33 5f 6c 6f 63 6b  nt _sqlite3_lock
1ffc0 73 74 61 74 65 28 63 6f 6e 73 74 20 63 68 61 72  state(const char
1ffd0 20 2a 70 61 74 68 2c 20 70 69 64 5f 74 20 70 69   *path, pid_t pi
1ffe0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  d){.  sqlite3 *d
1fff0 62 20 3d 20 4e 55 4c 4c 3b 0a 20 20 0a 20 20 69  b = NULL;.  .  i
20000 66 28 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  f( sqlite3_open_
20010 76 32 28 70 61 74 68 2c 20 26 64 62 2c 20 53 51  v2(path, &db, SQ
20020 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
20030 4c 59 2c 20 4e 55 4c 4c 29 20 3d 3d 20 53 51 4c  LY, NULL) == SQL
20040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 4c 6f  ITE_OK ){.    Lo
20050 63 6b 73 74 61 74 65 50 49 44 20 6c 6f 63 6b 73  ckstatePID locks
20060 74 61 74 65 20 3d 20 7b 70 69 64 2c 20 2d 31 7d  tate = {pid, -1}
20070 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
20080 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
20090 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ULL, SQLITE_FCNT
200a0 4c 5f 4c 4f 43 4b 53 54 41 54 45 5f 50 49 44 2c  L_LOCKSTATE_PID,
200b0 20 26 6c 6f 63 6b 73 74 61 74 65 29 3b 0a 20 20   &lockstate);.  
200c0 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
200d0 64 62 29 3b 0a 20 20 20 20 69 6e 74 20 73 74 61  db);.    int sta
200e0 74 65 20 3d 20 6c 6f 63 6b 73 74 61 74 65 2e 73  te = lockstate.s
200f0 74 61 74 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  tate;.    return
20100 20 73 74 61 74 65 3b 0a 20 20 7d 0a 20 20 69 66   state;.  }.  if
20110 28 20 4e 55 4c 4c 21 3d 64 62 20 29 7b 20 0a 20  ( NULL!=db ){ . 
20120 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
20130 28 64 62 29 3b 20 2f 2a 20 6e 65 65 64 20 74 6f  (db); /* need to
20140 20 63 6c 6f 73 65 20 65 76 65 6e 20 69 66 20 6f   close even if o
20150 70 65 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  pen returns an e
20160 72 72 6f 72 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  rror */.  }.  re
20170 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
20180 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  STATE_ERROR;.}..
20190 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
201a0 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50  _ENABLE_APPLE_SP
201b0 49 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  I */..#ifdef SQL
201c0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53  ITE_ENABLE_SNAPS
201d0 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e  HOT./*.** Obtain
201e0 20 61 20 73 6e 61 70 73 68 6f 74 20 68 61 6e 64   a snapshot hand
201f0 6c 65 20 66 6f 72 20 74 68 65 20 73 6e 61 70 73  le for the snaps
20200 68 6f 74 20 6f 66 20 64 61 74 61 62 61 73 65 20  hot of database 
20210 7a 44 62 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a  zDb currently .*
20220 2a 20 62 65 69 6e 67 20 72 65 61 64 20 62 79 20  * being read by 
20230 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
20240 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  t sqlite3_snapsh
20250 6f 74 5f 67 65 74 28 0a 20 20 73 71 6c 69 74 65  ot_get(.  sqlite
20260 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3 *db, .  const 
20270 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 73 71 6c  char *zDb,.  sql
20280 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 2a  ite3_snapshot **
20290 70 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20 20  ppSnapshot.){.  
202a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
202b0 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53  ERROR;.#ifndef S
202c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
202d0 20 69 6e 74 20 69 44 62 3b 0a 0a 23 69 66 64 65   int iDb;..#ifde
202e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
202f0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
20300 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
20310 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
20320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
20330 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
20340 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
20350 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
20360 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 69 44 62 20  >mutex);..  iDb 
20370 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
20380 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  ame(db, zDb);.  
20390 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44  if( iDb==0 || iD
203a0 62 3e 31 20 29 7b 0a 20 20 20 20 42 74 72 65 65  b>1 ){.    Btree
203b0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
203c0 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  iDb].pBt;.    if
203d0 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  ( 0==sqlite3Btre
203e0 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
203f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
20400 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
20410 72 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a 20 20  rans(pBt, 0);.  
20420 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20430 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
20440 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20450 65 72 53 6e 61 70 73 68 6f 74 47 65 74 28 73 71  erSnapshotGet(sq
20460 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
20470 70 42 74 29 2c 20 70 70 53 6e 61 70 73 68 6f 74  pBt), ppSnapshot
20480 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
20490 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
204a0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
204b0 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20 20  mutex);.#endif  
204c0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
204d0 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  WAL */.  return 
204e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
204f0 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
20500 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 6e 61 70  tion on the snap
20510 73 68 6f 74 20 69 64 65 6e 64 69 66 69 65 64 20  shot idendified 
20520 62 79 20 70 53 6e 61 70 73 68 6f 74 2e 0a 2a 2f  by pSnapshot..*/
20530 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 61  .int sqlite3_sna
20540 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20 20 73 71  pshot_open(.  sq
20550 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f  lite3 *db, .  co
20560 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a  nst char *zDb, .
20570 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68    sqlite3_snapsh
20580 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 0a 29 7b  ot *pSnapshot.){
20590 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
205a0 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65  TE_ERROR;.#ifnde
205b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
205c0 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  L..#ifdef SQLITE
205d0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
205e0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
205f0 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
20600 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
20610 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
20620 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  PT;.  }.#endif. 
20630 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
20640 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
20650 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  .  if( db->autoC
20660 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
20670 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 69 44 62  int iDb;.    iDb
20680 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
20690 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20  Name(db, zDb);. 
206a0 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c     if( iDb==0 ||
206b0 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 20 20   iDb>1 ){.      
206c0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
206d0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
206e0 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
206f0 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64  te3BtreeIsInRead
20700 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
20710 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20720 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 4f  e3PagerSnapshotO
20730 70 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65  pen(sqlite3Btree
20740 50 61 67 65 72 28 70 42 74 29 2c 20 70 53 6e 61  Pager(pBt), pSna
20750 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pshot);.        
20760 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20770 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
20780 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
20790 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20  BeginTrans(pBt, 
207a0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
207b0 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68  lite3PagerSnapsh
207c0 6f 74 4f 70 65 6e 28 73 71 6c 69 74 65 33 42 74  otOpen(sqlite3Bt
207d0 72 65 65 50 61 67 65 72 28 70 42 74 29 2c 20 30  reePager(pBt), 0
207e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
207f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
20800 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
20810 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
20820 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51  ;.#endif   /* SQ
20830 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
20840 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20850 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73 6e  ./*.** Free a sn
20860 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 6f 62  apshot handle ob
20870 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
20880 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74  te3_snapshot_get
20890 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
208a0 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65  te3_snapshot_fre
208b0 65 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  e(sqlite3_snapsh
208c0 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 29 7b 0a  ot *pSnapshot){.
208d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
208e0 53 6e 61 70 73 68 6f 74 29 3b 0a 7d 0a 23 65 6e  Snapshot);.}.#en
208f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
20900 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f  ABLE_SNAPSHOT */
20910 0a                                               .