/ Hex Artifact Content
Login

Artifact 7b310607d36a7c9754671284f646e0ea5196d299:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
0290: 51 4c 52 52 0a 23 20 69 6e 63 6c 75 64 65 20 22  QLRR.# include "
02a0: 73 71 6c 72 72 2e 68 22 0a 23 65 6e 64 69 66 20  sqlrr.h".#endif 
02b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
02c0: 4e 41 42 4c 45 5f 46 54 53 33 0a 23 20 69 6e 63  NABLE_FTS3.# inc
02d0: 6c 75 64 65 20 22 66 74 73 33 2e 68 22 0a 23 65  lude "fts3.h".#e
02e0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
02f0: 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a  TE_ENABLE_RTREE.
0300: 23 20 69 6e 63 6c 75 64 65 20 22 72 74 72 65 65  # include "rtree
0310: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0320: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0330: 49 43 55 0a 23 20 69 6e 63 6c 75 64 65 20 22 73  ICU.# include "s
0340: 71 6c 69 74 65 69 63 75 2e 68 22 0a 23 65 6e 64  qliteicu.h".#end
0350: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
0360: 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a 69 6e  _ENABLE_JSON1.in
0370: 74 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e  t sqlite3Json1In
0380: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
0390: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
03a0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 69  TE_ENABLE_FTS5.i
03b0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
03c0: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
03d0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
03e0: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
03f0: 4e 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  N./* IMPLEMENTAT
0400: 49 4f 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36 2d  ION-OF: R-46656-
0410: 34 35 31 35 36 20 54 68 65 20 73 71 6c 69 74 65  45156 The sqlite
0420: 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69  3_version[] stri
0430: 6e 67 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 63  ng constant.** c
0440: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78 74  ontains the text
0450: 20 6f 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49   of SQLITE_VERSI
0460: 4f 4e 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f  ON macro. .*/.co
0470: 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65 33  nst char sqlite3
0480: 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c  _version[] = SQL
0490: 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e  ITE_VERSION;.#en
04a0: 64 69 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e  dif../* IMPLEMEN
04b0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33 35  TATION-OF: R-535
04c0: 33 36 2d 34 32 35 37 35 20 54 68 65 20 73 71 6c  36-42575 The sql
04d0: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
04e0: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
04f0: 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ns.** a pointer 
0500: 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 73 71  to the to the sq
0510: 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20  lite3_version[] 
0520: 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e  string constant.
0530: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
0540: 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  *sqlite3_libvers
0550: 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72  ion(void){ retur
0560: 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  n sqlite3_versio
0570: 6e 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  n; }../* IMPLEME
0580: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 36 33  NTATION-OF: R-63
0590: 31 32 34 2d 33 39 33 30 30 20 54 68 65 20 73 71  124-39300 The sq
05a0: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
05b0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
05c0: 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  s a.** pointer t
05d0: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74  o a string const
05e0: 61 6e 74 20 77 68 6f 73 65 20 76 61 6c 75 65 20  ant whose value 
05f0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
0600: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f 55  he.** SQLITE_SOU
0610: 52 43 45 5f 49 44 20 43 20 70 72 65 70 72 6f 63  RCE_ID C preproc
0620: 65 73 73 6f 72 20 6d 61 63 72 6f 2e 20 0a 2a 2f  essor macro. .*/
0630: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
0640: 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 76 6f  ite3_sourceid(vo
0650: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
0660: 54 45 5f 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a  TE_SOURCE_ID; }.
0670: 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49  ./* IMPLEMENTATI
0680: 4f 4e 2d 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36  ON-OF: R-35210-6
0690: 33 35 30 38 20 54 68 65 20 73 71 6c 69 74 65 33  3508 The sqlite3
06a0: 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
06b0: 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  er() function.**
06c0: 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74 65   returns an inte
06d0: 67 65 72 20 65 71 75 61 6c 20 74 6f 20 53 51 4c  ger equal to SQL
06e0: 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  ITE_VERSION_NUMB
06f0: 45 52 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ER..*/.int sqlit
0700: 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75  e3_libversion_nu
0710: 6d 62 65 72 28 76 6f 69 64 29 7b 20 72 65 74 75  mber(void){ retu
0720: 72 6e 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  rn SQLITE_VERSIO
0730: 4e 5f 4e 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 20  N_NUMBER; }../* 
0740: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
0750: 46 3a 20 52 2d 32 30 37 39 30 2d 31 34 30 32 35  F: R-20790-14025
0760: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72   The sqlite3_thr
0770: 65 61 64 73 61 66 65 28 29 20 66 75 6e 63 74 69  eadsafe() functi
0780: 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65  on returns.** ze
0790: 72 6f 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ro if and only i
07a0: 66 20 53 51 4c 69 74 65 20 77 61 73 20 63 6f 6d  f SQLite was com
07b0: 70 69 6c 65 64 20 77 69 74 68 20 6d 75 74 65 78  piled with mutex
07c0: 69 6e 67 20 63 6f 64 65 20 6f 6d 69 74 74 65 64  ing code omitted
07d0: 20 64 75 65 20 74 6f 0a 2a 2a 20 74 68 65 20 53   due to.** the S
07e0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
07f0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
0800: 74 69 6f 6e 20 62 65 69 6e 67 20 73 65 74 20 74  tion being set t
0810: 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  o 0..*/.int sqli
0820: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 76  te3_threadsafe(v
0830: 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c  oid){ return SQL
0840: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3b 20  ITE_THREADSAFE; 
0850: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f  }../*.** When co
0860: 6d 70 69 6c 69 6e 67 20 74 68 65 20 74 65 73 74  mpiling the test
0870: 20 66 69 78 74 75 72 65 20 6f 72 20 77 69 74 68   fixture or with
0880: 20 64 65 62 75 67 67 69 6e 67 20 65 6e 61 62 6c   debugging enabl
0890: 65 64 20 28 6f 6e 20 57 69 6e 33 32 29 2c 0a 2a  ed (on Win32),.*
08a0: 2a 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20  * this variable 
08b0: 62 65 69 6e 67 20 73 65 74 20 74 6f 20 6e 6f 6e  being set to non
08c0: 2d 7a 65 72 6f 20 77 69 6c 6c 20 63 61 75 73 65  -zero will cause
08d0: 20 4f 53 54 52 41 43 45 20 6d 61 63 72 6f 73 20   OSTRACE macros 
08e0: 74 6f 20 65 6d 69 74 0a 2a 2a 20 65 78 74 72 61  to emit.** extra
08f0: 20 64 69 61 67 6e 6f 73 74 69 63 20 69 6e 66 6f   diagnostic info
0900: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64  rmation..*/.#ifd
0910: 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f  ef SQLITE_HAVE_O
0920: 53 5f 54 52 41 43 45 0a 23 20 69 66 6e 64 65 66  S_TRACE.# ifndef
0930: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53   SQLITE_DEBUG_OS
0940: 5f 54 52 41 43 45 0a 23 20 20 20 64 65 66 69 6e  _TRACE.#   defin
0950: 65 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f  e SQLITE_DEBUG_O
0960: 53 5f 54 52 41 43 45 20 30 0a 23 20 65 6e 64 69  S_TRACE 0.# endi
0970: 66 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 4f  f.  int sqlite3O
0980: 53 54 72 61 63 65 20 3d 20 53 51 4c 49 54 45 5f  STrace = SQLITE_
0990: 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 3b 0a  DEBUG_OS_TRACE;.
09a0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
09b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
09c0: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
09d0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
09e0: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
09f0: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0a00: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
0a10: 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e  r is not NULL an
0a20: 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  d if.** SQLITE_E
0a30: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 69 73  NABLE_IOTRACE is
0a40: 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d   enabled, then m
0a50: 65 73 73 61 67 65 73 20 64 65 73 63 72 69 62 69  essages describi
0a60: 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65  ng.** I/O active
0a70: 20 61 72 65 20 77 72 69 74 74 65 6e 20 75 73 69   are written usi
0a80: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
0a90: 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61 67 65  .  These message
0aa0: 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 64 65  s.** are intende
0ab0: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
0ac0: 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a  activity only..*
0ad0: 2f 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f 69  /.SQLITE_API voi
0ae0: 64 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20  d (SQLITE_CDECL 
0af0: 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 29  *sqlite3IoTrace)
0b00: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e  (const char*, ..
0b10: 2e 29 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  .) = 0;.#endif..
0b20: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c  /*.** If the fol
0b30: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
0b40: 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  riable points to
0b50: 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 68 20   a string which 
0b60: 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f  is the.** name o
0b70: 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74  f a directory, t
0b80: 68 65 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f  hen that directo
0b90: 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ry will be used 
0ba0: 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70  to store.** temp
0bb0: 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a  orary files..**.
0bc0: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  ** See also the 
0bd0: 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f  "PRAGMA temp_sto
0be0: 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51  re_directory" SQ
0bf0: 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68  L command..*/.ch
0c00: 61 72 20 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70  ar *sqlite3_temp
0c10: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  _directory = 0;.
0c20: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f  ./*.** If the fo
0c30: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
0c40: 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74  ariable points t
0c50: 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 68  o a string which
0c60: 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20   is the.** name 
0c70: 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  of a directory, 
0c80: 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63 74  then that direct
0c90: 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ory will be used
0ca0: 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 61 6c 6c   to store.** all
0cb0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
0cc0: 73 70 65 63 69 66 69 65 64 20 77 69 74 68 20 61  specified with a
0cd0: 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
0ce0: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  me..**.** See al
0cf0: 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41 20 64  so the "PRAGMA d
0d00: 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  ata_store_direct
0d10: 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  ory" SQL command
0d20: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
0d30: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
0d40: 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e  y = 0;../*.** In
0d50: 69 74 69 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e  itialize SQLite.
0d60: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f    .**.** This ro
0d70: 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
0d80: 6c 6c 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  lled to initiali
0d90: 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ze the memory al
0da0: 6c 6f 63 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53  location,.** VFS
0db0: 2c 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73  , and mutex subs
0dc0: 79 73 74 65 6d 73 20 70 72 69 6f 72 20 74 6f 20  ystems prior to 
0dd0: 64 6f 69 6e 67 20 61 6e 79 20 73 65 72 69 6f 75  doing any seriou
0de0: 73 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53  s work with.** S
0df0: 51 4c 69 74 65 2e 20 20 42 75 74 20 61 73 20 6c  QLite.  But as l
0e00: 6f 6e 67 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f  ong as you do no
0e10: 74 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 53  t compile with S
0e20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
0e30: 4e 49 54 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  NIT.** this rout
0e40: 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
0e50: 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
0e60: 20 62 79 20 6b 65 79 20 72 6f 75 74 69 6e 65 73   by key routines
0e70: 20 73 75 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69   such as.** sqli
0e80: 74 65 33 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a  te3_open().  .**
0e90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
0ea0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65   is a no-op exce
0eb0: 70 74 20 6f 6e 20 69 74 73 20 76 65 72 79 20 66  pt on its very f
0ec0: 69 72 73 74 20 63 61 6c 6c 20 66 6f 72 20 74 68  irst call for th
0ed0: 65 20 70 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72  e process,.** or
0ee0: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
0ef0: 61 6c 6c 20 61 66 74 65 72 20 61 20 63 61 6c 6c  all after a call
0f00: 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 68 75 74   to sqlite3_shut
0f10: 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  down..**.** The 
0f20: 66 69 72 73 74 20 74 68 72 65 61 64 20 74 6f 20  first thread to 
0f30: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
0f40: 65 20 72 75 6e 73 20 74 68 65 20 69 6e 69 74 69  e runs the initi
0f50: 61 6c 69 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20  alization to.** 
0f60: 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20  completion.  If 
0f70: 73 75 62 73 65 71 75 65 6e 74 20 74 68 72 65 61  subsequent threa
0f80: 64 73 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ds call this rou
0f90: 74 69 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20  tine before the 
0fa0: 66 69 72 73 74 0a 2a 2a 20 74 68 72 65 61 64 20  first.** thread 
0fb0: 68 61 73 20 66 69 6e 69 73 68 65 64 20 74 68 65  has finished the
0fc0: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
0fd0: 70 72 6f 63 65 73 73 2c 20 74 68 65 6e 20 74 68  process, then th
0fe0: 65 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  e subsequent.** 
0ff0: 74 68 72 65 61 64 73 20 6d 75 73 74 20 62 6c 6f  threads must blo
1000: 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  ck until the fir
1010: 73 74 20 74 68 72 65 61 64 20 66 69 6e 69 73 68  st thread finish
1020: 65 73 20 77 69 74 68 20 74 68 65 20 69 6e 69 74  es with the init
1030: 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ialization..**.*
1040: 2a 20 54 68 65 20 66 69 72 73 74 20 74 68 72 65  * The first thre
1050: 61 64 20 6d 69 67 68 74 20 63 61 6c 6c 20 74 68  ad might call th
1060: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 63 75 72  is routine recur
1070: 73 69 76 65 6c 79 2e 20 20 52 65 63 75 72 73 69  sively.  Recursi
1080: 76 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74  ve.** calls to t
1090: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
10a0: 6c 64 20 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66  ld not block, of
10b0: 20 63 6f 75 72 73 65 2e 20 20 4f 74 68 65 72 77   course.  Otherw
10c0: 69 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69  ise the.** initi
10d0: 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73  alization proces
10e0: 73 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f  s would never co
10f0: 6d 70 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65  mplete..**.** Le
1100: 74 20 58 20 62 65 20 74 68 65 20 66 69 72 73 74  t X be the first
1110: 20 74 68 72 65 61 64 20 74 6f 20 65 6e 74 65 72   thread to enter
1120: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
1130: 4c 65 74 20 59 20 62 65 20 73 6f 6d 65 20 6f 74  Let Y be some ot
1140: 68 65 72 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20  her.** thread.  
1150: 54 68 65 6e 20 77 68 69 6c 65 20 74 68 65 20 69  Then while the i
1160: 6e 69 74 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f  nitial invocatio
1170: 6e 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  n of this routin
1180: 65 20 62 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63  e by X is.** inc
1190: 6f 6d 70 6c 65 74 65 2c 20 69 74 20 69 73 20 72  omplete, it is r
11a0: 65 71 75 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a  equired that:.**
11b0: 0a 2a 2a 20 20 20 20 2a 20 20 43 61 6c 6c 73 20  .**    *  Calls 
11c0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
11d0: 66 72 6f 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63  from Y must bloc
11e0: 6b 20 75 6e 74 69 6c 20 74 68 65 20 6f 75 74 65  k until the oute
11f0: 72 2d 6d 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20  r-most.**       
1200: 63 61 6c 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65  call by X comple
1210: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  tes..**.**    * 
1220: 20 52 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   Recursive calls
1230: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
1240: 20 66 72 6f 6d 20 74 68 72 65 61 64 20 58 20 72   from thread X r
1250: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
1260: 79 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68 6f  y.**       witho
1270: 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ut blocking..*/.
1280: 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  int sqlite3_init
1290: 69 61 6c 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20  ialize(void){.  
12a0: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
12b0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
12c0: 74 65 72 3b 20 29 20 20 20 20 20 20 20 2f 2a 20  ter; )       /* 
12d0: 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69 63 20  The main static 
12e0: 6d 75 74 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72  mutex */.  int r
12f0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1310: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1320: 74 20 63 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66  t code */.#ifdef
1330: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e   SQLITE_EXTRA_IN
1340: 49 54 0a 20 20 69 6e 74 20 62 52 75 6e 45 78 74  IT.  int bRunExt
1350: 72 61 49 6e 69 74 20 3d 20 30 3b 20 20 20 20 20  raInit = 0;     
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1370: 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 69 74 69    /* Extra initi
1380: 61 6c 69 7a 61 74 69 6f 6e 20 6e 65 65 64 65 64  alization needed
1390: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64   */.#endif..#ifd
13a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
13b0: 53 44 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  SD.  rc = sqlite
13c0: 33 5f 77 73 64 5f 69 6e 69 74 28 34 30 39 36 2c  3_wsd_init(4096,
13d0: 20 32 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d   24);.  if( rc!=
13e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1400: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1410: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
1420: 73 65 72 74 28 29 20 66 61 69 6c 73 20 6f 6e 20  sert() fails on 
1430: 73 6f 6d 65 20 6f 62 73 63 75 72 65 20 70 72 6f  some obscure pro
1440: 63 65 73 73 6f 72 2f 63 6f 6d 70 69 6c 65 72 0a  cessor/compiler.
1450: 20 20 2a 2a 20 63 6f 6d 62 69 6e 61 74 69 6f 6e    ** combination
1460: 2c 20 74 68 65 20 77 6f 72 6b 2d 61 72 6f 75 6e  , the work-aroun
1470: 64 20 69 73 20 74 6f 20 73 65 74 20 74 68 65 20  d is to set the 
1480: 63 6f 72 72 65 63 74 20 70 6f 69 6e 74 65 72 0a  correct pointer.
1490: 20 20 2a 2a 20 73 69 7a 65 20 61 74 20 63 6f 6d    ** size at com
14a0: 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20  pile-time using 
14b0: 2d 44 53 51 4c 49 54 45 5f 50 54 52 53 49 5a 45  -DSQLITE_PTRSIZE
14c0: 3d 6e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  =n compile-time 
14d0: 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65  option */.  asse
14e0: 72 74 28 20 53 51 4c 49 54 45 5f 50 54 52 53 49  rt( SQLITE_PTRSI
14f0: 5a 45 3d 3d 73 69 7a 65 6f 66 28 63 68 61 72 2a  ZE==sizeof(char*
1500: 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51  ) );..  /* If SQ
1510: 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64 79 20  Lite is already 
1520: 63 6f 6d 70 6c 65 74 65 6c 79 20 69 6e 69 74 69  completely initi
1530: 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20 74 68 69  alized, then thi
1540: 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73  s call.  ** to s
1550: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
1560: 65 28 29 20 73 68 6f 75 6c 64 20 62 65 20 61 20  e() should be a 
1570: 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 74 68 65 20  no-op.  But the 
1580: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
1590: 20 2a 2a 20 6d 75 73 74 20 62 65 20 63 6f 6d 70   ** must be comp
15a0: 6c 65 74 65 2e 20 20 53 6f 20 69 73 49 6e 69 74  lete.  So isInit
15b0: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 73 65 74   must not be set
15c0: 20 75 6e 74 69 6c 20 74 68 65 20 76 65 72 79 20   until the very 
15d0: 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73  end.  ** of this
15e0: 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20   routine..  */. 
15f0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
1600: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
1610: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1620: 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  OK;..  /* Make s
1630: 75 72 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ure the mutex su
1640: 62 73 79 73 74 65 6d 20 69 73 20 69 6e 69 74 69  bsystem is initi
1650: 61 6c 69 7a 65 64 2e 20 20 49 66 20 75 6e 61 62  alized.  If unab
1660: 6c 65 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74  le to .  ** init
1670: 69 61 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78  ialize the mutex
1680: 20 73 75 62 73 79 73 74 65 6d 2c 20 72 65 74 75   subsystem, retu
1690: 72 6e 20 65 61 72 6c 79 20 77 69 74 68 20 74 68  rn early with th
16a0: 65 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66  e error..  ** If
16b0: 20 74 68 65 20 73 79 73 74 65 6d 20 69 73 20 73   the system is s
16c0: 6f 20 73 69 63 6b 20 74 68 61 74 20 77 65 20 61  o sick that we a
16d0: 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  re unable to all
16e0: 6f 63 61 74 65 20 61 20 6d 75 74 65 78 2c 0a 20  ocate a mutex,. 
16f0: 20 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 74   ** there is not
1700: 20 6d 75 63 68 20 53 51 4c 69 74 65 20 69 73 20   much SQLite is 
1710: 67 6f 69 6e 67 20 74 6f 20 62 65 20 61 62 6c 65  going to be able
1720: 20 74 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a   to do..  **.  *
1730: 2a 20 54 68 65 20 6d 75 74 65 78 20 73 75 62 73  * The mutex subs
1740: 79 73 74 65 6d 20 6d 75 73 74 20 74 61 6b 65 20  ystem must take 
1750: 63 61 72 65 20 6f 66 20 73 65 72 69 61 6c 69 7a  care of serializ
1760: 69 6e 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a  ing its own.  **
1770: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e   initialization.
1780: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
1790: 69 74 65 33 4d 75 74 65 78 49 6e 69 74 28 29 3b  ite3MutexInit();
17a0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
17b0: 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69  rn rc;..  /* Ini
17c0: 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c  tialize the mall
17d0: 6f 63 28 29 20 73 79 73 74 65 6d 20 61 6e 64 20  oc() system and 
17e0: 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70 49  the recursive pI
17f0: 6e 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a  nitMutex mutex..
1800: 20 20 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74    ** This operat
1810: 69 6f 6e 20 69 73 20 70 72 6f 74 65 63 74 65 64  ion is protected
1820: 20 62 79 20 74 68 65 20 53 54 41 54 49 43 5f 4d   by the STATIC_M
1830: 41 53 54 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f  ASTER mutex.  No
1840: 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74  te that.  ** Mut
1850: 65 78 41 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c  exAlloc() is cal
1860: 6c 65 64 20 66 6f 72 20 61 20 73 74 61 74 69 63  led for a static
1870: 20 6d 75 74 65 78 20 70 72 69 6f 72 20 74 6f 20   mutex prior to 
1880: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
1890: 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62  .  ** malloc sub
18a0: 73 79 73 74 65 6d 20 2d 20 74 68 69 73 20 69 6d  system - this im
18b0: 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 61  plies that the a
18c0: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 73  llocation of a s
18d0: 74 61 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78  tatic.  ** mutex
18e0: 20 6d 75 73 74 20 6e 6f 74 20 72 65 71 75 69 72   must not requir
18f0: 65 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20 74  e support from t
1900: 68 65 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  he malloc subsys
1910: 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45  tem..  */.  MUTE
1920: 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72  X_LOGIC( pMaster
1930: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
1940: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1950: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
1960: 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ; ).  sqlite3_mu
1970: 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
1980: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f  r);.  sqlite3Glo
1990: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
19a0: 78 49 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28  xInit = 1;.  if(
19b0: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
19c0: 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e  onfig.isMallocIn
19d0: 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  it ){.    rc = s
19e0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74  qlite3MallocInit
19f0: 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ();.  }.  if( rc
1a00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a10: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1a20: 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49  Config.isMallocI
1a30: 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  nit = 1;.    if(
1a40: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
1a50: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1a60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1a70: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
1a80: 6e 69 74 4d 75 74 65 78 20 3d 0a 20 20 20 20 20  nitMutex =.     
1a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74        sqlite3Mut
1aa0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
1ab0: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b  UTEX_RECURSIVE);
1ac0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1ad0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
1ae0: 43 6f 72 65 4d 75 74 65 78 20 26 26 20 21 73 71  CoreMutex && !sq
1af0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1b00: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a  g.pInitMutex ){.
1b10: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1b20: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1b30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b40: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1b50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
1b60: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1b70: 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b  .nRefInitMutex++
1b80: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1b90: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
1ba0: 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72  ter);..  /* If r
1bb0: 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  c is not SQLITE_
1bc0: 4f 4b 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  OK at this point
1bd0: 2c 20 74 68 65 6e 20 65 69 74 68 65 72 20 74 68  , then either th
1be0: 65 20 6d 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75  e malloc.  ** su
1bf0: 62 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f  bsystem could no
1c00: 74 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  t be initialized
1c10: 20 6f 72 20 74 68 65 20 73 79 73 74 65 6d 20 66   or the system f
1c20: 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74  ailed to allocat
1c30: 65 0a 20 20 2a 2a 20 74 68 65 20 70 49 6e 69 74  e.  ** the pInit
1c40: 4d 75 74 65 78 20 6d 75 74 65 78 2e 20 52 65 74  Mutex mutex. Ret
1c50: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  urn an error in 
1c60: 65 69 74 68 65 72 20 63 61 73 65 2e 20 20 2a 2f  either case.  */
1c70: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1c80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1c90: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
1ca0: 20 44 6f 20 74 68 65 20 72 65 73 74 20 6f 66 20   Do the rest of 
1cb0: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
1cc0: 6f 6e 20 75 6e 64 65 72 20 74 68 65 20 72 65 63  on under the rec
1cd0: 75 72 73 69 76 65 20 6d 75 74 65 78 20 73 6f 0a  ursive mutex so.
1ce0: 20 20 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c    ** that we wil
1cf0: 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 68 61 6e  l be able to han
1d00: 64 6c 65 20 72 65 63 75 72 73 69 76 65 20 63 61  dle recursive ca
1d10: 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71  lls into.  ** sq
1d20: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1d30: 28 29 2e 20 20 54 68 65 20 72 65 63 75 72 73 69  ().  The recursi
1d40: 76 65 20 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c  ve calls normall
1d50: 79 20 63 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20  y come through. 
1d60: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69   ** sqlite3_os_i
1d70: 6e 69 74 28 29 20 77 68 65 6e 20 69 74 20 69 6e  nit() when it in
1d80: 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 76 66  vokes sqlite3_vf
1d90: 73 5f 72 65 67 69 73 74 65 72 28 29 2c 20 62 75  s_register(), bu
1da0: 74 20 6f 74 68 65 72 0a 20 20 2a 2a 20 72 65 63  t other.  ** rec
1db0: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6d 69 67  ursive calls mig
1dc0: 68 74 20 61 6c 73 6f 20 62 65 20 70 6f 73 73 69  ht also be possi
1dd0: 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
1de0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
1df0: 3a 20 52 2d 30 30 31 34 30 2d 33 37 34 34 35 20  : R-00140-37445 
1e00: 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69 63  SQLite automatic
1e10: 61 6c 6c 79 20 73 65 72 69 61 6c 69 7a 65 73 20  ally serializes 
1e20: 63 61 6c 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68  calls.  ** to th
1e30: 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20  e xInit method, 
1e40: 73 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65 74  so the xInit met
1e50: 68 6f 64 20 6e 65 65 64 20 6e 6f 74 20 62 65 20  hod need not be 
1e60: 74 68 72 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a  threadsafe..  **
1e70: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
1e80: 69 6e 67 20 6d 75 74 65 78 20 69 73 20 77 68 61  ing mutex is wha
1e90: 74 20 73 65 72 69 61 6c 69 7a 65 73 20 61 63 63  t serializes acc
1ea0: 65 73 73 20 74 6f 20 74 68 65 20 61 70 70 64 65  ess to the appde
1eb0: 66 20 70 63 61 63 68 65 20 78 49 6e 69 74 0a 20  f pcache xInit. 
1ec0: 20 2a 2a 20 6d 65 74 68 6f 64 73 2e 20 20 54 68   ** methods.  Th
1ed0: 65 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  e sqlite3_pcache
1ee0: 5f 6d 65 74 68 6f 64 73 2e 78 49 6e 69 74 28 29  _methods.xInit()
1ef0: 20 61 6c 6c 20 69 73 20 65 6d 62 65 64 64 65 64   all is embedded
1f00: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c   in the.  ** cal
1f10: 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63  l to sqlite3Pcac
1f20: 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a  heInitialize()..
1f30: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
1f40: 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
1f50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1f60: 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 69 66  InitMutex);.  if
1f70: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1f80: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20  onfig.isInit==0 
1f90: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
1fa0: 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73  Config.inProgres
1fb0: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  s==0 ){.    sqli
1fc0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1fd0: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a  inProgress = 1;.
1fe0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1ff0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20  ABLE_SQLLOG.    
2000: 7b 0a 20 20 20 20 20 20 65 78 74 65 72 6e 20 76  {.      extern v
2010: 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  oid sqlite3_init
2020: 5f 73 71 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20  _sqllog(void);. 
2030: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 69       sqlite3_ini
2040: 74 5f 73 71 6c 6c 6f 67 28 29 3b 0a 20 20 20 20  t_sqllog();.    
2050: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d  }.#endif.    mem
2060: 73 65 74 28 26 73 71 6c 69 74 65 33 42 75 69 6c  set(&sqlite3Buil
2070: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 2c 20 30 2c  tinFunctions, 0,
2080: 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 42   sizeof(sqlite3B
2090: 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 29  uiltinFunctions)
20a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
20b0: 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e  gisterBuiltinFun
20c0: 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66  ctions();.    if
20d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
20e0: 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e  onfig.isPCacheIn
20f0: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
2100: 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
2110: 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  eInitialize();. 
2120: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2130: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2140: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2150: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
2160: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Init = 1;.      
2170: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e  rc = sqlite3OsIn
2180: 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  it();.    }.    
2190: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21a0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
21b0: 65 33 50 43 61 63 68 65 42 75 66 66 65 72 53 65  e3PCacheBufferSe
21c0: 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  tup( sqlite3Glob
21d0: 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20  alConfig.pPage, 
21e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
21f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
2200: 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47 6c  zPage, sqlite3Gl
2210: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65  obalConfig.nPage
2220: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2230: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2240: 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  nit = 1;.#ifdef 
2250: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2260: 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78 74 72  T.      bRunExtr
2270: 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e 64 69  aInit = 1;.#endi
2280: 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  f.    }.    sqli
2290: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
22a0: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  inProgress = 0;.
22b0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
22c0: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
22d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
22e0: 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  nitMutex);..  /*
22f0: 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72 20 74   Go back under t
2300: 68 65 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  he static mutex 
2310: 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74 68 65  and clean up the
2320: 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a 2a 20   recursive.  ** 
2330: 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65 6e 74  mutex to prevent
2340: 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65 61 6b   a resource leak
2350: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
2360: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
2370: 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ster);.  sqlite3
2380: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65  GlobalConfig.nRe
2390: 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20  fInitMutex--;.  
23a0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
23b0: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
23c0: 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20  Mutex<=0 ){.    
23d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 47  assert( sqlite3G
23e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
23f0: 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a  InitMutex==0 );.
2400: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
2410: 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33 47 6c  x_free(sqlite3Gl
2420: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
2430: 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Mutex);.    sqli
2440: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2450: 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a  pInitMutex = 0;.
2460: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
2470: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
2480: 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  r);..  /* The fo
2490: 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73 74 20  llowing is just 
24a0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 74  a sanity check t
24b0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69  o make sure SQLi
24c0: 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e  te has.  ** been
24d0: 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72 65 63   compiled correc
24e0: 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d 70 6f  tly.  It is impo
24f0: 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 69  rtant to run thi
2500: 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a  s code, but.  **
2510: 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
2520: 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74  o run it too oft
2530: 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70 20 43  en and soak up C
2540: 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f  PU cycles for no
2550: 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53  .  ** reason.  S
2560: 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e 63 65  o we run it once
2570: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
2580: 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  zation..  */.#if
2590: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69 66 6e  ndef NDEBUG.#ifn
25a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25b0: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
25c0: 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   /* This section
25d0: 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20   of code's only 
25e0: 22 6f 75 74 70 75 74 22 20 69 73 20 76 69 61 20  "output" is via 
25f0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
2600: 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72  nts. */.  if ( r
2610: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2620: 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 75      u64 x = (((u
2630: 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20  64)1)<<63)-1;.  
2640: 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20    double y;.    
2650: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
2660: 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ==8);.    assert
2670: 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65  (sizeof(x)==size
2680: 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63  of(y));.    memc
2690: 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20  py(&y, &x, 8);. 
26a0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
26b0: 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20  e3IsNaN(y) );.  
26c0: 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  }.#endif.#endif.
26d0: 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 69  .  /* Do extra i
26e0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 74  nitialization st
26f0: 65 70 73 20 72 65 71 75 65 73 74 65 64 20 62 79  eps requested by
2700: 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58 54 52   the SQLITE_EXTR
2710: 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d 70  A_INIT.  ** comp
2720: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e  ile-time option.
2730: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
2740: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20  ITE_EXTRA_INIT. 
2750: 20 69 66 28 20 62 52 75 6e 45 78 74 72 61 49 6e   if( bRunExtraIn
2760: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 53 51  it ){.    int SQ
2770: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28  LITE_EXTRA_INIT(
2780: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20  const char*);.  
2790: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 58    rc = SQLITE_EX
27a0: 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20 20 7d  TRA_INIT(0);.  }
27b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
27c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
27d0: 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74 73 20  ndo the effects 
27e0: 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  of sqlite3_initi
27f0: 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e  alize().  Must n
2800: 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69  ot be called whi
2810: 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  le.** there are 
2820: 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61 74 61  outstanding data
2830: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
2840: 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   or memory alloc
2850: 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69  ations or.** whi
2860: 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66 20 53  le any part of S
2870: 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72 77 69  QLite is otherwi
2880: 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61 6e 79  se in use in any
2890: 20 74 68 72 65 61 64 2e 20 20 54 68 69 73 0a 2a   thread.  This.*
28a0: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  * routine is not
28b0: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 42 75   threadsafe.  Bu
28c0: 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
28d0: 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
28e0: 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20 53  ine.** on when S
28f0: 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64 79  QLite is already
2900: 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49 66 20   shut down.  If 
2910: 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64  SQLite is alread
2920: 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a 20 77  y shut down.** w
2930: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2940: 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65   is invoked, the
2950: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
2960: 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
2970: 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
2980: 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f 69 64  e3_shutdown(void
2990: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
29a0: 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e 74 20  _OMIT_WSD.  int 
29b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64  rc = sqlite3_wsd
29c0: 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b  _init(4096, 24);
29d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
29e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
29f0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
2a00: 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  f..  if( sqlite3
2a10: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2a20: 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51  nit ){.#ifdef SQ
2a30: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
2a40: 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53 51 4c  OWN.    void SQL
2a50: 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f  ITE_EXTRA_SHUTDO
2a60: 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20 53 51  WN(void);.    SQ
2a70: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
2a80: 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  OWN();.#endif.  
2a90: 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64    sqlite3_os_end
2aa0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
2ab0: 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e  reset_auto_exten
2ac0: 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69  sion();.    sqli
2ad0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2ae0: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
2af0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2b00: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
2b10: 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  heInit ){.    sq
2b20: 6c 69 74 65 33 50 63 61 63 68 65 53 68 75 74 64  lite3PcacheShutd
2b30: 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  own();.    sqlit
2b40: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2b50: 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 30 3b  sPCacheInit = 0;
2b60: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2b70: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2b80: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
2b90: 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63     sqlite3Malloc
2ba0: 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  End();.    sqlit
2bb0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2bc0: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b  sMallocInit = 0;
2bd0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2be0: 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e 5f 44  _OMIT_SHUTDOWN_D
2bf0: 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20 20 2f  IRECTORIES.    /
2c00: 2a 20 54 68 65 20 68 65 61 70 20 73 75 62 73 79  * The heap subsy
2c10: 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62 65 65  stem has now bee
2c20: 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64 20 74  n shutdown and t
2c30: 68 65 73 65 20 76 61 6c 75 65 73 20 61 72 65 20  hese values are 
2c40: 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a 2a 20  supposed.    ** 
2c50: 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20 70 6f  to be NULL or po
2c60: 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20 74 68  int to memory th
2c70: 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  at was obtained 
2c80: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
2c90: 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20 77 68  loc(),.    ** wh
2ca0: 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79 20 6f  ich would rely o
2cb0: 6e 20 74 68 61 74 20 68 65 61 70 20 73 75 62 73  n that heap subs
2cc0: 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f 72 65  ystem; therefore
2cd0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 73  , make sure thes
2ce0: 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
2cf0: 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74 6f 20  cannot refer to 
2d00: 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68 61 74  heap memory that
2d10: 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61 6c 69   was just invali
2d20: 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 0a 20  dated when the. 
2d30: 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62 73 79     ** heap subsy
2d40: 73 74 65 6d 20 77 61 73 20 73 68 75 74 64 6f 77  stem was shutdow
2d50: 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  n.  This is only
2d60: 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72   done if the cur
2d70: 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  rent call to.   
2d80: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
2d90: 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20 74 68  n resulted in th
2da0: 65 20 68 65 61 70 20 73 75 62 73 79 73 74 65 6d  e heap subsystem
2db0: 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
2dc0: 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20 2a 2f  shutdown..    */
2dd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74  .    sqlite3_dat
2de0: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
2df0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d  .    sqlite3_tem
2e00: 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  p_directory = 0;
2e10: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
2e20: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2e30: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2e40: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2e50: 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20 20 20  MutexEnd();.    
2e60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2e70: 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20  fig.isMutexInit 
2e80: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
2e90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2ea0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50 49 20  ./*.** This API 
2eb0: 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61 74 69  allows applicati
2ec0: 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ons to modify th
2ed0: 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75  e global configu
2ee0: 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65  ration of.** the
2ef0: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
2f00: 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a  at run-time..**.
2f10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2f20: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2f30: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
2f40: 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
2f50: 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
2f60: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d  connections or m
2f70: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2f80: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
2f90: 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61   is not.** threa
2fa0: 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72 65 20  dsafe.  Failure 
2fb0: 74 6f 20 68 65 65 64 20 74 68 65 73 65 20 77 61  to heed these wa
2fc0: 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61 64 20  rnings can lead 
2fd0: 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62 6c 65  to unpredictable
2fe0: 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  .** behavior..*/
2ff0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e  .int sqlite3_con
3000: 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  fig(int op, ...)
3010: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
3020: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
3030: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  E_OK;..  /* sqli
3040: 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73 68 61  te3_config() sha
3050: 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ll return SQLITE
3060: 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20 69 73  _MISUSE if it is
3070: 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65 0a 20   invoked while. 
3080: 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c   ** the SQLite l
3090: 69 62 72 61 72 79 20 69 73 20 69 6e 20 75 73 65  ibrary is in use
30a0: 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  . */.  if( sqlit
30b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
30c0: 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53  sInit ) return S
30d0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
30e0: 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61  T;..  va_start(a
30f0: 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
3100: 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  ( op ){..    /* 
3110: 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72 61 74  Mutex configurat
3120: 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72 65 20  ion options are 
3130: 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69  only available i
3140: 6e 20 61 20 74 68 72 65 61 64 73 61 66 65 0a 20  n a threadsafe. 
3150: 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e 0a 20     ** compile.. 
3160: 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65     */.#if define
3170: 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  d(SQLITE_THREADS
3180: 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  AFE) && SQLITE_T
3190: 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f 2a 20  HREADSAFE>0  /* 
31a0: 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34 36 37  IMP: R-54466-467
31b0: 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  56 */.    case S
31c0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e  QLITE_CONFIG_SIN
31d0: 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20 20 20  GLETHREAD: {.   
31e0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
31f0: 46 3a 20 52 2d 30 32 37 34 38 2d 31 39 30 39 36  F: R-02748-19096
3200: 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73 65 74   This option set
3210: 73 20 74 68 65 20 74 68 72 65 61 64 69 6e 67 20  s the threading 
3220: 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  mode to.      **
3230: 20 53 69 6e 67 6c 65 2d 74 68 72 65 61 64 2e 20   Single-thread. 
3240: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3250: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
3260: 72 65 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a  reMutex = 0;  /*
3270: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20 6f   Disable mutex o
3280: 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20  n core */.      
3290: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
32a0: 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d  fig.bFullMutex =
32b0: 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 20   0;  /* Disable 
32c0: 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74  mutex on connect
32d0: 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  ions */.      br
32e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
32f0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
3300: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 29  LITE_THREADSAFE)
3310: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
3320: 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20  DSAFE>0 /* IMP: 
3330: 52 2d 32 30 35 32 30 2d 35 34 30 38 36 20 2a 2f  R-20520-54086 */
3340: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3350: 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52  _CONFIG_MULTITHR
3360: 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  EAD: {.      /* 
3370: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
3380: 34 33 37 34 2d 34 32 34 36 38 20 54 68 69 73 20  4374-42468 This 
3390: 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  option sets the 
33a0: 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74  threading mode t
33b0: 6f 0a 20 20 20 20 20 20 2a 2a 20 4d 75 6c 74 69  o.      ** Multi
33c0: 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20  -thread. */.    
33d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
33e0: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
33f0: 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65   = 1;  /* Enable
3400: 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a   mutex on core *
3410: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3420: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
3430: 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a 20  lMutex = 0;  /* 
3440: 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e  Disable mutex on
3450: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
3460: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3470: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
3480: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52  fined(SQLITE_THR
3490: 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49  EADSAFE) && SQLI
34a0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20  TE_THREADSAFE>0 
34b0: 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39 33 2d  /* IMP: R-59593-
34c0: 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63 61 73  21810 */.    cas
34d0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
34e0: 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20  SERIALIZED: {.  
34f0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
3500: 4f 46 3a 20 52 2d 34 31 32 32 30 2d 35 31 38 30  OF: R-41220-5180
3510: 30 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73 65  0 This option se
3520: 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e 67  ts the threading
3530: 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20 2a   mode to.      *
3540: 2a 20 53 65 72 69 61 6c 69 7a 65 64 2e 20 2a 2f  * Serialized. */
3550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3560: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
3570: 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45  Mutex = 1;  /* E
3580: 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63  nable mutex on c
3590: 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ore */.      sql
35a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
35b0: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b  .bFullMutex = 1;
35c0: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65    /* Enable mute
35d0: 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  x on connections
35e0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
35f0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
3600: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3610: 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20  _THREADSAFE) && 
3620: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3630: 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 33  E>0 /* IMP: R-63
3640: 36 36 36 2d 34 38 37 35 35 20 2a 2f 0a 20 20 20  666-48755 */.   
3650: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3660: 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20 20  FIG_MUTEX: {.   
3670: 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e     /* Specify an
3680: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 75 74   alternative mut
3690: 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ex implementatio
36a0: 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  n */.      sqlit
36b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
36c0: 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67 28 61  utex = *va_arg(a
36d0: 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  p, sqlite3_mutex
36e0: 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20  _methods*);.    
36f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
3700: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
3710: 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  d(SQLITE_THREADS
3720: 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  AFE) && SQLITE_T
3730: 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49  HREADSAFE>0 /* I
3740: 4d 50 3a 20 52 2d 31 34 34 35 30 2d 33 37 35 39  MP: R-14450-3759
3750: 37 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51  7 */.    case SQ
3760: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d  LITE_CONFIG_GETM
3770: 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  UTEX: {.      /*
3780: 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75   Retrieve the cu
3790: 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c  rrent mutex impl
37a0: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
37b0: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
37c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65  sqlite3_mutex_me
37d0: 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65  thods*) = sqlite
37e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75  3GlobalConfig.mu
37f0: 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  tex;.      break
3800: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
3810: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3820: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b  CONFIG_MALLOC: {
3830: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
3840: 43 45 2d 4f 46 3a 20 52 2d 35 35 35 39 34 2d 32  CE-OF: R-55594-2
3850: 31 30 33 30 20 54 68 65 20 53 51 4c 49 54 45 5f  1030 The SQLITE_
3860: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20 6f 70  CONFIG_MALLOC op
3870: 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20  tion takes a.   
3880: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
3890: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61  ument which is a
38a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
38b0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 20  nstance of the. 
38c0: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
38d0: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75  mem_methods stru
38e0: 63 74 75 72 65 2e 20 54 68 65 20 61 72 67 75 6d  cture. The argum
38f0: 65 6e 74 20 73 70 65 63 69 66 69 65 73 20 61 6c  ent specifies al
3900: 74 65 72 6e 61 74 69 76 65 0a 20 20 20 20 20 20  ternative.      
3910: 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d  ** low-level mem
3920: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72  ory allocation r
3930: 6f 75 74 69 6e 65 73 20 74 6f 20 62 65 20 75 73  outines to be us
3940: 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ed in place of t
3950: 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20 20 20  he memory.      
3960: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f  ** allocation ro
3970: 75 74 69 6e 65 73 20 62 75 69 6c 74 20 69 6e 74  utines built int
3980: 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a 20 20 20  o SQLite. */.   
3990: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
39a0: 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61  Config.m = *va_a
39b0: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d  rg(ap, sqlite3_m
39c0: 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20  em_methods*);.  
39d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
39e0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
39f0: 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f  _CONFIG_GETMALLO
3a00: 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  C: {.      /* EV
3a10: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 32  IDENCE-OF: R-512
3a20: 31 33 2d 34 36 34 31 34 20 54 68 65 20 53 51 4c  13-46414 The SQL
3a30: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41  ITE_CONFIG_GETMA
3a40: 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61 6b 65  LLOC option take
3a50: 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e  s a.      ** sin
3a60: 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69  gle argument whi
3a70: 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ch is a pointer 
3a80: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
3a90: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  f the.      ** s
3aa0: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
3ab0: 64 73 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  ds structure. Th
3ac0: 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  e sqlite3_mem_me
3ad0: 74 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 20  thods structure 
3ae0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c  is.      ** fill
3af0: 65 64 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ed with the curr
3b00: 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 6d 65  ently defined me
3b10: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3b20: 72 6f 75 74 69 6e 65 73 2e 20 2a 2f 0a 20 20 20  routines. */.   
3b30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
3b40: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61  obalConfig.m.xMa
3b50: 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65  lloc==0 ) sqlite
3b60: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29  3MemSetDefault()
3b70: 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28  ;.      *va_arg(
3b80: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  ap, sqlite3_mem_
3b90: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
3ba0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3bb0: 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  m;.      break;.
3bc0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
3bd0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d  QLITE_CONFIG_MEM
3be0: 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20  STATUS: {.      
3bf0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
3c00: 52 2d 36 31 32 37 35 2d 33 35 31 35 37 20 54 68  R-61275-35157 Th
3c10: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3c20: 4d 45 4d 53 54 41 54 55 53 20 6f 70 74 69 6f 6e  MEMSTATUS option
3c30: 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a 2a 20   takes.      ** 
3c40: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
3c50: 6f 66 20 74 79 70 65 20 69 6e 74 2c 20 69 6e 74  of type int, int
3c60: 65 72 70 72 65 74 65 64 20 61 73 20 61 20 62 6f  erpreted as a bo
3c70: 6f 6c 65 61 6e 2c 20 77 68 69 63 68 20 65 6e 61  olean, which ena
3c80: 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 72  bles.      ** or
3c90: 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f   disables the co
3ca0: 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 6d 65 6d 6f  llection of memo
3cb0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 74  ry allocation st
3cc0: 61 74 69 73 74 69 63 73 2e 20 2a 2f 0a 20 20 20  atistics. */.   
3cd0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3ce0: 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20  Config.bMemstat 
3cf0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3d00: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3d10: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
3d20: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52  QLITE_CONFIG_SCR
3d30: 41 54 43 48 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ATCH: {.      /*
3d40: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
3d50: 30 38 34 30 34 2d 36 30 38 38 37 20 54 68 65 72  08404-60887 Ther
3d60: 65 20 61 72 65 20 74 68 72 65 65 20 61 72 67 75  e are three argu
3d70: 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a  ments to.      *
3d80: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  * SQLITE_CONFIG_
3d90: 53 43 52 41 54 43 48 3a 20 41 20 70 6f 69 6e 74  SCRATCH: A point
3da0: 65 72 20 61 6e 20 38 2d 62 79 74 65 20 61 6c 69  er an 8-byte ali
3db0: 67 6e 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66  gned memory buff
3dc0: 65 72 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  er from.      **
3dd0: 20 77 68 69 63 68 20 74 68 65 20 73 63 72 61 74   which the scrat
3de0: 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 77  ch allocations w
3df0: 69 6c 6c 20 62 65 20 64 72 61 77 6e 2c 20 74 68  ill be drawn, th
3e00: 65 20 73 69 7a 65 20 6f 66 20 65 61 63 68 20 73  e size of each s
3e10: 63 72 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20  cratch.      ** 
3e20: 61 6c 6c 6f 63 61 74 69 6f 6e 20 28 73 7a 29 2c  allocation (sz),
3e30: 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d   and the maximum
3e40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 63 72 61 74   number of scrat
3e50: 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 28  ch allocations (
3e60: 4e 29 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  N). */.      sql
3e70: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3e80: 2e 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61  .pScratch = va_a
3e90: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20  rg(ap, void*);. 
3ea0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3eb0: 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74  alConfig.szScrat
3ec0: 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ch = va_arg(ap, 
3ed0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
3ee0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3ef0: 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72  nScratch = va_ar
3f00: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3f10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3f20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3f30: 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a  ONFIG_PAGECACHE:
3f40: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3f50: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 37 36 31  ENCE-OF: R-18761
3f60: 2d 33 36 36 30 31 20 54 68 65 72 65 20 61 72 65  -36601 There are
3f70: 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73   three arguments
3f80: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   to.      ** SQL
3f90: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43  ITE_CONFIG_PAGEC
3fa0: 41 43 48 45 3a 20 41 20 70 6f 69 6e 74 65 72 20  ACHE: A pointer 
3fb0: 74 6f 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  to 8-byte aligne
3fc0: 64 20 6d 65 6d 6f 72 79 20 28 70 4d 65 6d 29 2c  d memory (pMem),
3fd0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69  .      ** the si
3fe0: 7a 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  ze of each page 
3ff0: 63 61 63 68 65 20 6c 69 6e 65 20 28 73 7a 29 2c  cache line (sz),
4000: 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
4010: 6f 66 20 63 61 63 68 65 20 6c 69 6e 65 73 0a 20  of cache lines. 
4020: 20 20 20 20 20 2a 2a 20 28 4e 29 2e 20 2a 2f 0a       ** (N). */.
4030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4040: 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 20  balConfig.pPage 
4050: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
4060: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
4070: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
4080: 7a 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  zPage = va_arg(a
4090: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  p, int);.      s
40a0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
40b0: 69 67 2e 6e 50 61 67 65 20 3d 20 76 61 5f 61 72  ig.nPage = va_ar
40c0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
40d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
40e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
40f0: 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f 48 44 52  ONFIG_PCACHE_HDR
4100: 53 5a 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  SZ: {.      /* E
4110: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39  VIDENCE-OF: R-39
4120: 31 30 30 2d 32 37 33 31 37 20 54 68 65 20 53 51  100-27317 The SQ
4130: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43  LITE_CONFIG_PCAC
4140: 48 45 5f 48 44 52 53 5a 20 6f 70 74 69 6f 6e 20  HE_HDRSZ option 
4150: 74 61 6b 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  takes.      ** a
4160: 20 73 69 6e 67 6c 65 20 70 61 72 61 6d 65 74 65   single paramete
4170: 72 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69  r which is a poi
4180: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67  nter to an integ
4190: 65 72 20 61 6e 64 20 77 72 69 74 65 73 20 69 6e  er and writes in
41a0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  to.      ** that
41b0: 20 69 6e 74 65 67 65 72 20 74 68 65 20 6e 75 6d   integer the num
41c0: 62 65 72 20 6f 66 20 65 78 74 72 61 20 62 79 74  ber of extra byt
41d0: 65 73 20 70 65 72 20 70 61 67 65 20 72 65 71 75  es per page requ
41e0: 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 70 61  ired for each pa
41f0: 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 53  ge.      ** in S
4200: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47  QLITE_CONFIG_PAG
4210: 45 43 41 43 48 45 2e 20 2a 2f 0a 20 20 20 20 20  ECACHE. */.     
4220: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74   *va_arg(ap, int
4230: 2a 29 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  *) = .          
4240: 73 71 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a  sqlite3HeaderSiz
4250: 65 42 74 72 65 65 28 29 20 2b 0a 20 20 20 20 20  eBtree() +.     
4260: 20 20 20 20 20 73 71 6c 69 74 65 33 48 65 61 64       sqlite3Head
4270: 65 72 53 69 7a 65 50 63 61 63 68 65 28 29 20 2b  erSizePcache() +
4280: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4290: 65 33 48 65 61 64 65 72 53 69 7a 65 50 63 61 63  e3HeaderSizePcac
42a0: 68 65 31 28 29 3b 0a 20 20 20 20 20 20 62 72 65  he1();.      bre
42b0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
42c0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
42d0: 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  G_PCACHE: {.    
42e0: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
42f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4300: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4310: 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48  _CONFIG_GETPCACH
4320: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  E: {.      /* no
4330: 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  w an error */.  
4340: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4350: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
4360: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
4370: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
4380: 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20  G_PCACHE2: {.   
4390: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
43a0: 46 3a 20 52 2d 36 33 33 32 35 2d 34 38 33 37 38  F: R-63325-48378
43b0: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
43c0: 49 47 5f 50 43 41 43 48 45 32 20 6f 70 74 69 6f  IG_PCACHE2 optio
43d0: 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20  n takes a.      
43e0: 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65  ** single argume
43f0: 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70 6f  nt which is a po
4400: 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
4410: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
4420: 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a  ds2.      ** obj
4430: 65 63 74 2e 20 54 68 69 73 20 6f 62 6a 65 63 74  ect. This object
4440: 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 69   specifies the i
4450: 6e 74 65 72 66 61 63 65 20 74 6f 20 61 20 63 75  nterface to a cu
4460: 73 74 6f 6d 20 70 61 67 65 20 63 61 63 68 65 0a  stom page cache.
4470: 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
4480: 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ntation. */.    
4490: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
44a0: 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 20 3d 20  onfig.pcache2 = 
44b0: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
44c0: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
44d0: 64 73 32 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ds2*);.      bre
44e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
44f0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
4500: 5f 47 45 54 50 43 41 43 48 45 32 3a 20 7b 0a 20  _GETPCACHE2: {. 
4510: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
4520: 2d 4f 46 3a 20 52 2d 32 32 30 33 35 2d 34 36 31  -OF: R-22035-461
4530: 38 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  82 The SQLITE_CO
4540: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 32 20  NFIG_GETPCACHE2 
4550: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20  option takes a. 
4560: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61       ** single a
4570: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
4580: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
4590: 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
45a0: 6d 65 74 68 6f 64 73 32 0a 20 20 20 20 20 20 2a  methods2.      *
45b0: 2a 20 6f 62 6a 65 63 74 2e 20 53 51 4c 69 74 65  * object. SQLite
45c0: 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 63   copies of the c
45d0: 75 72 72 65 6e 74 20 70 61 67 65 20 63 61 63 68  urrent page cach
45e0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
45f0: 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74   into.      ** t
4600: 68 61 74 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  hat object. */. 
4610: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
4620: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61  GlobalConfig.pca
4630: 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b  che2.xInit==0 ){
4640: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4650: 50 43 61 63 68 65 53 65 74 44 65 66 61 75 6c 74  PCacheSetDefault
4660: 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
4670: 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71    *va_arg(ap, sq
4680: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
4690: 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c 69 74 65  hods2*) = sqlite
46a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63  3GlobalConfig.pc
46b0: 61 63 68 65 32 3b 0a 20 20 20 20 20 20 62 72 65  ache2;.      bre
46c0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 2f 2a 20 45 56  ak;.    }../* EV
46d0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 36  IDENCE-OF: R-066
46e0: 32 36 2d 31 32 39 31 31 20 54 68 65 20 53 51 4c  26-12911 The SQL
46f0: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 20  ITE_CONFIG_HEAP 
4700: 6f 70 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a  option is only.*
4710: 2a 20 61 76 61 69 6c 61 62 6c 65 20 69 66 20 53  * available if S
4720: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
4730: 64 20 77 69 74 68 20 65 69 74 68 65 72 20 53 51  d with either SQ
4740: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
4750: 59 53 33 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45  YS3 or.** SQLITE
4760: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20  _ENABLE_MEMSYS5 
4770: 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49  and returns SQLI
4780: 54 45 5f 45 52 52 4f 52 20 69 66 20 69 6e 76 6f  TE_ERROR if invo
4790: 6b 65 64 20 6f 74 68 65 72 77 69 73 65 2e 20 2a  ked otherwise. *
47a0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
47b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
47c0: 59 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  YS3) || defined(
47d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
47e0: 4d 53 59 53 35 29 0a 20 20 20 20 63 61 73 65 20  MSYS5).    case 
47f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45  SQLITE_CONFIG_HE
4800: 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  AP: {.      /* E
4810: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39  VIDENCE-OF: R-19
4820: 38 35 34 2d 34 32 31 32 36 20 54 68 65 72 65 20  854-42126 There 
4830: 61 72 65 20 74 68 72 65 65 20 61 72 67 75 6d 65  are three argume
4840: 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  nts to.      ** 
4850: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45  SQLITE_CONFIG_HE
4860: 41 50 3a 20 41 6e 20 38 2d 62 79 74 65 20 61 6c  AP: An 8-byte al
4870: 69 67 6e 65 64 20 70 6f 69 6e 74 65 72 20 74 6f  igned pointer to
4880: 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65   the memory, the
4890: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
48a0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
48b0: 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2c 20   memory buffer, 
48c0: 61 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20  and the minimum 
48d0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e  allocation size.
48e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
48f0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4900: 66 69 67 2e 70 48 65 61 70 20 3d 20 76 61 5f 61  fig.pHeap = va_a
4910: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20  rg(ap, void*);. 
4920: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4930: 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d  alConfig.nHeap =
4940: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4950: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4960: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65  lobalConfig.mnRe
4970: 71 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  q = va_arg(ap, i
4980: 6e 74 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  nt);..      if( 
4990: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
49a0: 66 69 67 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20  fig.mnReq<1 ){. 
49b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
49c0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71  obalConfig.mnReq
49d0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
49e0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f  e if( sqlite3Glo
49f0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e  balConfig.mnReq>
4a00: 28 31 3c 3c 31 32 29 20 29 7b 0a 20 20 20 20 20  (1<<12) ){.     
4a10: 20 20 20 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65     /* cap min re
4a20: 71 75 65 73 74 20 73 69 7a 65 20 61 74 20 32 5e  quest size at 2^
4a30: 31 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  12 */.        sq
4a40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4a50: 67 2e 6d 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32  g.mnReq = (1<<12
4a60: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
4a70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
4a80: 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d  balConfig.pHeap=
4a90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
4aa0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
4ab0: 34 39 39 32 30 2d 36 30 31 38 39 20 49 66 20 74  49920-60189 If t
4ac0: 68 65 20 66 69 72 73 74 20 70 6f 69 6e 74 65 72  he first pointer
4ad0: 20 28 74 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69   (the memory poi
4ae0: 6e 74 65 72 29 0a 20 20 20 20 20 20 20 20 2a 2a  nter).        **
4af0: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53   is NULL, then S
4b00: 51 4c 69 74 65 20 72 65 76 65 72 74 73 20 74 6f  QLite reverts to
4b10: 20 75 73 69 6e 67 20 69 74 73 20 64 65 66 61 75   using its defau
4b20: 6c 74 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  lt memory alloca
4b30: 74 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  tor.        ** (
4b40: 74 68 65 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f  the system mallo
4b50: 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  c() implementati
4b60: 6f 6e 29 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79  on), undoing any
4b70: 20 70 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f   prior invocatio
4b80: 6e 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  n of.        ** 
4b90: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41  SQLITE_CONFIG_MA
4ba0: 4c 4c 4f 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a  LLOC..        **
4bb0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 65 74 74  .        ** Sett
4bc0: 69 6e 67 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ing sqlite3Globa
4bd0: 6c 43 6f 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c  lConfig.m to all
4be0: 20 7a 65 72 6f 73 20 77 69 6c 6c 20 63 61 75 73   zeros will caus
4bf0: 65 20 6d 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20  e malloc to.    
4c00: 20 20 20 20 2a 2a 20 72 65 76 65 72 74 20 74 6f      ** revert to
4c10: 20 69 74 73 20 64 65 66 61 75 6c 74 20 69 6d 70   its default imp
4c20: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e  lementation when
4c30: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
4c40: 69 7a 65 28 29 20 69 73 20 72 75 6e 0a 20 20 20  ize() is run.   
4c50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
4c60: 6d 65 6d 73 65 74 28 26 73 71 6c 69 74 65 33 47  memset(&sqlite3G
4c70: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30  lobalConfig.m, 0
4c80: 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  , sizeof(sqlite3
4c90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29  GlobalConfig.m))
4ca0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4cb0: 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
4cc0: 43 45 2d 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30  CE-OF: R-61006-0
4cd0: 38 39 31 38 20 49 66 20 74 68 65 20 6d 65 6d 6f  8918 If the memo
4ce0: 72 79 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  ry pointer is no
4cf0: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a  t NULL then the.
4d00: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 74 65 72          ** alter
4d10: 6e 61 74 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c  native memory al
4d20: 6c 6f 63 61 74 6f 72 20 69 73 20 65 6e 67 61 67  locator is engag
4d30: 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c  ed to handle all
4d40: 20 6f 66 20 53 51 4c 69 74 65 73 0a 20 20 20 20   of SQLites.    
4d50: 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c      ** memory al
4d60: 6c 6f 63 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20  location needs. 
4d70: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4d80: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a  _ENABLE_MEMSYS3.
4d90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
4da0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20  lobalConfig.m = 
4db0: 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65  *sqlite3MemGetMe
4dc0: 6d 73 79 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a  msys3();.#endif.
4dd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4de0: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20  ABLE_MEMSYS5.   
4df0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4e00: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
4e10: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
4e20: 73 35 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  s5();.#endif.   
4e30: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
4e40: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
4e50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4e60: 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45  CONFIG_LOOKASIDE
4e70: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4e80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
4e90: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61  Lookaside = va_a
4ea0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
4eb0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4ec0: 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64  Config.nLookasid
4ed0: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
4ee0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
4ef0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20  ;.    }.    .   
4f00: 20 2f 2a 20 52 65 63 6f 72 64 20 61 20 70 6f 69   /* Record a poi
4f10: 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 6f 67 67  nter to the logg
4f20: 65 72 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  er function and 
4f30: 69 74 73 20 66 69 72 73 74 20 61 72 67 75 6d 65  its first argume
4f40: 6e 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 64  nt..    ** The d
4f50: 65 66 61 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20  efault is NULL. 
4f60: 20 4c 6f 67 67 69 6e 67 20 69 73 20 64 69 73 61   Logging is disa
4f70: 62 6c 65 64 20 69 66 20 74 68 65 20 66 75 6e 63  bled if the func
4f80: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a  tion pointer is.
4f90: 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20      ** NULL..   
4fa0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
4fb0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20  ITE_CONFIG_LOG: 
4fc0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20  {.      /* MSVC 
4fd0: 69 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70  is picky about p
4fe0: 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73  ulling func ptrs
4ff0: 20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a   from va lists..
5000: 20 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f        ** http://
5010: 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66  support.microsof
5020: 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20  t.com/kb/47961. 
5030: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47       ** sqlite3G
5040: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
5050: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
5060: 69 64 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  id(*)(void*,int,
5070: 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20  const char*));. 
5080: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79       */.      ty
5090: 70 65 64 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46  pedef void(*LOGF
50a0: 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74  UNC_t)(void*,int
50b0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20  ,const char*);. 
50c0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
50d0: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20  alConfig.xLog = 
50e0: 76 61 5f 61 72 67 28 61 70 2c 20 4c 4f 47 46 55  va_arg(ap, LOGFU
50f0: 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  NC_t);.      sql
5100: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5110: 2e 70 4c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72  .pLogArg = va_ar
5120: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
5130: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5140: 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ..    /* EVIDENC
5150: 45 2d 4f 46 3a 20 52 2d 35 35 35 34 38 2d 33 33  E-OF: R-55548-33
5160: 38 31 37 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d  817 The compile-
5170: 74 69 6d 65 20 73 65 74 74 69 6e 67 20 66 6f 72  time setting for
5180: 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20   URI filenames. 
5190: 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 63 68 61     ** can be cha
51a0: 6e 67 65 64 20 61 74 20 73 74 61 72 74 2d 74 69  nged at start-ti
51b0: 6d 65 20 75 73 69 6e 67 20 74 68 65 0a 20 20 20  me using the.   
51c0: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66   ** sqlite3_conf
51d0: 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
51e0: 5f 55 52 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a  _URI,1) or.    *
51f0: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
5200: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55  (SQLITE_CONFIG_U
5210: 52 49 2c 30 29 20 63 6f 6e 66 69 67 75 72 61 74  RI,0) configurat
5220: 69 6f 6e 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a  ion calls..    *
5230: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
5240: 45 5f 43 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a  E_CONFIG_URI: {.
5250: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
5260: 45 2d 4f 46 3a 20 52 2d 32 35 34 35 31 2d 36 31  E-OF: R-25451-61
5270: 31 32 35 20 54 68 65 20 53 51 4c 49 54 45 5f 43  125 The SQLITE_C
5280: 4f 4e 46 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e  ONFIG_URI option
5290: 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a   takes a single.
52a0: 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e        ** argumen
52b0: 74 20 6f 66 20 74 79 70 65 20 69 6e 74 2e 20 49  t of type int. I
52c0: 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  f non-zero, then
52d0: 20 55 52 49 20 68 61 6e 64 6c 69 6e 67 20 69 73   URI handling is
52e0: 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20   globally.      
52f0: 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74  ** enabled. If t
5300: 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
5310: 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52 49 20 68  zero, then URI h
5320: 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61  andling is globa
5330: 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 73  lly.      ** dis
5340: 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  abled. */.      
5350: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
5360: 66 69 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76  fig.bOpenUri = v
5370: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
5380: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5390: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
53a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52  ITE_CONFIG_COVER
53b0: 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20  ING_INDEX_SCAN: 
53c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
53d0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d  NCE-OF: R-36592-
53e0: 30 32 37 37 32 20 54 68 65 20 53 51 4c 49 54 45  02772 The SQLITE
53f0: 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47  _CONFIG_COVERING
5400: 5f 49 4e 44 45 58 5f 53 43 41 4e 0a 20 20 20 20  _INDEX_SCAN.    
5410: 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65    ** option take
5420: 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 67  s a single integ
5430: 65 72 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  er argument whic
5440: 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
5450: 20 61 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 62   as a.      ** b
5460: 6f 6f 6c 65 61 6e 20 69 6e 20 6f 72 64 65 72 20  oolean in order 
5470: 74 6f 20 65 6e 61 62 6c 65 20 6f 72 20 64 69 73  to enable or dis
5480: 61 62 6c 65 20 74 68 65 20 75 73 65 20 6f 66 20  able the use of 
5490: 63 6f 76 65 72 69 6e 67 20 69 6e 64 69 63 65 73  covering indices
54a0: 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 66 75   for.      ** fu
54b0: 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 73 20 69  ll table scans i
54c0: 6e 20 74 68 65 20 71 75 65 72 79 20 6f 70 74 69  n the query opti
54d0: 6d 69 7a 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  mizer. */.      
54e0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
54f0: 66 69 67 2e 62 55 73 65 43 69 73 20 3d 20 76 61  fig.bUseCis = va
5500: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
5510: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5520: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
5530: 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20  _ENABLE_SQLLOG. 
5540: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5550: 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a  ONFIG_SQLLOG: {.
5560: 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
5570: 69 64 28 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74  id(*SQLLOGFUNC_t
5580: 29 28 76 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33  )(void*, sqlite3
5590: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  *, const char*, 
55a0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
55b0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
55c0: 78 53 71 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67  xSqllog = va_arg
55d0: 28 61 70 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f  (ap, SQLLOGFUNC_
55e0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
55f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
5600: 71 6c 6c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72  qllogArg = va_ar
5610: 67 28 61 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20  g(ap, void *);. 
5620: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5630: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61  }.#endif..    ca
5640: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5650: 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20  _MMAP_SIZE: {.  
5660: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5670: 4f 46 3a 20 52 2d 35 38 30 36 33 2d 33 38 32 35  OF: R-58063-3825
5680: 38 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  8 SQLITE_CONFIG_
5690: 4d 4d 41 50 5f 53 49 5a 45 20 74 61 6b 65 73 20  MMAP_SIZE takes 
56a0: 74 77 6f 20 36 34 2d 62 69 74 0a 20 20 20 20 20  two 64-bit.     
56b0: 20 2a 2a 20 69 6e 74 65 67 65 72 20 28 73 71 6c   ** integer (sql
56c0: 69 74 65 33 5f 69 6e 74 36 34 29 20 76 61 6c 75  ite3_int64) valu
56d0: 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65 20  es that are the 
56e0: 64 65 66 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a  default mmap siz
56f0: 65 20 6c 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a  e limit.      **
5700: 20 28 74 68 65 20 64 65 66 61 75 6c 74 20 73 65   (the default se
5710: 74 74 69 6e 67 20 66 6f 72 20 50 52 41 47 4d 41  tting for PRAGMA
5720: 20 6d 6d 61 70 5f 73 69 7a 65 29 20 61 6e 64 20   mmap_size) and 
5730: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  the maximum allo
5740: 77 65 64 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61  wed.      ** mma
5750: 70 20 73 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f  p size limit. */
5760: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
5770: 6e 74 36 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61  nt64 szMmap = va
5780: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
5790: 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20 20 20 73  _int64);.      s
57a0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d  qlite3_int64 mxM
57b0: 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  map = va_arg(ap,
57c0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b   sqlite3_int64);
57d0: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
57e0: 43 45 2d 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34  CE-OF: R-53367-4
57f0: 33 31 39 30 20 49 66 20 65 69 74 68 65 72 20 61  3190 If either a
5800: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
5810: 6f 70 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  option is.      
5820: 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  ** negative, the
5830: 6e 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20  n that argument 
5840: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 69 74  is changed to it
5850: 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64  s compile-time d
5860: 65 66 61 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a  efault..      **
5870: 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
5880: 43 45 2d 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34  CE-OF: R-34993-4
5890: 35 30 33 31 20 54 68 65 20 6d 61 78 69 6d 75 6d  5031 The maximum
58a0: 20 61 6c 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69   allowed mmap si
58b0: 7a 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  ze will be.     
58c0: 20 2a 2a 20 73 69 6c 65 6e 74 6c 79 20 74 72 75   ** silently tru
58d0: 6e 63 61 74 65 64 20 69 66 20 6e 65 63 65 73 73  ncated if necess
58e0: 61 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 64  ary so that it d
58f0: 6f 65 73 20 6e 6f 74 20 65 78 63 65 65 64 20 74  oes not exceed t
5900: 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  he.      ** comp
5910: 69 6c 65 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile-time maximum
5920: 20 6d 6d 61 70 20 73 69 7a 65 20 73 65 74 20 62   mmap size set b
5930: 79 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 58  y the SQLITE_MAX
5940: 5f 4d 4d 41 50 5f 53 49 5a 45 0a 20 20 20 20 20  _MMAP_SIZE.     
5950: 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   ** compile-time
5960: 20 6f 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a   option..      *
5970: 2f 0a 20 20 20 20 20 20 69 66 28 20 6d 78 4d 6d  /.      if( mxMm
5980: 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53  ap<0 || mxMmap>S
5990: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
59a0: 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  IZE ){.        m
59b0: 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 4d  xMmap = SQLITE_M
59c0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20  AX_MMAP_SIZE;.  
59d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
59e0: 73 7a 4d 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61  szMmap<0 ) szMma
59f0: 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  p = SQLITE_DEFAU
5a00: 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20  LT_MMAP_SIZE;.  
5a10: 20 20 20 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d      if( szMmap>m
5a20: 78 4d 6d 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20  xMmap) szMmap = 
5a30: 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73 71  mxMmap;.      sq
5a40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5a50: 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61  g.mxMmap = mxMma
5a60: 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
5a70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d  GlobalConfig.szM
5a80: 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20  map = szMmap;.  
5a90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5aa0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
5ab0: 57 49 4e 20 26 26 20 64 65 66 69 6e 65 64 28 53  WIN && defined(S
5ac0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
5ad0: 4f 43 29 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34  OC) /* IMP: R-04
5ae0: 37 38 30 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20  780-55815 */.   
5af0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
5b00: 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53 49  FIG_WIN32_HEAPSI
5b10: 5a 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ZE: {.      /* E
5b20: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34  VIDENCE-OF: R-34
5b30: 39 32 36 2d 30 33 33 36 30 20 53 51 4c 49 54 45  926-03360 SQLITE
5b40: 5f 43 4f 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45  _CONFIG_WIN32_HE
5b50: 41 50 53 49 5a 45 20 74 61 6b 65 73 20 61 20 33  APSIZE takes a 3
5b60: 32 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 75  2-bit.      ** u
5b70: 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
5b80: 76 61 6c 75 65 20 74 68 61 74 20 73 70 65 63 69  value that speci
5b90: 66 69 65 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  fies the maximum
5ba0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 72 65   size of the cre
5bb0: 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 68 65  ated.      ** he
5bc0: 61 70 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ap. */.      sql
5bd0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5be0: 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .nHeap = va_arg(
5bf0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
5c00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
5c10: 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51  dif..    case SQ
5c20: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53  LITE_CONFIG_PMAS
5c30: 5a 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Z: {.      sqlit
5c40: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
5c50: 7a 50 6d 61 20 3d 20 76 61 5f 61 72 67 28 61 70  zPma = va_arg(ap
5c60: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b  , unsigned int);
5c70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5c80: 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74    }..    default
5c90: 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  : {.      rc = S
5ca0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
5cb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5cc0: 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29    }.  va_end(ap)
5cd0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
5ce0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74  ../*.** Set up t
5cf0: 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66  he lookaside buf
5d00: 66 65 72 73 20 66 6f 72 20 61 20 64 61 74 61 62  fers for a datab
5d10: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
5d20: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
5d30: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
5d40: 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64   .** If lookasid
5d50: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  e is already act
5d60: 69 76 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ive, return SQLI
5d70: 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54  TE_BUSY..**.** T
5d80: 68 65 20 73 7a 20 70 61 72 61 6d 65 74 65 72 20  he sz parameter 
5d90: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
5da0: 20 62 79 74 65 73 20 69 6e 20 65 61 63 68 20 6c   bytes in each l
5db0: 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a  ookaside slot..*
5dc0: 2a 20 54 68 65 20 63 6e 74 20 70 61 72 61 6d 65  * The cnt parame
5dd0: 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ter is the numbe
5de0: 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66 20  r of slots.  If 
5df0: 70 53 74 61 72 74 20 69 73 20 4e 55 4c 4c 20 74  pStart is NULL t
5e00: 68 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72 20  he.** space for 
5e10: 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  the lookaside me
5e20: 6d 6f 72 79 20 69 73 20 6f 62 74 61 69 6e 65 64  mory is obtained
5e30: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
5e40: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53  lloc()..** If pS
5e50: 74 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  tart is not NULL
5e60: 20 74 68 65 6e 20 69 74 20 69 73 20 73 7a 2a 63   then it is sz*c
5e70: 6e 74 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  nt bytes of memo
5e80: 72 79 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a  ry to use for.**
5e90: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d   the lookaside m
5ea0: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
5eb0: 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73   int setupLookas
5ec0: 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ide(sqlite3 *db,
5ed0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
5ee0: 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 23   sz, int cnt){.#
5ef0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5f00: 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20 20 76  IT_LOOKASIDE.  v
5f10: 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69  oid *pStart;.  i
5f20: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
5f30: 2e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74  .nOut ){.    ret
5f40: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
5f50: 0a 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61  .  }.  /* Free a
5f60: 6e 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b  ny existing look
5f70: 61 73 69 64 65 20 62 75 66 66 65 72 20 66 6f 72  aside buffer for
5f80: 20 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66   this handle bef
5f90: 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  ore.  ** allocat
5fa0: 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f  ing a new one so
5fb0: 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74   we don't have t
5fc0: 6f 20 68 61 76 65 20 73 70 61 63 65 20 66 6f 72  o have space for
5fd0: 20 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74   .  ** both at t
5fe0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20  he same time..  
5ff0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  */.  if( db->loo
6000: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
6010: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
6020: 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69  free(db->lookasi
6030: 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  de.pStart);.  }.
6040: 20 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66    /* The size of
6050: 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f   a lookaside slo
6060: 74 20 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57  t after ROUNDDOW
6070: 4e 38 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c  N8 needs to be l
6080: 61 72 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20  arger.  ** than 
6090: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20  a pointer to be 
60a0: 75 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73  useful..  */.  s
60b0: 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73  z = ROUNDDOWN8(s
60c0: 7a 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33  z);  /* IMP: R-3
60d0: 33 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20  3038-09382 */.  
60e0: 69 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a  if( sz<=(int)siz
60f0: 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f  eof(LookasideSlo
6100: 74 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20  t*) ) sz = 0;.  
6110: 69 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20  if( cnt<0 ) cnt 
6120: 3d 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30  = 0;.  if( sz==0
6130: 20 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20   || cnt==0 ){.  
6140: 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53    sz = 0;.    pS
6150: 74 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tart = 0;.  }els
6160: 65 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b  e if( pBuf==0 ){
6170: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
6180: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
6190: 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 73 71  .    pStart = sq
61a0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a  lite3Malloc( sz*
61b0: 63 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20  cnt );  /* IMP: 
61c0: 52 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f  R-61949-35727 */
61d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
61e0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
61f0: 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 20     if( pStart ) 
6200: 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  cnt = sqlite3Mal
6210: 6c 6f 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f  locSize(pStart)/
6220: 73 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sz;.  }else{.   
6230: 20 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a   pStart = pBuf;.
6240: 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73    }.  db->lookas
6250: 69 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74  ide.pStart = pSt
6260: 61 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  art;.  db->looka
6270: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a  side.pFree = 0;.
6280: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6290: 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20  sz = (u16)sz;.  
62a0: 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
62b0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f    int i;.    Loo
62c0: 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20  kasideSlot *p;. 
62d0: 20 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20     assert( sz > 
62e0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b  (int)sizeof(Look
62f0: 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20  asideSlot*) );. 
6300: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
6310: 65 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20  eSlot*)pStart;. 
6320: 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20     for(i=cnt-1; 
6330: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
6340: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
6350: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65  >lookaside.pFree
6360: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  ;.      db->look
6370: 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b  aside.pFree = p;
6380: 0a 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b  .      p = (Look
6390: 61 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38  asideSlot*)&((u8
63a0: 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a  *)p)[sz];.    }.
63b0: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
63c0: 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20  e.pEnd = p;.    
63d0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
63e0: 69 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  isable = 0;.    
63f0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
6400: 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d  alloced = pBuf==
6410: 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b  0 ?1:0;.  }else{
6420: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
6430: 64 65 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a  de.pStart = db;.
6440: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
6450: 65 2e 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20  e.pEnd = db;.   
6460: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
6470: 44 69 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  Disable = 1;.   
6480: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
6490: 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20  Malloced = 0;.  
64a0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
64b0: 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44  TE_OMIT_LOOKASID
64c0: 45 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51  E */.  return SQ
64d0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
64e0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 75 74  * Return the mut
64f0: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
6500: 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
6510: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c  nnection..*/.sql
6520: 69 74 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69  ite3_mutex *sqli
6530: 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c  te3_db_mutex(sql
6540: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
6550: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6560: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
6570: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
6580: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
6590: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
65a0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
65b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
65c0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  dif.  return db-
65d0: 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >mutex;.}../*.**
65e0: 20 46 72 65 65 20 75 70 20 61 73 20 6d 75 63 68   Free up as much
65f0: 20 6d 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61   memory as we ca
6600: 6e 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  n from the given
6610: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
6620: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  nection..*/.int 
6630: 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61  sqlite3_db_relea
6640: 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65  se_memory(sqlite
6650: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
6660: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
6670: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
6680: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
6690: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
66a0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
66b0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
66c0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
66d0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
66e0: 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  utex);.  sqlite3
66f0: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
6700: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6710: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
6720: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
6730: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
6740: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
6750: 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67       Pager *pPag
6760: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
6770: 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20  ePager(pBt);.   
6780: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
6790: 68 72 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20  hrink(pPager);. 
67a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
67b0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
67c0: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  db);.  sqlite3_m
67d0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
67e0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
67f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
6800: 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 69  .** Flush any di
6810: 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
6820: 20 70 61 67 65 72 2d 63 61 63 68 65 20 66 6f 72   pager-cache for
6830: 20 61 6e 79 20 61 74 74 61 63 68 65 64 20 64 61   any attached da
6840: 74 61 62 61 73 65 0a 2a 2a 20 74 6f 20 64 69 73  tabase.** to dis
6850: 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
6860: 33 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68 28  3_db_cacheflush(
6870: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
6880: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
6890: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
68a0: 6e 74 20 62 53 65 65 6e 42 75 73 79 20 3d 20 30  nt bSeenBusy = 0
68b0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
68c0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
68d0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
68e0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
68f0: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
6900: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
6910: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
6920: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
6930: 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65  mutex);.  sqlite
6940: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
6950: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  b);.  for(i=0; r
6960: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
6970: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
6980: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
6990: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
69a0: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  ;.    if( pBt &&
69b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
69c0: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
69d0: 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67       Pager *pPag
69e0: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
69f0: 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20  ePager(pBt);.   
6a00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
6a10: 61 67 65 72 46 6c 75 73 68 28 70 50 61 67 65 72  agerFlush(pPager
6a20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
6a30: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
6a40: 20 20 20 20 20 20 20 20 62 53 65 65 6e 42 75 73          bSeenBus
6a50: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  y = 1;.        r
6a60: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6a70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6a80: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
6a90: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73  eaveAll(db);.  s
6aa0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
6ab0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
6ac0: 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51   return ((rc==SQ
6ad0: 4c 49 54 45 5f 4f 4b 20 26 26 20 62 53 65 65 6e  LITE_OK && bSeen
6ae0: 42 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42  Busy) ? SQLITE_B
6af0: 55 53 59 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  USY : rc);.}../*
6b00: 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
6b10: 6e 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61  n settings for a
6b20: 6e 20 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74  n individual dat
6b30: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6b40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
6b50: 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65  db_config(sqlite
6b60: 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e  3 *db, int op, .
6b70: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
6b80: 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76  p;.  int rc;.  v
6b90: 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
6ba0: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
6bb0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6bc0: 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53  _DBCONFIG_LOOKAS
6bd0: 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69  IDE: {.      voi
6be0: 64 20 2a 70 42 75 66 20 3d 20 76 61 5f 61 72 67  d *pBuf = va_arg
6bf0: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20  (ap, void*); /* 
6c00: 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d 31 30 39  IMP: R-26835-109
6c10: 36 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  64 */.      int 
6c20: 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  sz = va_arg(ap, 
6c30: 69 6e 74 29 3b 20 20 20 20 20 20 20 2f 2a 20 49  int);       /* I
6c40: 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32 35 39 39  MP: R-47871-2599
6c50: 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63  4 */.      int c
6c60: 6e 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  nt = va_arg(ap, 
6c70: 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d  int);      /* IM
6c80: 50 3a 20 52 2d 30 34 34 36 30 2d 35 33 33 38 36  P: R-04460-53386
6c90: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
6ca0: 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62  etupLookaside(db
6cb0: 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29  , pBuf, sz, cnt)
6cc0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6cd0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
6ce0: 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  : {.      static
6cf0: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
6d00: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20          int op; 
6d10: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
6d20: 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  de */.        u3
6d30: 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61  2 mask;    /* Ma
6d40: 73 6b 20 6f 66 20 74 68 65 20 62 69 74 20 69 6e  sk of the bit in
6d50: 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 74   sqlite3.flags t
6d60: 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20  o set/clear */. 
6d70: 20 20 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d       } aFlagOp[]
6d80: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 53   = {.        { S
6d90: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
6da0: 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20 20  NABLE_FKEY,     
6db0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46 6f 72        SQLITE_For
6dc0: 65 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a 20  eignKeys    },. 
6dd0: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
6de0: 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
6df0: 54 52 49 47 47 45 52 2c 20 20 20 20 20 20 20 20  TRIGGER,        
6e00: 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69  SQLITE_EnableTri
6e10: 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 20  gger  },.       
6e20: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
6e30: 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54  IG_ENABLE_FTS3_T
6e40: 4f 4b 45 4e 49 5a 45 52 2c 20 53 51 4c 49 54 45  OKENIZER, SQLITE
6e50: 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72 20 20  _Fts3Tokenizer  
6e60: 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  },.      };.    
6e70: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
6e80: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
6e90: 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d  ITE_ERROR; /* IM
6ea0: 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33 37 32  P: R-42790-23372
6eb0: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
6ec0: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
6ed0: 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20  FlagOp); i++){. 
6ee0: 20 20 20 20 20 20 20 69 66 28 20 61 46 6c 61 67         if( aFlag
6ef0: 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a  Op[i].op==op ){.
6f00: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6e            int on
6f10: 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  off = va_arg(ap,
6f20: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20   int);.         
6f30: 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76 61 5f   int *pRes = va_
6f40: 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20  arg(ap, int*);. 
6f50: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6c 64           int old
6f60: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
6f70: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  s;.          if(
6f80: 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20   onoff>0 ){.    
6f90: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
6fa0: 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e  s |= aFlagOp[i].
6fb0: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  mask;.          
6fc0: 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d  }else if( onoff=
6fd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6fe0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
6ff0: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b  aFlagOp[i].mask;
7000: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7010: 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64 46 6c         if( oldFl
7020: 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29  ags!=db->flags )
7030: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
7040: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
7050: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
7060: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
7070: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
7080: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
7090: 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c   *pRes = (db->fl
70a0: 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d  ags & aFlagOp[i]
70b0: 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20  .mask)!=0;.     
70c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
70d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
70e0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
70f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7100: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7110: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
7120: 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72  end(ap);.  retur
7130: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
7140: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
7150: 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e  he buffer z[0..n
7160: 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  -1] contains all
7170: 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   spaces..*/.stat
7180: 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73  ic int allSpaces
7190: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
71a0: 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28  int n){.  while(
71b0: 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>0 && z[n-1]==
71c0: 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  ' ' ){ n--; }.  
71d0: 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a  return n==0;.}..
71e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
71f0: 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
7200: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  ing function nam
7210: 65 64 20 22 42 49 4e 41 52 59 22 20 77 68 69 63  ed "BINARY" whic
7220: 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61  h is always.** a
7230: 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
7240: 49 66 20 74 68 65 20 70 61 64 46 6c 61 67 20 61  If the padFlag a
7250: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
7260: 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70  ULL then space p
7270: 61 64 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e  adding at the en
7280: 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20  d.** of strings 
7290: 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  is ignored.  Thi
72a0: 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  s implements the
72b0: 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e   RTRIM collation
72c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
72d0: 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76  binCollFunc(.  v
72e0: 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20  oid *padFlag,.  
72f0: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
7300: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
7310: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
7320: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
7330: 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e    int rc, n;.  n
7340: 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f   = nKey1<nKey2 ?
7350: 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a   nKey1 : nKey2;.
7360: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
7370: 3a 20 52 2d 36 35 30 33 33 2d 32 38 34 34 39 20  : R-65033-28449 
7380: 54 68 65 20 62 75 69 6c 74 2d 69 6e 20 42 49 4e  The built-in BIN
7390: 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 6f  ARY collation co
73a0: 6d 70 61 72 65 73 0a 20 20 2a 2a 20 73 74 72 69  mpares.  ** stri
73b0: 6e 67 73 20 62 79 74 65 20 62 79 20 62 79 74 65  ngs byte by byte
73c0: 20 75 73 69 6e 67 20 74 68 65 20 6d 65 6d 63 6d   using the memcm
73d0: 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  p() function fro
73e0: 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 43  m the standard C
73f0: 0a 20 20 2a 2a 20 6c 69 62 72 61 72 79 2e 20 2a  .  ** library. *
7400: 2f 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28  /.  rc = memcmp(
7410: 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29  pKey1, pKey2, n)
7420: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
7430: 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c 61 67  .    if( padFlag
7440: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
7450: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31  es(((char*)pKey1
7460: 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20  )+n, nKey1-n).  
7470: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
7480: 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e  ((char*)pKey2)+n
7490: 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29  , nKey2-n).    )
74a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
74b0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 31 36 32 34 2d  NCE-OF: R-31624-
74c0: 32 34 37 33 37 20 52 54 52 49 4d 20 69 73 20 6c  24737 RTRIM is l
74d0: 69 6b 65 20 42 49 4e 41 52 59 20 65 78 63 65 70  ike BINARY excep
74e0: 74 20 74 68 61 74 20 65 78 74 72 61 0a 20 20 20  t that extra.   
74f0: 20 20 20 2a 2a 20 73 70 61 63 65 73 20 61 74 20     ** spaces at 
7500: 74 68 65 20 65 6e 64 20 6f 66 20 65 69 74 68 65  the end of eithe
7510: 72 20 73 74 72 69 6e 67 20 64 6f 20 6e 6f 74 20  r string do not 
7520: 63 68 61 6e 67 65 20 74 68 65 20 72 65 73 75 6c  change the resul
7530: 74 2e 20 49 6e 20 6f 74 68 65 72 0a 20 20 20 20  t. In other.    
7540: 20 20 2a 2a 20 77 6f 72 64 73 2c 20 73 74 72 69    ** words, stri
7550: 6e 67 73 20 77 69 6c 6c 20 63 6f 6d 70 61 72 65  ngs will compare
7560: 20 65 71 75 61 6c 20 74 6f 20 6f 6e 65 20 61 6e   equal to one an
7570: 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73  other as long as
7580: 20 74 68 65 79 0a 20 20 20 20 20 20 2a 2a 20 64   they.      ** d
7590: 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e 20 74 68  iffer only in th
75a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 70 61 63  e number of spac
75b0: 65 73 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 20  es at the end.. 
75c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73       */.    }els
75d0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b  e{.      rc = nK
75e0: 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20  ey1 - nKey2;.   
75f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7600: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  rc;.}../*.** Ano
7610: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
7620: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
7630: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
7640: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
7650: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
7660: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
7670: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
7680: 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndent.** compari
7690: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
76a0: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
76b0: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
76c0: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
76d0: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
76e0: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
76f0: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
7700: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
7710: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
7720: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
7730: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
7740: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
7750: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
7760: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
7770: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
7780: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
7790: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
77a0: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
77b0: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
77c0: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
77d0: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
77e0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
77f0: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
7800: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
7810: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
7820: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
7830: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
7840: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
7850: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
7860: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
7870: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
7880: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
7890: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
78a0: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
78b0: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
78c0: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
78d0: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
78e0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
78f0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
7900: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
7910: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
7920: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
7930: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
7940: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
7950: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
7960: 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77  turn db->lastRow
7970: 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  id;.}../*.** Ret
7980: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
7990: 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65  f changes in the
79a0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
79b0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65  l to sqlite3_exe
79c0: 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  c()..*/.int sqli
79d0: 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  te3_changes(sqli
79e0: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
79f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
7a00: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
7a10: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
7a20: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
7a30: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
7a40: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
7a50: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
7a60: 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  if.  return db->
7a70: 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
7a80: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
7a90: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73  ber of changes s
7aa0: 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
7ab0: 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65  e handle was ope
7ac0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
7ad0: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
7ae0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
7af0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7b00: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
7b10: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
7b20: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
7b30: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
7b40: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
7b50: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7b60: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
7b70: 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e  n db->nTotalChan
7b80: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ge;.}../*.** Clo
7b90: 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  se all open save
7ba0: 70 6f 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e  points. This fun
7bb0: 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70  ction only manip
7bc0: 75 6c 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66  ulates fields of
7bd0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
7be0: 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20   handle object, 
7bf0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73  it does not clos
7c00: 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73  e any savepoints
7c10: 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65   that may be ope
7c20: 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72  n.** at the b-tr
7c30: 65 65 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a  ee/pager level..
7c40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
7c50: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73  loseSavepoints(s
7c60: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77  qlite3 *db){.  w
7c70: 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70  hile( db->pSavep
7c80: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65  oint ){.    Save
7c90: 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62  point *pTmp = db
7ca0: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20  ->pSavepoint;.  
7cb0: 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74    db->pSavepoint
7cc0: 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a   = pTmp->pNext;.
7cd0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7ce0: 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d  e(db, pTmp);.  }
7cf0: 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  .  db->nSavepoin
7d00: 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74  t = 0;.  db->nSt
7d10: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64  atement = 0;.  d
7d20: 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  b->isTransaction
7d30: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d  Savepoint = 0;.}
7d40: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
7d50: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75  he destructor fu
7d60: 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65  nction associate
7d70: 64 20 77 69 74 68 20 46 75 6e 63 44 65 66 20 70  d with FuncDef p
7d80: 2c 20 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74  , if any. Except
7d90: 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  ,.** if this is 
7da0: 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70  not the last cop
7db0: 79 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  y of the functio
7dc0: 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  n, do not invoke
7dd0: 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a   it. Multiple.**
7de0: 20 63 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e   copies of a sin
7df0: 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  gle function are
7e00: 20 63 72 65 61 74 65 64 20 77 68 65 6e 20 63 72   created when cr
7e10: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20  eate_function() 
7e20: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74  is called.** wit
7e30: 68 20 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20  h SQLITE_ANY as 
7e40: 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f  the encoding..*/
7e50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e  .static void fun
7e60: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c  ctionDestroy(sql
7e70: 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65  ite3 *db, FuncDe
7e80: 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73  f *p){.  FuncDes
7e90: 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75  tructor *pDestru
7ea0: 63 74 6f 72 20 3d 20 70 2d 3e 75 2e 70 44 65 73  ctor = p->u.pDes
7eb0: 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70  tructor;.  if( p
7ec0: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
7ed0: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
7ee0: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
7ef0: 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66  Destructor->nRef
7f00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65  ==0 ){.      pDe
7f10: 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72  structor->xDestr
7f20: 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e  oy(pDestructor->
7f30: 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20  pUserData);.    
7f40: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7f50: 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  db, pDestructor)
7f60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7f70: 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20  *.** Disconnect 
7f80: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  all sqlite3_vtab
7f90: 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 62 65   objects that be
7fa0: 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  long to database
7fb0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64   connection.** d
7fc0: 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  b. This is calle
7fd0: 64 20 77 68 65 6e 20 64 62 20 69 73 20 62 65 69  d when db is bei
7fe0: 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  ng closed..*/.st
7ff0: 61 74 69 63 20 76 6f 69 64 20 64 69 73 63 6f 6e  atic void discon
8000: 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71 6c 69  nectAllVtab(sqli
8010: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65  te3 *db){.#ifnde
8020: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
8030: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74  RTUALTABLE.  int
8040: 20 69 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   i;.  HashElem *
8050: 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  p;.  sqlite3Btre
8060: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
8070: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
8080: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 53  nDb; i++){.    S
8090: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
80a0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68   db->aDb[i].pSch
80b0: 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  ema;.    if( db-
80c0: 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 20  >aDb[i].pSchema 
80d0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73  ){.      for(p=s
80e0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
80f0: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
8100: 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61  ); p; p=sqliteHa
8110: 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20  shNext(p)){.    
8120: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
8130: 3d 20 28 54 61 62 6c 65 20 2a 29 73 71 6c 69 74  = (Table *)sqlit
8140: 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20  eHashData(p);.  
8150: 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
8160: 75 61 6c 28 70 54 61 62 29 20 29 20 73 71 6c 69  ual(pTab) ) sqli
8170: 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63  te3VtabDisconnec
8180: 74 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  t(db, pTab);.   
8190: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
81a0: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
81b0: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64  hFirst(&db->aMod
81c0: 75 6c 65 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ule); p; p=sqlit
81d0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
81e0: 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20     Module *pMod 
81f0: 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69  = (Module *)sqli
8200: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
8210: 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70 45 70     if( pMod->pEp
8220: 6f 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71  oTab ){.      sq
8230: 6c 69 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e  lite3VtabDisconn
8240: 65 63 74 28 64 62 2c 20 70 4d 6f 64 2d 3e 70 45  ect(db, pMod->pE
8250: 70 6f 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  poTab);.    }.  
8260: 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  }.  sqlite3VtabU
8270: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20  nlockList(db);. 
8280: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
8290: 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65 6c 73 65  veAll(db);.#else
82a0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
82b0: 54 45 52 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a  TER(db);.#endif.
82c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
82d0: 54 52 55 45 20 69 66 20 64 61 74 61 62 61 73 65  TRUE if database
82e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68   connection db h
82f0: 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70  as unfinalized p
8300: 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65  repared.** state
8310: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
8320: 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  hed sqlite3_back
8330: 75 70 20 6f 62 6a 65 63 74 73 2e 20 20 0a 2a 2f  up objects.  .*/
8340: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 6e  .static int conn
8350: 65 63 74 69 6f 6e 49 73 42 75 73 79 28 73 71 6c  ectionIsBusy(sql
8360: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
8370: 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   j;.  assert( sq
8380: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8390: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
83a0: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
83b0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72   return 1;.  for
83c0: 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b  (j=0; j<db->nDb;
83d0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   j++){.    Btree
83e0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
83f0: 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  j].pBt;.    if( 
8400: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
8410: 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42  reeIsInBackup(pB
8420: 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  t) ) return 1;. 
8430: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
8440: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
8450: 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65   existing SQLite
8460: 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61   database.*/.sta
8470: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 43  tic int sqlite3C
8480: 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lose(sqlite3 *db
8490: 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f 6d 62 69  , int forceZombi
84a0: 65 29 7b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  e){.  if( !db ){
84b0: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
84c0: 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d 31 31 37  -OF: R-63257-117
84d0: 34 30 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74  40 Calling sqlit
84e0: 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72 0a 20 20  e3_close() or.  
84f0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6c 6f    ** sqlite3_clo
8500: 73 65 5f 76 32 28 29 20 77 69 74 68 20 61 20 4e  se_v2() with a N
8510: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 72 67 75  ULL pointer argu
8520: 6d 65 6e 74 20 69 73 20 61 20 68 61 72 6d 6c 65  ment is a harmle
8530: 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20  ss no-op. */.   
8540: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8550: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  K;.  }.  if( !sq
8560: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
8570: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
8580: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8590: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
85a0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
85b0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
85c0: 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72 63 65  ex);..  /* Force
85d0: 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c   xDisconnect cal
85e0: 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61  ls on all virtua
85f0: 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69  l tables */.  di
8600: 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28  sconnectAllVtab(
8610: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20  db);..  /* If a 
8620: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
8630: 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e  pen, the disconn
8640: 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63 61 6c  ectAllVtab() cal
8650: 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c  l above.  ** wil
8660: 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65  l not have calle
8670: 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63  d the xDisconnec
8680: 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e  t() method on an
8690: 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74  y virtual.  ** t
86a0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d  ables in the db-
86b0: 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79  >aVTrans[] array
86c0: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
86d0: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
86e0: 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20  ack().  ** call 
86f0: 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e  will do so. We n
8700: 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62  eed to do this b
8710: 65 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20  efore the check 
8720: 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20  for active.  ** 
8730: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62  SQL statements b
8740: 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74  elow, as the v-t
8750: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
8760: 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69  ion may be stori
8770: 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65  ng.  ** some pre
8780: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
8790: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
87a0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52  /.  sqlite3VtabR
87b0: 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20  ollback(db);..  
87c0: 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76 69  /* Legacy behavi
87d0: 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73  or (sqlite3_clos
87e0: 65 28 29 20 62 65 68 61 76 69 6f 72 29 20 69 73  e() behavior) is
87f0: 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20   to return.  ** 
8800: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74  SQLITE_BUSY if t
8810: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61  he connection ca
8820: 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  n not be closed 
8830: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a  immediately..  *
8840: 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a 6f  /.  if( !forceZo
8850: 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74 69  mbie && connecti
8860: 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a  onIsBusy(db) ){.
8870: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8880: 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
8890: 54 45 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c 65  TE_BUSY, "unable
88a0: 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f   to close due to
88b0: 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20   unfinalized ". 
88c0: 20 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74        "statement
88d0: 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20  s or unfinished 
88e0: 62 61 63 6b 75 70 73 22 29 3b 0a 20 20 20 20 73  backups");.    s
88f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
8900: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
8910: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8920: 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64  _BUSY;.  }..#ifd
8930: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
8940: 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71  _SQLLOG.  if( sq
8950: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
8960: 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20  g.xSqllog ){.   
8970: 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65 20   /* Closing the 
8980: 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70  handle. Fourth p
8990: 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73  arameter is pass
89a0: 65 64 20 74 68 65 20 76 61 6c 75 65 20 32 2e 20  ed the value 2. 
89b0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  */.    sqlite3Gl
89c0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
89d0: 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  og(sqlite3Global
89e0: 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
89f0: 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20  g, db, 0, 2);.  
8a00: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
8a10: 6f 6e 76 65 72 74 20 74 68 65 20 63 6f 6e 6e 65  onvert the conne
8a20: 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d  ction into a zom
8a30: 62 69 65 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f  bie and then clo
8a40: 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62  se it..  */.  db
8a50: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
8a60: 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20  _MAGIC_ZOMBIE;. 
8a70: 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74   sqlite3LeaveMut
8a80: 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65  exAndCloseZombie
8a90: 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (db);.  return S
8aa0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8ab0: 2a 2a 20 54 77 6f 20 76 61 72 69 61 74 69 6f 6e  ** Two variation
8ac0: 73 20 6f 6e 20 74 68 65 20 70 75 62 6c 69 63 20  s on the public 
8ad0: 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20 63 6c  interface for cl
8ae0: 6f 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  osing a database
8af0: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  .** connection. 
8b00: 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  The sqlite3_clos
8b10: 65 28 29 20 76 65 72 73 69 6f 6e 20 72 65 74 75  e() version retu
8b20: 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 20  rns SQLITE_BUSY 
8b30: 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68  and.** leaves th
8b40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74  e connection opt
8b50: 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ion if there are
8b60: 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65   unfinalized pre
8b70: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
8b80: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
8b90: 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  d sqlite3_backup
8ba0: 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
8bb0: 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65  close_v2().** ve
8bc0: 72 73 69 6f 6e 20 66 6f 72 63 65 73 20 74 68 65  rsion forces the
8bd0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
8be0: 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69  ecome a zombie i
8bf0: 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 75  f there are.** u
8c00: 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75 72 63 65  nclosed resource
8c10: 73 2c 20 61 6e 64 20 61 72 72 61 6e 67 65 73 20  s, and arranges 
8c20: 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e  for deallocation
8c30: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a   when the last.*
8c40: 2a 20 70 72 65 70 61 72 65 20 73 74 61 74 65 6d  * prepare statem
8c50: 65 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62  ent or sqlite3_b
8c60: 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f  ackup closes..*/
8c70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .int sqlite3_clo
8c80: 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  se(sqlite3 *db){
8c90: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43   return sqlite3C
8ca0: 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e  lose(db,0); }.in
8cb0: 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  t sqlite3_close_
8cc0: 76 32 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  v2(sqlite3 *db){
8cd0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43   return sqlite3C
8ce0: 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a  lose(db,1); }...
8cf0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
8d00: 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73  mutex on databas
8d10: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  e connection db.
8d20: 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f  .**.** Furthermo
8d30: 72 65 2c 20 69 66 20 64 61 74 61 62 61 73 65 20  re, if database 
8d40: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73  connection db is
8d50: 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69   a zombie (meani
8d60: 6e 67 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a  ng that there.**
8d70: 20 68 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f   has been a prio
8d80: 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
8d90: 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72 20 73  3_close(db) or s
8da0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
8db0: 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72  db)) and.** ever
8dc0: 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68  y sqlite3_stmt h
8dd0: 61 73 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61  as now been fina
8de0: 6c 69 7a 65 64 20 61 6e 64 20 65 76 65 72 79 20  lized and every 
8df0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 68  sqlite3_backup h
8e00: 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20  as.** finished, 
8e10: 74 68 65 6e 20 66 72 65 65 20 61 6c 6c 20 72 65  then free all re
8e20: 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64  sources..*/.void
8e30: 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74   sqlite3LeaveMut
8e40: 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65  exAndCloseZombie
8e50: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
8e60: 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20   HashElem *i;   
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e80: 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69   /* Hash table i
8e90: 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  terator */.  int
8ea0: 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   j;..  /* If the
8eb0: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
8ec0: 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ng sqlite3_stmt 
8ed0: 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  or sqlite3_backu
8ee0: 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f  p objects.  ** o
8ef0: 72 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  r if the connect
8f00: 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
8f10: 62 65 65 6e 20 63 6c 6f 73 65 64 20 62 79 20 73  been closed by s
8f20: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
8f30: 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73  ),.  ** then jus
8f40: 74 20 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65  t leave the mute
8f50: 78 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  x and return..  
8f60: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67  */.  if( db->mag
8f70: 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43  ic!=SQLITE_MAGIC
8f80: 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65  _ZOMBIE || conne
8f90: 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20  ctionIsBusy(db) 
8fa0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ){.    sqlite3_m
8fb0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
8fc0: 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72  utex);.    retur
8fd0: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  n;.  }..  /* If 
8fe0: 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
8ff0: 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
9000: 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
9010: 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20  connection has. 
9020: 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73   ** closed all s
9030: 71 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e 64 20  qlite3_stmt and 
9040: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f  sqlite3_backup o
9050: 62 6a 65 63 74 73 20 61 6e 64 20 68 61 73 20 62  bjects and has b
9060: 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64 20  een.  ** passed 
9070: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  to sqlite3_close
9080: 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69   (meaning that i
9090: 74 20 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20  t is a zombie). 
90a0: 20 54 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a   Therefore,.  **
90b0: 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 66 72   go ahead and fr
90c0: 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73  ee all resources
90d0: 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ..  */..  /* If 
90e0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
90f0: 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62   open, roll it b
9100: 61 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20 65  ack. This also e
9110: 6e 73 75 72 65 73 20 74 68 61 74 20 69 66 0a 20  nsures that if. 
9120: 20 2a 2a 20 61 6e 79 20 64 61 74 61 62 61 73 65   ** any database
9130: 20 73 63 68 65 6d 61 73 20 68 61 76 65 20 62 65   schemas have be
9140: 65 6e 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61  en modified by a
9150: 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72  n uncommitted tr
9160: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74  ansaction.  ** t
9170: 68 65 79 20 61 72 65 20 72 65 73 65 74 2e 20 41  hey are reset. A
9180: 6e 64 20 74 68 61 74 20 74 68 65 20 72 65 71 75  nd that the requ
9190: 69 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ired b-tree mute
91a0: 78 20 69 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b  x is held to mak
91b0: 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72  e.  ** the pager
91c0: 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63   rollback and sc
91d0: 68 65 6d 61 20 72 65 73 65 74 20 61 6e 20 61 74  hema reset an at
91e0: 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20  omic operation. 
91f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c  */.  sqlite3Roll
9200: 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
9210: 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72  TE_OK);..  /* Fr
9220: 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69  ee any outstandi
9230: 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72  ng Savepoint str
9240: 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71  uctures. */.  sq
9250: 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
9260: 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  ints(db);..  /* 
9270: 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61 62 61  Close all databa
9280: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  se connections *
9290: 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  /.  for(j=0; j<d
92a0: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
92b0: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
92c0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a   = &db->aDb[j];.
92d0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
92e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
92f0: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d  3BtreeClose(pDb-
9300: 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62  >pBt);.      pDb
9310: 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20  ->pBt = 0;.     
9320: 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20   if( j!=1 ){.   
9330: 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d       pDb->pSchem
9340: 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  a = 0;.      }. 
9350: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c     }.  }.  /* Cl
9360: 65 61 72 20 74 68 65 20 54 45 4d 50 20 73 63 68  ear the TEMP sch
9370: 65 6d 61 20 73 65 70 61 72 61 74 65 6c 79 20 61  ema separately a
9380: 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28  nd last */.  if(
9390: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
93a0: 65 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ema ){.    sqlit
93b0: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62  e3SchemaClear(db
93c0: 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
93d0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
93e0: 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64  VtabUnlockList(d
93f0: 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 75  b);..  /* Free u
9400: 70 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 61  p the array of a
9410: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
9420: 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  es */.  sqlite3C
9430: 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41  ollapseDatabaseA
9440: 72 72 61 79 28 64 62 29 3b 0a 20 20 61 73 73 65  rray(db);.  asse
9450: 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29  rt( db->nDb<=2 )
9460: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
9470: 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74  aDb==db->aDbStat
9480: 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c  ic );..  /* Tell
9490: 20 74 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74   the code in not
94a0: 69 66 79 2e 63 20 74 68 61 74 20 74 68 65 20 63  ify.c that the c
94b0: 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e  onnection no lon
94c0: 67 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20  ger holds any.  
94d0: 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65  ** locks and doe
94e0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e  s not require an
94f0: 79 20 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b  y further unlock
9500: 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b  -notify callback
9510: 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
9520: 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65  3ConnectionClose
9530: 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  d(db);..  for(i=
9540: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
9550: 26 64 62 2d 3e 61 46 75 6e 63 29 3b 20 69 3b 20  &db->aFunc); i; 
9560: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
9570: 28 69 29 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  (i)){.    FuncDe
9580: 66 20 2a 70 4e 65 78 74 2c 20 2a 70 3b 0a 20 20  f *pNext, *p;.  
9590: 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68    p = sqliteHash
95a0: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 64 6f 7b  Data(i);.    do{
95b0: 0a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44  .      functionD
95c0: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20  estroy(db, p);. 
95d0: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e       pNext = p->
95e0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
95f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9600: 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 4e 65  );.      p = pNe
9610: 78 74 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  xt;.    }while( 
9620: 70 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  p );.  }.  sqlit
9630: 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  e3HashClear(&db-
9640: 3e 61 46 75 6e 63 29 3b 0a 20 20 66 6f 72 28 69  >aFunc);.  for(i
9650: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
9660: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
9670: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
9680: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f  Next(i)){.    Co
9690: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28  llSeq *pColl = (
96a0: 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65  CollSeq *)sqlite
96b0: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
96c0: 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64   /* Invoke any d
96d0: 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69 73  estructors regis
96e0: 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74  tered for collat
96f0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65  ion sequence use
9700: 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66  r data. */.    f
9710: 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b  or(j=0; j<3; j++
9720: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  ){.      if( pCo
9730: 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20  ll[j].xDel ){.  
9740: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78        pColl[j].x
9750: 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73  Del(pColl[j].pUs
9760: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
9770: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
9780: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b  Free(db, pColl);
9790: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
97a0: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f  shClear(&db->aCo
97b0: 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20  llSeq);.#ifndef 
97c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
97d0: 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69  UALTABLE.  for(i
97e0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
97f0: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20  (&db->aModule); 
9800: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
9810: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64  ext(i)){.    Mod
9820: 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64  ule *pMod = (Mod
9830: 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68  ule *)sqliteHash
9840: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
9850: 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20   pMod->xDestroy 
9860: 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78  ){.      pMod->x
9870: 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41  Destroy(pMod->pA
9880: 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ux);.    }.    s
9890: 71 6c 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d  qlite3VtabEponym
98a0: 6f 75 73 54 61 62 6c 65 43 6c 65 61 72 28 64 62  ousTableClear(db
98b0: 2c 20 70 4d 6f 64 29 3b 0a 20 20 20 20 73 71 6c  , pMod);.    sql
98c0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
98d0: 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Mod);.  }.  sqli
98e0: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62  te3HashClear(&db
98f0: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64  ->aModule);.#end
9900: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72  if..  sqlite3Err
9910: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
9920: 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65  ); /* Deallocate
9930: 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72 72  s any cached err
9940: 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20  or strings. */. 
9950: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
9960: 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 73  e(db->pErr);.  s
9970: 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e  qlite3CloseExten
9980: 73 69 6f 6e 73 28 64 62 29 3b 0a 23 69 66 20 53  sions(db);.#if S
9990: 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
99a0: 4e 54 49 43 41 54 49 4f 4e 0a 20 20 73 71 6c 69  NTICATION.  sqli
99b0: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74  te3_free(db->aut
99c0: 68 2e 7a 41 75 74 68 55 73 65 72 29 3b 0a 20 20  h.zAuthUser);.  
99d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
99e0: 3e 61 75 74 68 2e 7a 41 75 74 68 50 57 29 3b 0a  >auth.zAuthPW);.
99f0: 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d 61  #endif..  db->ma
9a00: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
9a10: 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20  IC_ERROR;..  /* 
9a20: 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73  The temp-databas
9a30: 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f  e schema is allo
9a40: 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c  cated differentl
9a50: 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  y from the other
9a60: 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a   schema.  ** obj
9a70: 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69  ects (using sqli
9a80: 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63  teMalloc() direc
9a90: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
9aa0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
9ab0: 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69  ma())..  ** So i
9ac0: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
9ad0: 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20  eed here. Todo: 
9ae0: 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65  Why not roll the
9af0: 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74   temp schema int
9b00: 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20  o.  ** the same 
9b10: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
9b20: 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61  s the one that a
9b30: 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61 74  llocates the dat
9b40: 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75  abase .  ** stru
9b50: 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71  cture?.  */.  sq
9b60: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9b70: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
9b80: 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ma);.  sqlite3_m
9b90: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
9ba0: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67  utex);.  db->mag
9bb0: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
9bc0: 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69  C_CLOSED;.  sqli
9bd0: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64  te3_mutex_free(d
9be0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
9bf0: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
9c00: 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f  de.nOut==0 );  /
9c10: 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f  * Fails on a loo
9c20: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65  kaside memory le
9c30: 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  ak */.  if( db->
9c40: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
9c50: 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ced ){.    sqlit
9c60: 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b  e3_free(db->look
9c70: 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20  aside.pStart);. 
9c80: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
9c90: 5f 45 4e 41 42 4c 45 5f 53 51 4c 52 52 0a 20 20  _ENABLE_SQLRR.  
9ca0: 53 52 52 65 63 43 6c 6f 73 65 28 64 62 29 3b 0a  SRRecClose(db);.
9cb0: 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 71 6c 69  #endif.  .  sqli
9cc0: 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a  te3_free(db);.}.
9cd0: 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
9ce0: 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  all database fil
9cf0: 65 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65  es.  If tripCode
9d00: 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
9d10: 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77  K, then.** any w
9d20: 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
9d30: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 22 74   invalidated ("t
9d40: 72 69 70 70 65 64 22 20 2d 20 61 73 20 69 6e 20  ripped" - as in 
9d50: 22 74 72 69 70 70 69 6e 67 20 61 20 63 69 72 63  "tripping a circ
9d60: 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29  uit.** breaker")
9d70: 20 61 6e 64 20 6d 61 64 65 20 74 6f 20 72 65 74   and made to ret
9d80: 75 72 6e 20 74 72 69 70 43 6f 64 65 20 69 66 20  urn tripCode if 
9d90: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 66 75  there are any fu
9da0: 72 74 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74  rther.** attempt
9db0: 73 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 75  s to use that cu
9dc0: 72 73 6f 72 2e 20 20 52 65 61 64 20 63 75 72 73  rsor.  Read curs
9dd0: 6f 72 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20  ors remain open 
9de0: 61 6e 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74  and valid.** but
9df0: 20 61 72 65 20 22 73 61 76 65 64 22 20 69 6e 20   are "saved" in 
9e00: 63 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 70  case the table p
9e10: 61 67 65 73 20 61 72 65 20 6d 6f 76 65 64 20 61  ages are moved a
9e20: 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  round..*/.void s
9e30: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
9e40: 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  l(sqlite3 *db, i
9e50: 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20  nt tripCode){.  
9e60: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54  int i;.  int inT
9e70: 72 61 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rans = 0;.  int 
9e80: 73 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20  schemaChange;.  
9e90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9ea0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
9eb0: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
9ec0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
9ed0: 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74  loc();..  /* Obt
9ee0: 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d  ain all b-tree m
9ef0: 75 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d 61  utexes before ma
9f00: 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20 74  king any calls t
9f10: 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  o BtreeRollback(
9f20: 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69 73  ). .  ** This is
9f30: 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63 61   important in ca
9f40: 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  se the transacti
9f50: 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  on being rolled 
9f60: 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f  back has.  ** mo
9f70: 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62  dified the datab
9f80: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 74  ase schema. If t
9f90: 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65  he b-tree mutexe
9fa0: 73 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a  s are not taken.
9fb0: 20 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e 20    ** here, then 
9fc0: 61 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63  another shared-c
9fd0: 61 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ache connection 
9fe0: 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20 62  might sneak in b
9ff0: 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20  etween.  ** the 
a000: 64 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61 63  database rollbac
a010: 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73  k and schema res
a020: 65 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63 61  et, which can ca
a030: 75 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63  use false.  ** c
a040: 6f 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72 74  orruption report
a050: 73 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e  s in some cases.
a060: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
a070: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
a080: 0a 20 20 73 63 68 65 6d 61 43 68 61 6e 67 65 20  .  schemaChange 
a090: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
a0a0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
a0b0: 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d 3e 69  ges)!=0 && db->i
a0c0: 6e 69 74 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20 20  nit.busy==0;..  
a0d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
a0e0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; i++){.    Bt
a0f0: 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62  ree *p = db->aDb
a100: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
a110: 20 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   p ){.      if( 
a120: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
a130: 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20  Trans(p) ){.    
a140: 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b      inTrans = 1;
a150: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
a160: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
a170: 61 63 6b 28 70 2c 20 74 72 69 70 43 6f 64 65 2c  ack(p, tripCode,
a180: 20 21 73 63 68 65 6d 61 43 68 61 6e 67 65 29 3b   !schemaChange);
a190: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
a1a0: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
a1b0: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  (db);.  sqlite3E
a1c0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
a1d0: 3b 0a 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  ;..  if( (db->fl
a1e0: 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72  ags&SQLITE_Inter
a1f0: 6e 43 68 61 6e 67 65 73 29 21 3d 30 20 26 26 20  nChanges)!=0 && 
a200: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
a210: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
a220: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
a230: 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
a240: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
a250: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
a260: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73  ion(db);.  }.  s
a270: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
a280: 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41  All(db);..  /* A
a290: 6e 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  ny deferred cons
a2a0: 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
a2b0: 73 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  s have now been 
a2c0: 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64  resolved. */.  d
a2d0: 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
a2e0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66   = 0;.  db->nDef
a2f0: 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30  erredImmCons = 0
a300: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
a310: 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b   ~SQLITE_DeferFK
a320: 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  s;..  /* If one 
a330: 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  has been configu
a340: 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  red, invoke the 
a350: 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61  rollback-hook ca
a360: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  llback */.  if( 
a370: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
a380: 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e  lback && (inTran
a390: 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f  s || !db->autoCo
a3a0: 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d  mmit) ){.    db-
a3b0: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
a3c0: 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ck(db->pRollback
a3d0: 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Arg);.  }.}../*.
a3e0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74  ** Return a stat
a3f0: 69 63 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  ic string contai
a400: 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 63 6f  ning the name co
a410: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
a420: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
a430: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
a440: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  e argument..*/.#
a450: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
a460: 45 5f 4e 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29  E_NEED_ERR_NAME)
a470: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
a480: 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 20  ite3ErrName(int 
a490: 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc){.  const cha
a4a0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
a4b0: 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d 20  int i, origRc = 
a4c0: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
a4d0: 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20  <2 && zName==0; 
a4e0: 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66 29  i++, rc &= 0xff)
a4f0: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 72 63  {.    switch( rc
a500: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53   ){.      case S
a510: 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20  QLITE_OK:       
a520: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a530: 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20  = "SQLITE_OK";  
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
a550: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a560: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20  SQLITE_ERROR:   
a570: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a580: 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52   = "SQLITE_ERROR
a590: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
a5a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a5b0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
a5c0: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
a5d0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45  e = "SQLITE_INTE
a5e0: 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20 20  RNAL";          
a5f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a600: 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20  e SQLITE_PERM:  
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
a620: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45 52  me = "SQLITE_PER
a630: 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  M";             
a640: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a650: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a  se SQLITE_ABORT:
a660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
a670: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42  ame = "SQLITE_AB
a680: 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  ORT";           
a690: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a6a0: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
a6b0: 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a  _ROLLBACK:     z
a6c0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41  Name = "SQLITE_A
a6d0: 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20  BORT_ROLLBACK"; 
a6e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a6f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
a700: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
a710: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a720: 42 55 53 59 22 3b 20 20 20 20 20 20 20 20 20 20  BUSY";          
a730: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a740: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
a750: 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20 20  Y_RECOVERY:     
a760: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a770: 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22 3b  _BUSY_RECOVERY";
a780: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a790: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
a7a0: 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20 20  SY_SNAPSHOT:    
a7b0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a7c0: 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 22  E_BUSY_SNAPSHOT"
a7d0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
a7e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
a7f0: 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20  OCKED:          
a800: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a810: 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20  TE_LOCKED";     
a820: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a830: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a840: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
a850: 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  HE: zName = "SQL
a860: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
a870: 44 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20  DCACHE";break;. 
a880: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a890: 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 20  _NOMEM:         
a8a0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a8b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20  LITE_NOMEM";    
a8c0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a8d0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a8e0: 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20  E_READONLY:     
a8f0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a900: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b  QLITE_READONLY";
a910: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a920: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a930: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f  TE_READONLY_RECO
a940: 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  VERY:  zName = "
a950: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
a960: 52 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61 6b  RECOVERY"; break
a970: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a980: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e  ITE_READONLY_CAN
a990: 54 4c 4f 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20  TLOCK:  zName = 
a9a0: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
a9b0: 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61  _CANTLOCK"; brea
a9c0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a9d0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f  LITE_READONLY_RO
a9e0: 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d  LLBACK:  zName =
a9f0: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
aa00: 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65  Y_ROLLBACK"; bre
aa10: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
aa20: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44  QLITE_READONLY_D
aa30: 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20  BMOVED:   zName 
aa40: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
aa50: 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62 72  LY_DBMOVED";  br
aa60: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aa70: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
aa80: 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  :          zName
aa90: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52   = "SQLITE_INTER
aaa0: 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 62  RUPT";         b
aab0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
aac0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20   SQLITE_IOERR:  
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
aae0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
aaf0: 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  R";             
ab00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ab10: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  e SQLITE_IOERR_R
ab20: 45 41 44 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  EAD:         zNa
ab30: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
ab40: 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20 20  RR_READ";       
ab50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ab60: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
ab70: 53 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e  SHORT_READ:   zN
ab80: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
ab90: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b  ERR_SHORT_READ";
aba0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
abb0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
abc0: 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 7a  _WRITE:        z
abd0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
abe0: 4f 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20  OERR_WRITE";    
abf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ac00: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
ac10: 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20  R_FSYNC:        
ac20: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ac30: 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20  IOERR_FSYNC";   
ac40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ac50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
ac60: 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20 20  RR_DIR_FSYNC:   
ac70: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ac80: 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
ac90: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
aca0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
acb0: 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20  ERR_TRUNCATE:   
acc0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
acd0: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
ace0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
acf0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
ad00: 4f 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20  OERR_FSTAT:     
ad10: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ad20: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b  TE_IOERR_FSTAT";
ad30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ad40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ad50: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20  IOERR_UNLOCK:   
ad60: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ad70: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
ad80: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
ad90: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ada0: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20  _IOERR_RDLOCK:  
adb0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
adc0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
add0: 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K";      break;.
ade0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
adf0: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20  E_IOERR_DELETE: 
ae00: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ae10: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
ae20: 54 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  TE";      break;
ae30: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ae40: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20  TE_IOERR_NOMEM: 
ae50: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ae60: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
ae70: 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  EM";       break
ae80: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ae90: 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
aea0: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
aeb0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43  "SQLITE_IOERR_AC
aec0: 43 45 53 53 22 3b 20 20 20 20 20 20 62 72 65 61  CESS";      brea
aed0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
aee0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
aef0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20  RESERVEDLOCK:.  
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
af20: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
af30: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
af40: 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  DLOCK"; break;. 
af50: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
af60: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20  _IOERR_LOCK:    
af70: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
af80: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22  LITE_IOERR_LOCK"
af90: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
afa0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
afb0: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20  E_IOERR_CLOSE:  
afc0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
afd0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
afe0: 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  E";       break;
aff0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b000: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f  TE_IOERR_DIR_CLO
b010: 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  SE:    zName = "
b020: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
b030: 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72 65 61 6b  _CLOSE";   break
b040: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b050: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
b060: 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  N:      zName = 
b070: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
b080: 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62 72 65 61  MOPEN";     brea
b090: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b0a0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
b0b0: 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ZE:      zName =
b0c0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b0d0: 48 4d 53 49 5a 45 22 3b 20 20 20 20 20 62 72 65  HMSIZE";     bre
b0e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b0f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c  QLITE_IOERR_SHML
b100: 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  OCK:      zName 
b110: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b120: 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72  SHMLOCK";     br
b130: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b140: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b150: 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  MAP:       zName
b160: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b170: 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20 20 20 62  _SHMMAP";      b
b180: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b190: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45   SQLITE_IOERR_SE
b1a0: 45 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  EK:         zNam
b1b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b1c0: 52 5f 53 45 45 4b 22 3b 20 20 20 20 20 20 20 20  R_SEEK";        
b1d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b1e0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
b1f0: 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61  ELETE_NOENT: zNa
b200: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b210: 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22  RR_DELETE_NOENT"
b220: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
b230: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b240: 4d 4d 41 50 3a 20 20 20 20 20 20 20 20 20 7a 4e  MMAP:         zN
b250: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b260: 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20  ERR_MMAP";      
b270: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b280: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b290: 5f 47 45 54 54 45 4d 50 50 41 54 48 3a 20 20 7a  _GETTEMPPATH:  z
b2a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b2b0: 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
b2c0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
b2d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b2e0: 52 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20 20 20  R_CONVPATH:     
b2f0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b300: 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b  IOERR_CONVPATH";
b310: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b320: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52   case SQLITE_COR
b330: 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 20  RUPT:           
b340: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b350: 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20  _CORRUPT";      
b360: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b370: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
b380: 52 52 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20  RRUPT_VTAB:     
b390: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b3a0: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b  E_CORRUPT_VTAB";
b3b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b3c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
b3d0: 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20  OTFOUND:        
b3e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b3f0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20  TE_NOTFOUND";   
b400: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b410: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b420: 46 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20  FULL:           
b430: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b440: 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20  ITE_FULL";      
b450: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b460: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b470: 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20  _CANTOPEN:      
b480: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b490: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20  LITE_CANTOPEN"; 
b4a0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b4b0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b4c0: 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d  E_CANTOPEN_NOTEM
b4d0: 50 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  PDIR: zName = "S
b4e0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e  QLITE_CANTOPEN_N
b4f0: 4f 54 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b  OTEMPDIR";break;
b500: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b510: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
b520: 52 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  R:     zName = "
b530: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
b540: 49 53 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b  ISDIR";    break
b550: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b560: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
b570: 4c 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20  LPATH:  zName = 
b580: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
b590: 5f 46 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61  _FULLPATH"; brea
b5a0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b5b0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
b5c0: 4e 56 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d  NVPATH:  zName =
b5d0: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
b5e0: 4e 5f 43 4f 4e 56 50 41 54 48 22 3b 20 62 72 65  N_CONVPATH"; bre
b5f0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b600: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20  QLITE_PROTOCOL: 
b610: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b620: 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  = "SQLITE_PROTOC
b630: 4f 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  OL";          br
b640: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b650: 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20  SQLITE_EMPTY:   
b660: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b670: 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59   = "SQLITE_EMPTY
b680: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
b690: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b6a0: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20   SQLITE_SCHEMA: 
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b6c0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45  e = "SQLITE_SCHE
b6d0: 4d 41 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  MA";            
b6e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b6f0: 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a  e SQLITE_TOOBIG:
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
b710: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f  me = "SQLITE_TOO
b720: 42 49 47 22 3b 20 20 20 20 20 20 20 20 20 20 20  BIG";           
b730: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b740: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b750: 41 49 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e  AINT:         zN
b760: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b770: 4e 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20  NSTRAINT";      
b780: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b790: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
b7a0: 52 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a  RAINT_UNIQUE:  z
b7b0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b7c0: 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
b7d0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
b7e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
b7f0: 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20  TRAINT_TRIGGER: 
b800: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b810: 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
b820: 45 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  ER";break;.     
b830: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
b840: 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
b850: 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY:.            
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b870: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b880: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
b890: 4f 52 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72  OREIGNKEY";   br
b8a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b8b0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b8c0: 54 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65  T_CHECK:   zName
b8d0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
b8e0: 52 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62  RAINT_CHECK";  b
b8f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b900: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
b910: 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20  NT_PRIMARYKEY:. 
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
b940: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b950: 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
b960: 59 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a  YKEY";   break;.
b970: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b980: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54  E_CONSTRAINT_NOT
b990: 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  NULL: zName = "S
b9a0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b9b0: 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b  _NOTNULL";break;
b9c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b9d0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f  TE_CONSTRAINT_CO
b9e0: 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20  MMITHOOK:.      
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
ba10: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
ba20: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22  AINT_COMMITHOOK"
ba30: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
ba40: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
ba50: 53 54 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20  STRAINT_VTAB:   
ba60: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ba70: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42  _CONSTRAINT_VTAB
ba80: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
ba90: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
baa0: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  NSTRAINT_FUNCTIO
bab0: 4e 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N:.             
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bad0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bae0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55  TE_CONSTRAINT_FU
baf0: 4e 43 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65  NCTION";     bre
bb00: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bb10: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bb20: 5f 52 4f 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20  _ROWID:   zName 
bb30: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
bb40: 41 49 4e 54 5f 52 4f 57 49 44 22 3b 20 20 62 72  AINT_ROWID";  br
bb50: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bb60: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a  SQLITE_MISMATCH:
bb70: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bb80: 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41   = "SQLITE_MISMA
bb90: 54 43 48 22 3b 20 20 20 20 20 20 20 20 20 20 62  TCH";          b
bba0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bbb0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20   SQLITE_MISUSE: 
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bbd0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55  e = "SQLITE_MISU
bbe0: 53 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  SE";            
bbf0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bc00: 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20  e SQLITE_NOLFS: 
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
bc20: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c  me = "SQLITE_NOL
bc30: 46 53 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  FS";            
bc40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bc50: 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20  se SQLITE_AUTH: 
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
bc70: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55  ame = "SQLITE_AU
bc80: 54 48 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  TH";            
bc90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bca0: 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41  ase SQLITE_FORMA
bcb0: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  T:             z
bcc0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
bcd0: 4f 52 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20  ORMAT";         
bce0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bcf0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47  case SQLITE_RANG
bd00: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E:              
bd10: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bd20: 52 41 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20  RANGE";         
bd30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bd40: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
bd50: 41 44 42 3a 20 20 20 20 20 20 20 20 20 20 20 20  ADB:            
bd60: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bd70: 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20  _NOTADB";       
bd80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bd90: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f    case SQLITE_RO
bda0: 57 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W:              
bdb0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bdc0: 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20  E_ROW";         
bdd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bde0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
bdf0: 4f 54 49 43 45 3a 20 20 20 20 20 20 20 20 20 20  OTICE:          
be00: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
be10: 54 45 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20 20  TE_NOTICE";     
be20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
be30: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
be40: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57  NOTICE_RECOVER_W
be50: 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  AL: zName = "SQL
be60: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
be70: 45 52 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20  ER_WAL";break;. 
be80: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
be90: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
bea0: 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20  ROLLBACK:.      
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bed0: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  = "SQLITE_NOTICE
bee0: 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
bef0: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
bf00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52   case SQLITE_WAR
bf10: 4e 49 4e 47 3a 20 20 20 20 20 20 20 20 20 20 20  NING:           
bf20: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bf30: 5f 57 41 52 4e 49 4e 47 22 3b 20 20 20 20 20 20  _WARNING";      
bf40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bf50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41    case SQLITE_WA
bf60: 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a  RNING_AUTOINDEX:
bf70: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bf80: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
bf90: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
bfa0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
bfb0: 4f 4e 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  ONE:            
bfc0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bfd0: 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20  TE_DONE";       
bfe0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bff0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e    }.  }.  if( zN
c000: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ame==0 ){.    st
c010: 61 74 69 63 20 63 68 61 72 20 7a 42 75 66 5b 35  atic char zBuf[5
c020: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
c030: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
c040: 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 53 51  zBuf), zBuf, "SQ
c050: 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29  LITE_UNKNOWN(%d)
c060: 22 2c 20 6f 72 69 67 52 63 29 3b 0a 20 20 20 20  ", origRc);.    
c070: 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20  zName = zBuf;.  
c080: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
c090: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
c0a0: 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69  * Return a stati
c0b0: 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  c string that de
c0c0: 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64  scribes the kind
c0d0: 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66   of error specif
c0e0: 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ied in the.** ar
c0f0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74  gument..*/.const
c100: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72   char *sqlite3Er
c110: 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20  rStr(int rc){.  
c120: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
c130: 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20  r* const aMsg[] 
c140: 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  = {.    /* SQLIT
c150: 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f  E_OK          */
c160: 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c   "not an error",
c170: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
c180: 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53  RROR       */ "S
c190: 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f  QL logic error o
c1a0: 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61  r missing databa
c1b0: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
c1c0: 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a  TE_INTERNAL    *
c1d0: 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  / 0,.    /* SQLI
c1e0: 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a  TE_PERM        *
c1f0: 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73  / "access permis
c200: 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  sion denied",.  
c210: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52    /* SQLITE_ABOR
c220: 54 20 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c  T       */ "call
c230: 62 61 63 6b 20 72 65 71 75 65 73 74 65 64 20 71  back requested q
c240: 75 65 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20  uery abort",.   
c250: 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20   /* SQLITE_BUSY 
c260: 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62         */ "datab
c270: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ase is locked",.
c280: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f      /* SQLITE_LO
c290: 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61  CKED      */ "da
c2a0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
c2b0: 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20  locked",.    /* 
c2c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20  SQLITE_NOMEM    
c2d0: 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65     */ "out of me
c2e0: 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51  mory",.    /* SQ
c2f0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20  LITE_READONLY   
c300: 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20   */ "attempt to 
c310: 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79  write a readonly
c320: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
c330: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  /* SQLITE_INTERR
c340: 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72  UPT   */ "interr
c350: 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  upted",.    /* S
c360: 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20  QLITE_IOERR     
c370: 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65    */ "disk I/O e
c380: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
c390: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20  LITE_CORRUPT    
c3a0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69   */ "database di
c3b0: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
c3c0: 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ormed",.    /* S
c3d0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20  QLITE_NOTFOUND  
c3e0: 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70    */ "unknown op
c3f0: 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a  eration",.    /*
c400: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20   SQLITE_FULL    
c410: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
c420: 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c   or disk is full
c430: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c440: 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20  _CANTOPEN    */ 
c450: 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
c460: 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a  database file",.
c470: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52      /* SQLITE_PR
c480: 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f  OTOCOL    */ "lo
c490: 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c  cking protocol",
c4a0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
c4b0: 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74  MPTY       */ "t
c4c0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  able contains no
c4d0: 20 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53   data",.    /* S
c4e0: 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20  QLITE_SCHEMA    
c4f0: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73    */ "database s
c500: 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65  chema has change
c510: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
c520: 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f  E_TOOBIG      */
c530: 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62   "string or blob
c540: 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f   too big",.    /
c550: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
c560: 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61  INT  */ "constra
c570: 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20  int failed",.   
c580: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41   /* SQLITE_MISMA
c590: 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74  TCH    */ "datat
c5a0: 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20  ype mismatch",. 
c5b0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53     /* SQLITE_MIS
c5c0: 55 53 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62  USE      */ "lib
c5d0: 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c  rary routine cal
c5e0: 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65  led out of seque
c5f0: 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  nce",.    /* SQL
c600: 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20  ITE_NOLFS       
c610: 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73  */ "large file s
c620: 75 70 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c  upport is disabl
c630: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c640: 54 45 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a  TE_AUTH        *
c650: 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  / "authorization
c660: 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a   denied",.    /*
c670: 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20   SQLITE_FORMAT  
c680: 20 20 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72      */ "auxiliar
c690: 79 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61  y database forma
c6a0: 74 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  t error",.    /*
c6b0: 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20   SQLITE_RANGE   
c6c0: 20 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20      */ "bind or 
c6d0: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74  column index out
c6e0: 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20   of range",.    
c6f0: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  /* SQLITE_NOTADB
c700: 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69        */ "file i
c710: 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69  s encrypted or i
c720: 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65  s not a database
c730: 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20  ",.  };.  const 
c740: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e  char *zErr = "un
c750: 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20  known error";.  
c760: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
c770: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
c780: 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a  ORT_ROLLBACK: {.
c790: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62        zErr = "ab
c7a0: 6f 72 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42  ort due to ROLLB
c7b0: 41 43 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61  ACK";.      brea
c7c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
c7d0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63  ault: {.      rc
c7e0: 20 26 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20   &= 0xff;.      
c7f0: 69 66 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30  if( ALWAYS(rc>=0
c800: 29 20 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a  ) && rc<ArraySiz
c810: 65 28 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b  e(aMsg) && aMsg[
c820: 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  rc]!=0 ){.      
c830: 20 20 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63    zErr = aMsg[rc
c840: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
c850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c860: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b  }.  return zErr;
c870: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
c880: 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
c890: 73 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63  s a busy callbac
c8a0: 6b 20 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e  k that sleeps an
c8b0: 64 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e  d tries.** again
c8c0: 20 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74   until a timeout
c8d0: 20 76 61 6c 75 65 20 69 73 20 72 65 61 63 68 65   value is reache
c8e0: 64 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20  d.  The timeout 
c8f0: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69  value is.** an i
c900: 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
c910: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61   milliseconds pa
c920: 73 73 65 64 20 69 6e 20 61 73 20 74 68 65 20 66  ssed in as the f
c930: 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
c940: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c950: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
c960: 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64  yCallback(. void
c970: 20 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20 20   *ptr,          
c980: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
c990: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
c9a0: 69 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20  int count       
c9b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c9c0: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c  er of times tabl
c9d0: 65 20 68 61 73 20 62 65 65 6e 20 62 75 73 79 20  e has been busy 
c9e0: 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  */.){.#if SQLITE
c9f0: 5f 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f  _OS_WIN || HAVE_
ca00: 55 53 4c 45 45 50 0a 20 20 73 74 61 74 69 63 20  USLEEP.  static 
ca10: 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b  const u8 delays[
ca20: 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c  ] =.     { 1, 2,
ca30: 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20   5, 10, 15, 20, 
ca40: 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30  25, 25,  25,  50
ca50: 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20  ,  50, 100 };.  
ca60: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
ca70: 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20  totals[] =.     
ca80: 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31  { 0, 1, 3,  8, 1
ca90: 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31  8, 33, 53, 78, 1
caa0: 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32  03, 128, 178, 22
cab0: 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44  8 };.# define ND
cac0: 45 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28 64  ELAY ArraySize(d
cad0: 65 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33  elays).  sqlite3
cae0: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
caf0: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d  *)ptr;.  int tim
cb00: 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54  eout = db->busyT
cb10: 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65  imeout;.  int de
cb20: 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61  lay, prior;..  a
cb30: 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20  ssert( count>=0 
cb40: 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c  );.  if( count <
cb50: 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64   NDELAY ){.    d
cb60: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f  elay = delays[co
cb70: 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  unt];.    prior 
cb80: 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b  = totals[count];
cb90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65  .  }else{.    de
cba0: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45  lay = delays[NDE
cbb0: 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f  LAY-1];.    prio
cbc0: 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41  r = totals[NDELA
cbd0: 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f  Y-1] + delay*(co
cbe0: 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b  unt-(NDELAY-1));
cbf0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72  .  }.  if( prior
cc00: 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f   + delay > timeo
cc10: 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20  ut ){.    delay 
cc20: 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f  = timeout - prio
cc30: 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79  r;.    if( delay
cc40: 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  <=0 ) return 0;.
cc50: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
cc60: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64  leep(db->pVfs, d
cc70: 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65  elay*1000);.  re
cc80: 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20  turn 1;.#else.  
cc90: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73  sqlite3 *db = (s
cca0: 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20  qlite3 *)ptr;.  
ccb0: 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28  int timeout = ((
ccc0: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e  sqlite3 *)ptr)->
ccd0: 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69  busyTimeout;.  i
cce0: 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30  f( (count+1)*100
ccf0: 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20  0 > timeout ){. 
cd00: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
cd10: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
cd20: 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30  p(db->pVfs, 1000
cd30: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
cd40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
cd50: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
cd60: 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e  en busy handler.
cd70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
cd80: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
cd90: 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  en an operation 
cda0: 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f  failed with a lo
cdb0: 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72  ck..** If this r
cdc0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e  outine returns n
cdd0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
cde0: 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49  k is retried.  I
cdf0: 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20  f it.** returns 
ce00: 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  0, the operation
ce10: 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20   aborts with an 
ce20: 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
ce30: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
ce40: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
ce50: 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  er(BusyHandler *
ce60: 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
ce70: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
ce80: 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c  || p->xFunc==0 |
ce90: 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72  | p->nBusy<0 ) r
cea0: 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20  eturn 0;.  rc = 
ceb0: 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67  p->xFunc(p->pArg
cec0: 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69  , p->nBusy);.  i
ced0: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
cee0: 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20  p->nBusy = -1;. 
cef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e   }else{.    p->n
cf00: 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  Busy++;.  }.  re
cf10: 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a  turn rc; .}../*.
cf20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
cf30: 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61  sets the busy ca
cf40: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71  llback for an Sq
cf50: 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f  lite database to
cf60: 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61   the.** given ca
cf70: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
cf80: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61  with the given a
cf90: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
cfa0: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
cfb0: 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  dler(.  sqlite3 
cfc0: 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75  *db,.  int (*xBu
cfd0: 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a  sy)(void*,int),.
cfe0: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
cff0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d000: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
d010: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
d020: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
d030: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
d040: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
d050: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
d060: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
d070: 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  ex);.  db->busyH
d080: 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78  andler.xFunc = x
d090: 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79  Busy;.  db->busy
d0a0: 48 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70  Handler.pArg = p
d0b0: 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  Arg;.  db->busyH
d0c0: 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
d0d0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  ;.  db->busyTime
d0e0: 6f 75 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  out = 0;.  sqlit
d0f0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
d100: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
d110: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d120: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d130: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
d140: 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68  ALLBACK./*.** Th
d150: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
d160: 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  the progress cal
d170: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
d180: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
d190: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
d1a0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
d1b0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
d1c0: 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67  gument. The prog
d1d0: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69  ress callback wi
d1e0: 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ll.** be invoked
d1f0: 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f   every nOps opco
d200: 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  des..*/.void sql
d210: 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
d220: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
d230: 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70   *db, .  int nOp
d240: 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67  s,.  int (*xProg
d250: 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20  ress)(void*), . 
d260: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23   void *pArg.){.#
d270: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d280: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
d290: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
d2a0: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
d2b0: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
d2c0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
d2d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
d2e0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
d2f0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
d300: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f  mutex);.  if( nO
d310: 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  ps>0 ){.    db->
d320: 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f  xProgress = xPro
d330: 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e  gress;.    db->n
d340: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 28 75  ProgressOps = (u
d350: 6e 73 69 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20  nsigned)nOps;.  
d360: 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41    db->pProgressA
d370: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c  rg = pArg;.  }el
d380: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f  se{.    db->xPro
d390: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64  gress = 0;.    d
d3a0: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
d3b0: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72  = 0;.    db->pPr
d3c0: 6f 67 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20  ogressArg = 0;. 
d3d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
d3e0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
d3f0: 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ex);.}.#endif...
d400: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
d410: 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65  ne installs a de
d420: 66 61 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c  fault busy handl
d430: 65 72 20 74 68 61 74 20 77 61 69 74 73 20 66 6f  er that waits fo
d440: 72 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  r the.** specifi
d450: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  ed number of mil
d460: 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65  liseconds before
d470: 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f   returning 0..*/
d480: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73  .int sqlite3_bus
d490: 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65  y_timeout(sqlite
d4a0: 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a  3 *db, int ms){.
d4b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d4c0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
d4d0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
d4e0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
d4f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
d500: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
d510: 69 66 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b  if.  if( ms>0 ){
d520: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
d530: 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71  y_handler(db, sq
d540: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
d550: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29  allback, (void*)
d560: 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73  db);.    db->bus
d570: 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20  yTimeout = ms;. 
d580: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
d590: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
d5a0: 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  (db, 0, 0);.  }.
d5b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d5c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75  OK;.}../*.** Cau
d5d0: 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f  se any pending o
d5e0: 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70  peration to stop
d5f0: 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74   at its earliest
d600: 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f   opportunity..*/
d610: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e  .void sqlite3_in
d620: 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20  terrupt(sqlite3 
d630: 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *db){.#ifdef SQL
d640: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
d650: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
d660: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
d670: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
d680: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
d690: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
d6a0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 64  ;.  }.#endif.  d
d6b0: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
d6c0: 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  ted = 1;.}.../*.
d6d0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d6e0: 20 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20   is exactly the 
d6f0: 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f  same as sqlite3_
d700: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
d710: 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61  ), except.** tha
d720: 74 20 69 74 20 69 73 20 64 65 73 69 67 6e 65 64  t it is designed
d730: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79   to be called by
d740: 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20   internal code. 
d750: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69  The difference i
d760: 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d  s.** that if a m
d770: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e  alloc() fails in
d780: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
d790: 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65  function(), an e
d7a0: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
d7b0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
d7c0: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c   mallocFailed fl
d7d0: 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a  ag cleared. .*/.
d7e0: 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61 74  int sqlite3Creat
d7f0: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
d800: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
d810: 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  ar *zFunctionNam
d820: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  e,.  int nArg,. 
d830: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
d840: 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76   *pUserData,.  v
d850: 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71  oid (*xSFunc)(sq
d860: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
d870: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
d880: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
d890: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
d8a0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
d8b0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
d8c0: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
d8d0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
d8e0: 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  ,.  FuncDestruct
d8f0: 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a  or *pDestructor.
d900: 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b  ){.  FuncDef *p;
d910: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20  .  int nName;.  
d920: 69 6e 74 20 65 78 74 72 61 46 6c 61 67 73 3b 0a  int extraFlags;.
d930: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d940: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
d950: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
d960: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  ( zFunctionName=
d970: 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 53 46  =0 ||.      (xSF
d980: 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c  unc && (xFinal |
d990: 7c 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20  | xStep)) || .  
d9a0: 20 20 20 20 28 21 78 53 46 75 6e 63 20 26 26 20      (!xSFunc && 
d9b0: 28 78 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65  (xFinal && !xSte
d9c0: 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78  p)) ||.      (!x
d9d0: 53 46 75 6e 63 20 26 26 20 28 21 78 46 69 6e 61  SFunc && (!xFina
d9e0: 6c 20 26 26 20 78 53 74 65 70 29 29 20 7c 7c 0a  l && xStep)) ||.
d9f0: 20 20 20 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c        (nArg<-1 |
da00: 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41  | nArg>SQLITE_MA
da10: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20  X_FUNCTION_ARG) 
da20: 7c 7c 0a 20 20 20 20 20 20 28 32 35 35 3c 28 6e  ||.      (255<(n
da30: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
da40: 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f  rlen30( zFunctio
da50: 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20  nName))) ){.    
da60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
da70: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  SUSE_BKPT;.  }..
da80: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
da90: 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d  _FUNC_CONSTANT==
daa0: 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
dab0: 53 54 49 43 20 29 3b 0a 20 20 65 78 74 72 61 46  STIC );.  extraF
dac0: 6c 61 67 73 20 3d 20 65 6e 63 20 26 20 20 53 51  lags = enc &  SQ
dad0: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
dae0: 49 43 3b 0a 20 20 65 6e 63 20 26 3d 20 28 53 51  IC;.  enc &= (SQ
daf0: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
db00: 4b 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20  K|SQLITE_ANY);. 
db10: 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
db20: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a  _OMIT_UTF16.  /*
db30: 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   If SQLITE_UTF16
db40: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
db50: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79   the encoding ty
db60: 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68  pe, transform th
db70: 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f  is.  ** to one o
db80: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  f SQLITE_UTF16LE
db90: 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36   or SQLITE_UTF16
dba0: 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  BE using the.  *
dbb0: 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
dbc0: 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49  TIVE macro. SQLI
dbd0: 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20  TE_UTF16 is not 
dbe0: 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  used internally.
dbf0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51  .  **.  ** If SQ
dc00: 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63  LITE_ANY is spec
dc10: 69 66 69 65 64 2c 20 61 64 64 20 74 68 72 65 65  ified, add three
dc20: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
dc30: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74   function.  ** t
dc40: 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  o the hash table
dc50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63  ..  */.  if( enc
dc60: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29  ==SQLITE_UTF16 )
dc70: 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49  {.    enc = SQLI
dc80: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
dc90: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d    }else if( enc=
dca0: 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20  =SQLITE_ANY ){. 
dcb0: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72     int rc;.    r
dcc0: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
dcd0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74  eFunc(db, zFunct
dce0: 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  ionName, nArg, S
dcf0: 51 4c 49 54 45 5f 55 54 46 38 7c 65 78 74 72 61  QLITE_UTF8|extra
dd00: 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
dd10: 70 55 73 65 72 44 61 74 61 2c 20 78 53 46 75 6e  pUserData, xSFun
dd20: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
dd30: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
dd40: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
dd50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
dd60: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
dd70: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74  eFunc(db, zFunct
dd80: 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  ionName, nArg, S
dd90: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 7c 65 78  QLITE_UTF16LE|ex
dda0: 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  traFlags,.      
ddb0: 20 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78      pUserData, x
ddc0: 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  SFunc, xStep, xF
ddd0: 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f  inal, pDestructo
dde0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
ddf0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
de00: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
de10: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e  rc;.    }.    en
de20: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c = SQLITE_UTF16
de30: 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  BE;.  }.#else.  
de40: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
de50: 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f  8;.#endif.  .  /
de60: 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 20 65 78  * Check if an ex
de70: 69 73 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  isting function 
de80: 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64  is being overrid
de90: 64 65 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  den or deleted. 
dea0: 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20  If so,.  ** and 
deb0: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
dec0: 20 56 4d 73 2c 20 74 68 65 6e 20 72 65 74 75 72   VMs, then retur
ded0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 49  n SQLITE_BUSY. I
dee0: 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  f a function.  *
def0: 2a 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72  * is being overr
df00: 69 64 64 65 6e 2f 64 65 6c 65 74 65 64 20 62 75  idden/deleted bu
df10: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  t there are no a
df20: 63 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77  ctive VMs, allow
df30: 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74   the.  ** operat
df40: 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ion to continue 
df50: 62 75 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61  but invalidate a
df60: 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73  ll precompiled s
df70: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
df80: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    p = sqlite3Fin
df90: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46  dFunction(db, zF
dfa0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
dfb0: 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a  g, (u8)enc, 0);.
dfc0: 20 20 69 66 28 20 70 20 26 26 20 28 70 2d 3e 66    if( p && (p->f
dfd0: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
dfe0: 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d  E_FUNC_ENCMASK)=
dff0: 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d  =enc && p->nArg=
e000: 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28  =nArg ){.    if(
e010: 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
e020: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e030: 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
e040: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a  , SQLITE_BUSY, .
e050: 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20          "unable 
e060: 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79  to delete/modify
e070: 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64   user-function d
e080: 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61  ue to active sta
e090: 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20  tements");.     
e0a0: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
e0b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
e0c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e0d0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73  E_BUSY;.    }els
e0e0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
e0f0: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
e100: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
e110: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73    }.  }..  p = s
e120: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
e130: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
e140: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29  Name, nArg, (u8)
e150: 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  enc, 1);.  asser
e160: 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  t(p || db->mallo
e170: 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20  cFailed);.  if( 
e180: 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
e190: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
e1a0: 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
e1b0: 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   an older versio
e1c0: 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  n of the functio
e1d0: 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75  n with a configu
e1e0: 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69  red destructor i
e1f0: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70  s.  ** being rep
e200: 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65  laced invoke the
e210: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
e220: 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tion here. */.  
e230: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
e240: 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70  db, p);..  if( p
e250: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
e260: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
e270: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Ref++;.  }.  p->
e280: 75 2e 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20  u.pDestructor = 
e290: 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70  pDestructor;.  p
e2a0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70  ->funcFlags = (p
e2b0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
e2c0: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
e2d0: 4b 29 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b  K) | extraFlags;
e2e0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e  .  testcase( p->
e2f0: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
e300: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
e310: 20 29 3b 0a 20 20 70 2d 3e 78 53 46 75 6e 63 20   );.  p->xSFunc 
e320: 3d 20 78 53 46 75 6e 63 20 3f 20 78 53 46 75 6e  = xSFunc ? xSFun
e330: 63 20 3a 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e  c : xStep;.  p->
e340: 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e  xFinalize = xFin
e350: 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61  al;.  p->pUserDa
e360: 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a  ta = pUserData;.
e370: 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36    p->nArg = (u16
e380: 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20  )nArg;.  return 
e390: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e3a0: 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75  .** Create new u
e3b0: 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ser functions..*
e3c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
e3d0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
e3e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
e3f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
e400: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
e410: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
e420: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53   *p,.  void (*xS
e430: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
e440: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
e450: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
e460: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
e470: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
e480: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
e490: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
e4a0: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
e4b0: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65  ontext*).){.  re
e4c0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
e4d0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
e4e0: 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c  db, zFunc, nArg,
e4f0: 20 65 6e 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c   enc, p, xSFunc,
e500: 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20   xStep,.        
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e520: 20 20 20 20 20 20 20 20 20 20 20 20 78 46 69 6e              xFin
e530: 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73  al, 0);.}..int s
e540: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
e550: 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c  nction_v2(.  sql
e560: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
e570: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20  t char *zFunc,. 
e580: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
e590: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c   enc,.  void *p,
e5a0: 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63  .  void (*xSFunc
e5b0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e5c0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e5d0: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
e5e0: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
e5f0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e600: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
e610: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
e620: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
e630: 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  xt*),.  void (*x
e640: 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29  Destroy)(void *)
e650: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
e660: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46  QLITE_ERROR;.  F
e670: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
e680: 41 72 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  Arg = 0;..#ifdef
e690: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
e6a0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
e6b0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
e6c0: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
e6d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
e6e0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
e6f0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
e700: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
e710: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44  mutex);.  if( xD
e720: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41  estroy ){.    pA
e730: 72 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75  rg = (FuncDestru
e740: 63 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62  ctor *)sqlite3Db
e750: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
e760: 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75  izeof(FuncDestru
e770: 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ctor));.    if( 
e780: 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78  !pArg ){.      x
e790: 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20  Destroy(p);.    
e7a0: 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20    goto out;.    
e7b0: 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73  }.    pArg->xDes
e7c0: 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b  troy = xDestroy;
e7d0: 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72  .    pArg->pUser
e7e0: 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Data = p;.  }.  
e7f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
e800: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
e810: 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20  , nArg, enc, p, 
e820: 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78  xSFunc, xStep, x
e830: 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20  Final, pArg);.  
e840: 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
e850: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
e860: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
e870: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44  ITE_OK );.    xD
e880: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73  estroy(p);.    s
e890: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e8a0: 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75   pArg);.  }.. ou
e8b0: 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  t:.  rc = sqlite
e8c0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
e8d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
e8e0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
e8f0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
e900: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
e910: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e  TE_OMIT_UTF16.in
e920: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
e930: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73  _function16(.  s
e940: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
e950: 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74  nst void *zFunct
e960: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
e970: 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74  Arg,.  int eText
e980: 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  Rep,.  void *p,.
e990: 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29    void (*xSFunc)
e9a0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e9b0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
e9c0: 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  lue**),.  void (
e9d0: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
e9e0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
e9f0: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
ea00: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
ea10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
ea20: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ).){.  int rc;. 
ea30: 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a   char *zFunc8;..
ea40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
ea50: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
ea60: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
ea70: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c  etyCheckOk(db) |
ea80: 7c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  | zFunctionName=
ea90: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
eaa0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
eab0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
eac0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
ead0: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
eae0: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
eaf0: 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38  iled );.  zFunc8
eb00: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74   = sqlite3Utf16t
eb10: 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  o8(db, zFunction
eb20: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
eb30: 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
eb40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
eb50: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
eb60: 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52  c8, nArg, eTextR
eb70: 65 70 2c 20 70 2c 20 78 53 46 75 6e 63 2c 78 53  ep, p, xSFunc,xS
eb80: 74 65 70 2c 78 46 69 6e 61 6c 2c 30 29 3b 0a 20  tep,xFinal,0);. 
eb90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
eba0: 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63  b, zFunc8);.  rc
ebb0: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
ebc0: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
ebd0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
ebe0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
ebf0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
ec00: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61  if.../*.** Decla
ec10: 72 65 20 74 68 61 74 20 61 20 66 75 6e 63 74 69  re that a functi
ec20: 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  on has been over
ec30: 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69 72 74  loaded by a virt
ec40: 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
ec50: 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   If the function
ec60: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
ec70: 61 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f  as a regular glo
ec80: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  bal function, th
ec90: 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
eca0: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
ecb0: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
ecc0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
ecd0: 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61  then create.** a
ece0: 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c   new one that al
ecf0: 77 61 79 73 20 74 68 72 6f 77 73 20 61 20 72 75  ways throws a ru
ed00: 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a  n-time error.  .
ed10: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75  **.** When virtu
ed20: 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64  al tables intend
ed30: 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f   to provide an o
ed40: 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69  verloaded functi
ed50: 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75  on, they.** shou
ed60: 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ld call this rou
ed70: 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  tine to make sur
ed80: 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e  e the global fun
ed90: 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a  ction exists..**
eda0: 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69   A global functi
edb0: 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e  on must exist in
edc0: 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20   order for name 
edd0: 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f  resolution to wo
ede0: 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a  rk.** properly..
edf0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
ee00: 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e  verload_function
ee10: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
ee20: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
ee30: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
ee40: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
ee50: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65  QLITE_OK;..#ifde
ee60: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ee70: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
ee80: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
ee90: 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61  eckOk(db) || zNa
eea0: 6d 65 3d 3d 30 20 7c 7c 20 6e 41 72 67 3c 2d 32  me==0 || nArg<-2
eeb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
eec0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
eed0: 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  T;.  }.#endif.  
eee0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
eef0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
ef00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
ef10: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e  dFunction(db, zN
ef20: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
ef30: 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b  E_UTF8, 0)==0 ){
ef40: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ef50: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
ef60: 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  zName, nArg, SQL
ef70: 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef90: 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49       0, sqlite3I
efa0: 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20  nvalidFunction, 
efb0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
efc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
efd0: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
efe0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
eff0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f000: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
f010: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f020: 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52  IT_TRACE./*.** R
f030: 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20  egister a trace 
f040: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  function.  The p
f050: 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65  Arg from the pre
f060: 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
f070: 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72  ed trace.** is r
f080: 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a  eturned.  .**.**
f090: 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75   A NULL trace fu
f0a0: 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  nction means tha
f0b0: 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20  t no tracing is 
f0c0: 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e  executes.  A non
f0d0: 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69  -NULL.** trace i
f0e0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
f0f0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
f100: 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
f110: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a   start of each.*
f120: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  * SQL statement.
f130: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
f140: 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20  3_trace(sqlite3 
f150: 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61  *db, void (*xTra
f160: 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  ce)(void*,const 
f170: 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41  char*), void *pA
f180: 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  rg){.  void *pOl
f190: 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
f1a0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
f1b0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
f1c0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
f1d0: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
f1e0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
f1f0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
f200: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
f210: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
f220: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
f230: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61   pOld = db->pTra
f240: 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72  ceArg;.  db->xTr
f250: 61 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20  ace = xTrace;.  
f260: 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20  db->pTraceArg = 
f270: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
f280: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
f290: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
f2a0: 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52   pOld;.}./*.** R
f2b0: 65 67 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c  egister a profil
f2c0: 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  e function.  The
f2d0: 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70   pArg from the p
f2e0: 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74  reviously regist
f2f0: 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65  ered .** profile
f300: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74   function is ret
f310: 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  urned.  .**.** A
f320: 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75   NULL profile fu
f330: 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  nction means tha
f340: 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69  t no profiling i
f350: 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e  s executes.  A n
f360: 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69  on-NULL.** profi
f370: 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  le is a pointer 
f380: 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68  to a function th
f390: 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74  at is invoked at
f3a0: 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
f3b0: 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73  of.** each SQL s
f3c0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73  tatement that is
f3d0: 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73   run..*/.void *s
f3e0: 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a  qlite3_profile(.
f3f0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
f400: 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65   void (*xProfile
f410: 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
f420: 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36  ar*,sqlite_uint6
f430: 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  4),.  void *pArg
f440: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  .){.  void *pOld
f450: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
f460: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
f470: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
f480: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
f490: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
f4a0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
f4b0: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
f4c0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
f4d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
f4e0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
f4f0: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66  pOld = db->pProf
f500: 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50  ileArg;.  db->xP
f510: 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c  rofile = xProfil
f520: 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c  e;.  db->pProfil
f530: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
f540: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f550: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f560: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
f570: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f580: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a  _OMIT_TRACE */..
f590: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
f5a0: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
f5b0: 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74  invoked when a t
f5c0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
f5d0: 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ts..** If the in
f5e0: 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72  voked function r
f5f0: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
f600: 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74   then the commit
f610: 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f   becomes a.** ro
f620: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  llback..*/.void 
f630: 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f  *sqlite3_commit_
f640: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
f650: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
f660: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
f670: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
f680: 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28  abase */.  int (
f690: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
f6a0: 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  *),  /* Function
f6b0: 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61   to invoke on ea
f6c0: 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76  ch commit */.  v
f6d0: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
f6e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
f6f0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
f700: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
f710: 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66  d *pOld;..#ifdef
f720: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
f730: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
f740: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
f750: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
f760: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
f770: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
f780: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
f790: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
f7a0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
f7b0: 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62  ex);.  pOld = db
f7c0: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20  ->pCommitArg;.  
f7d0: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
f7e0: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
f7f0: 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72  .  db->pCommitAr
f800: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
f810: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f820: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f830: 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a  turn pOld;.}../*
f840: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
f850: 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
f860: 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
f870: 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64  a row is updated
f880: 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72  ,.** inserted or
f890: 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74   deleted using t
f8a0: 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
f8b0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
f8c0: 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65   *sqlite3_update
f8d0: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
f8e0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
f8f0: 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
f900: 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
f910: 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64  tabase */.  void
f920: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
f930: 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e  id*,int,char con
f940: 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20  st *,char const 
f950: 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c  *,sqlite_int64),
f960: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f980: 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
f990: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
f9a0: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69   void *pRet;..#i
f9b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
f9c0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
f9d0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
f9e0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
f9f0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
fa00: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
fa10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
fa20: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
fa30: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
fa40: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
fa50: 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67  = db->pUpdateArg
fa60: 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43  ;.  db->xUpdateC
fa70: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
fa80: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61  ack;.  db->pUpda
fa90: 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  teArg = pArg;.  
faa0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
fab0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
fac0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
fad0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
fae0: 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
faf0: 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
fb00: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
fb10: 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n is rolled.** b
fb20: 61 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61  ack by this data
fb30: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
fb40: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
fb50: 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28  3_rollback_hook(
fb60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb80: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
fb90: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
fba0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
fbb0: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20  llback)(void*), 
fbc0: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  /* Callback func
fbd0: 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
fbe0: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
fbf0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
fc00: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
fc10: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
fc20: 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  et;..#ifdef SQLI
fc30: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
fc40: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
fc50: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
fc60: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
fc70: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
fc80: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
fc90: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
fca0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
fcb0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
fcc0: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f    pRet = db->pRo
fcd0: 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d  llbackArg;.  db-
fce0: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
fcf0: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
fd00: 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41    db->pRollbackA
fd10: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
fd20: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
fd30: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
fd40: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
fd50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fd60: 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65  IT_WAL./*.** The
fd70: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
fd80: 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67  k() callback reg
fd90: 69 73 74 65 72 65 64 20 62 79 20 73 71 6c 69 74  istered by sqlit
fda0: 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
fdb0: 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f  point()..** Invo
fdc0: 6b 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  ke sqlite3_wal_c
fdd0: 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65  heckpoint if the
fde0: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65   number of frame
fdf0: 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  s in the log fil
fe00: 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
fe10: 74 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61  than sqlite3.pWa
fe20: 6c 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20  lArg cast to an 
fe30: 69 6e 74 65 67 65 72 20 28 74 68 65 20 76 61 6c  integer (the val
fe40: 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ue configured by
fe50: 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63  .** wal_autochec
fe60: 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69  kpoint())..*/ .i
fe70: 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66  nt sqlite3WalDef
fe80: 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64  aultHook(.  void
fe90: 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20   *pClientData,  
fea0: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a     /* Argument *
feb0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
fec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
fed0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  nnection */.  co
fee0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
fef0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
ff00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65   */.  int nFrame
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff20: 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29  Size of WAL */.)
ff30: 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d  {.  if( nFrame>=
ff40: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
ff50: 54 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29  T(pClientData) )
ff60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
ff70: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
ff80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  ;.    sqlite3_wa
ff90: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  l_checkpoint(db,
ffa0: 20 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   zDb);.    sqlit
ffb0: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
ffc0: 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  c();.  }.  retur
ffd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
ffe0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
fff0: 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
10000 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20  ** Configure an 
10010 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
10020 28 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61  () callback to a
10030 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65  utomatically che
10040 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74  ckpoint.** a dat
10050 61 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d  abase after comm
10060 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
10070 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72  tion if there ar
10080 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d  e nFrame or.** m
10090 6f 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68  ore frames in th
100a0 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73  e log file. Pass
100b0 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65  ing zero or a ne
100c0 67 61 74 69 76 65 20 76 61 6c 75 65 20 61 73 20  gative value as 
100d0 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61  the.** nFrame pa
100e0 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73  rameter disables
100f0 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b   automatic check
10100 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e  points entirely.
10110 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62  .**.** The callb
10120 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62  ack registered b
10130 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
10140 72 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69  replaces any exi
10150 73 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a  sting callback.*
10160 2a 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69  * registered usi
10170 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  ng sqlite3_wal_h
10180 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c  ook(). Likewise,
10190 20 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 63   registering a c
101a0 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  allback.** using
101b0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
101c0 6b 28 29 20 64 69 73 61 62 6c 65 73 20 74 68 65  k() disables the
101d0 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b   automatic check
101e0 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a  point mechanism.
101f0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ** configured by
10200 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
10210 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
10220 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
10230 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
10240 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64  nt nFrame){.#ifd
10250 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
10260 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  AL.  UNUSED_PARA
10270 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55  METER(db);.  UNU
10280 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46  SED_PARAMETER(nF
10290 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 23 69 66  rame);.#else.#if
102a0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
102b0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
102c0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
102d0 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
102e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
102f0 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
10300 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29    if( nFrame>0 )
10310 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  {.    sqlite3_wa
10320 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74  l_hook(db, sqlit
10330 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b  e3WalDefaultHook
10340 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  , SQLITE_INT_TO_
10350 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20  PTR(nFrame));.  
10360 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
10370 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20  e3_wal_hook(db, 
10380 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
10390 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
103a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
103b0 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
103c0 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
103d0 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
103e0 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74  nsaction is writ
103f0 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  ten.** into the 
10400 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20  write-ahead-log 
10410 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
10420 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
10430 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61  void *sqlite3_wa
10440 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  l_hook(.  sqlite
10450 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
10460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
10470 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
10480 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a  this db handle *
10490 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61  /.  int(*xCallba
104a0 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69  ck)(void *, sqli
104b0 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  te3*, const char
104c0 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  *, int),.  void 
104d0 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
104e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
104f0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
10500 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b  sed to xCallback
10510 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  () */.){.#ifndef
10520 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
10530 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 23  .  void *pRet;.#
10540 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10550 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
10560 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
10570 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
10580 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
10590 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
105a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
105b0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
105c0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
105d0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
105e0 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a   = db->pWalArg;.
105f0 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61    db->xWalCallba
10600 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
10610 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20    db->pWalArg = 
10620 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
10630 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
10640 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
10650 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72   pRet;.#else.  r
10660 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
10670 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f  }../*.** Checkpo
10680 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62  int database zDb
10690 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
106a0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
106b0 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  v2(.  sqlite3 *d
106c0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
106d0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
106e0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f  e handle */.  co
106f0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
10700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10710 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68 65   Name of attache
10720 64 20 64 61 74 61 62 61 73 65 20 28 6f 72 20 4e  d database (or N
10730 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d  ULL) */.  int eM
10740 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
10750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
10760 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a  ITE_CHECKPOINT_*
10770 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
10780 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20 20  *pnLog,         
10790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
107a0 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20  UT: Size of WAL 
107b0 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f  log in frames */
107c0 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20  .  int *pnCkpt  
107d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107e0 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c     /* OUT: Total
107f0 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65   number of frame
10800 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a  s checkpointed *
10810 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  /.){.#ifdef SQLI
10820 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65  TE_OMIT_WAL.  re
10830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10840 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 20  #else.  int rc; 
10850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10860 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
10870 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
10880 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  iDb = SQLITE_MAX
10890 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20 73  _ATTACHED;  /* s
108a0 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64  qlite3.aDb[] ind
108b0 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65 63  ex of db to chec
108c0 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65  kpoint */..#ifde
108d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
108e0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
108f0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
10900 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
10910 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
10920 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 0a 20  _BKPT;.#endif.. 
10930 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
10940 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
10950 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73  les to -1 in cas
10960 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
10970 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f  s. */.  if( pnLo
10980 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b  g ) *pnLog = -1;
10990 0a 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20  .  if( pnCkpt ) 
109a0 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20  *pnCkpt = -1;.. 
109b0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
109c0 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
109d0 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  VE==0 );.  asser
109e0 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
109f0 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a  OINT_FULL==1 );.
10a00 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
10a10 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54  _CHECKPOINT_REST
10a20 41 52 54 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65  ART==2 );.  asse
10a30 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
10a40 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d  POINT_TRUNCATE==
10a50 33 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  3 );.  if( eMode
10a60 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  <SQLITE_CHECKPOI
10a70 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d  NT_PASSIVE || eM
10a80 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b  ode>SQLITE_CHECK
10a90 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 20 29  POINT_TRUNCATE )
10aa0 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
10ab0 45 2d 4f 46 3a 20 52 2d 30 33 39 39 36 2d 31 32  E-OF: R-03996-12
10ac0 30 38 38 20 54 68 65 20 4d 20 70 61 72 61 6d 65  088 The M parame
10ad0 74 65 72 20 6d 75 73 74 20 62 65 20 61 20 76 61  ter must be a va
10ae0 6c 69 64 20 63 68 65 63 6b 70 6f 69 6e 74 0a 20  lid checkpoint. 
10af0 20 20 20 2a 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20     ** mode: */. 
10b00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10b10 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20  _MISUSE;.  }..  
10b20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10b30 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
10b40 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62    if( zDb && zDb
10b50 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d  [0] ){.    iDb =
10b60 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
10b70 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d  me(db, zDb);.  }
10b80 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a  .  if( iDb<0 ){.
10b90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10ba0 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
10bb0 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
10bc0 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  b, SQLITE_ERROR,
10bd0 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61   "unknown databa
10be0 73 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20  se: %s", zDb);. 
10bf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
10c00 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73  busyHandler.nBus
10c10 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
10c20 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e  sqlite3Checkpoin
10c30 74 28 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65  t(db, iDb, eMode
10c40 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29  , pnLog, pnCkpt)
10c50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
10c60 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a  or(db, rc);.  }.
10c70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
10c80 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
10c90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10ca0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
10cb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
10cc0 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ndif.}.../*.** C
10cd0 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61  heckpoint databa
10ce0 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69  se zDb. If zDb i
10cf0 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68  s NULL, or if th
10d00 65 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69  e buffer zDb poi
10d10 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69  nts.** to contai
10d20 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  ns a zero-length
10d30 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74   string, all att
10d40 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
10d50 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69  are .** checkpoi
10d60 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nted..*/.int sql
10d70 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
10d80 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
10d90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
10da0 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  ){.  /* EVIDENCE
10db0 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32 30 35  -OF: R-41613-205
10dc0 35 33 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77  53 The sqlite3_w
10dd0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c  al_checkpoint(D,
10de0 58 29 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  X) is equivalent
10df0 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   to.  ** sqlite3
10e00 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
10e10 76 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48  v2(D,X,SQLITE_CH
10e20 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
10e30 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75  ,0,0). */.  retu
10e40 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  rn sqlite3_wal_c
10e50 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c  heckpoint_v2(db,
10e60 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b  zDb,SQLITE_CHECK
10e70 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c  POINT_PASSIVE,0,
10e80 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  0);.}..#ifndef S
10e90 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
10ea0 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b  *.** Run a check
10eb0 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73  point on databas
10ec0 65 20 69 44 62 2e 20 54 68 69 73 20 69 73 20 61  e iDb. This is a
10ed0 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61   no-op if databa
10ee0 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74  se iDb is.** not
10ef0 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
10f00 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a  in WAL mode..**.
10f10 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
10f20 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74  ion is open on t
10f30 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
10f40 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20  g checkpointed, 
10f50 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
10f60 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
10f70 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68  _LOCKED and a ch
10f80 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  eckpoint is not 
10f90 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a  attempted. If .*
10fa0 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
10fb0 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20  s while running 
10fc0 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20  the checkpoint, 
10fd0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
10fe0 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
10ff0 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54  rned (i.e. SQLIT
11000 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77  E_IOERR). Otherw
11010 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
11020 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
11030 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
11040 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20  le db should be 
11050 68 65 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c  held by the call
11060 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a  er. The mutex.**
11070 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
11080 20 74 68 65 20 73 70 65 63 69 66 69 63 20 62 2d   the specific b-
11090 74 72 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b  tree being check
110a0 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e  pointed is taken
110b0 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63   by.** this func
110c0 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63  tion while the c
110d0 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e  heckpoint is run
110e0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  ning..**.** If i
110f0 44 62 20 69 73 20 70 61 73 73 65 64 20 53 51 4c  Db is passed SQL
11100 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
11110 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63  , then all attac
11120 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72  hed databases ar
11130 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65  e.** checkpointe
11140 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  d. If an error i
11150 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
11160 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d   is returned imm
11170 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f  ediately -.** no
11180 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
11190 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61   to checkpoint a
111a0 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74  ny remaining dat
111b0 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61  abases..**.** Pa
111c0 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73  rameter eMode is
111d0 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43   one of SQLITE_C
111e0 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
111f0 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45 53 54 41  E, FULL or RESTA
11200 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  RT..*/.int sqlit
11210 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  e3Checkpoint(sql
11220 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
11230 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e  b, int eMode, in
11240 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70  t *pnLog, int *p
11250 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63  nCkpt){.  int rc
11260 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
11270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
11280 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
11290 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
112b0 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
112c0 20 74 68 72 6f 75 67 68 20 61 74 74 61 63 68 65   through attache
112d0 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62  d dbs */.  int b
112e0 42 75 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Busy = 0;       
112f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
11300 75 65 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53  ue if SQLITE_BUS
11310 59 20 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75  Y has been encou
11320 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73  ntered */..  ass
11330 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11340 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
11350 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
11360 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67  !pnLog || *pnLog
11370 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ==-1 );.  assert
11380 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e  ( !pnCkpt || *pn
11390 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66  Ckpt==-1 );..  f
113a0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
113b0 62 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  b && rc==SQLITE_
113c0 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  OK; i++){.    if
113d0 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d  ( i==iDb || iDb=
113e0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  =SQLITE_MAX_ATTA
113f0 43 48 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63  CHED ){.      rc
11400 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
11410 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44  heckpoint(db->aD
11420 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c  b[i].pBt, eMode,
11430 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b   pnLog, pnCkpt);
11440 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30  .      pnLog = 0
11450 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d  ;.      pnCkpt =
11460 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
11470 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
11480 0a 20 20 20 20 20 20 20 20 62 42 75 73 79 20 3d  .        bBusy =
11490 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   1;.        rc =
114a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
114b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
114c0 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
114d0 49 54 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29  ITE_OK && bBusy)
114e0 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a   ? SQLITE_BUSY :
114f0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
11500 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
11510 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
11520 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
11530 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65   true if main-me
11540 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75  mory should be u
11550 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  sed instead of.*
11560 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
11570 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74  le for transient
11580 20 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64   pager files and
11590 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
115a0 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75  als..** The valu
115b0 65 20 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e  e returned depen
115c0 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
115d0 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  of db->temp_stor
115e0 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61  e (runtime.** pa
115f0 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65  rameter) and the
11600 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61   compile time va
11610 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45  lue of SQLITE_TE
11620 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a  MP_STORE. The.**
11630 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
11640 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72   describes the r
11650 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
11660 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61  een these two va
11670 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73  lues.** and this
11680 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
11690 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20  n value..**.**  
116a0 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
116b0 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f  RE     db->temp_
116c0 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69  store     Locati
116d0 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  on of temporary 
116e0 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d  database.**   --
116f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
11700 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
11710 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
11720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11730 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
11740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11750 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
11760 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
11770 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20  eturn 0).**   1 
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11790 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
117a0 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
117b0 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
117c0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
117d0 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
117e0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
117f0 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
11800 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
11810 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
11830 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
11840 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11870 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
11880 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
118b0 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
118c0 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20  turn 1).**   2  
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118e0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
118f0 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
11900 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
11910 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
11920 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20        any       
11930 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
11940 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f     (return 1).*/
11950 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70  .int sqlite3Temp
11960 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73  InMemory(const s
11970 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
11980 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
11990 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28  RE==1.  return (
119a0 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d   db->temp_store=
119b0 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =2 );.#endif.#if
119c0 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
119d0 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28  RE==2.  return (
119e0 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21   db->temp_store!
119f0 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =1 );.#endif.#if
11a00 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
11a10 52 45 3d 3d 33 0a 20 20 55 4e 55 53 45 44 5f 50  RE==3.  UNUSED_P
11a20 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20  ARAMETER(db);.  
11a30 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
11a40 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
11a50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49  _STORE<1 || SQLI
11a60 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a  TE_TEMP_STORE>3.
11a70 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
11a80 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  ER(db);.  return
11a90 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
11aa0 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38  .** Return UTF-8
11ab0 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68   encoded English
11ac0 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
11ad0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
11ae0 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f  t recent.** erro
11af0 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  r..*/.const char
11b00 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   *sqlite3_errmsg
11b10 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
11b20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
11b30 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
11b40 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
11b50 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d  rrStr(SQLITE_NOM
11b60 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20  EM_BKPT);.  }.  
11b70 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
11b80 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
11b90 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
11ba0 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
11bb0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
11bc0 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  PT);.  }.  sqlit
11bd0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
11be0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
11bf0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11c00 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  d ){.    z = sql
11c10 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
11c20 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20  E_NOMEM_BKPT);. 
11c30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73 74   }else{.    test
11c40 63 61 73 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d  case( db->pErr==
11c50 30 20 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68  0 );.    z = (ch
11c60 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
11c70 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29  e_text(db->pErr)
11c80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64  ;.    assert( !d
11c90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11ca0 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
11cb0 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
11cc0 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
11cd0 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  rrCode);.    }. 
11ce0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
11cf0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
11d00 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  ex);.  return z;
11d10 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
11d20 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
11d30 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31  .** Return UTF-1
11d40 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  6 encoded Englis
11d50 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
11d60 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
11d70 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
11d80 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  or..*/.const voi
11d90 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  d *sqlite3_errms
11da0 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29  g16(sqlite3 *db)
11db0 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
11dc0 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20   u16 outOfMem[] 
11dd0 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27  = {.    'o', 'u'
11de0 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c  , 't', ' ', 'o',
11df0 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20   'f', ' ', 'm', 
11e00 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27  'e', 'm', 'o', '
11e10 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a  r', 'y', 0.  };.
11e20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
11e30 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a  16 misuse[] = {.
11e40 20 20 20 20 27 6c 27 2c 20 27 69 27 2c 20 27 62      'l', 'i', 'b
11e50 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 72 27  ', 'r', 'a', 'r'
11e60 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'y', ' ', .   
11e70 20 27 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20   'r', 'o', 'u', 
11e80 27 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27  't', 'i', 'n', '
11e90 65 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 63  e', ' ', .    'c
11ea0 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27  ', 'a', 'l', 'l'
11eb0 2c 20 27 65 27 2c 20 27 64 27 2c 20 27 20 27 2c  , 'e', 'd', ' ',
11ec0 20 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20   .    'o', 'u', 
11ed0 27 74 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  't', ' ', .    '
11ee0 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a 20  o', 'f', ' ', . 
11ef0 20 20 20 27 73 27 2c 20 27 65 27 2c 20 27 71 27     's', 'e', 'q'
11f00 2c 20 27 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c  , 'u', 'e', 'n',
11f10 20 27 63 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d   'c', 'e', 0.  }
11f20 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ;..  const void 
11f30 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  *z;.  if( !db ){
11f40 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
11f50 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20  d *)outOfMem;.  
11f60 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
11f70 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
11f80 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
11f90 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69  eturn (void *)mi
11fa0 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  suse;.  }.  sqli
11fb0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11fc0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
11fd0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
11fe0 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76  ed ){.    z = (v
11ff0 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a  oid *)outOfMem;.
12000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d    }else{.    z =
12010 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
12020 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b  ext16(db->pErr);
12030 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
12040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
12050 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 64  rorWithMsg(db, d
12060 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71 6c 69  b->errCode, sqli
12070 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72  te3ErrStr(db->er
12080 72 43 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 7a  rCode));.      z
12090 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
120a0 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72  _text16(db->pErr
120b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
120c0 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68  A malloc() may h
120d0 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69  ave failed withi
120e0 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  n the call to sq
120f0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
12100 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76  16().    ** abov
12110 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
12120 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
12130 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12140 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a  d flag needs to.
12150 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65      ** be cleare
12160 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
12170 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65  ng. Do this dire
12180 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
12190 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69   via.    ** sqli
121a0 74 65 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f  te3ApiExit(), to
121b0 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74   avoid setting t
121c0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
121d0 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  le error message
121e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
121f0 69 74 65 33 4f 6f 6d 43 6c 65 61 72 28 64 62 29  ite3OomClear(db)
12200 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
12210 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
12220 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
12230 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
12240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
12250 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  6 */../*.** Retu
12260 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
12270 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65  nt error code ge
12280 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53 51  nerated by an SQ
12290 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66  Lite routine. If
122a0 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73   NULL is.** pass
122b0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
122c0 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61  ion, we assume a
122d0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
122e0 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   during sqlite3_
122f0 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  open()..*/.int s
12300 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73  qlite3_errcode(s
12310 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
12320 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65  f( db && !sqlite
12330 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
12340 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
12350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
12360 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
12370 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
12380 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
12390 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
123a0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
123b0 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65  }.  return db->e
123c0 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72  rrCode & db->err
123d0 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  Mask;.}.int sqli
123e0 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
123f0 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  code(sqlite3 *db
12400 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  ){.  if( db && !
12410 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
12420 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
12430 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12440 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
12450 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c  .  }.  if( !db |
12460 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
12470 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
12480 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
12490 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
124a0 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a   db->errCode;.}.
124b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
124c0 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
124d0 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f  ribes the kind o
124e0 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65  f error specifie
124f0 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75  d in the.** argu
12500 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20  ment.  For now, 
12510 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c  this simply call
12520 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
12530 71 6c 69 74 65 33 45 72 72 53 74 72 28 29 0a 2a  qlite3ErrStr().*
12540 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  * function..*/.c
12550 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
12560 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20 72 63  e3_errstr(int rc
12570 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
12580 74 65 33 45 72 72 53 74 72 28 72 63 29 3b 0a 7d  te3ErrStr(rc);.}
12590 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
125a0 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66   new collating f
125b0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61  unction for data
125c0 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65 20  base "db".  The 
125d0 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a  name is zName.**
125e0 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e   and the encodin
125f0 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61  g is enc..*/.sta
12600 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f  tic int createCo
12610 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
12620 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3* db,.  const 
12630 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
12640 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20  u8 enc,.  void* 
12650 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
12660 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
12670 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
12680 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20  ,const void*),. 
12690 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69   void(*xDel)(voi
126a0 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  d*).){.  CollSeq
126b0 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65   *pColl;.  int e
126c0 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  nc2;.  .  assert
126d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
126e0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
126f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49  );..  /* If SQLI
12700 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63  TE_UTF16 is spec
12710 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63  ified as the enc
12720 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e  oding type, tran
12730 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20  sform this.  ** 
12740 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  to one of SQLITE
12750 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49  _UTF16LE or SQLI
12760 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67  TE_UTF16BE using
12770 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
12780 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63  _UTF16NATIVE mac
12790 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ro. SQLITE_UTF16
127a0 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
127b0 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
127c0 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65  enc2 = enc;.  te
127d0 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51  stcase( enc2==SQ
127e0 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20  LITE_UTF16 );.  
127f0 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
12800 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
12810 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e  GNED );.  if( en
12820 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
12830 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45   || enc2==SQLITE
12840 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29  _UTF16_ALIGNED )
12850 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c  {.    enc2 = SQL
12860 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
12870 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c  .  }.  if( enc2<
12880 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65  SQLITE_UTF8 || e
12890 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36  nc2>SQLITE_UTF16
128a0 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  BE ){.    return
128b0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
128c0 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
128d0 68 65 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c  heck if this cal
128e0 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72  l is removing or
128f0 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78   replacing an ex
12900 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e  isting collation
12910 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e   .  ** sequence.
12920 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72   If so, and ther
12930 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
12940 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49  , return busy. I
12950 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65  f there.  ** are
12960 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
12970 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70  invalidate any p
12980 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  re-compiled stat
12990 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
129a0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
129b0 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75  ndCollSeq(db, (u
129c0 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30  8)enc2, zName, 0
129d0 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26  );.  if( pColl &
129e0 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b  & pColl->xCmp ){
129f0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64  .    if( db->nVd
12a00 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20  beActive ){.    
12a10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
12a20 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
12a30 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20  _BUSY, .        
12a40 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74  "unable to delet
12a50 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69  e/modify collati
12a60 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20  on sequence due 
12a70 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  to active statem
12a80 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65  ents");.      re
12a90 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
12aa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
12ab0 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
12ac0 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
12ad0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c  ..    /* If coll
12ae0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70  ation sequence p
12af0 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64  Coll was created
12b00 20 64 69 72 65 63 74 6c 79 20 62 79 20 61 20 63   directly by a c
12b10 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
12b20 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
12b30 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20  lation, and not 
12b40 67 65 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e  generated by syn
12b50 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20  thCollSeq(),.   
12b60 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70   ** then any cop
12b70 69 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74  ies made by synt
12b80 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20  hCollSeq() need 
12b90 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  to be invalidate
12ba0 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  d..    ** Also, 
12bb0 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75  collation destru
12bc0 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78  ctor - CollSeq.x
12bd0 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e  Del() - function
12be0 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a   may need.    **
12bf0 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20   to be called.. 
12c00 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28     */ .    if( (
12c10 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51  pColl->enc & ~SQ
12c20 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
12c30 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20  ED)==enc2 ){.   
12c40 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c     CollSeq *aCol
12c50 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  l = sqlite3HashF
12c60 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ind(&db->aCollSe
12c70 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  q, zName);.     
12c80 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
12c90 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
12ca0 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
12cb0 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d  q *p = &aColl[j]
12cc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
12cd0 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
12ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
12cf0 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20  ( p->xDel ){.   
12d00 20 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c           p->xDel
12d10 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20  (p->pUser);.    
12d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12d30 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20    p->xCmp = 0;. 
12d40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12d50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43  .    }.  }..  pC
12d60 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
12d70 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38  dCollSeq(db, (u8
12d80 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29  )enc2, zName, 1)
12d90 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30  ;.  if( pColl==0
12da0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
12db0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 70  _NOMEM_BKPT;.  p
12dc0 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f  Coll->xCmp = xCo
12dd0 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e  mpare;.  pColl->
12de0 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20  pUser = pCtx;.  
12df0 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44  pColl->xDel = xD
12e00 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63  el;.  pColl->enc
12e10 20 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28   = (u8)(enc2 | (
12e20 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46  enc & SQLITE_UTF
12e30 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20  16_ALIGNED));.  
12e40 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
12e50 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 72   SQLITE_OK);.  r
12e60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e70 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
12e80 61 72 72 61 79 20 64 65 66 69 6e 65 73 20 68 61  array defines ha
12e90 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20  rd upper bounds 
12ea0 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e  on limit values.
12eb0 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c    The.** initial
12ec0 69 7a 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70  izer must be kep
12ed0 74 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74  t in sync with t
12ee0 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  he SQLITE_LIMIT_
12ef0 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e  *.** #defines in
12f00 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73   sqlite3.h..*/.s
12f10 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
12f20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b  aHardLimit[] = {
12f30 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  .  SQLITE_MAX_LE
12f40 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  NGTH,.  SQLITE_M
12f50 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20  AX_SQL_LENGTH,. 
12f60 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
12f70 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  MN,.  SQLITE_MAX
12f80 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53  _EXPR_DEPTH,.  S
12f90 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
12fa0 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c  ND_SELECT,.  SQL
12fb0 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c  ITE_MAX_VDBE_OP,
12fc0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  .  SQLITE_MAX_FU
12fd0 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51  NCTION_ARG,.  SQ
12fe0 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
12ff0 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  D,.  SQLITE_MAX_
13000 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
13010 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
13020 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
13030 52 2c 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  R,      /* IMP: 
13040 52 2d 33 38 30 39 31 2d 33 32 33 35 32 20 2a 2f  R-38091-32352 */
13050 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  .  SQLITE_MAX_TR
13060 49 47 47 45 52 5f 44 45 50 54 48 2c 0a 20 20 53  IGGER_DEPTH,.  S
13070 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
13080 5f 54 48 52 45 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a  _THREADS,.};../*
13090 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
130a0 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72  e hard limits ar
130b0 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61  e set to reasona
130c0 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69  ble values.*/.#i
130d0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  f SQLITE_MAX_LEN
130e0 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
130f0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
13100 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
13110 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
13120 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
13130 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
13140 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ror SQLITE_MAX_S
13150 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  QL_LENGTH must b
13160 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
13170 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13180 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e  _MAX_SQL_LENGTH>
13190 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
131a0 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  H.# error SQLITE
131b0 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
131c0 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61  must not be grea
131d0 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  ter than SQLITE_
131e0 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69  MAX_LENGTH.#endi
131f0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
13200 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
13210 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <2.# error SQLIT
13220 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
13230 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61 74  ELECT must be at
13240 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a   least 2.#endif.
13250 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  #if SQLITE_MAX_V
13260 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f  DBE_OP<40.# erro
13270 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  r SQLITE_MAX_VDB
13280 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20  E_OP must be at 
13290 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a  least 40.#endif.
132a0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  #if SQLITE_MAX_F
132b0 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c  UNCTION_ARG<0 ||
132c0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
132d0 54 49 4f 4e 5f 41 52 47 3e 31 32 37 0a 23 20 65  TION_ARG>127.# e
132e0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
132f0 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73  FUNCTION_ARG mus
13300 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  t be between 0 a
13310 6e 64 20 31 32 37 0a 23 65 6e 64 69 66 0a 23 69  nd 127.#endif.#i
13320 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  f SQLITE_MAX_ATT
13330 41 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54  ACHED<0 || SQLIT
13340 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 31  E_MAX_ATTACHED>1
13350 32 35 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  25.# error SQLIT
13360 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 6d  E_MAX_ATTACHED m
13370 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30  ust be between 0
13380 20 61 6e 64 20 31 32 35 0a 23 65 6e 64 69 66 0a   and 125.#endif.
13390 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
133a0 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
133b0 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  TH<1.# error SQL
133c0 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
133d0 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74  TERN_LENGTH must
133e0 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
133f0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13400 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36  _MAX_COLUMN>3276
13410 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  7.# error SQLITE
13420 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74  _MAX_COLUMN must
13430 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37 36   not exceed 3276
13440 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  7.#endif.#if SQL
13450 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
13460 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20  DEPTH<1.# error 
13470 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
13480 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65  ER_DEPTH must be
13490 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64   at least 1.#end
134a0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
134b0 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
134c0 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  <0 || SQLITE_MAX
134d0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e  _WORKER_THREADS>
134e0 35 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  50.# error SQLIT
134f0 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
13500 45 41 44 53 20 6d 75 73 74 20 62 65 20 62 65 74  EADS must be bet
13510 77 65 65 6e 20 30 20 61 6e 64 20 35 30 0a 23 65  ween 0 and 50.#e
13520 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ndif.../*.** Cha
13530 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
13540 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72   a limit.  Repor
13550 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e  t the old value.
13560 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69  .** If an invali
13570 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73  d limit index is
13580 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72   supplied, repor
13590 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  t -1..** Make no
135a0 20 63 68 61 6e 67 65 73 20 62 75 74 20 73 74 69   changes but sti
135b0 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c  ll report the ol
135c0 64 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a  d value if the.*
135d0 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e  * new limit is n
135e0 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41  egative..**.** A
135f0 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74   new lower limit
13600 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b   does not shrink
13610 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72   existing constr
13620 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65  ucts..** It mere
13630 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20  ly prevents new 
13640 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74 20  constructs that 
13650 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74  exceed the limit
13660 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67  .** from forming
13670 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13680 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  _limit(sqlite3 *
13690 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c  db, int limitId,
136a0 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a   int newLimit){.
136b0 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a    int oldLimit;.
136c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
136d0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
136e0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
136f0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
13700 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
13710 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
13720 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
13730 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
13740 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
13750 33 30 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20  30189-54097 For 
13760 65 61 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67  each limit categ
13770 6f 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  ory SQLITE_LIMIT
13780 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65  _NAME.  ** there
13790 20 69 73 20 61 20 68 61 72 64 20 75 70 70 65 72   is a hard upper
137a0 20 62 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f   bound set at co
137b0 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20  mpile-time by a 
137c0 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20  C preprocessor. 
137d0 20 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64   ** macro called
137e0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45   SQLITE_MAX_NAME
137f0 2e 20 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22  . (The "_LIMIT_"
13800 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20   in the name is 
13810 63 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20  changed to.  ** 
13820 22 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20  "_MAX_".).  */. 
13830 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
13840 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
13850 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45  _LENGTH]==SQLITE
13860 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  _MAX_LENGTH );. 
13870 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
13880 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
13890 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  _SQL_LENGTH]==SQ
138a0 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
138b0 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  GTH );.  assert(
138c0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
138d0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
138e0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  ==SQLITE_MAX_COL
138f0 55 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UMN );.  assert(
13900 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
13910 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
13920 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  PTH]==SQLITE_MAX
13930 5f 45 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20  _EXPR_DEPTH );. 
13940 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
13950 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
13960 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
13970 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  ]==SQLITE_MAX_CO
13980 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a  MPOUND_SELECT);.
13990 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
139a0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
139b0 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49  T_VDBE_OP]==SQLI
139c0 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29  TE_MAX_VDBE_OP )
139d0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
139e0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
139f0 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MIT_FUNCTION_ARG
13a00 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  ]==SQLITE_MAX_FU
13a10 4e 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20  NCTION_ARG );.  
13a20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
13a30 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
13a40 41 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54  ATTACHED]==SQLIT
13a50 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29  E_MAX_ATTACHED )
13a60 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
13a70 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
13a80 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
13a90 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20  _LENGTH]==.     
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 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
13ad0 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
13ae0 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  N_LENGTH );.  as
13af0 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13b00 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
13b10 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d  RIABLE_NUMBER]==
13b20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
13b30 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61  BLE_NUMBER);.  a
13b40 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
13b50 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54  t[SQLITE_LIMIT_T
13b60 52 49 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53  RIGGER_DEPTH]==S
13b70 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
13b80 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  R_DEPTH );.  ass
13b90 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
13ba0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
13bb0 4b 45 52 5f 54 48 52 45 41 44 53 5d 3d 3d 53 51  KER_THREADS]==SQ
13bc0 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
13bd0 54 48 52 45 41 44 53 20 29 3b 0a 20 20 61 73 73  THREADS );.  ass
13be0 65 72 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49  ert( SQLITE_LIMI
13bf0 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
13c00 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49  ==(SQLITE_N_LIMI
13c10 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20  T-1) );...  if( 
13c20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d  limitId<0 || lim
13c30 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c  itId>=SQLITE_N_L
13c40 49 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75  IMIT ){.    retu
13c50 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64  rn -1;.  }.  old
13c60 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d  Limit = db->aLim
13c70 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69  it[limitId];.  i
13c80 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29  f( newLimit>=0 )
13c90 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
13ca0 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32      /* IMP: R-52
13cb0 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20  476-28732 */.   
13cc0 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48   if( newLimit>aH
13cd0 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ardLimit[limitId
13ce0 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69  ] ){.      newLi
13cf0 6d 69 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74  mit = aHardLimit
13d00 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49  [limitId];  /* I
13d10 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32 35 36 33  MP: R-51463-2563
13d20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64  4 */.    }.    d
13d30 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  b->aLimit[limitI
13d40 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20  d] = newLimit;. 
13d50 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c   }.  return oldL
13d60 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  imit;           
13d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
13d80 3a 20 52 2d 35 33 33 34 31 2d 33 35 34 31 39 20  : R-53341-35419 
13d90 2a 2f 0a 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  */.}.#if defined
13da0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
13db0 55 54 4f 5f 50 52 4f 46 49 4c 45 29 0a 2f 2a 20  UTO_PROFILE)./* 
13dc0 73 74 64 65 72 72 20 6c 6f 67 67 69 6e 67 20 2a  stderr logging *
13dd0 2f 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61  /.void _sqlite_a
13de0 75 74 6f 5f 70 72 6f 66 69 6c 65 28 76 6f 69 64  uto_profile(void
13df0 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61   *aux, const cha
13e00 72 20 2a 73 71 6c 2c 20 75 36 34 20 6e 73 29 3b  r *sql, u64 ns);
13e10 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75  .void _sqlite_au
13e20 74 6f 5f 74 72 61 63 65 28 76 6f 69 64 20 2a 61  to_trace(void *a
13e30 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ux, const char *
13e40 73 71 6c 29 3b 0a 76 6f 69 64 20 5f 73 71 6c 69  sql);.void _sqli
13e50 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65 28  te_auto_profile(
13e60 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74  void *aux, const
13e70 20 63 68 61 72 20 2a 73 71 6c 2c 20 75 36 34 20   char *sql, u64 
13e80 6e 73 29 20 7b 0a 23 70 72 61 67 6d 61 20 75 6e  ns) {.#pragma un
13e90 75 73 65 64 28 61 75 78 29 0a 09 66 70 72 69 6e  used(aux)..fprin
13ea0 74 66 28 73 74 64 65 72 72 2c 20 22 51 75 65 72  tf(stderr, "Quer
13eb0 79 3a 20 25 73 5c 6e 20 45 78 65 63 75 74 69 6f  y: %s\n Executio
13ec0 6e 20 54 69 6d 65 3a 20 25 6c 6c 75 20 6d 73 5c  n Time: %llu ms\
13ed0 6e 22 2c 20 73 71 6c 2c 20 6e 73 20 2f 20 31 30  n", sql, ns / 10
13ee0 30 30 30 30 30 29 3b 0a 7d 0a 76 6f 69 64 20 5f  00000);.}.void _
13ef0 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63  sqlite_auto_trac
13f00 65 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e  e(void *aux, con
13f10 73 74 20 63 68 61 72 20 2a 73 71 6c 29 20 7b 0a  st char *sql) {.
13f20 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .fprintf(stderr,
13f30 20 22 54 72 61 63 65 53 51 4c 28 25 70 29 3a 20   "TraceSQL(%p): 
13f40 25 73 5c 6e 22 2c 20 61 75 78 2c 20 73 71 6c 29  %s\n", aux, sql)
13f50 3b 0a 7d 0a 0a 2f 2a 20 73 79 73 6c 6f 67 20 6c  ;.}../* syslog l
13f60 6f 67 67 69 6e 67 20 2a 2f 0a 23 69 6e 63 6c 75  ogging */.#inclu
13f70 64 65 20 3c 61 73 6c 2e 68 3e 0a 73 74 61 74 69  de <asl.h>.stati
13f80 63 20 61 73 6c 63 6c 69 65 6e 74 20 61 75 74 6f  c aslclient auto
13f90 6c 6f 67 5f 63 6c 69 65 6e 74 20 3d 20 4e 55 4c  log_client = NUL
13fa0 4c 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f  L;.static void _
13fb0 63 6c 6f 73 65 5f 61 73 6c 5f 6c 6f 67 28 29 20  close_asl_log() 
13fc0 7b 0a 20 20 69 66 28 20 4e 55 4c 4c 21 3d 61 75  {.  if( NULL!=au
13fd0 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 29 7b 0a  tolog_client ){.
13fe0 20 20 20 20 61 73 6c 5f 63 6c 6f 73 65 28 61 75      asl_close(au
13ff0 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 29 3b 0a 20  tolog_client);. 
14000 20 20 20 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e     autolog_clien
14010 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a  t = NULL;.  }.}.
14020 73 74 61 74 69 63 20 76 6f 69 64 20 5f 6f 70 65  static void _ope
14030 6e 5f 61 73 6c 5f 6c 6f 67 28 29 20 7b 0a 20 20  n_asl_log() {.  
14040 69 66 28 20 4e 55 4c 4c 3d 3d 61 75 74 6f 6c 6f  if( NULL==autolo
14050 67 5f 63 6c 69 65 6e 74 20 29 7b 0a 20 20 20 20  g_client ){.    
14060 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 3d  autolog_client =
14070 20 61 73 6c 5f 6f 70 65 6e 28 22 53 51 4c 69 74   asl_open("SQLit
14080 65 22 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20  e", NULL, 0);.  
14090 20 20 61 74 65 78 69 74 28 5f 63 6c 6f 73 65 5f    atexit(_close_
140a0 61 73 6c 5f 6c 6f 67 29 3b 0a 20 20 7d 0a 7d 0a  asl_log);.  }.}.
140b0 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75  .void _sqlite_au
140c0 74 6f 5f 70 72 6f 66 69 6c 65 5f 73 79 73 6c 6f  to_profile_syslo
140d0 67 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e  g(void *aux, con
140e0 73 74 20 63 68 61 72 20 2a 73 71 6c 2c 20 75 36  st char *sql, u6
140f0 34 20 6e 73 29 3b 0a 76 6f 69 64 20 5f 73 71 6c  4 ns);.void _sql
14100 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 5f 73  ite_auto_trace_s
14110 79 73 6c 6f 67 28 76 6f 69 64 20 2a 61 75 78 2c  yslog(void *aux,
14120 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
14130 29 3b 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f  );.void _sqlite_
14140 61 75 74 6f 5f 70 72 6f 66 69 6c 65 5f 73 79 73  auto_profile_sys
14150 6c 6f 67 28 76 6f 69 64 20 2a 61 75 78 2c 20 63  log(void *aux, c
14160 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 2c 20  onst char *sql, 
14170 75 36 34 20 6e 73 29 20 7b 0a 23 70 72 61 67 6d  u64 ns) {.#pragm
14180 61 20 75 6e 75 73 65 64 28 61 75 78 29 0a 09 61  a unused(aux)..a
14190 73 6c 5f 6c 6f 67 28 61 75 74 6f 6c 6f 67 5f 63  sl_log(autolog_c
141a0 6c 69 65 6e 74 2c 20 4e 55 4c 4c 2c 20 41 53 4c  lient, NULL, ASL
141b0 5f 4c 45 56 45 4c 5f 4e 4f 54 49 43 45 2c 20 22  _LEVEL_NOTICE, "
141c0 51 75 65 72 79 3a 20 25 73 5c 6e 20 45 78 65 63  Query: %s\n Exec
141d0 75 74 69 6f 6e 20 54 69 6d 65 3a 20 25 6c 6c 75  ution Time: %llu
141e0 20 6d 73 5c 6e 22 2c 20 73 71 6c 2c 20 6e 73 20   ms\n", sql, ns 
141f0 2f 20 31 30 30 30 30 30 30 29 3b 0a 7d 0a 76 6f  / 1000000);.}.vo
14200 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f  id _sqlite_auto_
14210 74 72 61 63 65 5f 73 79 73 6c 6f 67 28 76 6f 69  trace_syslog(voi
14220 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68  d *aux, const ch
14230 61 72 20 2a 73 71 6c 29 20 7b 0a 09 61 73 6c 5f  ar *sql) {..asl_
14240 6c 6f 67 28 61 75 74 6f 6c 6f 67 5f 63 6c 69 65  log(autolog_clie
14250 6e 74 2c 20 4e 55 4c 4c 2c 20 41 53 4c 5f 4c 45  nt, NULL, ASL_LE
14260 56 45 4c 5f 4e 4f 54 49 43 45 2c 20 22 54 72 61  VEL_NOTICE, "Tra
14270 63 65 53 51 4c 28 25 70 29 3a 20 25 73 5c 6e 22  ceSQL(%p): %s\n"
14280 2c 20 61 75 78 2c 20 73 71 6c 29 3b 0a 7d 0a 23  , aux, sql);.}.#
14290 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
142a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
142b0 65 64 20 74 6f 20 70 61 72 73 65 20 62 6f 74 68  ed to parse both
142c0 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52   URIs and non-UR
142d0 49 20 66 69 6c 65 6e 61 6d 65 73 20 70 61 73 73  I filenames pass
142e0 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 75 73 65  ed by the.** use
142f0 72 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f  r to API functio
14300 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ns sqlite3_open(
14310 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65  ) or sqlite3_ope
14320 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66 6f 72 20  n_v2(), and for 
14330 64 61 74 61 62 61 73 65 0a 2a 2a 20 55 52 49 73  database.** URIs
14340 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61   specified as pa
14350 72 74 20 6f 66 20 41 54 54 41 43 48 20 73 74 61  rt of ATTACH sta
14360 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  tements..**.** T
14370 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
14380 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
14390 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  on is the name o
143a0 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73 65  f the VFS to use
143b0 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74   (or.** a NULL t
143c0 6f 20 73 69 67 6e 69 66 79 20 74 68 65 20 64 65  o signify the de
143d0 66 61 75 6c 74 20 56 46 53 29 20 69 66 20 74 68  fault VFS) if th
143e0 65 20 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 63  e URI does not c
143f0 6f 6e 74 61 69 6e 20 61 20 22 76 66 73 3d 78 78  ontain a "vfs=xx
14400 78 22 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61  x".** query para
14410 6d 65 74 65 72 2e 20 54 68 65 20 73 65 63 6f 6e  meter. The secon
14420 64 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61  d argument conta
14430 69 6e 73 20 74 68 65 20 55 52 49 20 28 6f 72 20  ins the URI (or 
14440 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65  non-URI filename
14450 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20 57 68 65  ).** itself. Whe
14460 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
14470 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 2a 70  is called the *p
14480 46 6c 61 67 73 20 76 61 72 69 61 62 6c 65 20 73  Flags variable s
14490 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  hould contain.**
144a0 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 6c 61   the default fla
144b0 67 73 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64  gs to open the d
144c0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77  atabase handle w
144d0 69 74 68 2e 20 54 68 65 20 76 61 6c 75 65 20 73  ith. The value s
144e0 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c  tored in.** *pFl
144f0 61 67 73 20 6d 61 79 20 62 65 20 75 70 64 61 74  ags may be updat
14500 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
14510 69 6e 67 20 69 66 20 74 68 65 20 55 52 49 20 66  ing if the URI f
14520 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73  ilename contains
14530 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78 78 78 22   .** "cache=xxx"
14540 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78 22 20 71   or "mode=xxx" q
14550 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e  uery parameters.
14560 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
14570 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
14580 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20  is returned. In 
14590 74 68 69 73 20 63 61 73 65 20 2a 70 70 56 66 73  this case *ppVfs
145a0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
145b0 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46 53 20 74   to.** the VFS t
145c0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
145d0 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64  ed to open the d
145e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 70  atabase file. *p
145f0 7a 46 69 6c 65 20 69 73 20 73 65 74 20 74 6f 0a  zFile is set to.
14600 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  ** point to a bu
14610 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
14620 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
14630 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74  file to open. It
14640 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
14650 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
14660 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
14670 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69  tually call sqli
14680 74 65 33 5f 66 72 65 65 28 29 20 74 6f 20 72 65  te3_free() to re
14690 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75  lease.** this bu
146a0 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ffer..**.** If a
146b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
146c0 74 68 65 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  then an SQLite e
146d0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
146e0 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a 45 72 72  urned and *pzErr
146f0 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65  Msg.** may be se
14700 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
14710 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
14720 67 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e  g an English lan
14730 67 75 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20  guage error .** 
14740 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74  message. It is t
14750 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
14760 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
14770 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65  to eventually re
14780 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75  lease.** this bu
14790 66 66 65 72 20 62 79 20 63 61 6c 6c 69 6e 67 20  ffer by calling 
147a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
147b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
147c0 72 73 65 55 72 69 28 0a 20 20 63 6f 6e 73 74 20  rseUri(.  const 
147d0 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 56 66  char *zDefaultVf
147e0 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53  s,        /* VFS
147f0 20 74 6f 20 75 73 65 20 69 66 20 6e 6f 20 22 76   to use if no "v
14800 66 73 3d 78 78 78 22 20 71 75 65 72 79 20 6f 70  fs=xxx" query op
14810 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tion */.  const 
14820 63 68 61 72 20 2a 7a 55 72 69 2c 20 20 20 20 20  char *zUri,     
14830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c            /* Nul
14840 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 52 49 20  -terminated URI 
14850 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e  to parse */.  un
14860 73 69 67 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61  signed int *pFla
14870 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs,           /*
14880 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f   IN/OUT: SQLITE_
14890 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a  OPEN_XXX flags *
148a0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
148b0 2a 2a 70 70 56 66 73 2c 20 20 20 20 20 20 20 20  **ppVfs,        
148c0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20      /* OUT: VFS 
148d0 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20 63 68 61  to use */ .  cha
148e0 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20  r **pzFile,     
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14900 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f  OUT: Filename co
14910 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a  mponent of URI *
14920 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  /.  char **pzErr
14930 4d 73 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Msg             
14940 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f      /* OUT: Erro
14950 72 20 6d 65 73 73 61 67 65 20 28 69 66 20 72 63  r message (if rc
14960 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a  !=SQLITE_OK) */.
14970 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
14980 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67  LITE_OK;.  unsig
14990 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ned int flags = 
149a0 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74  *pFlags;.  const
149b0 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44   char *zVfs = zD
149c0 65 66 61 75 6c 74 56 66 73 3b 0a 20 20 63 68 61  efaultVfs;.  cha
149d0 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72  r *zFile;.  char
149e0 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d   c;.  int nUri =
149f0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
14a00 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73 73 65 72  (zUri);..  asser
14a10 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20  t( *pzErrMsg==0 
14a20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66 6c 61 67  );..  if( ((flag
14a30 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
14a40 55 52 49 29 20 20 20 20 20 20 20 20 20 20 20 20  URI)            
14a50 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38 37 32 35   /* IMP: R-48725
14a60 2d 33 32 32 30 36 20 2a 2f 0a 20 20 20 20 20 20  -32206 */.      
14a70 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
14a80 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70  GlobalConfig.bOp
14a90 65 6e 55 72 69 29 20 2f 2a 20 49 4d 50 3a 20 52  enUri) /* IMP: R
14aa0 2d 35 31 36 38 39 2d 34 36 35 34 38 20 2a 2f 0a  -51689-46548 */.
14ab0 20 20 20 26 26 20 6e 55 72 69 3e 3d 35 20 26 26     && nUri>=5 &&
14ac0 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66   memcmp(zUri, "f
14ad0 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 2f 2a 20  ile:", 5)==0 /* 
14ae0 49 4d 50 3a 20 52 2d 35 37 38 38 34 2d 33 37 34  IMP: R-57884-374
14af0 39 36 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 63  96 */.  ){.    c
14b00 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69  har *zOpt;.    i
14b10 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  nt eState;      
14b20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14b30 50 61 72 73 65 72 20 73 74 61 74 65 20 77 68 65  Parser state whe
14b40 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20 2a 2f  n parsing URI */
14b50 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20 20 20  .    int iIn;   
14b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b70 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61 72     /* Input char
14b80 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20  acter index */. 
14b90 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b     int iOut = 0;
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bb0 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61 72 61   /* Output chara
14bc0 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cter index */.  
14bd0 20 20 75 36 34 20 6e 42 79 74 65 20 3d 20 6e 55    u64 nByte = nU
14be0 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20 20 20  ri+2;           
14bf0 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
14c00 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  e to allocate */
14c10 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
14c20 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50  re the SQLITE_OP
14c30 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73 20 73  EN_URI flag is s
14c40 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  et to indicate t
14c50 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65 6e 20  o the VFS xOpen 
14c60 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74  .    ** method t
14c70 68 61 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  hat there may be
14c80 20 65 78 74 72 61 20 70 61 72 61 6d 65 74 65 72   extra parameter
14c90 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  s following the 
14ca0 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20  file-name.  */. 
14cb0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
14cc0 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20  TE_OPEN_URI;..  
14cd0 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e    for(iIn=0; iIn
14ce0 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42  <nUri; iIn++) nB
14cf0 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e  yte += (zUri[iIn
14d00 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a 46 69  ]=='&');.    zFi
14d10 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  le = sqlite3_mal
14d20 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20  loc64(nByte);.  
14d30 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72    if( !zFile ) r
14d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
14d50 45 4d 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 69 49  EM_BKPT;..    iI
14d60 6e 20 3d 20 35 3b 0a 23 69 66 64 65 66 20 53 51  n = 5;.#ifdef SQ
14d70 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41  LITE_ALLOW_URI_A
14d80 55 54 48 4f 52 49 54 59 0a 20 20 20 20 69 66 28  UTHORITY.    if(
14d90 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c   strncmp(zUri+5,
14da0 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b   "///", 3)==0 ){
14db0 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a  .      iIn = 7;.
14dc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
14dd0 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e  lowing condition
14de0 20 63 61 75 73 65 73 20 55 52 49 73 20 77 69 74   causes URIs wit
14df0 68 20 66 69 76 65 20 6c 65 61 64 69 6e 67 20 2f  h five leading /
14e00 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20   characters.    
14e10 20 20 2a 2a 20 6c 69 6b 65 20 66 69 6c 65 3a 2f    ** like file:/
14e20 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 20 74 6f  ////host/path to
14e30 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
14e40 74 6f 20 55 4e 43 73 20 6c 69 6b 65 20 2f 2f 68  to UNCs like //h
14e50 6f 73 74 2f 70 61 74 68 2e 0a 20 20 20 20 20 20  ost/path..      
14e60 2a 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20 55  ** The correct U
14e70 52 49 20 66 6f 72 20 74 68 61 74 20 55 4e 43 20  RI for that UNC 
14e80 68 61 73 20 6f 6e 6c 79 20 74 77 6f 20 6f 72 20  has only two or 
14e90 66 6f 75 72 20 6c 65 61 64 69 6e 67 20 2f 20 63  four leading / c
14ea0 68 61 72 61 63 74 65 72 73 0a 20 20 20 20 20 20  haracters.      
14eb0 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73 74 2f 70  ** file://host/p
14ec0 61 74 68 20 6f 72 20 66 69 6c 65 3a 2f 2f 2f 2f  ath or file:////
14ed0 68 6f 73 74 2f 70 61 74 68 2e 20 20 42 75 74 20  host/path.  But 
14ee0 35 20 6c 65 61 64 69 6e 67 20 73 6c 61 73 68 65  5 leading slashe
14ef0 73 20 69 73 20 61 20 0a 20 20 20 20 20 20 2a 2a  s is a .      **
14f00 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72 2c 20 77   common error, w
14f10 65 20 61 72 65 20 74 6f 6c 64 2c 20 73 6f 20 77  e are told, so w
14f20 65 20 68 61 6e 64 6c 65 20 69 74 20 61 73 20 61  e handle it as a
14f30 20 73 70 65 63 69 61 6c 20 63 61 73 65 2e 20 2a   special case. *
14f40 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  /.      if( strn
14f50 63 6d 70 28 7a 55 72 69 2b 37 2c 20 22 2f 2f 2f  cmp(zUri+7, "///
14f60 22 2c 20 33 29 3d 3d 30 20 29 7b 20 69 49 6e 2b  ", 3)==0 ){ iIn+
14f70 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69  +; }.    }else i
14f80 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b  f( strncmp(zUri+
14f90 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f  5, "//localhost/
14fa0 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 12)==0 ){.   
14fb0 20 20 20 69 49 6e 20 3d 20 31 36 3b 0a 20 20 20     iIn = 16;.   
14fc0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20   }.#else.    /* 
14fd0 44 69 73 63 61 72 64 20 74 68 65 20 73 63 68 65  Discard the sche
14fe0 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69 74 79  me and authority
14ff0 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74 68 65   segments of the
15000 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28   URI. */.    if(
15010 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26   zUri[5]=='/' &&
15020 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b   zUri[6]=='/' ){
15030 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a  .      iIn = 7;.
15040 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72        while( zUr
15050 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69  i[iIn] && zUri[i
15060 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b  In]!='/' ) iIn++
15070 3b 0a 20 20 20 20 20 20 69 66 28 20 69 49 6e 21  ;.      if( iIn!
15080 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36 20 7c  =7 && (iIn!=16 |
15090 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68  | memcmp("localh
150a0 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20  ost", &zUri[7], 
150b0 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  9)) ){.        *
150c0 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
150d0 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61  e3_mprintf("inva
150e0 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72 69 74  lid uri authorit
150f0 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20  y: %.*s", .     
15100 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a         iIn-7, &z
15110 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20  Uri[7]);.       
15120 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
15130 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  OR;.        goto
15140 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
15150 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
15160 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70  ndif..    /* Cop
15170 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61  y the filename a
15180 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70 61 72  nd any query par
15190 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65  ameters into the
151a0 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a   zFile buffer. .
151b0 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48      ** Decode %H
151c0 48 20 65 73 63 61 70 65 20 63 6f 64 65 73 20 61  H escape codes a
151d0 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20  long the way. . 
151e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74     **.    ** Wit
151f0 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76  hin this loop, v
15200 61 72 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d  ariable eState m
15210 61 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20  ay be set to 0, 
15220 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e  1 or 2, dependin
15230 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  g.    ** on the 
15240 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e  parsing context.
15250 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   As follows:.   
15260 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20   **.    **   0: 
15270 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d  Parsing file-nam
15280 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50  e..    **   1: P
15290 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74  arsing name sect
152a0 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61  ion of a name=va
152b0 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  lue query parame
152c0 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a  ter..    **   2:
152d0 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73   Parsing value s
152e0 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65  ection of a name
152f0 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72  =value query par
15300 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  ameter..    */. 
15310 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20     eState = 0;. 
15320 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
15330 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20  Uri[iIn])!=0 && 
15340 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20  c!='#' ){.      
15350 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  iIn++;.      if(
15360 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20   c=='%' .       
15370 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67  && sqlite3Isxdig
15380 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20  it(zUri[iIn]) . 
15390 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
153a0 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49  Isxdigit(zUri[iI
153b0 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a  n+1]) .      ){.
153c0 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65          int octe
153d0 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54  t = (sqlite3HexT
153e0 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d  oInt(zUri[iIn++]
153f0 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20  ) << 4);.       
15400 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65   octet += sqlite
15410 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69  3HexToInt(zUri[i
15420 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20  In++]);..       
15430 20 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d   assert( octet>=
15440 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29  0 && octet<256 )
15450 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 63  ;.        if( oc
15460 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tet==0 ){.      
15470 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
15480 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
15490 20 22 25 30 30 22 20 61 70 70 65 61 72 73 20 77   "%00" appears w
154a0 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49  ithin the URI. I
154b0 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
154c0 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f   ** case we igno
154d0 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74  re all text in t
154e0 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
154f0 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f  the path, name o
15500 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76  r.          ** v
15510 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62  alue currently b
15520 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20  eing parsed. So 
15530 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65  ignore the curre
15540 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 20 20  nt character.   
15550 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b         ** and sk
15560 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22  ip to the next "
15570 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20  ?", "=" or "&", 
15580 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
15590 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  */.          whi
155a0 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49  le( (c = zUri[iI
155b0 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27  n])!=0 && c!='#'
155c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
155d0 26 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c  && (eState!=0 ||
155e0 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20   c!='?').       
155f0 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
15600 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20  e!=1 || (c!='=' 
15610 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20  && c!='&')).    
15620 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53            && (eS
15630 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26  tate!=2 || c!='&
15640 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  ').          ){.
15650 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b              iIn+
15660 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
15670 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
15680 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
15690 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a       c = octet;.
156a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
156b0 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d  eState==1 && (c=
156c0 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20  ='&' || c=='=') 
156d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
156e0 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20  File[iOut-1]==0 
156f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
15700 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20  An empty option 
15710 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69  name. Ignore thi
15720 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74  s option altoget
15730 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  her. */.        
15740 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
15750 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
15760 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e  ='#' && zUri[iIn
15770 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b  -1]!='&' ) iIn++
15780 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
15790 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
157a0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
157b0 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  &' ){.          
157c0 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
157d0 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65  '\0';.        }e
157e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65  lse{.          e
157f0 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20  State = 2;.     
15800 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
15810 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
15820 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26  if( (eState==0 &
15830 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53  & c=='?') || (eS
15840 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26  tate==2 && c=='&
15850 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  ') ){.        c 
15860 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74  = 0;.        eSt
15870 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ate = 1;.      }
15880 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  .      zFile[iOu
15890 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a  t++] = c;.    }.
158a0 20 20 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d      if( eState==
158b0 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b  1 ) zFile[iOut++
158c0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
158d0 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
158e0 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f  0';.    zFile[iO
158f0 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  ut++] = '\0';.. 
15900 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
15910 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70  here were any op
15920 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20  tions specified 
15930 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69  that should be i
15940 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20 20 20  nterpreted .    
15950 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73  ** here. Options
15960 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 72 70   that are interp
15970 72 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75  reted here inclu
15980 64 65 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f  de "vfs" and tho
15990 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  se that.    ** c
159a0 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61  orrespond to fla
159b0 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70  gs that may be p
159c0 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c  assed to the sql
159d0 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20  ite3_open_v2(). 
159e0 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f     ** method. */
159f0 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69  .    zOpt = &zFi
15a00 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  le[sqlite3Strlen
15a10 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20  30(zFile)+1];.  
15a20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d    while( zOpt[0]
15a30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
15a40 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  pt = sqlite3Strl
15a50 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20  en30(zOpt);.    
15a60 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26    char *zVal = &
15a70 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20  zOpt[nOpt+1];.  
15a80 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73      int nVal = s
15a90 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
15aa0 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  Val);..      if(
15ab0 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63   nOpt==3 && memc
15ac0 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20  mp("vfs", zOpt, 
15ad0 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  3)==0 ){.       
15ae0 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20   zVfs = zVal;.  
15af0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15b00 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f     struct OpenMo
15b10 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63  de {.          c
15b20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
15b30 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65          int mode
15b40 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f  ;.        } *aMo
15b50 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
15b60 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20  char *zModeType 
15b70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
15b80 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20   mask = 0;.     
15b90 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30     int limit = 0
15ba0 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ;..        if( n
15bb0 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Opt==5 && memcmp
15bc0 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20  ("cache", zOpt, 
15bd0 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  5)==0 ){.       
15be0 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
15bf0 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65   OpenMode aCache
15c00 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Mode[] = {.     
15c10 20 20 20 20 20 20 20 7b 20 22 73 68 61 72 65 64         { "shared
15c20 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
15c30 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20  SHAREDCACHE },. 
15c40 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 70 72             { "pr
15c50 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f  ivate", SQLITE_O
15c60 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
15c70 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
15c80 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
15c90 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
15ca0 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
15cb0 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c  PEN_SHAREDCACHE|
15cc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
15cd0 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20  ATECACHE;.      
15ce0 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63      aMode = aCac
15cf0 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  heMode;.        
15d00 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a    limit = mask;.
15d10 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
15d20 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20  ype = "cache";. 
15d30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15d40 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20   if( nOpt==4 && 
15d50 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a  memcmp("mode", z
15d60 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 4)==0 ){.  
15d70 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73          static s
15d80 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61  truct OpenMode a
15d90 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20  OpenMode[] = {. 
15da0 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f             { "ro
15db0 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
15dc0 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20  READONLY },.    
15dd0 20 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20          { "rw", 
15de0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
15df0 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20  DWRITE }, .     
15e00 20 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20         { "rwc", 
15e10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
15e20 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
15e30 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20  PEN_CREATE },.  
15e40 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d            { "mem
15e50 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ory", SQLITE_OPE
15e60 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20  N_MEMORY },.    
15e70 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d          { 0, 0 }
15e80 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  .          };.. 
15e90 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20           mask = 
15ea0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
15eb0 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50  ONLY | SQLITE_OP
15ec0 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20  EN_READWRITE.   
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ee0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
15ef0 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
15f00 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20  EN_MEMORY;.     
15f10 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70       aMode = aOp
15f20 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  enMode;.        
15f30 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26    limit = mask &
15f40 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20   flags;.        
15f50 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61    zModeType = "a
15f60 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20  ccess";.        
15f70 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  }..        if( a
15f80 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
15f90 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
15fa0 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b     int mode = 0;
15fb0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
15fc0 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20  =0; aMode[i].z; 
15fd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
15fe0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
15ff0 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20  = aMode[i].z;.  
16000 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 56            if( nV
16010 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65  al==sqlite3Strle
16020 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d  n30(z) && 0==mem
16030 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61  cmp(zVal, z, nVa
16040 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
16050 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65      mode = aMode
16060 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  [i].mode;.      
16070 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16080 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
16090 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
160a0 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29     if( mode==0 )
160b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
160c0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
160d0 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
160e0 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c  ch %s mode: %s",
160f0 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c   zModeType, zVal
16100 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
16110 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
16120 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
16130 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
16140 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16150 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64          if( (mod
16160 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  e & ~SQLITE_OPEN
16170 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29  _MEMORY)>limit )
16180 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
16190 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
161a0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f  3_mprintf("%s mo
161b0 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20  de not allowed: 
161c0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f               zMo
161f0 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20  deType, zVal);. 
16200 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
16210 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
16220 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61           goto pa
16230 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
16240 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16250 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67     flags = (flag
16260 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64  s & ~mask) | mod
16270 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
16280 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74     }..      zOpt
16290 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d   = &zVal[nVal+1]
162a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
162b0 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71  {.    zFile = sq
162c0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
162d0 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20  Uri+2);.    if( 
162e0 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !zFile ) return 
162f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
16300 54 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 46  T;.    memcpy(zF
16310 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29  ile, zUri, nUri)
16320 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69  ;.    zFile[nUri
16330 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
16340 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c  ile[nUri+1] = '\
16350 30 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d  0';.    flags &=
16360 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52   ~SQLITE_OPEN_UR
16370 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73  I;.  }..  *ppVfs
16380 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
16390 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28  ind(zVfs);.  if(
163a0 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20   *ppVfs==0 ){.  
163b0 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
163c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e  lite3_mprintf("n
163d0 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c  o such vfs: %s",
163e0 20 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d   zVfs);.    rc =
163f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
16400 20 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75   }. parse_uri_ou
16410 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
16420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
16430 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
16440 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30  );.    zFile = 0
16450 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20  ;.  }.  *pFlags 
16460 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69  = flags;.  *pzFi
16470 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65  le = zFile;.  re
16480 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
16490 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
164a0 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49  NABLE_AUTO_PROFI
164b0 4c 45 29 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  LE).#define SQLI
164c0 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
164d0 54 44 45 52 52 20 31 0a 23 64 65 66 69 6e 65 20  TDERR 1.#define 
164e0 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
164f0 4e 47 5f 53 59 53 4c 4f 47 20 32 0a 73 74 61 74  NG_SYSLOG 2.stat
16500 69 63 20 76 6f 69 64 20 65 6e 61 62 6c 65 41 75  ic void enableAu
16510 74 6f 4c 6f 67 67 69 6e 67 28 0a 20 20 73 71 6c  toLogging(.  sql
16520 69 74 65 33 20 2a 64 62 0a 29 7b 0a 20 20 63 68  ite3 *db.){.  ch
16530 61 72 20 2a 65 6e 76 70 72 6f 66 69 6c 65 20 3d  ar *envprofile =
16540 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
16550 41 55 54 4f 5f 50 52 4f 46 49 4c 45 22 29 3b 0a  AUTO_PROFILE");.
16560 20 20 0a 20 20 69 66 28 20 65 6e 76 70 72 6f 66    .  if( envprof
16570 69 6c 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  ile!=NULL ){.   
16580 20 69 6e 74 20 77 68 65 72 65 20 3d 20 30 3b 0a   int where = 0;.
16590 20 20 20 20 69 66 28 20 21 73 74 72 6e 63 61 73      if( !strncas
165a0 65 63 6d 70 28 22 31 22 2c 20 65 6e 76 70 72 6f  ecmp("1", envpro
165b0 66 69 6c 65 2c 20 31 29 20 29 7b 0a 20 20 20 20  file, 1) ){.    
165c0 20 20 69 66 28 20 69 73 61 74 74 79 28 32 29 20    if( isatty(2) 
165d0 29 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  ){.        where
165e0 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f   = SQLITE_AUTOLO
165f0 47 47 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20 20  GGING_STDERR;.  
16600 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16610 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54     where = SQLIT
16620 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59  E_AUTOLOGGING_SY
16630 53 4c 4f 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SLOG;.      }.  
16640 20 20 7d 20 65 6c 73 65 20 69 66 28 20 21 73 74    } else if( !st
16650 72 6e 63 61 73 65 63 6d 70 28 22 73 74 64 65 72  rncasecmp("stder
16660 72 22 2c 20 65 6e 76 70 72 6f 66 69 6c 65 2c 20  r", envprofile, 
16670 36 29 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72  6) ){.      wher
16680 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c  e = SQLITE_AUTOL
16690 4f 47 47 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20  OGGING_STDERR;. 
166a0 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 21 73     } else if( !s
166b0 74 72 6e 63 61 73 65 63 6d 70 28 22 73 79 73 6c  trncasecmp("sysl
166c0 6f 67 22 2c 20 65 6e 76 70 72 6f 66 69 6c 65 2c  og", envprofile,
166d0 20 36 29 20 29 7b 0a 20 20 20 20 20 20 77 68 65   6) ){.      whe
166e0 72 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f  re = SQLITE_AUTO
166f0 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a  LOGGING_SYSLOG;.
16700 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 68      }.    if( wh
16710 65 72 65 3d 3d 53 51 4c 49 54 45 5f 41 55 54 4f  ere==SQLITE_AUTO
16720 4c 4f 47 47 49 4e 47 5f 53 54 44 45 52 52 20 29  LOGGING_STDERR )
16730 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
16740 70 72 6f 66 69 6c 65 28 64 62 2c 20 5f 73 71 6c  profile(db, _sql
16750 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65  ite_auto_profile
16760 2c 20 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , db);.    }else
16770 20 69 66 28 20 77 68 65 72 65 3d 3d 53 51 4c 49   if( where==SQLI
16780 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
16790 59 53 4c 4f 47 20 29 7b 0a 20 20 20 20 20 20 5f  YSLOG ){.      _
167a0 6f 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28 29 3b 0a  open_asl_log();.
167b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
167c0 6f 66 69 6c 65 28 64 62 2c 20 5f 73 71 6c 69 74  ofile(db, _sqlit
167d0 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65 5f 73  e_auto_profile_s
167e0 79 73 6c 6f 67 2c 20 64 62 29 3b 0a 20 20 20 20  yslog, db);.    
167f0 7d 0a 20 20 7d 0a 20 20 63 68 61 72 20 2a 65 6e  }.  }.  char *en
16800 76 74 72 61 63 65 20 3d 20 67 65 74 65 6e 76 28  vtrace = getenv(
16810 22 53 51 4c 49 54 45 5f 41 55 54 4f 5f 54 52 41  "SQLITE_AUTO_TRA
16820 43 45 22 29 3b 0a 20 20 69 66 28 20 65 6e 76 74  CE");.  if( envt
16830 72 61 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  race!=NULL ){.  
16840 20 20 69 6e 74 20 77 68 65 72 65 20 3d 20 30 3b    int where = 0;
16850 0a 20 20 20 20 69 66 28 20 21 73 74 72 6e 63 61  .    if( !strnca
16860 73 65 63 6d 70 28 22 31 22 2c 20 65 6e 76 74 72  secmp("1", envtr
16870 61 63 65 2c 20 31 29 20 29 7b 0a 20 20 20 20 20  ace, 1) ){.     
16880 20 69 66 28 20 69 73 61 74 74 79 28 32 29 20 29   if( isatty(2) )
16890 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 20  {.        where 
168a0 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47  = SQLITE_AUTOLOG
168b0 47 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20 20 20  GING_STDERR;.   
168c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
168d0 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45    where = SQLITE
168e0 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53  _AUTOLOGGING_SYS
168f0 4c 4f 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LOG;.      }.   
16900 20 7d 20 65 6c 73 65 20 69 66 28 20 21 73 74 72   } else if( !str
16910 6e 63 61 73 65 63 6d 70 28 22 73 74 64 65 72 72  ncasecmp("stderr
16920 22 2c 20 65 6e 76 74 72 61 63 65 2c 20 36 29 20  ", envtrace, 6) 
16930 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d  ){.      where =
16940 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47   SQLITE_AUTOLOGG
16950 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20 20 20 20  ING_STDERR;.    
16960 7d 20 65 6c 73 65 20 69 66 28 20 21 73 74 72 6e  } else if( !strn
16970 63 61 73 65 63 6d 70 28 22 73 79 73 6c 6f 67 22  casecmp("syslog"
16980 2c 20 65 6e 76 74 72 61 63 65 2c 20 36 29 20 29  , envtrace, 6) )
16990 7b 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d 20  {.      where = 
169a0 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
169b0 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20 20 20 20 7d  NG_SYSLOG;.    }
169c0 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 3d 3d  .    if( where==
169d0 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
169e0 4e 47 5f 53 54 44 45 52 52 20 29 7b 0a 20 20 20  NG_STDERR ){.   
169f0 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65     sqlite3_trace
16a00 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75 74  (db, _sqlite_aut
16a10 6f 5f 74 72 61 63 65 2c 20 64 62 29 3b 0a 20 20  o_trace, db);.  
16a20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72    }else if( wher
16a30 65 3d 3d 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f  e==SQLITE_AUTOLO
16a40 47 47 49 4e 47 5f 53 59 53 4c 4f 47 20 29 7b 0a  GGING_SYSLOG ){.
16a50 20 20 20 20 20 20 5f 6f 70 65 6e 5f 61 73 6c 5f        _open_asl_
16a60 6c 6f 67 28 29 3b 0a 20 20 20 20 20 20 73 71 6c  log();.      sql
16a70 69 74 65 33 5f 74 72 61 63 65 28 64 62 2c 20 5f  ite3_trace(db, _
16a80 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63  sqlite_auto_trac
16a90 65 5f 73 79 73 6c 6f 67 2c 20 64 62 29 3b 0a 20  e_syslog, db);. 
16aa0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
16ab0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
16ac0 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
16ad0 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61  ork of opening a
16ae0 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68   database on beh
16af0 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  alf of.** sqlite
16b00 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c  3_open() and sql
16b10 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54  ite3_open16(). T
16b20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16b30 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22  name "zFilename"
16b40 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65    .** is UTF-8 e
16b50 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
16b60 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61  c int openDataba
16b70 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  se(.  const char
16b80 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20   *zFilename, /* 
16b90 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
16ba0 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
16bb0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
16bc0 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  pDb,        /* O
16bd0 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74  UT: Returned dat
16be0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
16bf0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
16c00 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72  lags,    /* Oper
16c10 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f  ational flags */
16c20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16c30 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Vfs       /* Nam
16c40 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
16c50 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  use */.){.  sqli
16c60 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
16c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
16c80 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68  tore allocated h
16c90 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
16ca0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
16cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cc0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
16cd0 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61 64  /.  int isThread
16ce0 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20 20  safe;           
16cf0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
16d00 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65  threadsafe conne
16d10 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72  ctions */.  char
16d20 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20   *zOpen = 0;    
16d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
16d40 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
16d50 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65   to pass to Btre
16d60 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61  eOpen() */.  cha
16d70 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20  r *zErrMsg = 0; 
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16d90 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  Error message fr
16da0 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55  om sqlite3ParseU
16db0 72 69 28 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ri() */..#ifdef 
16dc0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
16dd0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70  I_ARMOR.  if( pp
16de0 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Db==0 ) return S
16df0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
16e00 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44  T;.#endif.  *ppD
16e10 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
16e20 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
16e30 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  NIT.  rc = sqlit
16e40 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
16e50 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
16e60 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20  rn rc;.#endif.. 
16e70 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73   /* Only allow s
16e80 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74  ensible combinat
16e90 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20  ions of bits in 
16ea0 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  the flags argume
16eb0 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77  nt.  .  ** Throw
16ec0 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
16ed0 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69   non-sense combi
16ee0 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  nation is used. 
16ef0 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e   If we.  ** do n
16f00 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c  ot block illegal
16f10 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65   combinations he
16f20 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69  re, it could tri
16f30 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74  gger.  ** assert
16f40 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  () statements in
16f50 20 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20   deeper layers. 
16f60 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e   Sensible combin
16f70 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a  ations.  ** are:
16f80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20  .  **.  **  1:  
16f90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16fa0 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53  ONLY.  **  2:  S
16fb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
16fc0 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53  RITE.  **  6:  S
16fd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
16fe0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
16ff0 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20  EN_CREATE.  */. 
17000 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
17010 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d  OPEN_READONLY  =
17020 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65  = 0x01 );.  asse
17030 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
17040 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30  READWRITE == 0x0
17050 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
17060 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
17070 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a  E    == 0x04 );.
17080 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
17090 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32  (flags&7))==0x02
170a0 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20   ); /* READONLY 
170b0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
170c0 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
170d0 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x04 ); /* READWR
170e0 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ITE */.  testcas
170f0 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
17100 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45  )==0x40 ); /* RE
17110 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
17120 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28   */.  if( ((1<<(
17130 66 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36  flags&7)) & 0x46
17140 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
17150 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
17160 5f 42 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20  _BKPT;  /* IMP: 
17170 52 2d 36 35 34 39 37 2d 34 34 35 39 34 20 2a 2f  R-65497-44594 */
17180 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69  .  }..  if( sqli
17190 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
171a0 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b  bCoreMutex==0 ){
171b0 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
171c0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
171d0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
171e0 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29  E_OPEN_NOMUTEX )
171f0 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
17200 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  fe = 0;.  }else 
17210 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
17220 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
17230 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  X ){.    isThrea
17240 64 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  dsafe = 1;.  }el
17250 73 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64  se{.    isThread
17260 73 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c  safe = sqlite3Gl
17270 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
17280 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  Mutex;.  }.  if(
17290 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
172a0 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
172b0 45 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 26  E ){.    flags &
172c0 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  = ~SQLITE_OPEN_S
172d0 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 65  HAREDCACHE;.  }e
172e0 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 47  lse if( sqlite3G
172f0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72  lobalConfig.shar
17300 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29  edCacheEnabled )
17310 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  {.    flags |= S
17320 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
17330 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f  DCACHE;.  }..  /
17340 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c  * Remove harmful
17350 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66   bits from the f
17360 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 20  lags parameter. 
17370 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c   **.  ** The SQL
17380 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
17390 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e   and SQLITE_OPEN
173a0 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73  _FULLMUTEX flags
173b0 20 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74   were.  ** dealt
173c0 20 77 69 74 68 20 69 6e 20 74 68 65 20 70 72 65   with in the pre
173d0 76 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b  vious code block
173e0 2e 20 20 42 65 73 69 64 65 73 20 74 68 65 73 65  .  Besides these
173f0 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20  , the only.  ** 
17400 76 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61 67  valid input flag
17410 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  s for sqlite3_op
17420 65 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c 49  en_v2() are SQLI
17430 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
17440 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50  ,.  ** SQLITE_OP
17450 45 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53 51  EN_READWRITE, SQ
17460 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
17470 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  , SQLITE_OPEN_SH
17480 41 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20  AREDCACHE,.  ** 
17490 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
174a0 41 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73 6f  ATECACHE, and so
174b0 6d 65 20 72 65 73 65 72 76 65 64 20 62 69 74 73  me reserved bits
174c0 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b  .  Silently mask
174d0 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74  .  ** off all ot
174e0 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a  her flags..  */.
174f0 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53    flags &=  ~( S
17500 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
17510 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
17520 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
17530 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
17540 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
17550 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
17560 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20  N_DB |.         
17570 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
17580 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20  N_TEMP_DB | .   
17590 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
175a0 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
175b0 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20  T_DB | .        
175c0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
175d0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
175e0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
175f0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
17600 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  MP_JOURNAL | .  
17610 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17620 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
17630 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
17640 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
17650 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
17660 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
17670 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f    SQLITE_OPEN_NO
17680 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20  MUTEX |.        
17690 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
176a0 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20  EN_FULLMUTEX |. 
176b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
176c0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
176d0 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20             );.. 
176e0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
176f0 20 73 71 6c 69 74 65 20 64 61 74 61 20 73 74 72   sqlite data str
17700 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d  ucture */.  db =
17710 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
17720 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  ro( sizeof(sqlit
17730 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d  e3) );.  if( db=
17740 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62  =0 ) goto opendb
17750 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68  _out;.  if( isTh
17760 72 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20  readsafe ){.    
17770 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  db->mutex = sqli
17780 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
17790 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
177a0 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  SIVE);.    if( d
177b0 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  b->mutex==0 ){. 
177c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
177d0 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20  e(db);.      db 
177e0 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 0;.      goto 
177f0 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20  opendb_out;.    
17800 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
17810 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
17820 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
17830 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20  rMask = 0xff;.  
17840 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64  db->nDb = 2;.  d
17850 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
17860 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20  E_MAGIC_BUSY;.  
17870 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
17880 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65  bStatic;..  asse
17890 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61  rt( sizeof(db->a
178a0 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61  Limit)==sizeof(a
178b0 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20  HardLimit) );.  
178c0 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69  memcpy(db->aLimi
178d0 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73  t, aHardLimit, s
178e0 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
178f0 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d 69 74  ));.  db->aLimit
17900 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f  [SQLITE_LIMIT_WO
17910 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 20 3d 20  RKER_THREADS] = 
17920 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
17930 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3b 0a 20  ORKER_THREADS;. 
17940 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
17950 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41  = 1;.  db->nextA
17960 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64  utovac = -1;.  d
17970 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c 69  b->szMmap = sqli
17980 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
17990 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e 65  szMmap;.  db->ne
179a0 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a  xtPagesize = 0;.
179b0 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72    db->nMaxSorter
179c0 4d 6d 61 70 20 3d 20 30 78 37 46 46 46 46 46 46  Mmap = 0x7FFFFFF
179d0 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  F;.  db->flags |
179e0 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
179f0 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f  lNames | SQLITE_
17a00 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 7c 20  EnableTrigger | 
17a10 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c  SQLITE_CacheSpil
17a20 6c 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  l.#if !defined(S
17a30 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
17a40 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 29 20 7c  TOMATIC_INDEX) |
17a50 7c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  | SQLITE_DEFAULT
17a60 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
17a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17a80 20 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49    | SQLITE_AutoI
17a90 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndex.#endif.#if 
17aa0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
17ab0 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20  KPTFULLFSYNC.   
17ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
17ad0 53 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46  SQLITE_CkptFullF
17ae0 53 79 6e 63 0a 23 65 6e 64 69 66 0a 23 69 66 20  Sync.#endif.#if 
17af0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
17b00 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20  ILE_FORMAT<4.   
17b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
17b20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
17b30 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64  eFmt.#endif.#ifd
17b40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17b50 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
17b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b70 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78   | SQLITE_LoadEx
17b80 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23  tension.#endif.#
17b90 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
17ba0 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49 47  T_RECURSIVE_TRIG
17bb0 47 45 52 53 0a 20 20 20 20 20 20 20 20 20 20 20  GERS.           
17bc0 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52        | SQLITE_R
17bd0 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69  ecTriggers.#endi
17be0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
17bf0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52  LITE_DEFAULT_FOR
17c00 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51  EIGN_KEYS) && SQ
17c10 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52  LITE_DEFAULT_FOR
17c20 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20  EIGN_KEYS.      
17c30 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
17c40 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a  ITE_ForeignKeys.
17c50 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
17c60 65 64 28 53 51 4c 49 54 45 5f 52 45 56 45 52 53  ed(SQLITE_REVERS
17c70 45 5f 55 4e 4f 52 44 45 52 45 44 5f 53 45 4c 45  E_UNORDERED_SELE
17c80 43 54 53 29 0a 20 20 20 20 20 20 20 20 20 20 20  CTS).           
17c90 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52        | SQLITE_R
17ca0 65 76 65 72 73 65 4f 72 64 65 72 0a 23 65 6e 64  everseOrder.#end
17cb0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
17cc0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
17cd0 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
17ce0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
17cf0 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 65 6c 6c     | SQLITE_Cell
17d00 53 69 7a 65 43 6b 0a 23 65 6e 64 69 66 0a 23 69  SizeCk.#endif.#i
17d10 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
17d20 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b  _ENABLE_FTS3_TOK
17d30 45 4e 49 5a 45 52 29 0a 20 20 20 20 20 20 20 20  ENIZER).        
17d40 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
17d50 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72 0a  E_Fts3Tokenizer.
17d60 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20  #endif.      ;. 
17d70 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
17d80 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
17d90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17da0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17db0 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  E.  sqlite3HashI
17dc0 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  nit(&db->aModule
17dd0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
17de0 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20  Add the default 
17df0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
17e00 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52  ce BINARY. BINAR
17e10 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68  Y works for both
17e20 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20   UTF-8.  ** and 
17e30 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61  UTF-16, so add a
17e40 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63   version for eac
17e50 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75  h to avoid any u
17e60 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20  nnecessary.  ** 
17e70 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65  conversions. The
17e80 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74   only error that
17e90 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20   can occur here 
17ea0 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  is a malloc() fa
17eb0 69 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ilure..  **.  **
17ec0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17ed0 35 32 37 38 36 2d 34 34 38 37 38 20 53 51 4c 69  52786-44878 SQLi
17ee0 74 65 20 64 65 66 69 6e 65 73 20 74 68 72 65 65  te defines three
17ef0 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74   built-in collat
17f00 69 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  ing.  ** functio
17f10 6e 73 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74  ns:.  */.  creat
17f20 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73  eCollation(db, s
17f30 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c  qlite3StrBINARY,
17f40 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
17f50 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
17f60 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
17f70 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53  ion(db, sqlite3S
17f80 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45  trBINARY, SQLITE
17f90 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e  _UTF16BE, 0, bin
17fa0 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
17fb0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
17fc0 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49  db, sqlite3StrBI
17fd0 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46  NARY, SQLITE_UTF
17fe0 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  16LE, 0, binColl
17ff0 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
18000 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
18010 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45  "NOCASE", SQLITE
18020 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65  _UTF8, 0, nocase
18030 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30  CollatingFunc, 0
18040 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
18050 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22  tion(db, "RTRIM"
18060 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28  , SQLITE_UTF8, (
18070 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c  void*)1, binColl
18080 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  Func, 0);.  if( 
18090 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
180a0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
180b0 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f  ndb_out;.  }.  /
180c0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
180d0 2d 30 38 33 30 38 2d 31 37 32 32 34 20 54 68 65  -08308-17224 The
180e0 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
180f0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ng function for 
18100 61 6c 6c 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73  all.  ** strings
18110 20 69 73 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a   is BINARY. .  *
18120 2f 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  /.  db->pDfltCol
18130 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
18140 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54  ollSeq(db, SQLIT
18150 45 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33 53  E_UTF8, sqlite3S
18160 74 72 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  trBINARY, 0);.  
18170 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c  assert( db->pDfl
18180 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f  tColl!=0 );..  /
18190 2a 20 50 61 72 73 65 20 74 68 65 20 66 69 6c 65  * Parse the file
181a0 6e 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e  name/URI argumen
181b0 74 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e  t. */.  db->open
181c0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
181d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 72   rc = sqlite3Par
181e0 73 65 55 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c  seUri(zVfs, zFil
181f0 65 6e 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26  ename, &flags, &
18200 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e  db->pVfs, &zOpen
18210 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
18220 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18230 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
18240 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73  SQLITE_NOMEM ) s
18250 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
18260 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  b);.    sqlite3E
18270 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
18280 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25  rc, zErrMsg ? "%
18290 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29  s" : 0, zErrMsg)
182a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
182b0 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
182c0 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
182d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
182e0 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74   the backend dat
182f0 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a  abase driver */.
18300 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
18310 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73  reeOpen(db->pVfs
18320 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62  , zOpen, db, &db
18330 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c  ->aDb[0].pBt, 0,
18340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18350 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
18360 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
18370 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21  N_DB);.  if( rc!
18380 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18390 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
183a0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a  _IOERR_NOMEM ){.
183b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
183c0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
183d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
183e0 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20  rror(db, rc);.  
183f0 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
18400 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
18410 42 74 72 65 65 45 6e 74 65 72 28 64 62 2d 3e 61  BtreeEnter(db->a
18420 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62  Db[0].pBt);.  db
18430 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61  ->aDb[0].pSchema
18440 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
18450 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b  Get(db, db->aDb[
18460 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20 21  0].pBt);.  if( !
18470 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18480 20 29 20 45 4e 43 28 64 62 29 20 3d 20 53 43 48   ) ENC(db) = SCH
18490 45 4d 41 5f 45 4e 43 28 64 62 29 3b 0a 20 20 73  EMA_ENC(db);.  s
184a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
184b0 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
184c0 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ;.  db->aDb[1].p
184d0 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33  Schema = sqlite3
184e0 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29  SchemaGet(db, 0)
184f0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61  ;..  /* The defa
18500 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c  ult safety_level
18510 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
18520 74 61 62 61 73 65 20 69 73 20 46 55 4c 4c 3b 20  tabase is FULL; 
18530 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a  for the temp.  *
18540 2a 20 64 61 74 61 62 61 73 65 20 69 74 20 69 73  * database it is
18550 20 4f 46 46 2e 20 54 68 69 73 20 6d 61 74 63 68   OFF. This match
18560 65 73 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  es the pager lay
18570 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20  er defaults.  . 
18580 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d   */.  db->aDb[0]
18590 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b  .zName = "main";
185a0 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61  .  db->aDb[0].sa
185b0 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 50 41 47  fety_level = PAG
185c0 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 46  ER_SYNCHRONOUS_F
185d0 55 4c 4c 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31  ULL;.  db->aDb[1
185e0 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22  ].zName = "temp"
185f0 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73  ;.  db->aDb[1].s
18600 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 50 41  afety_level = PA
18610 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
18620 4f 46 46 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69  OFF;..  db->magi
18630 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
18640 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d  _OPEN;.  if( db-
18650 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
18660 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
18670 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
18680 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69  Register all bui
18690 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c  lt-in functions,
186a0 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65   but do not atte
186b0 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a  mpt to read the.
186c0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63    ** database sc
186d0 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69  hema yet. This i
186e0 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20  s delayed until 
186f0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  the first time t
18700 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
18710 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20   is accessed..  
18720 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  */.  sqlite3Erro
18730 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  r(db, SQLITE_OK)
18740 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73  ;.  sqlite3Regis
18750 74 65 72 50 65 72 43 6f 6e 6e 65 63 74 69 6f 6e  terPerConnection
18760 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73  BuiltinFunctions
18770 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64  (db);..  /* Load
18780 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e   automatic exten
18790 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f  sions - extensio
187a0 6e 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  ns that have bee
187b0 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a  n registered.  *
187c0 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
187d0 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78  te3_automatic_ex
187e0 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20  tension() API.. 
187f0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
18800 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
18810 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18820 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
18830 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73  e3AutoLoadExtens
18840 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20 72 63  ions(db);.    rc
18850 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
18860 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20  de(db);.    if( 
18870 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18880 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
18890 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  db_out;.    }.  
188a0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
188b0 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69  _ENABLE_FTS1.  i
188c0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
188d0 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65  iled ){.    exte
188e0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  rn int sqlite3Ft
188f0 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29  s1Init(sqlite3*)
18900 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18910 65 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a  e3Fts1Init(db);.
18920 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
18930 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18940 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d  _FTS2.  if( !db-
18950 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
18960 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18970 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
18980 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74   sqlite3Fts2Init
18990 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
189a0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32  rc = sqlite3Fts2
189b0 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
189c0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
189d0 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 20  ITE_ENABLE_FTS3 
189e0 2f 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  /* automatically
189f0 20 64 65 66 69 6e 65 64 20 62 79 20 53 51 4c 49   defined by SQLI
18a00 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 20 2a  TE_ENABLE_FTS4 *
18a10 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  /.  if( !db->mal
18a20 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
18a30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18a40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
18a50 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s3Init(db);.  }.
18a60 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
18a70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
18a80 35 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  5.  if( !db->mal
18a90 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
18aa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18ab0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
18ac0 73 35 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s5Init(db);.  }.
18ad0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
18ae0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55  QLITE_ENABLE_ICU
18af0 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
18b00 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
18b10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18b20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75   rc = sqlite3Icu
18b30 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
18b40 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
18b50 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45  ITE_ENABLE_RTREE
18b60 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
18b70 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
18b80 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
18b90 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65  rc = sqlite3Rtre
18ba0 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  eInit(db);.  }.#
18bb0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
18bc0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 53 54  LITE_ENABLE_DBST
18bd0 41 54 5f 56 54 41 42 0a 20 20 69 66 28 20 21 64  AT_VTAB.  if( !d
18be0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18bf0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
18c00 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
18c10 74 65 33 44 62 73 74 61 74 52 65 67 69 73 74 65  te3DbstatRegiste
18c20 72 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  r(db);.  }.#endi
18c30 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
18c40 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a 20 20  _ENABLE_JSON1.  
18c50 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
18c60 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
18c70 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20  ITE_OK){.    rc 
18c80 3d 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e  = sqlite3Json1In
18c90 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
18ca0 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54  if..  /* -DSQLIT
18cb0 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
18cc0 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45  G_MODE=1 makes E
18cd0 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65 66  XCLUSIVE the def
18ce0 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
18cf0 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54  * mode.  -DSQLIT
18d00 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
18d10 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f  G_MODE=0 make NO
18d20 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
18d30 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
18d40 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69  de.  Doing nothi
18d50 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d  ng at all also m
18d60 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20  akes NORMAL the 
18d70 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69  default..  */.#i
18d80 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  fdef SQLITE_DEFA
18d90 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
18da0 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d  .  db->dfltLockM
18db0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ode = SQLITE_DEF
18dc0 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
18dd0 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  E;.  sqlite3Page
18de0 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c  rLockingMode(sql
18df0 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64  ite3BtreePager(d
18e00 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a  b->aDb[0].pBt),.
18e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
18e30 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
18e40 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a  _MODE);.#endif..
18e50 20 20 69 66 28 20 72 63 20 29 20 73 71 6c 69 74    if( rc ) sqlit
18e60 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b  e3Error(db, rc);
18e70 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68  ..  /* Enable th
18e80 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c  e lookaside-mall
18e90 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a  oc subsystem */.
18ea0 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65    setupLookaside
18eb0 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47  (db, 0, sqlite3G
18ec0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f  lobalConfig.szLo
18ed0 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20  okaside,.       
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ef0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
18f00 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29  nfig.nLookaside)
18f10 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  ;..  sqlite3_wal
18f20 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
18f30 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  db, SQLITE_DEFAU
18f40 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b  LT_WAL_AUTOCHECK
18f50 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f  POINT);..opendb_
18f60 6f 75 74 3a 0a 20 20 69 66 28 20 64 62 20 29 7b  out:.  if( db ){
18f70 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
18f80 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73 54  >mutex!=0 || isT
18f90 68 72 65 61 64 73 61 66 65 3d 3d 30 0a 20 20 20  hreadsafe==0.   
18fa0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
18fb0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
18fc0 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a  FullMutex==0 );.
18fd0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
18fe0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
18ff0 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  x);.  }.  rc = s
19000 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
19010 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  b);.  assert( db
19020 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  !=0 || rc==SQLIT
19030 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28  E_NOMEM );.  if(
19040 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
19050 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  M ){.    sqlite3
19060 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20  _close(db);.    
19070 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  db = 0;.  }else 
19080 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19090 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  K ){.    db->mag
190a0 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
190b0 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 23 69 66 20  C_SICK;.  }.#if 
190c0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
190d0 5f 29 20 26 26 20 45 4e 41 42 4c 45 5f 46 4f 52  _) && ENABLE_FOR
190e0 43 45 5f 57 41 4c 0a 20 20 69 66 28 20 64 62 20  CE_WAL.  if( db 
190f0 26 26 20 21 72 63 20 29 7b 0a 20 20 20 20 69 66  && !rc ){.    if
19100 20 28 28 30 20 3d 3d 20 61 63 63 65 73 73 28 22   ((0 == access("
19110 2f 76 61 72 2f 64 62 2f 65 6e 61 62 6c 65 46 6f  /var/db/enableFo
19120 72 63 65 57 41 4c 22 2c 20 52 5f 4f 4b 29 29 29  rceWAL", R_OK)))
19130 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   {.#ifdef SQLITE
19140 5f 44 45 42 55 47 0a 20 20 20 20 20 20 66 70 72  _DEBUG.      fpr
19150 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51  intf(stderr, "SQ
19160 4c 69 74 65 20 57 41 4c 20 6a 6f 75 72 6e 61 6c  Lite WAL journal
19170 5f 6d 6f 64 65 20 45 4e 41 42 4c 45 44 20 62 79  _mode ENABLED by
19180 20 64 65 66 61 75 6c 74 2e 5c 6e 22 29 3b 0a 23   default.\n");.#
19190 65 6e 64 69 66 0a 20 20 20 20 20 20 0a 20 20 20  endif.      .   
191a0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
191b0 64 62 2c 20 22 70 72 61 67 6d 61 20 6a 6f 75 72  db, "pragma jour
191c0 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 2c 20 4e  nal_mode=wal", N
191d0 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
191e0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
191f0 44 45 42 55 47 0a 2f 2f 20 20 20 20 7d 20 65 6c  DEBUG.//    } el
19200 73 65 20 7b 0a 2f 2f 20 20 20 20 20 20 66 70 72  se {.//      fpr
19210 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51  intf(stderr, "SQ
19220 4c 69 74 65 20 57 41 4c 20 6a 6f 75 72 6e 61 6c  Lite WAL journal
19230 5f 6d 6f 64 65 20 4e 4f 54 20 45 4e 41 42 4c 45  _mode NOT ENABLE
19240 44 20 62 79 20 64 65 66 61 75 6c 74 2e 5c 6e 22  D by default.\n"
19250 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
19260 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
19270 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
19280 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49 4c  ABLE_AUTO_PROFIL
19290 45 29 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  E).  if( db && !
192a0 72 63 20 29 7b 0a 20 20 20 20 65 6e 61 62 6c 65  rc ){.    enable
192b0 41 75 74 6f 4c 6f 67 67 69 6e 67 28 64 62 29 3b  AutoLogging(db);
192c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
192d0 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65 66  pDb = db;.#ifdef
192e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
192f0 51 4c 52 52 0a 20 20 53 52 52 65 63 4f 70 65 6e  QLRR.  SRRecOpen
19300 28 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  (db, zFilename, 
19310 66 6c 61 67 73 29 3b 0a 23 65 6e 64 69 66 0a 23  flags);.#endif.#
19320 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
19330 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28  BLE_SQLLOG.  if(
19340 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
19350 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a  nfig.xSqllog ){.
19360 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e 67 20 61      /* Opening a
19370 20 64 62 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72   db handle. Four
19380 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  th parameter is 
19390 70 61 73 73 65 64 20 30 2e 20 2a 2f 0a 20 20 20  passed 0. */.   
193a0 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 73 71   void *pArg = sq
193b0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
193c0 67 2e 70 53 71 6c 6c 6f 67 41 72 67 3b 0a 20 20  g.pSqllogArg;.  
193d0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
193e0 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 70 41  onfig.xSqllog(pA
193f0 72 67 2c 20 64 62 2c 20 7a 46 69 6c 65 6e 61 6d  rg, db, zFilenam
19400 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  e, 0);.  }.#endi
19410 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
19420 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 0a  LITE_HAS_CODEC).
19430 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19440 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
19450 20 63 68 61 72 20 2a 7a 48 65 78 4b 65 79 20 3d   char *zHexKey =
19460 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
19470 61 6d 65 74 65 72 28 7a 4f 70 65 6e 2c 20 22 68  ameter(zOpen, "h
19480 65 78 6b 65 79 22 29 3b 0a 20 20 20 20 69 66 28  exkey");.    if(
19490 20 7a 48 65 78 4b 65 79 20 26 26 20 7a 48 65 78   zHexKey && zHex
194a0 4b 65 79 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Key[0] ){.      
194b0 75 38 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20  u8 iByte;.      
194c0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 68 61  int i;.      cha
194d0 72 20 7a 4b 65 79 5b 34 30 5d 3b 0a 20 20 20 20  r zKey[40];.    
194e0 20 20 66 6f 72 28 69 3d 30 2c 20 69 42 79 74 65    for(i=0, iByte
194f0 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 4b 65  =0; i<sizeof(zKe
19500 79 29 2a 32 20 26 26 20 73 71 6c 69 74 65 33 49  y)*2 && sqlite3I
19510 73 78 64 69 67 69 74 28 7a 48 65 78 4b 65 79 5b  sxdigit(zHexKey[
19520 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i]); i++){.     
19530 20 20 20 69 42 79 74 65 20 3d 20 28 69 42 79 74     iByte = (iByt
19540 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74 65 33 48  e<<4) + sqlite3H
19550 65 78 54 6f 49 6e 74 28 7a 48 65 78 4b 65 79 5b  exToInt(zHexKey[
19560 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  i]);.        if(
19570 20 28 69 26 31 29 21 3d 30 20 29 20 7a 4b 65 79   (i&1)!=0 ) zKey
19580 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20  [i/2] = iByte;. 
19590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
195a0 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20  ite3_key_v2(db, 
195b0 30 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a 20  0, zKey, i/2);. 
195c0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
195d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
195e0 4f 70 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  Open);.  return 
195f0 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a  rc & 0xff;.}../*
19600 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
19610 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
19620 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
19630 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  pen(.  const cha
19640 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  r *zFilename, . 
19650 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20   sqlite3 **ppDb 
19660 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  .){.  return ope
19670 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e  nDatabase(zFilen
19680 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20  ame, ppDb,.     
19690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
196b0 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
196c0 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b  OPEN_CREATE, 0);
196d0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  .}.int sqlite3_o
196e0 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20  pen_v2(.  const 
196f0 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20  char *filename, 
19700 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
19710 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a  lename (UTF-8) *
19720 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70  /.  sqlite3 **pp
19730 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  Db,         /* O
19740 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61  UT: SQLite db ha
19750 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ndle */.  int fl
19760 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
19770 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20    /* Flags */.  
19780 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
19790 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
197a0 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f  of VFS module to
197b0 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74   use */.){.  ret
197c0 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65  urn openDatabase
197d0 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c  (filename, ppDb,
197e0 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66   (unsigned int)f
197f0 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a  lags, zVfs);.}..
19800 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19810 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
19820 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
19830 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
19840 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nt sqlite3_open1
19850 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  6(.  const void 
19860 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
19870 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b  qlite3 **ppDb.){
19880 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
19890 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20  Filename8;   /* 
198a0 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65  zFilename encode
198b0 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65  d in UTF-8 inste
198c0 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a  ad of UTF-16 */.
198d0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
198e0 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *pVal;.  int rc;
198f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
19900 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
19910 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29  .  if( ppDb==0 )
19920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
19930 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
19940 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a  if.  *ppDb = 0;.
19950 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19960 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72  MIT_AUTOINIT.  r
19970 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
19980 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
19990 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
199a0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 46 69  #endif.  if( zFi
199b0 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 7a 46 69 6c  lename==0 ) zFil
199c0 65 6e 61 6d 65 20 3d 20 22 5c 30 30 30 5c 30 30  ename = "\000\00
199d0 30 22 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  0";.  pVal = sql
199e0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
199f0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
19a00 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
19a10 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54  zFilename, SQLIT
19a20 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53  E_UTF16NATIVE, S
19a30 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
19a40 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71   zFilename8 = sq
19a50 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70  lite3ValueText(p
19a60 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Val, SQLITE_UTF8
19a70 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
19a80 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
19a90 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
19aa0 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20  lename8, ppDb,. 
19ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ac0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
19ad0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
19ae0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
19af0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
19b00 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51   *ppDb || rc==SQ
19b10 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
19b20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19b30 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f  _OK && !DbHasPro
19b40 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20  perty(*ppDb, 0, 
19b50 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
19b60 20 29 7b 0a 20 20 20 20 20 20 53 43 48 45 4d 41   ){.      SCHEMA
19b70 5f 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 45 4e  _ENC(*ppDb) = EN
19b80 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54  C(*ppDb) = SQLIT
19b90 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
19ba0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
19bb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
19bc0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
19bd0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
19be0 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72  (pVal);..  retur
19bf0 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23  n rc & 0xff;.}.#
19c00 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
19c10 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
19c20 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
19c30 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
19c40 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
19c50 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
19c60 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
19c70 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
19c80 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  ion(.  sqlite3* 
19c90 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
19ca0 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
19cb0 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
19cc0 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
19cd0 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
19ce0 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
19cf0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
19d00 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
19d10 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
19d20 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  n_v2(db, zName, 
19d30 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
19d40 61 72 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  are, 0);.}../*.*
19d50 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
19d60 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
19d70 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
19d80 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
19d90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
19da0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
19db0 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  _v2(.  sqlite3* 
19dc0 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
19dd0 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
19de0 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
19df0 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
19e00 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
19e10 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
19e20 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20  const void*),.  
19e30 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64  void(*xDel)(void
19e40 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
19e50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19e60 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
19e70 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
19e80 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
19e90 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  || zName==0 ) re
19ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
19eb0 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
19ec0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
19ed0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
19ee0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
19ef0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
19f00 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f  .  rc = createCo
19f10 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
19f20 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78  e, (u8)enc, pCtx
19f30 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c  , xCompare, xDel
19f40 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
19f50 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
19f60 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
19f70 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
19f80 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
19f90 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
19fa0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
19fb0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
19fc0 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
19fd0 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
19fe0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
19ff0 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
1a000 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
1a010 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a  on16(.  sqlite3*
1a020 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f   db, .  const vo
1a030 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74  id *zName,.  int
1a040 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
1a050 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
1a060 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
1a070 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
1a080 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
1a090 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1a0a0 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  E_OK;.  char *zN
1a0b0 61 6d 65 38 3b 0a 0a 23 69 66 64 65 66 20 53 51  ame8;..#ifdef SQ
1a0c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1a0d0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1a0e0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1a0f0 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d  k(db) || zName==
1a100 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1a110 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
1a120 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
1a130 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1a140 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
1a150 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1a160 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20  led );.  zName8 
1a170 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f  = sqlite3Utf16to
1a180 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  8(db, zName, -1,
1a190 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
1a1a0 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  IVE);.  if( zNam
1a1b0 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  e8 ){.    rc = c
1a1c0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
1a1d0 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65  b, zName8, (u8)e
1a1e0 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
1a1f0 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  re, 0);.    sqli
1a200 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
1a210 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20  ame8);.  }.  rc 
1a220 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
1a230 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
1a240 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1a250 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1a260 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
1a270 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1a280 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
1a290 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
1a2a0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
1a2b0 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
1a2c0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1a2d0 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
1a2e0 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
1a2f0 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
1a300 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1a310 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
1a320 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
1a330 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20  ation_needed(.  
1a340 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
1a350 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
1a360 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
1a370 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64  CollNeeded)(void
1a380 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
1a390 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68  TextRep,const ch
1a3a0 61 72 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53  ar*).){.#ifdef S
1a3b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1a3c0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1a3d0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1a3e0 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
1a3f0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1a400 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
1a410 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1a420 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
1a430 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d  b->xCollNeeded =
1a440 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20   xCollNeeded;.  
1a450 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
1a460 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f  6 = 0;.  db->pCo
1a470 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
1a480 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
1a490 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1a4a0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1a4b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a4c0 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
1a4d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1a4e0 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
1a4f0 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
1a500 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c  ence factory cal
1a510 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64  lback with the d
1a520 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
1a530 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e  * db. Replace an
1a540 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  y previously ins
1a550 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  talled collation
1a560 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
1a570 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1a580 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
1a590 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20  ed16(.  sqlite3 
1a5a0 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
1a5b0 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
1a5c0 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
1a5d0 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69  ed16)(void*,sqli
1a5e0 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
1a5f0 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  p,const void*).)
1a600 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1a610 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1a620 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1a630 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1a640 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1a650 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
1a660 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
1a670 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1a680 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f  utex);.  db->xCo
1a690 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20  llNeeded = 0;.  
1a6a0 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
1a6b0 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31  6 = xCollNeeded1
1a6c0 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65  6;.  db->pCollNe
1a6d0 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e  ededArg = pCollN
1a6e0 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69  eededArg;.  sqli
1a6f0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1a700 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1a710 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a720 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1a730 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1a740 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1a750 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
1a760 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1a770 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61  tion is now an a
1a780 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75  nachronism. It u
1a790 73 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 74  sed to be used t
1a7a0 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61  o recover from a
1a7b0 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  .** malloc() fai
1a7c0 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65  lure, but SQLite
1a7d0 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61   now does this a
1a7e0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f  utomatically..*/
1a7f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f  .int sqlite3_glo
1a800 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64  bal_recover(void
1a810 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ){.  return SQLI
1a820 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
1a830 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73  ./*.** Test to s
1a840 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
1a850 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  t the database c
1a860 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20  onnection is in 
1a870 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f  autocommit.** mo
1a880 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
1a890 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 46 41   if it is and FA
1a8a0 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74  LSE if not.  Aut
1a8b0 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20  ocommit mode is 
1a8c0 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74  on.** by default
1a8d0 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73  .  Autocommit is
1a8e0 20 64 69 73 61 62 6c 65 64 20 62 79 20 61 20 42   disabled by a B
1a8f0 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61  EGIN statement a
1a900 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20  nd reenabled.** 
1a910 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d  by the next COMM
1a920 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a  IT or ROLLBACK..
1a930 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67  */.int sqlite3_g
1a940 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71  et_autocommit(sq
1a950 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64  lite3 *db){.#ifd
1a960 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1a970 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
1a980 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
1a990 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
1a9a0 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
1a9b0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
1a9c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
1a9d0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62  ndif.  return db
1a9e0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a  ->autoCommit;.}.
1a9f0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1aa00 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
1aa10 65 20 73 75 62 73 74 69 74 75 74 65 73 20 66 6f  e substitutes fo
1aa20 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49  r constants SQLI
1aa30 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53  TE_CORRUPT,.** S
1aa40 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51  QLITE_MISUSE, SQ
1aa50 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53  LITE_CANTOPEN, S
1aa60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20  QLITE_NOMEM and 
1aa70 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65  possibly other e
1aa80 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  rror.** constant
1aa90 73 2e 20 20 54 68 65 79 20 73 65 72 76 65 20 74  s.  They serve t
1aaa0 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a  wo purposes:.**.
1aab0 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20 61  **   1.  Serve a
1aac0 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  s a convenient p
1aad0 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
1aae0 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65  eakpoint in a de
1aaf0 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20  bugger.**       
1ab00 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 76  to detect when v
1ab10 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e  ersion error con
1ab20 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a  ditions occurs..
1ab30 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f  **.**   2.  Invo
1ab40 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ke sqlite3_log()
1ab50 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
1ab60 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61  source code loca
1ab70 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20  tion where.**   
1ab80 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20      a low-level 
1ab90 65 72 72 6f 72 20 69 73 20 66 69 72 73 74 20 64  error is first d
1aba0 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  etected..*/.stat
1abb0 69 63 20 69 6e 74 20 72 65 70 6f 72 74 45 72 72  ic int reportErr
1abc0 6f 72 28 69 6e 74 20 69 45 72 72 2c 20 69 6e 74  or(int iErr, int
1abd0 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20 63   lineno, const c
1abe0 68 61 72 20 2a 7a 54 79 70 65 29 7b 0a 20 20 73  har *zType){.  s
1abf0 71 6c 69 74 65 33 5f 6c 6f 67 28 69 45 72 72 2c  qlite3_log(iErr,
1ac00 20 22 25 73 20 61 74 20 6c 69 6e 65 20 25 64 20   "%s at line %d 
1ac10 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
1ac20 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65             zType
1ac30 2c 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c  , lineno, 20+sql
1ac40 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
1ac50 3b 0a 20 20 72 65 74 75 72 6e 20 69 45 72 72 3b  ;.  return iErr;
1ac60 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  .}.int sqlite3Co
1ac70 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74 20 6c  rruptError(int l
1ac80 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61  ineno){.  testca
1ac90 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
1aca0 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
1acb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 70 6f  );.  return repo
1acc0 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  rtError(SQLITE_C
1acd0 4f 52 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20  ORRUPT, lineno, 
1ace0 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70  "database corrup
1acf0 74 69 6f 6e 22 29 3b 0a 7d 0a 69 6e 74 20 73 71  tion");.}.int sq
1ad00 6c 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72  lite3MisuseError
1ad10 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
1ad20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
1ad30 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
1ad40 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  og!=0 );.  retur
1ad50 6e 20 72 65 70 6f 72 74 45 72 72 6f 72 28 53 51  n reportError(SQ
1ad60 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 6c 69 6e  LITE_MISUSE, lin
1ad70 65 6e 6f 2c 20 22 6d 69 73 75 73 65 22 29 3b 0a  eno, "misuse");.
1ad80 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e  }.int sqlite3Can
1ad90 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c  topenError(int l
1ada0 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61  ineno){.  testca
1adb0 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
1adc0 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
1add0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 70 6f  );.  return repo
1ade0 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  rtError(SQLITE_C
1adf0 41 4e 54 4f 50 45 4e 2c 20 6c 69 6e 65 6e 6f 2c  ANTOPEN, lineno,
1ae00 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69   "cannot open fi
1ae10 6c 65 22 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53  le");.}.#ifdef S
1ae20 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
1ae30 73 71 6c 69 74 65 33 4e 6f 6d 65 6d 45 72 72 6f  sqlite3NomemErro
1ae40 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
1ae50 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
1ae60 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1ae70 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  Log!=0 );.  retu
1ae80 72 6e 20 72 65 70 6f 72 74 45 72 72 6f 72 28 53  rn reportError(S
1ae90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e  QLITE_NOMEM, lin
1aea0 65 6e 6f 2c 20 22 4f 4f 4d 22 29 3b 0a 7d 0a 69  eno, "OOM");.}.i
1aeb0 6e 74 20 73 71 6c 69 74 65 33 49 6f 65 72 72 6e  nt sqlite3Ioerrn
1aec0 6f 6d 65 6d 45 72 72 6f 72 28 69 6e 74 20 6c 69  omemError(int li
1aed0 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
1aee0 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
1aef0 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
1af00 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 70 6f 72  ;.  return repor
1af10 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  tError(SQLITE_IO
1af20 45 52 52 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e  ERR_NOMEM, linen
1af30 6f 2c 20 22 49 2f 4f 20 4f 4f 4d 20 65 72 72 6f  o, "I/O OOM erro
1af40 72 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  r");.}.#endif..#
1af50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1af60 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
1af70 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f  .** This is a co
1af80 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e  nvenience routin
1af90 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
1afa0 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61  e that all threa
1afb0 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61  d-specific.** da
1afc0 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65  ta for this thre
1afd0 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c  ad has been deal
1afe0 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  located..**.** S
1aff0 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  QLite no longer 
1b000 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63  uses thread-spec
1b010 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69  ific data so thi
1b020 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77  s routine is now
1b030 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74   a.** no-op.  It
1b040 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72   is retained for
1b050 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
1b060 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f  atibility..*/.vo
1b070 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  id sqlite3_threa
1b080 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b  d_cleanup(void){
1b090 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1b0a0 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66   Return meta inf
1b0b0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
1b0c0 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e   specific column
1b0d0 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74   of a database t
1b0e0 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  able..** See com
1b0f0 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e  ment in sqlite3.
1b100 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20  h (sqlite.h.in) 
1b110 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
1b120 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  int sqlite3_tabl
1b130 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
1b140 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  a(.  sqlite3 *db
1b150 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b160 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
1b170 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
1b180 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20   char *zDbName, 
1b190 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1b1a0 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20  se name or NULL 
1b1b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1b1c0 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20  *zTableName,    
1b1d0 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a   /* Table name *
1b1e0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1b1f0 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20  zColumnName,    
1b200 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
1b210 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
1b220 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20  *pzDataType,    
1b230 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61  /* OUTPUT: Decla
1b240 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f  red data type */
1b250 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
1b260 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f  pzCollSeq,     /
1b270 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74  * OUTPUT: Collat
1b280 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
1b290 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74  e */.  int *pNot
1b2a0 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Null,           
1b2b0 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
1b2c0 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63  ue if NOT NULL c
1b2d0 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73  onstraint exists
1b2e0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d   */.  int *pPrim
1b2f0 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20  aryKey,         
1b300 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
1b310 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74  e if column part
1b320 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20   of PK */.  int 
1b330 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20  *pAutoinc       
1b340 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
1b350 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
1b360 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d  n is auto-increm
1b370 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
1b380 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
1b390 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65  Msg = 0;.  Table
1b3a0 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f   *pTab = 0;.  Co
1b3b0 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a  lumn *pCol = 0;.
1b3c0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30 3b 0a    int iCol = 0;.
1b3d0 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44    char const *zD
1b3e0 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63  ataType = 0;.  c
1b3f0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
1b400 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Seq = 0;.  int n
1b410 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e  otnull = 0;.  in
1b420 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30  t primarykey = 0
1b430 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20  ;.  int autoinc 
1b440 3d 20 30 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51  = 0;...#ifdef SQ
1b450 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1b460 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1b470 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1b480 6b 28 64 62 29 20 7c 7c 20 7a 54 61 62 6c 65 4e  k(db) || zTableN
1b490 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
1b4a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
1b4b0 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e  SE_BKPT;.  }.#en
1b4c0 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  dif..  /* Ensure
1b4d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1b4e0 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f  hema has been lo
1b4f0 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  aded */.  sqlite
1b500 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1b510 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69  ->mutex);.  sqli
1b520 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
1b530 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (db);.  rc = sql
1b540 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45  ite3Init(db, &zE
1b550 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 53 51  rrMsg);.  if( SQ
1b560 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20  LITE_OK!=rc ){. 
1b570 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
1b580 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  t;.  }..  /* Loc
1b590 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
1b5a0 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70   question */.  p
1b5b0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
1b5c0 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c  dTable(db, zTabl
1b5d0 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b  eName, zDbName);
1b5e0 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20  .  if( !pTab || 
1b5f0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
1b600 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20  .    pTab = 0;. 
1b610 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
1b620 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  t;.  }..  /* Fin
1b630 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72  d the column for
1b640 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72   which info is r
1b650 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66  equested */.  if
1b660 28 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30  ( zColumnName==0
1b670 20 29 7b 0a 20 20 20 20 2f 2a 20 51 75 65 72 79   ){.    /* Query
1b680 20 66 6f 72 20 65 78 69 73 74 61 6e 63 65 20 6f   for existance o
1b690 66 20 74 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a  f table only */.
1b6a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
1b6b0 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
1b6c0 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
1b6d0 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20  ){.      pCol = 
1b6e0 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
1b6f0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ];.      if( 0==
1b700 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1b710 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
1b720 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
1b730 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b740 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1b750 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f   iCol==pTab->nCo
1b760 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48  l ){.      if( H
1b770 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26  asRowid(pTab) &&
1b780 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
1b790 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
1b7a0 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 70          iCol = p
1b7b0 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
1b7c0 20 20 20 20 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e      pCol = iCol>
1b7d0 3d 30 20 3f 20 26 70 54 61 62 2d 3e 61 43 6f 6c  =0 ? &pTab->aCol
1b7e0 5b 69 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20 20  [iCol] : 0;.    
1b7f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b800 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20   pTab = 0;.     
1b810 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
1b820 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1b830 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
1b840 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73  ollowing block s
1b850 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20 69  tores the meta i
1b860 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
1b870 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
1b880 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  .  ** to the cal
1b890 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72  ler in local var
1b8a0 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65  iables zDataType
1b8b0 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e  , zCollSeq, notn
1b8c0 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a  ull, primarykey.
1b8d0 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63    ** and autoinc
1b8e0 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
1b8f0 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f  there are two po
1b900 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a  ssibilities:.  *
1b910 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54  * .  **     1. T
1b920 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  he specified col
1b930 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77  umn name was row
1b940 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f  id", "oid" or "_
1b950 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20  rowid_" .  **   
1b960 20 20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69       and there i
1b970 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20  s no explicitly 
1b980 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c  declared IPK col
1b990 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  umn. .  **.  ** 
1b9a0 20 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65      2. The table
1b9b0 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61   is not a view a
1b9c0 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  nd the column na
1b9d0 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e  me identified an
1b9e0 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78   .  **        ex
1b9f0 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65  plicitly declare
1ba00 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d  d column. Copy m
1ba10 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
1ba20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f  from *pCol..  */
1ba30 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a   .  if( pCol ){.
1ba40 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20      zDataType = 
1ba50 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20  pCol->zType;.   
1ba60 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c   zCollSeq = pCol
1ba70 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74  ->zColl;.    not
1ba80 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74  null = pCol->not
1ba90 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69  Null!=0;.    pri
1baa0 6d 61 72 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c  marykey  = (pCol
1bab0 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ->colFlags & COL
1bac0 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30  FLAG_PRIMKEY)!=0
1bad0 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20  ;.    autoinc = 
1bae0 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f  pTab->iPKey==iCo
1baf0 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  l && (pTab->tabF
1bb00 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
1bb10 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d  crement)!=0;.  }
1bb20 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54  else{.    zDataT
1bb30 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
1bb40 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20  .    primarykey 
1bb50 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  = 1;.  }.  if( !
1bb60 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  zCollSeq ){.    
1bb70 7a 43 6f 6c 6c 53 65 71 20 3d 20 73 71 6c 69 74  zCollSeq = sqlit
1bb80 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d  e3StrBINARY;.  }
1bb90 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73  ..error_out:.  s
1bba0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1bbb0 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57  All(db);..  /* W
1bbc0 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74  hether the funct
1bbd0 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64  ion call succeed
1bbe0 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65  ed or failed, se
1bbf0 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72  t the output par
1bc00 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20  ameters.  ** to 
1bc10 77 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c  whatever their l
1bc20 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74  ocal counterpart
1bc30 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e  s contain. If an
1bc40 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72   error did occur
1bc50 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20  ,.  ** this has 
1bc60 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65  the effect of ze
1bc70 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74  roing all output
1bc80 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a   parameters..  *
1bc90 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79  /.  if( pzDataTy
1bca0 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65  pe ) *pzDataType
1bcb0 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20   = zDataType;.  
1bcc0 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20  if( pzCollSeq ) 
1bcd0 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f  *pzCollSeq = zCo
1bce0 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f  llSeq;.  if( pNo
1bcf0 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c  tNull ) *pNotNul
1bd00 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69  l = notnull;.  i
1bd10 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29  f( pPrimaryKey )
1bd20 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20   *pPrimaryKey = 
1bd30 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66  primarykey;.  if
1bd40 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41  ( pAutoinc ) *pA
1bd50 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63  utoinc = autoinc
1bd60 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
1bd70 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20  OK==rc && !pTab 
1bd80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1bd90 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
1bda0 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  );.    zErrMsg =
1bdb0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1bdc0 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  db, "no such tab
1bdd0 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73  le column: %s.%s
1bde0 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20  ", zTableName,. 
1bdf0 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61         zColumnNa
1be00 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
1be10 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1be20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
1be30 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 28 7a  thMsg(db, rc, (z
1be40 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20  ErrMsg?"%s":0), 
1be50 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
1be60 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
1be70 72 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73  rrMsg);.  rc = s
1be80 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
1be90 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
1bea0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1beb0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1bec0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1bed0 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
1bee0 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
1bef0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
1bf00 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e  ime slept..*/.in
1bf10 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28  t sqlite3_sleep(
1bf20 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74  int ms){.  sqlit
1bf30 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20  e3_vfs *pVfs;.  
1bf40 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d  int rc;.  pVfs =
1bf50 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1bf60 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73  d(0);.  if( pVfs
1bf70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1bf80 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
1bf90 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c  ion works in mil
1bfa0 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74  liseconds, but t
1bfb0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73  he underlying Os
1bfc0 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50  Sleep() .  ** AP
1bfd0 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f  I uses microseco
1bfe0 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31  nds. Hence the 1
1bff0 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  000's..  */.  rc
1c000 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65   = (sqlite3OsSle
1c010 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73  ep(pVfs, 1000*ms
1c020 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  )/1000);.  retur
1c030 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
1c040 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
1c050 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65   the extended re
1c060 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69  sult codes..*/.i
1c070 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  nt sqlite3_exten
1c080 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
1c090 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
1c0a0 74 20 6f 6e 6f 66 66 29 7b 0a 23 69 66 64 65 66  t onoff){.#ifdef
1c0b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1c0c0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1c0d0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1c0e0 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
1c0f0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1c100 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
1c110 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1c120 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1c130 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f   db->errMask = o
1c140 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66 66 66  noff ? 0xfffffff
1c150 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69  f : 0xff;.  sqli
1c160 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1c170 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1c180 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c190 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
1c1a0 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  the xFileControl
1c1b0 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72   method on a par
1c1c0 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
1c1d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c1e0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71  _file_control(sq
1c1f0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1c200 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20   char *zDbName, 
1c210 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
1c220 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  rg){.  int rc = 
1c230 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1c240 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b 0a 0a  Btree *pBtree;..
1c250 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1c260 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1c270 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1c280 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
1c290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1c2a0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1c2b0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1c2c0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1c2d0 65 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20  ex);.  pBtree = 
1c2e0 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
1c2f0 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  tree(db, zDbName
1c300 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  );.  if( pBtree 
1c310 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
1c320 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  ager;.    sqlite
1c330 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20  3_file *fd;.    
1c340 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1c350 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70  r(pBtree);.    p
1c360 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
1c370 74 72 65 65 50 61 67 65 72 28 70 42 74 72 65 65  treePager(pBtree
1c380 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1c390 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Pager!=0 );.    
1c3a0 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
1c3b0 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20  rFile(pPager);. 
1c3c0 20 20 20 61 73 73 65 72 74 28 20 66 64 21 3d 30     assert( fd!=0
1c3d0 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d   );.    if( op==
1c3e0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c  SQLITE_FCNTL_FIL
1c3f0 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20  E_POINTER ){.   
1c400 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c     *(sqlite3_fil
1c410 65 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20  e**)pArg = fd;. 
1c420 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c430 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
1c440 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
1c450 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e 54 45 52 20  NTL_VFS_POINTER 
1c460 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74  ){.      *(sqlit
1c470 65 33 5f 76 66 73 2a 2a 29 70 41 72 67 20 3d 20  e3_vfs**)pArg = 
1c480 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
1c490 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
1c4a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c4b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d     }else if( op=
1c4c0 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4a 4f  =SQLITE_FCNTL_JO
1c4d0 55 52 4e 41 4c 5f 50 4f 49 4e 54 45 52 20 29 7b  URNAL_POINTER ){
1c4e0 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33  .      *(sqlite3
1c4f0 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 73  _file**)pArg = s
1c500 71 6c 69 74 65 33 50 61 67 65 72 4a 72 6e 6c 46  qlite3PagerJrnlF
1c510 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ile(pPager);.   
1c520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c530 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
1c540 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b   fd->pMethods ){
1c550 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1c560 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
1c570 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a  (fd, op, pArg);.
1c580 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c590 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 69 66  MIT_WAL.      if
1c5a0 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
1c5b0 29 26 26 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 46  )&&(op==SQLITE_F
1c5c0 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 29  CNTL_LAST_ERRNO)
1c5d0 26 26 28 2a 28 69 6e 74 20 2a 29 70 41 72 67 3d  &&(*(int *)pArg=
1c5e0 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =0) ){.        s
1c5f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 57 61  qlite3_file *pWa
1c600 6c 46 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  lFd = sqlite3Pag
1c610 65 72 57 61 6c 46 69 6c 65 28 70 50 61 67 65 72  erWalFile(pPager
1c620 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1c630 57 61 6c 46 64 26 26 28 70 57 61 6c 46 64 2d 3e  WalFd&&(pWalFd->
1c640 70 4d 65 74 68 6f 64 73 29 20 29 7b 0a 20 20 20  pMethods) ){.   
1c650 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1c660 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
1c670 28 70 57 61 6c 46 64 2c 20 6f 70 2c 20 70 41 72  (pWalFd, op, pAr
1c680 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
1c690 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1c6a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1c6b0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55   = SQLITE_NOTFOU
1c6c0 4e 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ND;.    }.    sq
1c6d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1c6e0 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73  pBtree);.  }.  s
1c6f0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
1c700 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
1c710 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1c720 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1c730 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74  rc;.}../*.** Int
1c740 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65  erface to the te
1c750 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a  sting logic..*/.
1c760 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74  int sqlite3_test
1c770 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c  _control(int op,
1c780 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20   ...){.  int rc 
1c790 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
1c7a0 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f  TE_OMIT_BUILTIN_
1c7b0 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41  TEST.  UNUSED_PA
1c7c0 52 41 4d 45 54 45 52 28 6f 70 29 3b 0a 23 65 6c  RAMETER(op);.#el
1c7d0 73 65 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  se.  va_list ap;
1c7e0 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1c7f0 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op);.  switch( o
1c800 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  p ){..    /*.   
1c810 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72   ** Save the cur
1c820 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
1c830 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20  e PRNG..    */. 
1c840 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1c850 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56  ESTCTRL_PRNG_SAV
1c860 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1c870 65 33 50 72 6e 67 53 61 76 65 53 74 61 74 65 28  e3PrngSaveState(
1c880 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c890 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1c8a0 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65    ** Restore the
1c8b0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52   state of the PR
1c8c0 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73  NG to the last s
1c8d0 74 61 74 65 20 73 61 76 65 64 20 75 73 69 6e 67  tate saved using
1c8e0 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56  .    ** PRNG_SAV
1c8f0 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41 56 45  E.  If PRNG_SAVE
1c900 20 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72   has never befor
1c910 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74  e been called, t
1c920 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  hen.    ** this 
1c930 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65 20 50  verb acts like P
1c940 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a  RNG_RESET..    *
1c950 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1c960 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
1c970 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20  RESTORE: {.     
1c980 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 74   sqlite3PrngRest
1c990 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20  oreState();.    
1c9a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1c9b0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
1c9c0 73 65 74 20 74 68 65 20 50 52 4e 47 20 62 61 63  set the PRNG bac
1c9d0 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69 74 69  k to its uniniti
1c9e0 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20 20 54  alized state.  T
1c9f0 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20  he next call.   
1ca00 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72   ** to sqlite3_r
1ca10 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c  andomness() will
1ca20 20 72 65 73 65 65 64 20 74 68 65 20 50 52 4e 47   reseed the PRNG
1ca30 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
1ca40 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74  call.    ** to t
1ca50 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d  he xRandomness m
1ca60 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64 65 66  ethod of the def
1ca70 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f  ault VFS..    */
1ca80 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ca90 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
1caa0 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  ESET: {.      sq
1cab0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
1cac0 28 30 2c 30 29 3b 0a 20 20 20 20 20 20 62 72 65  (0,0);.      bre
1cad0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1cae0 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1caf0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42  3_test_control(B
1cb00 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69 7a 65  ITVEC_TEST, size
1cb10 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a  , program).    *
1cb20 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 74  *.    ** Run a t
1cb30 65 73 74 20 61 67 61 69 6e 73 74 20 61 20 42 69  est against a Bi
1cb40 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66 20 73  tvec object of s
1cb50 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67 72 61  ize.  The progra
1cb60 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a  m argument.    *
1cb70 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66  * is an array of
1cb80 20 69 6e 74 65 67 65 72 73 20 74 68 61 74 20 64   integers that d
1cb90 65 66 69 6e 65 73 20 74 68 65 20 74 65 73 74 2e  efines the test.
1cba0 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61    Return -1 on a
1cbb0 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61  .    ** memory a
1cbc0 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c  llocation error,
1cbd0 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f   0 on success, o
1cbe0 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61  r non-zero for a
1cbf0 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20  n error..    ** 
1cc00 53 65 65 20 74 68 65 20 73 71 6c 69 74 65 33 42  See the sqlite3B
1cc10 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74  itvecBuiltinTest
1cc20 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
1cc30 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
1cc40 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1cc50 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
1cc60 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20  ITVEC_TEST: {.  
1cc70 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f      int sz = va_
1cc80 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1cc90 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d      int *aProg =
1cca0 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
1ccb0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
1ccc0 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74  lite3BitvecBuilt
1ccd0 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72 6f 67  inTest(sz, aProg
1cce0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ccf0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1cd00 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1cd10 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41 55 4c 54  st_control(FAULT
1cd20 5f 49 4e 53 54 41 4c 4c 2c 20 78 43 61 6c 6c 62  _INSTALL, xCallb
1cd30 61 63 6b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ack).    **.    
1cd40 2a 2a 20 41 72 72 61 6e 67 65 20 74 6f 20 69 6e  ** Arrange to in
1cd50 76 6f 6b 65 20 78 43 61 6c 6c 62 61 63 6b 28 29  voke xCallback()
1cd60 20 77 68 65 6e 65 76 65 72 20 73 71 6c 69 74 65   whenever sqlite
1cd70 33 46 61 75 6c 74 53 69 6d 28 29 20 69 73 20 63  3FaultSim() is c
1cd80 61 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a 20 69 66  alled,.    ** if
1cd90 20 78 43 61 6c 6c 62 61 63 6b 20 69 73 20 6e 6f   xCallback is no
1cda0 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 0a 20  t NULL..    **. 
1cdb0 20 20 20 2a 2a 20 41 73 20 61 20 74 65 73 74 20     ** As a test 
1cdc0 6f 66 20 74 68 65 20 66 61 75 6c 74 20 73 69 6d  of the fault sim
1cdd0 75 6c 61 74 6f 72 20 6d 65 63 68 61 6e 69 73 6d  ulator mechanism
1cde0 20 69 74 73 65 6c 66 2c 20 73 71 6c 69 74 65 33   itself, sqlite3
1cdf0 46 61 75 6c 74 53 69 6d 28 30 29 0a 20 20 20 20  FaultSim(0).    
1ce00 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 69 6d 6d  ** is called imm
1ce10 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 69  ediately after i
1ce20 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65 20 6e 65  nstalling the ne
1ce30 77 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20 74  w callback and t
1ce40 68 65 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  he return.    **
1ce50 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 71 6c 69   value from sqli
1ce60 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 20 62  te3FaultSim(0) b
1ce70 65 63 6f 6d 65 73 20 74 68 65 20 72 65 74 75 72  ecomes the retur
1ce80 6e 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71  n from.    ** sq
1ce90 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1cea0 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ol()..    */.   
1ceb0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1cec0 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54  TCTRL_FAULT_INST
1ced0 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ALL: {.      /* 
1cee0 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20 61 62  MSVC is picky ab
1cef0 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63  out pulling func
1cf00 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69   ptrs from va li
1cf10 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74  sts..      ** ht
1cf20 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63  tp://support.mic
1cf30 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37  rosoft.com/kb/47
1cf40 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  961.      ** sql
1cf50 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1cf60 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d  .xTestCallback =
1cf70 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 28   va_arg(ap, int(
1cf80 2a 29 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20  *)(int));.      
1cf90 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65 66  */.      typedef
1cfa0 20 69 6e 74 28 2a 54 45 53 54 43 41 4c 4c 42 41   int(*TESTCALLBA
1cfb0 43 4b 46 55 4e 43 5f 74 29 28 69 6e 74 29 3b 0a  CKFUNC_t)(int);.
1cfc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1cfd0 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43  balConfig.xTestC
1cfe0 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67  allback = va_arg
1cff0 28 61 70 2c 20 54 45 53 54 43 41 4c 4c 42 41 43  (ap, TESTCALLBAC
1d000 4b 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  KFUNC_t);.      
1d010 72 63 20 3d 20 73 71 6c 69 74 65 33 46 61 75 6c  rc = sqlite3Faul
1d020 74 53 69 6d 28 30 29 3b 0a 20 20 20 20 20 20 62  tSim(0);.      b
1d030 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1d040 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1d050 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1d060 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48  (BENIGN_MALLOC_H
1d070 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78 45  OOKS, xBegin, xE
1d080 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  nd).    **.    *
1d090 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b 73  * Register hooks
1d0a0 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69   to call to indi
1d0b0 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f  cate which mallo
1d0c0 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a 20 20  c() failures .  
1d0d0 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e    ** are benign.
1d0e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1d0f0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1d100 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48  _BENIGN_MALLOC_H
1d110 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74 79  OOKS: {.      ty
1d120 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76 6f 69  pedef void (*voi
1d130 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64  d_function)(void
1d140 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75  );.      void_fu
1d150 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65  nction xBenignBe
1d160 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f  gin;.      void_
1d170 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e  function xBenign
1d180 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65 6e 69  End;.      xBeni
1d190 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61 72 67  gnBegin = va_arg
1d1a0 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69  (ap, void_functi
1d1b0 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65 6e 69  on);.      xBeni
1d1c0 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67 28 61  gnEnd = va_arg(a
1d1d0 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e  p, void_function
1d1e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d1f0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b  BenignMallocHook
1d200 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20  s(xBenignBegin, 
1d210 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20  xBenignEnd);.   
1d220 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d230 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1d240 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1d250 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1d260 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
1d270 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  E, unsigned int 
1d280 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
1d290 20 53 65 74 20 74 68 65 20 50 45 4e 44 49 4e 47   Set the PENDING
1d2a0 20 62 79 74 65 20 74 6f 20 74 68 65 20 76 61 6c   byte to the val
1d2b0 75 65 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ue in the argume
1d2c0 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20 20  nt, if X>0..    
1d2d0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
1d2e0 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52 65 74  es if X==0.  Ret
1d2f0 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
1d300 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74   the pending byt
1d310 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74 20 65  e.    ** as it e
1d320 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65 20 74  xisting before t
1d330 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1d340 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  called..    **. 
1d350 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a     ** IMPORTANT:
1d360 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50    Changing the P
1d370 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72 6f 6d  ENDING byte from
1d380 20 30 78 34 30 30 30 30 30 30 30 20 72 65 73 75   0x40000000 resu
1d390 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e  lts in.    ** an
1d3a0 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64 61   incompatible da
1d3b0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 6d  tabase file form
1d3c0 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68  at.  Changing th
1d3d0 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 0a 20  e PENDING byte. 
1d3e0 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20     ** while any 
1d3f0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1d400 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65 73 75  ion is open resu
1d410 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e 65 64  lts in undefined
1d420 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65   and.    ** dele
1d430 74 65 72 69 6f 75 73 20 62 65 68 61 76 69 6f 72  terious behavior
1d440 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1d450 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1d460 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20  L_PENDING_BYTE: 
1d470 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 50 45 4e  {.      rc = PEN
1d480 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64  DING_BYTE;.#ifnd
1d490 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1d4a0 53 44 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  SD.      {.     
1d4b0 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
1d4c0 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72 67 28  newVal = va_arg(
1d4d0 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ap, unsigned int
1d4e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1d4f0 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65 33 50  ewVal ) sqlite3P
1d500 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e 65 77  endingByte = new
1d510 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  Val;.      }.#en
1d520 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  dif.      break;
1d530 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1d540 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1d550 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1d560 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
1d570 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  RT, int X).    *
1d580 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63  *.    ** This ac
1d590 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20  tion provides a 
1d5a0 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f  run-time test to
1d5b0 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20   see whether or 
1d5c0 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73 65 72  not.    ** asser
1d5d0 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65 64 20  t() was enabled 
1d5e0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
1d5f0 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61    If X is true a
1d600 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20 20 20  nd assert().    
1d610 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  ** is enabled, t
1d620 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
1d630 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20 20 49  alue is true.  I
1d640 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 0a  f X is true and.
1d650 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20      ** assert() 
1d660 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65  is disabled, the
1d670 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
1d680 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49 66 20  ue is zero.  If 
1d690 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73  X is.    ** fals
1d6a0 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69  e and assert() i
1d6b0 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
1d6c0 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20 66 69  the assertion fi
1d6d0 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20  res and the.    
1d6e0 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f 72 74  ** process abort
1d6f0 73 2e 20 20 49 66 20 58 20 69 73 20 66 61 6c 73  s.  If X is fals
1d700 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69  e and assert() i
1d710 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  s disabled, then
1d720 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75   the.    ** retu
1d730 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  rn value is zero
1d740 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1d750 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1d760 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20 20 20  L_ASSERT: {.    
1d770 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78    volatile int x
1d780 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
1d790 72 74 28 20 2f 2a 73 69 64 65 2d 65 66 66 65 63  rt( /*side-effec
1d7a0 74 73 2d 6f 6b 2a 2f 20 28 78 20 3d 20 76 61 5f  ts-ok*/ (x = va_
1d7b0 61 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20  arg(ap,int))!=0 
1d7c0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b  );.      rc = x;
1d7d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d7e0 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20    }...    /*.   
1d7f0 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1d800 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1d810 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
1d820 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  , int X).    **.
1d830 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69      ** This acti
1d840 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75  on provides a ru
1d850 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73  n-time test to s
1d860 65 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59  ee how the ALWAY
1d870 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56  S and.    ** NEV
1d880 45 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64  ER macros were d
1d890 65 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c  efined at compil
1d8a0 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20  e-time..    **. 
1d8b0 20 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e     ** The return
1d8c0 20 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53   value is ALWAYS
1d8d0 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  (X).  .    **.  
1d8e0 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65    ** The recomme
1d8f0 6e 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d  nded test is X==
1d900 32 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72  2.  If the retur
1d910 6e 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68  n value is 2, th
1d920 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  at means.    ** 
1d930 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56  ALWAYS() and NEV
1d940 45 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f  ER() are both no
1d950 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
1d960 20 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69   macros, which i
1d970 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  s the.    ** def
1d980 61 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49  ault setting.  I
1d990 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
1d9a0 75 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c  ue is 1, then AL
1d9b0 57 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72  WAYS() is either
1d9c0 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64  .    ** hard-cod
1d9d0 65 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c  ed to true or el
1d9e0 73 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66  se it asserts if
1d9f0 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73   its argument is
1da00 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54   false..    ** T
1da10 68 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f  he first behavio
1da20 72 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f  r (hard-coded to
1da30 20 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61   true) is the ca
1da40 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c  se if.    ** SQL
1da50 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1da60 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61  ERT shows that a
1da70 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
1da80 6c 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f  led and the seco
1da90 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69  nd.    ** behavi
1daa0 6f 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68  or (assert if th
1dab0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c  e argument to AL
1dac0 57 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29  WAYS() is false)
1dad0 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a   is the case if.
1dae0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45      ** SQLITE_TE
1daf0 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68  STCTRL_ASSERT sh
1db00 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28  ows that assert(
1db10 29 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20  ) is enabled..  
1db20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1db30 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72  run-time test pr
1db40 6f 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f  ocedure might lo
1db50 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ok something lik
1db60 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
1db70 20 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c     **    if( sql
1db80 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1db90 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1dba0 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20  L_ALWAYS, 2)==2 
1dbb0 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  ){.    **      /
1dbc0 2f 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e  / ALWAYS() and N
1dbd0 45 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70  EVER() are no-op
1dbe0 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61   pass-through ma
1dbf0 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d  cros.    **    }
1dc00 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
1dc10 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1dc20 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
1dc30 53 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20  SERT, 1) ){.    
1dc40 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59  **      // ALWAY
1dc50 53 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61  S(x) asserts tha
1dc60 74 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56  t x is true. NEV
1dc70 45 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20  ER(x) asserts x 
1dc80 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a  is false..    **
1dc90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a      }else{.    *
1dca0 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
1dcb0 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  (x) is a constan
1dcc0 74 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69  t 1.  NEVER(x) i
1dcd0 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a  s a constant 0..
1dce0 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20      **    }.    
1dcf0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1dd00 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
1dd10 59 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  YS: {.      int 
1dd20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
1dd30 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41  t);.      rc = A
1dd40 4c 57 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20  LWAYS(x);.      
1dd50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1dd60 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71    /*.    **   sq
1dd70 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1dd80 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1dd90 52 4c 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a 20  RL_BYTEORDER);. 
1dda0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1ddb0 20 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e 65   integer returne
1ddc0 64 20 72 65 76 65 61 6c 73 20 74 68 65 20 62 79  d reveals the by
1ddd0 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20  te-order of the 
1dde0 63 6f 6d 70 75 74 65 72 20 6f 6e 20 77 68 69 63  computer on whic
1ddf0 68 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20  h.    ** SQLite 
1de00 69 73 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20  is running:.    
1de10 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1de20 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e  1     big-endian
1de30 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20  ,    determined 
1de40 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20  at run-time.    
1de50 2a 2a 20 20 20 20 20 20 31 30 20 20 20 20 20 6c  **      10     l
1de60 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65  ittle-endian, de
1de70 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d  termined at run-
1de80 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33 32  time.    **  432
1de90 31 30 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69  101     big-endi
1dea0 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65  an,    determine
1deb0 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1dec0 65 0a 20 20 20 20 2a 2a 20 20 31 32 33 34 31 30  e.    **  123410
1ded0 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69       little-endi
1dee0 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61  an, determined a
1def0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20  t compile-time. 
1df00 20 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20     */ .    case 
1df10 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1df20 42 59 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20  BYTEORDER: {.   
1df30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1df40 59 54 45 4f 52 44 45 52 2a 31 30 30 20 2b 20 53  YTEORDER*100 + S
1df50 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49  QLITE_LITTLEENDI
1df60 41 4e 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f 42  AN*10 + SQLITE_B
1df70 49 47 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20  IGENDIAN;.      
1df80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1df90 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1dfa0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1dfb0 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45  TE_TESTCTRL_RESE
1dfc0 52 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  RVE, sqlite3 *db
1dfd0 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a  , int N).    **.
1dfe0 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e      ** Set the n
1dff0 52 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20  Reserve size to 
1e000 4e 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  N for the main d
1e010 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64  atabase on the d
1e020 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63  atabase.    ** c
1e030 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20  onnection db..  
1e040 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1e050 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45  LITE_TESTCTRL_RE
1e060 53 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73  SERVE: {.      s
1e070 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
1e080 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
1e090 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d  );.      int x =
1e0a0 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
1e0b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1e0c0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1e0d0 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c  utex);.      sql
1e0e0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
1e0f0 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  Size(db->aDb[0].
1e100 70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20  pBt, 0, x, 0);. 
1e110 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
1e120 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1e130 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
1e140 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e150 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1e160 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1e170 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
1e180 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  ONS, sqlite3 *db
1e190 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a  , int N).    **.
1e1a0 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72      ** Enable or
1e1b0 20 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73   disable various
1e1c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66   optimizations f
1e1d0 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
1e1e0 73 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a  ses.  The .    *
1e1f0 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20  * argument N is 
1e200 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74  a bitmask of opt
1e210 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65  imizations to be
1e220 20 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20   disabled.  For 
1e230 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70  normal.    ** op
1e240 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64  eration N should
1e250 20 62 65 20 30 2e 20 20 54 68 65 20 69 64 65 61   be 0.  The idea
1e260 20 69 73 20 74 68 61 74 20 61 20 74 65 73 74 20   is that a test 
1e270 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68  program (like th
1e280 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67  e.    ** SQL Log
1e290 69 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74  ic Test or SLT t
1e2a0 65 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20  est module) can 
1e2b0 72 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c  run the same SQL
1e2c0 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a   multiple times.
1e2d0 20 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69      ** with vari
1e2e0 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
1e2f0 73 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65  s disabled to ve
1e300 72 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61  rify that the sa
1e310 6d 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a  me answer.    **
1e320 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20   is obtained in 
1e330 65 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20  every case..    
1e340 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1e350 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
1e360 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20  MIZATIONS: {.   
1e370 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1e380 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
1e390 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d  te3*);.      db-
1e3a0 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75  >dbOptFlags = (u
1e3b0 31 36 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69  16)(va_arg(ap, i
1e3c0 6e 74 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20  nt) & 0xffff);. 
1e3d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e3e0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1e3f0 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f  _N_KEYWORD.    /
1e400 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
1e410 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1e420 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44  STCTRL_ISKEYWORD
1e430 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57  , const char *zW
1e440 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ord).    **.    
1e450 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61  ** If zWord is a
1e460 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69   keyword recogni
1e470 7a 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  zed by the parse
1e480 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  r, then return t
1e490 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  he.    ** number
1e4a0 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f   of keywords.  O
1e4b0 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f  r if zWord is no
1e4c0 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74  t a keyword, ret
1e4d0 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20  urn 0..    ** . 
1e4e0 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20     ** This test 
1e4f0 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20  feature is only 
1e500 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65  available in the
1e510 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69   amalgamation si
1e520 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53  nce.    ** the S
1e530 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20  QLITE_N_KEYWORD 
1e540 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66  macro is not def
1e550 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c  ined in this fil
1e560 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20  e if SQLite.    
1e570 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e  ** is built usin
1e580 67 20 73 65 70 61 72 61 74 65 20 73 6f 75 72 63  g separate sourc
1e590 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a  e files..    */.
1e5a0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e5b0 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f  TESTCTRL_ISKEYWO
1e5c0 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  RD: {.      cons
1e5d0 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20  t char *zWord = 
1e5e0 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74  va_arg(ap, const
1e5f0 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69   char*);.      i
1e600 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
1e610 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20  rlen30(zWord);. 
1e620 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74       rc = (sqlit
1e630 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75  e3KeywordCode((u
1e640 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b  8*)zWord, n)!=TK
1e650 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f  _ID) ? SQLITE_N_
1e660 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20  KEYWORD : 0;.   
1e670 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e680 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20  #endif ..    /* 
1e690 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1e6a0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1e6b0 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c  CTRL_SCRATCHMALL
1e6c0 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70  OC, sz, &pNew, p
1e6d0 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  Free);.    **.  
1e6e0 20 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20    ** Pass pFree 
1e6f0 69 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61  into sqlite3Scra
1e700 74 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20  tchFree(). .    
1e710 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20  ** If sz>0 then 
1e720 61 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74  allocate a scrat
1e730 63 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70  ch buffer into p
1e740 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20  New.  .    */.  
1e750 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1e760 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41  STCTRL_SCRATCHMA
1e770 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f  LLOC: {.      vo
1e780 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e  id *pFree, **ppN
1e790 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  ew;.      int sz
1e7a0 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f  ;.      sz = va_
1e7b0 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1e7c0 20 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61      ppNew = va_a
1e7d0 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a  rg(ap, void**);.
1e7e0 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 76 61        pFree = va
1e7f0 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
1e800 0a 20 20 20 20 20 20 69 66 28 20 73 7a 20 29 20  .      if( sz ) 
1e810 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33  *ppNew = sqlite3
1e820 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a  ScratchMalloc(sz
1e830 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e840 53 63 72 61 74 63 68 46 72 65 65 28 70 46 72 65  ScratchFree(pFre
1e850 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
1e860 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1e870 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1e880 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1e890 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
1e8a0 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66  FAULT, int onoff
1e8b0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1e8c0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e   If parameter on
1e8d0 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  off is non-zero,
1e8e0 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77   configure the w
1e8f0 72 61 70 70 65 72 73 20 73 6f 20 74 68 61 74 20  rappers so that 
1e900 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65  all.    ** subse
1e910 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c  quent calls to l
1e920 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76  ocaltime() and v
1e930 61 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66  ariants fail. If
1e940 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a   onoff is zero,.
1e950 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73      ** undo this
1e960 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f   setting..    */
1e970 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e980 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54  _TESTCTRL_LOCALT
1e990 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20  IME_FAULT: {.   
1e9a0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1e9b0 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d  Config.bLocaltim
1e9c0 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28  eFault = va_arg(
1e9d0 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1e9e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1e9f0 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1ea00 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1ea10 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45  TE_TESTCTRL_NEVE
1ea20 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e 74 29 3b  R_CORRUPT, int);
1ea30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
1ea40 65 74 20 6f 72 20 63 6c 65 61 72 20 61 20 66 6c  et or clear a fl
1ea50 61 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  ag that indicate
1ea60 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  s that the datab
1ea70 61 73 65 20 66 69 6c 65 20 69 73 20 61 6c 77 61  ase file is alwa
1ea80 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20  ys well-.    ** 
1ea90 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65 76 65 72  formed and never
1eaa0 20 63 6f 72 72 75 70 74 2e 20 20 54 68 69 73 20   corrupt.  This 
1eab0 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 62 79  flag is clear by
1eac0 20 64 65 66 61 75 6c 74 2c 20 69 6e 64 69 63 61   default, indica
1ead0 74 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a 2a  ting that.    **
1eae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1eaf0 6d 69 67 68 74 20 68 61 76 65 20 61 72 62 69 74  might have arbit
1eb00 72 61 72 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e  rary corruption.
1eb10 20 20 53 65 74 74 69 6e 67 20 74 68 65 20 66 6c    Setting the fl
1eb20 61 67 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a  ag during.    **
1eb30 20 74 65 73 74 69 6e 67 20 63 61 75 73 65 73 20   testing causes 
1eb40 63 65 72 74 61 69 6e 20 61 73 73 65 72 74 28 29  certain assert()
1eb50 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
1eb60 68 65 20 63 6f 64 65 20 74 6f 20 62 65 20 61 63  he code to be ac
1eb70 74 69 76 61 74 65 64 0a 20 20 20 20 2a 2a 20 74  tivated.    ** t
1eb80 68 61 74 20 64 65 6d 6f 6e 73 74 72 61 74 20 69  hat demonstrat i
1eb90 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20 77 65 6c  nvariants on wel
1eba0 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
1ebb0 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a  e files..    */.
1ebc0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ebd0 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43  TESTCTRL_NEVER_C
1ebe0 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 20 20  ORRUPT: {.      
1ebf0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1ec00 66 69 67 2e 6e 65 76 65 72 43 6f 72 72 75 70 74  fig.neverCorrupt
1ec10 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1ec20 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1ec30 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20  .    }...    /* 
1ec40 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1ec50 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1ec60 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45  STCTRL_VDBE_COVE
1ec70 52 41 47 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c  RAGE, xCallback,
1ec80 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20   ptr);.    **.  
1ec90 20 20 2a 2a 20 53 65 74 20 74 68 65 20 56 44 42    ** Set the VDB
1eca0 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c 62  E coverage callb
1ecb0 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  ack function to 
1ecc0 78 43 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 63  xCallback with c
1ecd0 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a 20 70  ontext .    ** p
1ece0 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20 20 20 20  ointer ptr..    
1ecf0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1ed00 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45  TE_TESTCTRL_VDBE
1ed10 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23 69 66  _COVERAGE: {.#if
1ed20 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
1ed30 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20 74  COVERAGE.      t
1ed40 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 62 72  ypedef void (*br
1ed50 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76  anch_callback)(v
1ed60 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c 75 38 29 3b  oid*,int,u8,u8);
1ed70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1ed80 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65  obalConfig.xVdbe
1ed90 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72 67 28  Branch = va_arg(
1eda0 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61  ap,branch_callba
1edb0 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ck);.      sqlit
1edc0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1edd0 56 64 62 65 42 72 61 6e 63 68 41 72 67 20 3d 20  VdbeBranchArg = 
1ede0 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a 29  va_arg(ap,void*)
1edf0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62  ;.#endif.      b
1ee00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1ee10 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1ee20 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1ee30 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45  E_TESTCTRL_SORTE
1ee40 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78  R_MMAP, db, nMax
1ee50 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  ); */.    case S
1ee60 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
1ee70 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20  ORTER_MMAP: {.  
1ee80 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
1ee90 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
1eea0 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62  ite3*);.      db
1eeb0 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70  ->nMaxSorterMmap
1eec0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1eed0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1eee0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1eef0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1ef00 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1ef10 54 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20  TCTRL_ISINIT);. 
1ef20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74     **.    ** Ret
1ef30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
1ef40 20 53 51 4c 69 74 65 20 68 61 73 20 62 65 65 6e   SQLite has been
1ef50 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
1ef60 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
1ef70 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20  .    ** not..   
1ef80 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1ef90 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49  ITE_TESTCTRL_ISI
1efa0 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  NIT: {.      if(
1efb0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1efc0 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29  nfig.isInit==0 )
1efd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1efe0 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
1eff0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1f000 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1f010 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1f020 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64  CTRL_IMPOSTER, d
1f030 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66  b, dbName, onOff
1f040 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a  , tnum);.    **.
1f050 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74      ** This test
1f060 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73 65 64   control is used
1f070 20 74 6f 20 63 72 65 61 74 65 20 69 6d 70 6f 73   to create impos
1f080 74 65 72 20 74 61 62 6c 65 73 2e 20 20 22 64 62  ter tables.  "db
1f090 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 20  " is a pointer. 
1f0a0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74     ** to the dat
1f0b0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1f0c0 2e 20 20 64 62 4e 61 6d 65 20 69 73 20 74 68 65  .  dbName is the
1f0d0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28   database name (
1f0e0 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20  ex: "main" or.  
1f0f0 20 20 2a 2a 20 22 74 65 6d 70 22 29 20 77 68 69    ** "temp") whi
1f100 63 68 20 77 69 6c 6c 20 72 65 63 65 69 76 65 20  ch will receive 
1f110 74 68 65 20 69 6d 70 6f 73 74 65 72 2e 20 20 22  the imposter.  "
1f120 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20 69 6d 70  onOff" turns imp
1f130 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20  oster mode on.  
1f140 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74    ** or off.  "t
1f150 6e 75 6d 22 20 69 73 20 74 68 65 20 72 6f 6f 74  num" is the root
1f160 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74   page of the b-t
1f170 72 65 65 20 74 6f 20 77 68 69 63 68 20 74 68 65  ree to which the
1f180 20 69 6d 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a   imposter.    **
1f190 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f   table should co
1f1a0 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  nnect..    **.  
1f1b0 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f    ** Enable impo
1f1c0 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77  ster mode only w
1f1d0 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 68  hen the schema h
1f1e0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1f1f0 70 61 72 73 65 64 2e 20 20 54 68 65 6e 0a 20 20  parsed.  Then.  
1f200 20 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c    ** run a singl
1f210 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
1f220 74 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73  tatement to cons
1f230 74 72 75 63 74 20 74 68 65 20 69 6d 70 6f 73 74  truct the impost
1f240 65 72 20 74 61 62 6c 65 20 69 6e 0a 20 20 20 20  er table in.    
1f250 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20 73 63  ** the parsed sc
1f260 68 65 6d 61 2e 20 20 54 68 65 6e 20 74 75 72 6e  hema.  Then turn
1f270 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 62   imposter mode b
1f280 61 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20  ack off again.. 
1f290 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
1f2a0 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75  onOff==0 and tnu
1f2b0 6d 3e 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  m>0 then reset t
1f2c0 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 61 6c  he schema for al
1f2d0 6c 20 64 61 74 61 62 61 73 65 73 2c 20 63 61 75  l databases, cau
1f2e0 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  sing.    ** the 
1f2f0 73 63 68 65 6d 61 20 74 6f 20 62 65 20 72 65 70  schema to be rep
1f300 61 72 73 65 64 20 74 68 65 20 6e 65 78 74 20 74  arsed the next t
1f310 69 6d 65 20 69 74 20 69 73 20 6e 65 65 64 65 64  ime it is needed
1f320 2e 20 20 54 68 69 73 20 68 61 73 20 74 68 65 0a  .  This has the.
1f330 20 20 20 20 2a 2a 20 65 66 66 65 63 74 20 6f 66      ** effect of
1f340 20 65 72 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70   erasing all imp
1f350 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 0a 20 20  oster tables..  
1f360 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1f370 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
1f380 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  POSTER: {.      
1f390 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61  sqlite3 *db = va
1f3a0 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
1f3b0 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
1f3c0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1f3d0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
1f3e0 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73  db->init.iDb = s
1f3f0 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
1f400 28 64 62 2c 20 76 61 5f 61 72 67 28 61 70 2c 63  (db, va_arg(ap,c
1f410 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20  onst char*));.  
1f420 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73      db->init.bus
1f430 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70  y = db->init.imp
1f440 6f 73 74 65 72 54 61 62 6c 65 20 3d 20 76 61 5f  osterTable = va_
1f450 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
1f460 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54     db->init.newT
1f470 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  num = va_arg(ap,
1f480 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  int);.      if( 
1f490 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
1f4a0 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77   && db->init.new
1f4b0 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20  Tnum>0 ){.      
1f4c0 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c    sqlite3ResetAl
1f4d0 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63  lSchemasOfConnec
1f4e0 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20 20  tion(db);.      
1f4f0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
1f500 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1f510 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72  mutex);.      br
1f520 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1f530 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e   va_end(ap);.#en
1f540 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1f550 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20  IT_BUILTIN_TEST 
1f560 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
1f570 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
1f580 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69   a utility routi
1f590 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46  ne, useful to VF
1f5a0 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
1f5b0 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a  s, that checks.*
1f5c0 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20 64 61  * to see if a da
1f5d0 74 61 62 61 73 65 20 66 69 6c 65 20 77 61 73 20  tabase file was 
1f5e0 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61  a URI that conta
1f5f0 69 6e 65 64 20 61 20 73 70 65 63 69 66 69 63 20  ined a specific 
1f600 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65  query .** parame
1f610 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f  ter, and if so o
1f620 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  btains the value
1f630 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 70 61   of the query pa
1f640 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  rameter..**.** T
1f650 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
1f660 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c  ument is the fil
1f670 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61  ename pointer pa
1f680 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f  ssed into the xO
1f690 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  pen().** method 
1f6a0 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65  of a VFS impleme
1f6b0 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50  ntation.  The zP
1f6c0 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73  aram argument is
1f6d0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1f6e0 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65  .** query parame
1f6f0 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68  ter we seek.  Th
1f700 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1f710 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
1f720 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61  the zParam.** pa
1f730 72 61 6d 65 74 65 72 20 69 66 20 69 74 20 65 78  rameter if it ex
1f740 69 73 74 73 2e 20 20 49 66 20 74 68 65 20 70 61  ists.  If the pa
1f750 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74  rameter does not
1f760 20 65 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75   exist, this rou
1f770 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
1f780 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  a NULL pointer..
1f790 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
1f7a0 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
1f7b0 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  eter(const char 
1f7c0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73  *zFilename, cons
1f7d0 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b  t char *zParam){
1f7e0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
1f7f0 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30  ==0 || zParam==0
1f800 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a   ) return 0;.  z
1f810 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
1f820 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
1f830 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68  ename) + 1;.  wh
1f840 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  ile( zFilename[0
1f850 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ] ){.    int x =
1f860 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
1f870 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20  e, zParam);.    
1f880 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c  zFilename += sql
1f890 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
1f8a0 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  lename) + 1;.   
1f8b0 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75   if( x==0 ) retu
1f8c0 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  rn zFilename;.  
1f8d0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
1f8e0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1f8f0 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
1f900 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1f910 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1f920 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66   boolean value f
1f930 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d  or a query param
1f940 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eter..*/.int sql
1f950 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
1f960 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1f970 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  lename, const ch
1f980 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20  ar *zParam, int 
1f990 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20  bDflt){.  const 
1f9a0 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
1f9b0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
1f9c0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
1f9d0 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44  m);.  bDflt = bD
1f9e0 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e  flt!=0;.  return
1f9f0 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42   z ? sqlite3GetB
1fa00 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29  oolean(z, bDflt)
1fa10 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   : bDflt;.}../*.
1fa20 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62  ** Return a 64-b
1fa30 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  it integer value
1fa40 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72   for a query par
1fa50 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74  ameter..*/.sqlit
1fa60 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
1fa70 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f  _uri_int64(.  co
1fa80 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1fa90 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e  ame,    /* Filen
1faa0 61 6d 65 20 61 73 20 70 61 73 73 65 64 20 74 6f  ame as passed to
1fab0 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73   xOpen */.  cons
1fac0 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20  t char *zParam, 
1fad0 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72        /* URI par
1fae0 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f  ameter sought */
1faf0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1fb00 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20   bDflt       /* 
1fb10 72 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65  return if parame
1fb20 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a  ter is missing *
1fb30 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
1fb40 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75  r *z = sqlite3_u
1fb50 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69  ri_parameter(zFi
1fb60 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
1fb70 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1fb80 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73   v;.  if( z && s
1fb90 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
1fba0 49 36 34 28 7a 2c 20 26 76 29 3d 3d 53 51 4c 49  I64(z, &v)==SQLI
1fbb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66  TE_OK ){.    bDf
1fbc0 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65  lt = v;.  }.  re
1fbd0 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f  turn bDflt;.}../
1fbe0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1fbf0 42 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64  Btree pointer id
1fc00 65 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e  entified by zDbN
1fc10 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ame.  Return NUL
1fc20 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
1fc30 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65  */.Btree *sqlite
1fc40 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73  3DbNameToBtree(s
1fc50 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
1fc60 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29  t char *zDbName)
1fc70 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1fc80 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
1fc90 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64   i++){.    if( d
1fca0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20  b->aDb[i].pBt.  
1fcb0 20 20 20 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d     && (zDbName==
1fcc0 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49  0 || sqlite3StrI
1fcd0 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d  Cmp(zDbName, db-
1fce0 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  >aDb[i].zName)==
1fcf0 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
1fd00 72 65 74 75 72 6e 20 64 62 2d 3e 61 44 62 5b 69  return db->aDb[i
1fd10 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  ].pBt;.    }.  }
1fd20 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1fd30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1fd40 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65   filename of the
1fd50 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
1fd60 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
1fd70 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
1fd80 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  on..*/.const cha
1fd90 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69  r *sqlite3_db_fi
1fda0 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a  lename(sqlite3 *
1fdb0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1fdc0 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
1fdd0 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53  e *pBt;.#ifdef S
1fde0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1fdf0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1fe00 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1fe10 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
1fe20 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
1fe30 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
1fe40 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
1fe50 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33  .  pBt = sqlite3
1fe60 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
1fe70 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65  , zDbName);.  re
1fe80 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74  turn pBt ? sqlit
1fe90 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
1fea0 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a  me(pBt) : 0;.}..
1feb0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  /*.** Return 1 i
1fec0 66 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  f database is re
1fed0 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20  ad-only or 0 if 
1fee0 72 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74  read/write.  Ret
1fef0 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20  urn -1 if.** no 
1ff00 73 75 63 68 20 64 61 74 61 62 61 73 65 20 65 78  such database ex
1ff10 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ists..*/.int sql
1ff20 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
1ff30 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
1ff40 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
1ff50 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  e){.  Btree *pBt
1ff60 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1ff70 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1ff80 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1ff90 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1ffa0 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
1ffb0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1ffc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ;.    return -1;
1ffd0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42  .  }.#endif.  pB
1ffe0 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  t = sqlite3DbNam
1fff0 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
20000 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
20010 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72  pBt ? sqlite3Btr
20020 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 70 42 74  eeIsReadonly(pBt
20030 29 20 3a 20 2d 31 3b 0a 7d 0a 23 69 66 20 28 53  ) : -1;.}.#if (S
20040 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50  QLITE_ENABLE_APP
20050 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66  LE_SPI>0) && def
20060 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
20070 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
20080 65 33 5f 70 72 69 76 61 74 65 2e 68 22 0a 0a 2f  e3_private.h"../
20090 2a 20 0a 2a 2a 20 54 65 73 74 69 6e 67 20 61 20  * .** Testing a 
200a0 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 73 71  file path for sq
200b0 6c 69 74 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  lite locks held 
200c0 62 79 20 61 20 70 72 6f 63 65 73 73 20 49 44 2e  by a process ID.
200d0 20 0a 2a 2a 20 52 65 74 75 72 6e 73 20 53 51 4c   .** Returns SQL
200e0 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 4e  ITE_LOCKSTATE_ON
200f0 20 69 66 20 6c 6f 63 6b 73 20 61 72 65 20 70 72   if locks are pr
20100 65 73 65 6e 74 20 6f 6e 20 70 61 74 68 0a 2a 2a  esent on path.**
20110 20 74 68 61 74 20 77 6f 75 6c 64 20 70 72 65 76   that would prev
20120 65 6e 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ent writing to t
20130 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
20140 69 6e 74 20 5f 73 71 6c 69 74 65 33 5f 6c 6f 63  int _sqlite3_loc
20150 6b 73 74 61 74 65 28 63 6f 6e 73 74 20 63 68 61  kstate(const cha
20160 72 20 2a 70 61 74 68 2c 20 70 69 64 5f 74 20 70  r *path, pid_t p
20170 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  id){.  sqlite3 *
20180 64 62 20 3d 20 4e 55 4c 4c 3b 0a 20 20 0a 20 20  db = NULL;.  .  
20190 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  if( sqlite3_open
201a0 5f 76 32 28 70 61 74 68 2c 20 26 64 62 2c 20 53  _v2(path, &db, S
201b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
201c0 4e 4c 59 2c 20 4e 55 4c 4c 29 20 3d 3d 20 53 51  NLY, NULL) == SQ
201d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 4c  LITE_OK ){.    L
201e0 6f 63 6b 73 74 61 74 65 50 49 44 20 6c 6f 63 6b  ockstatePID lock
201f0 73 74 61 74 65 20 3d 20 7b 70 69 64 2c 20 2d 31  state = {pid, -1
20200 7d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  };.    sqlite3_f
20210 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
20220 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e  NULL, SQLITE_FCN
20230 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 5f 50 49 44  TL_LOCKSTATE_PID
20240 2c 20 26 6c 6f 63 6b 73 74 61 74 65 29 3b 0a 20  , &lockstate);. 
20250 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
20260 28 64 62 29 3b 0a 20 20 20 20 69 6e 74 20 73 74  (db);.    int st
20270 61 74 65 20 3d 20 6c 6f 63 6b 73 74 61 74 65 2e  ate = lockstate.
20280 73 74 61 74 65 3b 0a 20 20 20 20 72 65 74 75 72  state;.    retur
20290 6e 20 73 74 61 74 65 3b 0a 20 20 7d 0a 20 20 69  n state;.  }.  i
202a0 66 28 20 4e 55 4c 4c 21 3d 64 62 20 29 7b 20 0a  f( NULL!=db ){ .
202b0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
202c0 65 28 64 62 29 3b 20 2f 2a 20 6e 65 65 64 20 74  e(db); /* need t
202d0 6f 20 63 6c 6f 73 65 20 65 76 65 6e 20 69 66 20  o close even if 
202e0 6f 70 65 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  open returns an 
202f0 65 72 72 6f 72 20 2a 2f 0a 20 20 7d 0a 20 20 72  error */.  }.  r
20300 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
20310 4b 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  KSTATE_ERROR;.}.
20320 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
20330 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53  E_ENABLE_APPLE_S
20340 50 49 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  PI */..#ifdef SQ
20350 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
20360 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  SHOT./*.** Obtai
20370 6e 20 61 20 73 6e 61 70 73 68 6f 74 20 68 61 6e  n a snapshot han
20380 64 6c 65 20 66 6f 72 20 74 68 65 20 73 6e 61 70  dle for the snap
20390 73 68 6f 74 20 6f 66 20 64 61 74 61 62 61 73 65  shot of database
203a0 20 7a 44 62 20 63 75 72 72 65 6e 74 6c 79 20 0a   zDb currently .
203b0 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 62 79  ** being read by
203c0 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
203d0 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  nt sqlite3_snaps
203e0 68 6f 74 5f 67 65 74 28 0a 20 20 73 71 6c 69 74  hot_get(.  sqlit
203f0 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3 *db, .  const
20400 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 73 71   char *zDb,.  sq
20410 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a  lite3_snapshot *
20420 2a 70 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20  *ppSnapshot.){. 
20430 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20440 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20  _ERROR;.#ifndef 
20450 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
20460 20 20 69 6e 74 20 69 44 62 3b 0a 0a 23 69 66 64    int iDb;..#ifd
20470 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
20480 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
20490 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
204a0 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
204b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
204c0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
204d0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
204e0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
204f0 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 69 44 62  ->mutex);..  iDb
20500 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
20510 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20  Name(db, zDb);. 
20520 20 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69   if( iDb==0 || i
20530 44 62 3e 31 20 29 7b 0a 20 20 20 20 42 74 72 65  Db>1 ){.    Btre
20540 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
20550 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69  [iDb].pBt;.    i
20560 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72  f( 0==sqlite3Btr
20570 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
20580 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
20590 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
205a0 54 72 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a 20  Trans(pBt, 0);. 
205b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
205c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
205d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
205e0 67 65 72 53 6e 61 70 73 68 6f 74 47 65 74 28 73  gerSnapshotGet(s
205f0 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
20600 28 70 42 74 29 2c 20 70 70 53 6e 61 70 73 68 6f  (pBt), ppSnapsho
20610 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
20620 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
20630 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
20640 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20  >mutex);.#endif 
20650 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    /* SQLITE_OMIT
20660 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e  _WAL */.  return
20670 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
20680 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
20690 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 6e 61  ction on the sna
206a0 70 73 68 6f 74 20 69 64 65 6e 64 69 66 69 65 64  pshot idendified
206b0 20 62 79 20 70 53 6e 61 70 73 68 6f 74 2e 0a 2a   by pSnapshot..*
206c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e  /.int sqlite3_sn
206d0 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20 20 73  apshot_open(.  s
206e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
206f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
20700 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  .  sqlite3_snaps
20710 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 0a 29  hot *pSnapshot.)
20720 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20730 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64  ITE_ERROR;.#ifnd
20740 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
20750 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  AL..#ifdef SQLIT
20760 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
20770 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
20780 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
20790 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
207a0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
207b0 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
207c0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
207d0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
207e0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f  ;.  if( db->auto
207f0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
20800 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 69 44   int iDb;.    iD
20810 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
20820 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a  bName(db, zDb);.
20830 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c      if( iDb==0 |
20840 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 20  | iDb>1 ){.     
20850 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
20860 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
20870 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
20880 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61  ite3BtreeIsInRea
20890 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  dTrans(pBt) ){. 
208a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
208b0 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74  te3PagerSnapshot
208c0 4f 70 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65  Open(sqlite3Btre
208d0 65 50 61 67 65 72 28 70 42 74 29 2c 20 70 53 6e  ePager(pBt), pSn
208e0 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20 20  apshot);.       
208f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20900 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
20910 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
20920 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c  eBeginTrans(pBt,
20930 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
20940 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73  qlite3PagerSnaps
20950 68 6f 74 4f 70 65 6e 28 73 71 6c 69 74 65 33 42  hotOpen(sqlite3B
20960 74 72 65 65 50 61 67 65 72 28 70 42 74 29 2c 20  treePager(pBt), 
20970 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
20980 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
20990 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
209a0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
209b0 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53  );.#endif   /* S
209c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
209d0 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
209e0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73  ../*.** Free a s
209f0 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 6f  napshot handle o
20a00 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
20a10 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65  ite3_snapshot_ge
20a20 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  t()..*/.void sql
20a30 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72  ite3_snapshot_fr
20a40 65 65 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  ee(sqlite3_snaps
20a50 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 29 7b  hot *pSnapshot){
20a60 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
20a70 70 53 6e 61 70 73 68 6f 74 29 3b 0a 7d 0a 23 65  pSnapshot);.}.#e
20a80 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
20a90 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a  NABLE_SNAPSHOT *
20aa0 2f 0a                                            /.