/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 75cdf5977022fe92a8fc2327934fd2ab4ccd29c0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
0290: 51 4c 52 52 0a 23 20 69 6e 63 6c 75 64 65 20 22  QLRR.# include "
02a0: 73 71 6c 72 72 2e 68 22 0a 23 65 6e 64 69 66 20  sqlrr.h".#endif 
02b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
02c0: 4e 41 42 4c 45 5f 46 54 53 33 0a 23 20 69 6e 63  NABLE_FTS3.# inc
02d0: 6c 75 64 65 20 22 66 74 73 33 2e 68 22 0a 23 65  lude "fts3.h".#e
02e0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
02f0: 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a  TE_ENABLE_RTREE.
0300: 23 20 69 6e 63 6c 75 64 65 20 22 72 74 72 65 65  # include "rtree
0310: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0320: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0330: 49 43 55 0a 23 20 69 6e 63 6c 75 64 65 20 22 73  ICU.# include "s
0340: 71 6c 69 74 65 69 63 75 2e 68 22 0a 23 65 6e 64  qliteicu.h".#end
0350: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
0360: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a  TE_AMALGAMATION.
0370: 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  /* IMPLEMENTATIO
0380: 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36 2d 34 35  N-OF: R-46656-45
0390: 31 35 36 20 54 68 65 20 73 71 6c 69 74 65 33 5f  156 The sqlite3_
03a0: 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67  version[] string
03b0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 63 6f 6e   constant.** con
03c0: 74 61 69 6e 73 20 74 68 65 20 74 65 78 74 20 6f  tains the text o
03d0: 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  f SQLITE_VERSION
03e0: 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73   macro. .*/.cons
03f0: 74 20 63 68 61 72 20 73 71 6c 69 74 65 33 5f 76  t char sqlite3_v
0400: 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c 49 54  ersion[] = SQLIT
0410: 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e 64 69  E_VERSION;.#endi
0420: 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  f../* IMPLEMENTA
0430: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33 35 33 36  TION-OF: R-53536
0440: 2d 34 32 35 37 35 20 54 68 65 20 73 71 6c 69 74  -42575 The sqlit
0450: 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 20  e3_libversion() 
0460: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
0470: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
0480: 20 74 68 65 20 74 6f 20 74 68 65 20 73 71 6c 69   the to the sqli
0490: 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74  te3_version[] st
04a0: 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e 20 0a  ring constant. .
04b0: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
04c0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
04d0: 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  n(void){ return 
04e0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 3b  sqlite3_version;
04f0: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0500: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 36 33 31 32  ATION-OF: R-6312
0510: 34 2d 33 39 33 30 30 20 54 68 65 20 73 71 6c 69  4-39300 The sqli
0520: 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 20 66  te3_sourceid() f
0530: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
0540: 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
0550: 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e  a string constan
0560: 74 20 77 68 6f 73 65 20 76 61 6c 75 65 20 69 73  t whose value is
0570: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
0580: 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f 55 52 43  .** SQLITE_SOURC
0590: 45 5f 49 44 20 43 20 70 72 65 70 72 6f 63 65 73  E_ID C preproces
05a0: 73 6f 72 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63  sor macro. .*/.c
05b0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
05c0: 65 33 5f 73 6f 75 72 63 65 69 64 28 76 6f 69 64  e3_sourceid(void
05d0: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
05e0: 5f 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a 0a 2f  _SOURCE_ID; }../
05f0: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0600: 2d 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36 33 35  -OF: R-35210-635
0610: 30 38 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c  08 The sqlite3_l
0620: 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72  ibversion_number
0630: 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72  () function.** r
0640: 65 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65  eturns an intege
0650: 72 20 65 71 75 61 6c 20 74 6f 20 53 51 4c 49 54  r equal to SQLIT
0660: 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
0670: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0680: 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
0690: 65 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e  er(void){ return
06a0: 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
06b0: 4e 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 20 49 4d  NUMBER; }../* IM
06c0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
06d0: 20 52 2d 32 30 37 39 30 2d 31 34 30 32 35 20 54   R-20790-14025 T
06e0: 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  he sqlite3_threa
06f0: 64 73 61 66 65 28 29 20 66 75 6e 63 74 69 6f 6e  dsafe() function
0700: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f   returns.** zero
0710: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
0720: 53 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69  SQLite was compi
0730: 6c 65 64 20 77 69 74 68 20 6d 75 74 65 78 69 6e  led with mutexin
0740: 67 20 63 6f 64 65 20 6f 6d 69 74 74 65 64 20 64  g code omitted d
0750: 75 65 20 74 6f 0a 2a 2a 20 74 68 65 20 53 51 4c  ue to.** the SQL
0760: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 63  ITE_THREADSAFE c
0770: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
0780: 6f 6e 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20  on being set to 
0790: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
07a0: 33 5f 74 68 72 65 61 64 73 61 66 65 28 76 6f 69  3_threadsafe(voi
07b0: 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d){ return SQLIT
07c0: 45 5f 54 48 52 45 41 44 53 41 46 45 3b 20 7d 0a  E_THREADSAFE; }.
07d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
07e0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
07f0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
0800: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
0810: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E)./*.** If the 
0820: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
0830: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  on pointer is no
0840: 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a 2a  t NULL and if.**
0850: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
0860: 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62 6c 65  OTRACE is enable
0870: 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67 65 73  d, then messages
0880: 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 49   describing.** I
0890: 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20 77 72  /O active are wr
08a0: 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68 69 73  itten using this
08b0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73   function.  Thes
08c0: 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61 72  e messages.** ar
08d0: 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 64  e intended for d
08e0: 65 62 75 67 67 69 6e 67 20 61 63 74 69 76 69 74  ebugging activit
08f0: 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  y only..*/.void 
0900: 28 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65  (*sqlite3IoTrace
0910: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e  )(const char*, .
0920: 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ..) = 0;.#endif.
0930: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f  ./*.** If the fo
0940: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
0950: 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74  ariable points t
0960: 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 68  o a string which
0970: 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20   is the.** name 
0980: 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  of a directory, 
0990: 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63 74  then that direct
09a0: 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ory will be used
09b0: 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d   to store.** tem
09c0: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a  porary files..**
09d0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
09e0: 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74   "PRAGMA temp_st
09f0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53  ore_directory" S
0a00: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63  QL command..*/.c
0a10: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 74 65 6d  har *sqlite3_tem
0a20: 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  p_directory = 0;
0a30: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
0a40: 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a  ze SQLite.  .**.
0a50: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0a60: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74  must be called t
0a70: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
0a80: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0a90: 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20  on,.** VFS, and 
0aa0: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73  mutex subsystems
0ab0: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
0ac0: 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b  any serious work
0ad0: 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e   with.** SQLite.
0ae0: 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73    But as long as
0af0: 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70   you do not comp
0b00: 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ile with SQLITE_
0b10: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a  OMIT_AUTOINIT.**
0b20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
0b30: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74  ll be called aut
0b40: 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65  omatically by ke
0b50: 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20  y routines such 
0b60: 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70  as.** sqlite3_op
0b70: 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  en().  .**.** Th
0b80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
0b90: 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20  no-op except on 
0ba0: 69 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63  its very first c
0bb0: 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63  all for the proc
0bc0: 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74  ess,.** or for t
0bd0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66  he first call af
0be0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
0bf0: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a  lite3_shutdown..
0c00: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
0c10: 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74  thread to call t
0c20: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
0c30: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
0c40: 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65  ion to.** comple
0c50: 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71  tion.  If subseq
0c60: 75 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c  uent threads cal
0c70: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  l this routine b
0c80: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a  efore the first.
0c90: 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69  ** thread has fi
0ca0: 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69  nished the initi
0cb0: 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73  alization proces
0cc0: 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73  s, then the subs
0cd0: 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64  equent.** thread
0ce0: 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74  s must block unt
0cf0: 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72  il the first thr
0d00: 65 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74  ead finishes wit
0d10: 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  h the initializa
0d20: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
0d30: 66 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67  first thread mig
0d40: 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ht call this rou
0d50: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
0d60: 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20  .  Recursive.** 
0d70: 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f  calls to this ro
0d80: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
0d90: 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73   block, of cours
0da0: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  e.  Otherwise th
0db0: 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74  e.** initializat
0dc0: 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c  ion process woul
0dd0: 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65  d never complete
0de0: 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65  ..**.** Let X be
0df0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61   the first threa
0e00: 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20  d to enter this 
0e10: 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20  routine.  Let Y 
0e20: 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  be some other.**
0e30: 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77   thread.  Then w
0e40: 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c  hile the initial
0e50: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
0e60: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58  his routine by X
0e70: 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74   is.** incomplet
0e80: 65 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65  e, it is require
0e90: 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  d that:.**.**   
0ea0: 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69   *  Calls to thi
0eb0: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59  s routine from Y
0ec0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0ed0: 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74  l the outer-most
0ee0: 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62  .**       call b
0ef0: 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a  y X completes..*
0f00: 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72  *.**    *  Recur
0f10: 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68  sive calls to th
0f20: 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  is routine from 
0f30: 74 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20  thread X return 
0f40: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
0f50: 20 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f       without blo
0f60: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
0f70: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
0f80: 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f  (void){.  MUTEX_
0f90: 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
0fa0: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
0fb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
0fc0: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
0fd0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1000: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1010: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1020: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1030: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1040: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
1050: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1060: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1070: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
1080: 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20  .  /* If SQLite 
1090: 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c  is already compl
10a0: 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65  etely initialize
10b0: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  d, then this cal
10c0: 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65  l.  ** to sqlite
10d0: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73  3_initialize() s
10e0: 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70  hould be a no-op
10f0: 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69 74 69  .  But the initi
1100: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d  alization.  ** m
1110: 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e  ust be complete.
1120: 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74    So isInit must
1130: 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69   not be set unti
1140: 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20  l the very end. 
1150: 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74   ** of this rout
1160: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ine..  */.  if( 
1170: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1180: 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74  fig.isInit ) ret
1190: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
11a0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
11b0: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
11c0: 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  em is initialize
11d0: 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  d.  If unable to
11e0: 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a   .  ** initializ
11f0: 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73  e the mutex subs
1200: 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61  ystem, return ea
1210: 72 6c 79 20 77 69 74 68 20 74 68 65 20 65 72 72  rly with the err
1220: 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  or..  ** If the 
1230: 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63  system is so sic
1240: 6b 20 74 68 61 74 20 77 65 20 61 72 65 20 75 6e  k that we are un
1250: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
1260: 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74   a mutex,.  ** t
1270: 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68  here is not much
1280: 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67   SQLite is going
1290: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64   to be able to d
12a0: 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  o..  **.  ** The
12b0: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
12c0: 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72 65 20   must take care 
12d0: 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69  of serializing i
12e0: 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74  ts own.  ** init
12f0: 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f  ialization..  */
1300: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d  .  rc = sqlite3M
1310: 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66  utexInit();.  if
1320: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1330: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
1340: 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20  ze the malloc() 
1350: 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72  system and the r
1360: 65 63 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75  ecursive pInitMu
1370: 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20  tex mutex..  ** 
1380: 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69  This operation i
1390: 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 74  s protected by t
13a0: 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52  he STATIC_MASTER
13b0: 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68   mutex.  Note th
13c0: 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c  at.  ** MutexAll
13d0: 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66  oc() is called f
13e0: 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75 74 65  or a static mute
13f0: 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69  x prior to initi
1400: 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a  alizing the.  **
1410: 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65   malloc subsyste
1420: 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73  m - this implies
1430: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
1440: 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63  tion of a static
1450: 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74  .  ** mutex must
1460: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73 75 70   not require sup
1470: 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61  port from the ma
1480: 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a  lloc subsystem..
1490: 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47    */.  MUTEX_LOG
14a0: 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
14b0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
14c0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
14d0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
14e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
14f0: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
1500: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1510: 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74  nfig.isMutexInit
1520: 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c   = 1;.  if( !sql
1530: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1540: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
1550: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1560: 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20  3MallocInit();. 
1570: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1580: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1590: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15a0: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d  g.isMallocInit =
15b0: 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c   1;.    if( !sql
15c0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
15d0: 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20  .pInitMutex ){. 
15e0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
15f0: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
1600: 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20  tex =.          
1610: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
1620: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1630: 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20  RECURSIVE);.    
1640: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1650: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
1660: 75 74 65 78 20 26 26 20 21 73 71 6c 69 74 65 33  utex && !sqlite3
1670: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1680: 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  itMutex ){.     
1690: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
16a0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
16b0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
16c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16d0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
16e0: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
16f0: 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  utex++;.  }.  sq
1700: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1710: 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f  e(pMaster);..  /
1720: 2a 20 49 66 20 72 63 20 69 73 20 6e 6f 74 20 53  * If rc is not S
1730: 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74 68 69 73  QLITE_OK at this
1740: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69 74   point, then eit
1750: 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a 20  her the malloc. 
1760: 20 2a 2a 20 73 75 62 73 79 73 74 65 6d 20 63 6f   ** subsystem co
1770: 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 69 74 69  uld not be initi
1780: 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20 73 79  alized or the sy
1790: 73 74 65 6d 20 66 61 69 6c 65 64 20 74 6f 20 61  stem failed to a
17a0: 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65  llocate.  ** the
17b0: 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65   pInitMutex mute
17c0: 78 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  x. Return an err
17d0: 6f 72 20 69 6e 20 65 69 74 68 65 72 20 63 61 73  or in either cas
17e0: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  e.  */.  if( rc!
17f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1800: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1810: 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 72 65  ..  /* Do the re
1820: 73 74 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  st of the initia
1830: 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20 74  lization under t
1840: 68 65 20 72 65 63 75 72 73 69 76 65 20 6d 75 74  he recursive mut
1850: 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ex so.  ** that 
1860: 77 65 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  we will be able 
1870: 74 6f 20 68 61 6e 64 6c 65 20 72 65 63 75 72 73  to handle recurs
1880: 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a 20  ive calls into. 
1890: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74   ** sqlite3_init
18a0: 69 61 6c 69 7a 65 28 29 2e 20 20 54 68 65 20 72  ialize().  The r
18b0: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6e  ecursive calls n
18c0: 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68 72  ormally come thr
18d0: 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74 65  ough.  ** sqlite
18e0: 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 68 65 6e  3_os_init() when
18f0: 20 69 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69   it invokes sqli
1900: 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
1910: 28 29 2c 20 62 75 74 20 6f 74 68 65 72 0a 20 20  (), but other.  
1920: 2a 2a 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  ** recursive cal
1930: 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  ls might also be
1940: 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a 0a   possible..  **.
1950: 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
1960: 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30 2d  ION-OF: R-00140-
1970: 33 37 34 34 35 20 53 51 4c 69 74 65 20 61 75 74  37445 SQLite aut
1980: 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 72 69 61  omatically seria
1990: 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a 2a  lizes calls.  **
19a0: 20 74 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65   to the xInit me
19b0: 74 68 6f 64 2c 20 73 6f 20 74 68 65 20 78 49 6e  thod, so the xIn
19c0: 69 74 20 6d 65 74 68 6f 64 20 6e 65 65 64 20 6e  it method need n
19d0: 6f 74 20 62 65 20 74 68 72 65 61 64 73 61 66 65  ot be threadsafe
19e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
19f0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78 20  following mutex 
1a00: 69 73 20 77 68 61 74 20 73 65 72 69 61 6c 69 7a  is what serializ
1a10: 65 73 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  es access to the
1a20: 20 61 70 70 64 65 66 20 70 63 61 63 68 65 20 78   appdef pcache x
1a30: 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f 64  Init.  ** method
1a40: 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
1a50: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e 78  pcache_methods.x
1a60: 49 6e 69 74 28 29 20 61 6c 6c 20 69 73 20 65 6d  Init() all is em
1a70: 62 65 64 64 65 64 20 69 6e 20 74 68 65 0a 20 20  bedded in the.  
1a80: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
1a90: 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69  e3PcacheInitiali
1aa0: 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ze()..  */.  sql
1ab0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1ac0: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
1ad0: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29  nfig.pInitMutex)
1ae0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ;.  if( sqlite3G
1af0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
1b00: 69 74 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  it==0 && sqlite3
1b10: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
1b20: 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20  rogress==0 ){.  
1b30: 20 20 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70    FuncDefHash *p
1b40: 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46  Hash = &GLOBAL(F
1b50: 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69  uncDefHash, sqli
1b60: 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  te3GlobalFunctio
1b70: 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ns);.    sqlite3
1b80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
1b90: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20  rogress = 1;.   
1ba0: 20 6d 65 6d 73 65 74 28 70 48 61 73 68 2c 20 30   memset(pHash, 0
1bb0: 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  , sizeof(sqlite3
1bc0: 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29  GlobalFunctions)
1bd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1be0: 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e 63  gisterGlobalFunc
1bf0: 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28  tions();.    if(
1c00: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1c10: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
1c20: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
1c30: 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1c40: 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  Initialize();.  
1c50: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1c60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c70: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1c80: 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49  Config.isPCacheI
1c90: 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  nit = 1;.      r
1ca0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69  c = sqlite3OsIni
1cb0: 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  t();.    }.    i
1cc0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cd0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ce0: 33 50 43 61 63 68 65 42 75 66 66 65 72 53 65 74  3PCacheBufferSet
1cf0: 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  up( sqlite3Globa
1d00: 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20 0a  lConfig.pPage, .
1d10: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d20: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
1d30: 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47 6c 6f  Page, sqlite3Glo
1d40: 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 29  balConfig.nPage)
1d50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
1d60: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
1d70: 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  it = 1;.    }.  
1d80: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1d90: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
1da0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
1db0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1dc0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1dd0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
1de0: 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75  ..  /* Go back u
1df0: 6e 64 65 72 20 74 68 65 20 73 74 61 74 69 63 20  nder the static 
1e00: 6d 75 74 65 78 20 61 6e 64 20 63 6c 65 61 6e 20  mutex and clean 
1e10: 75 70 20 74 68 65 20 72 65 63 75 72 73 69 76 65  up the recursive
1e20: 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70  .  ** mutex to p
1e30: 72 65 76 65 6e 74 20 61 20 72 65 73 6f 75 72 63  revent a resourc
1e40: 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73  e leak..  */.  s
1e50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1e60: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1e70: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1e80: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
1e90: 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  --;.  if( sqlite
1ea0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1eb0: 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29  efInitMutex<=0 )
1ec0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
1ed0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1ee0: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3d  g.nRefInitMutex=
1ef0: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
1f00: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73 71 6c  3_mutex_free(sql
1f10: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1f20: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20  .pInitMutex);.  
1f30: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1f40: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1f50: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
1f60: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1f70: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
1f80: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
1f90: 20 6a 75 73 74 20 61 20 73 61 6e 69 74 79 20 63   just a sanity c
1fa0: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
1fb0: 65 20 53 51 4c 69 74 65 20 68 61 73 0a 20 20 2a  e SQLite has.  *
1fc0: 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20  * been compiled 
1fd0: 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 74 20 69  correctly.  It i
1fe0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72  s important to r
1ff0: 75 6e 20 74 68 69 73 20 63 6f 64 65 2c 20 62 75  un this code, bu
2000: 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  t.  ** we don't 
2010: 77 61 6e 74 20 74 6f 20 72 75 6e 20 69 74 20 74  want to run it t
2020: 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61  oo often and soa
2030: 6b 20 75 70 20 43 50 55 20 63 79 63 6c 65 73 20  k up CPU cycles 
2040: 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73  for no.  ** reas
2050: 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75 6e 20 69  on.  So we run i
2060: 74 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 69 6e  t once during in
2070: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
2080: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
2090: 47 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  G.#ifndef SQLITE
20a0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
20b0: 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69 73 20 73  OINT.  /* This s
20c0: 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73  ection of code's
20d0: 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74 22 20 69   only "output" i
20e0: 73 20 76 69 61 20 61 73 73 65 72 74 28 29 20 73  s via assert() s
20f0: 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  tatements. */.  
2100: 69 66 20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  if ( rc==SQLITE_
2110: 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34 20 78 20  OK ){.    u64 x 
2120: 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 36 33 29  = (((u64)1)<<63)
2130: 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79  -1;.    double y
2140: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69 7a  ;.    assert(siz
2150: 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20 20 20 20  eof(x)==8);.    
2160: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
2170: 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b 0a 20 20  ==sizeof(y));.  
2180: 20 20 6d 65 6d 63 70 79 28 26 79 2c 20 26 78 2c    memcpy(&y, &x,
2190: 20 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   8);.    assert(
21a0: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 79 29   sqlite3IsNaN(y)
21b0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   );.  }.#endif.#
21c0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 65  endif..  /* Do e
21d0: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
21e0: 69 6f 6e 20 73 74 65 70 73 20 72 65 71 75 65 73  ion steps reques
21f0: 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ted by the SQLIT
2200: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 2a  E_EXTRA_INIT.  *
2210: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  * compile-time o
2220: 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  ption..  */.#ifd
2230: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
2240: 49 4e 49 54 0a 20 20 69 66 28 20 72 63 3d 3d 53  INIT.  if( rc==S
2250: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69  QLITE_OK && sqli
2260: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2270: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e  isInit ){.    in
2280: 74 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  t SQLITE_EXTRA_I
2290: 4e 49 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  NIT(const char*)
22a0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
22b0: 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b  E_EXTRA_INIT(0);
22c0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
22d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22e0: 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65  ** Undo the effe
22f0: 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  cts of sqlite3_i
2300: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75  nitialize().  Mu
2310: 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  st not be called
2320: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20   while.** there 
2330: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
2340: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2350: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
2360: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a  llocations or.**
2370: 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20   while any part 
2380: 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68  of SQLite is oth
2390: 65 72 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e  erwise in use in
23a0: 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68   any thread.  Th
23b0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
23c0: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e   not threadsafe.
23d0: 20 20 42 75 74 20 69 74 20 69 73 20 73 61 66 65    But it is safe
23e0: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20   to invoke this 
23f0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68  routine.** on wh
2400: 65 6e 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72  en SQLite is alr
2410: 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20  eady shut down. 
2420: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c   If SQLite is al
2430: 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a  ready shut down.
2440: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
2450: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c  tine is invoked,
2460: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
2470: 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
2480: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
2490: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
24a0: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 73 71 6c  void){.  if( sql
24b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
24c0: 2e 69 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65  .isInit ){.#ifde
24d0: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53  f SQLITE_EXTRA_S
24e0: 48 55 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64  HUTDOWN.    void
24f0: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48   SQLITE_EXTRA_SH
2500: 55 54 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20  UTDOWN(void);.  
2510: 20 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53    SQLITE_EXTRA_S
2520: 48 55 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69  HUTDOWN();.#endi
2530: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73  f.    sqlite3_os
2540: 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69  _end();.    sqli
2550: 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65  te3_reset_auto_e
2560: 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20  xtension();.    
2570: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2580: 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  fig.isInit = 0;.
2590: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
25a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
25b0: 50 43 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20  PCacheInit ){.  
25c0: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
25d0: 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73  hutdown();.    s
25e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
25f0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
2600: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
2610: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2620: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
2630: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61  ){.    sqlite3Ma
2640: 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73  llocEnd();.    s
2650: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2660: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
2670: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
2680: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2690: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 29  ig.isMutexInit )
26a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74  {.    sqlite3Mut
26b0: 65 78 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  exEnd();.    sql
26c0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
26d0: 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d 20 30  .isMutexInit = 0
26e0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
26f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2700: 0a 2a 2a 20 54 68 69 73 20 41 50 49 20 61 6c 6c  .** This API all
2710: 6f 77 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  ows applications
2720: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 67   to modify the g
2730: 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  lobal configurat
2740: 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 53 51  ion of.** the SQ
2750: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 61 74 20  Lite library at 
2760: 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  run-time..**.** 
2770: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
2780: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
2790: 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
27a0: 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
27b0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
27c0: 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f  nections or memo
27d0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20  ry allocations. 
27e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
27f0: 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 61   not.** threadsa
2800: 66 65 2e 20 20 46 61 69 6c 75 72 65 20 74 6f 20  fe.  Failure to 
2810: 68 65 65 64 20 74 68 65 73 65 20 77 61 72 6e 69  heed these warni
2820: 6e 67 73 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  ngs can lead to 
2830: 75 6e 70 72 65 64 69 63 74 61 62 6c 65 0a 2a 2a  unpredictable.**
2840: 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e   behavior..*/.in
2850: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  t sqlite3_config
2860: 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20  (int op, ...){. 
2870: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
2880: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2890: 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33  K;..  /* sqlite3
28a0: 5f 63 6f 6e 66 69 67 28 29 20 73 68 61 6c 6c 20  _config() shall 
28b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
28c0: 53 55 53 45 20 69 66 20 69 74 20 69 73 20 69 6e  SUSE if it is in
28d0: 76 6f 6b 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a  voked while.  **
28e0: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
28f0: 61 72 79 20 69 73 20 69 6e 20 75 73 65 2e 20 2a  ary is in use. *
2900: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  /.  if( sqlite3G
2910: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
2920: 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  it ) return SQLI
2930: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
2940: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
2950: 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op);.  switch( o
2960: 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4d 75 74  p ){..    /* Mut
2970: 65 78 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ex configuration
2980: 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 6f 6e 6c   options are onl
2990: 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  y available in a
29a0: 20 74 68 72 65 61 64 73 61 66 65 0a 20 20 20 20   threadsafe.    
29b0: 2a 2a 20 63 6f 6d 70 69 6c 65 2e 20 0a 20 20 20  ** compile. .   
29c0: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
29d0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
29e0: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
29f0: 45 41 44 53 41 46 45 3e 30 0a 20 20 20 20 63 61  EADSAFE>0.    ca
2a00: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
2a10: 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b  _SINGLETHREAD: {
2a20: 0a 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c  .      /* Disabl
2a30: 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a  e all mutexing *
2a40: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
2a50: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
2a60: 65 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20  eMutex = 0;.    
2a70: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2a80: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
2a90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
2aa0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
2ab0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
2ac0: 4d 55 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a 20  MULTITHREAD: {. 
2ad0: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
2ae0: 6d 75 74 65 78 69 6e 67 20 6f 66 20 64 61 74 61  mutexing of data
2af0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
2b00: 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61   */.      /* Ena
2b10: 62 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20  ble mutexing of 
2b20: 63 6f 72 65 20 64 61 74 61 20 73 74 72 75 63 74  core data struct
2b30: 75 72 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 71  ures */.      sq
2b40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2b50: 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31  g.bCoreMutex = 1
2b60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
2b70: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
2b80: 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20  lMutex = 0;.    
2b90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2ba0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2bb0: 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49 5a 45 44  ONFIG_SERIALIZED
2bc0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61  : {.      /* Ena
2bd0: 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e 67  ble all mutexing
2be0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2bf0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
2c00: 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20  oreMutex = 1;.  
2c10: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2c20: 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
2c30: 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  ex = 1;.      br
2c40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
2c50: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
2c60: 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20  G_MUTEX: {.     
2c70: 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61   /* Specify an a
2c80: 6c 74 65 72 6e 61 74 69 76 65 20 6d 75 74 65 78  lternative mutex
2c90: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2ca0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2cb0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74  GlobalConfig.mut
2cc0: 65 78 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c  ex = *va_arg(ap,
2cd0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d   sqlite3_mutex_m
2ce0: 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20  ethods*);.      
2cf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2d00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2d10: 46 49 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a  FIG_GETMUTEX: {.
2d20: 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76        /* Retriev
2d30: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 75  e the current mu
2d40: 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tex implementati
2d50: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f  on */.      *va_
2d60: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
2d70: 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20  mutex_methods*) 
2d80: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
2d90: 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20  onfig.mutex;.   
2da0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2db0: 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20 63 61 73  #endif...    cas
2dc0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
2dd0: 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
2de0: 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c  /* Specify an al
2df0: 74 65 72 6e 61 74 69 76 65 20 6d 61 6c 6c 6f 63  ternative malloc
2e00: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2e10: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2e20: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
2e30: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
2e40: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
2e50: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
2e60: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2e70: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
2e80: 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  TMALLOC: {.     
2e90: 20 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65   /* Retrieve the
2ea0: 20 63 75 72 72 65 6e 74 20 6d 61 6c 6c 6f 63 28   current malloc(
2eb0: 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  ) implementation
2ec0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
2ed0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2ee0: 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29  g.m.xMalloc==0 )
2ef0: 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65   sqlite3MemSetDe
2f00: 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 2a  fault();.      *
2f10: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
2f20: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29  e3_mem_methods*)
2f30: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
2f40: 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20 20 20  Config.m;.      
2f50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2f60: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2f70: 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a 20 7b  FIG_MEMSTATUS: {
2f80: 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65  .      /* Enable
2f90: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
2fa0: 6d 61 6c 6c 6f 63 20 73 74 61 74 75 73 20 63 6f  malloc status co
2fb0: 6c 6c 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  llection */.    
2fc0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2fd0: 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d  onfig.bMemstat =
2fe0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
2ff0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3000: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3010: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41  LITE_CONFIG_SCRA
3020: 54 43 48 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  TCH: {.      /* 
3030: 44 65 73 69 67 6e 61 74 65 20 61 20 62 75 66 66  Designate a buff
3040: 65 72 20 66 6f 72 20 73 63 72 61 74 63 68 20 6d  er for scratch m
3050: 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20  emory space */. 
3060: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3070: 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63  alConfig.pScratc
3080: 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  h = va_arg(ap, v
3090: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  oid*);.      sql
30a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
30b0: 2e 73 7a 53 63 72 61 74 63 68 20 3d 20 76 61 5f  .szScratch = va_
30c0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
30d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
30e0: 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68  lConfig.nScratch
30f0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3100: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
3110: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3120: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41  SQLITE_CONFIG_PA
3130: 47 45 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20  GECACHE: {.     
3140: 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20   /* Designate a 
3150: 62 75 66 66 65 72 20 66 6f 72 20 70 61 67 65 20  buffer for page 
3160: 63 61 63 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  cache memory spa
3170: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
3180: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3190: 70 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  pPage = va_arg(a
31a0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
31b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
31c0: 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61  nfig.szPage = va
31d0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
31e0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
31f0: 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d  alConfig.nPage =
3200: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
3210: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3220: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53     }..    case S
3230: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41  QLITE_CONFIG_PCA
3240: 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  CHE: {.      /* 
3250: 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62  no-op */.      b
3260: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3270: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3280: 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20 7b 0a  IG_GETPCACHE: {.
3290: 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 6e 20        /* now an 
32a0: 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72  error */.      r
32b0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
32c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
32d0: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53     }..    case S
32e0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41  QLITE_CONFIG_PCA
32f0: 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CHE2: {.      /*
3300: 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65   Specify an alte
3310: 72 6e 61 74 69 76 65 20 70 61 67 65 20 63 61 63  rnative page cac
3320: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
3330: 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  n */.      sqlit
3340: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
3350: 63 61 63 68 65 32 20 3d 20 2a 76 61 5f 61 72 67  cache2 = *va_arg
3360: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61  (ap, sqlite3_pca
3370: 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 3b 0a  che_methods2*);.
3380: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3390: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
33a0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
33b0: 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 69 66  CHE2: {.      if
33c0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
33d0: 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 2e 78 49  onfig.pcache2.xI
33e0: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
33f0: 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 53    sqlite3PCacheS
3400: 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20  etDefault();.   
3410: 20 20 20 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61     }.      *va_a
3420: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70  rg(ap, sqlite3_p
3430: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29  cache_methods2*)
3440: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
3450: 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 3b 0a  Config.pcache2;.
3460: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3470: 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28   }..#if defined(
3480: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
3490: 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69 6e 65  MSYS3) || define
34a0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
34b0: 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63 61 73  MEMSYS5).    cas
34c0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
34d0: 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  HEAP: {.      /*
34e0: 20 44 65 73 69 67 6e 61 74 65 20 61 20 62 75 66   Designate a buf
34f0: 66 65 72 20 66 6f 72 20 68 65 61 70 20 6d 65 6d  fer for heap mem
3500: 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ory space */.   
3510: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3520: 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 76  Config.pHeap = v
3530: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
3540: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
3550: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61  lobalConfig.nHea
3560: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  p = va_arg(ap, i
3570: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
3580: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3590: 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28 61 70  nReq = va_arg(ap
35a0: 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20 69  , int);..      i
35b0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
35c0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c 31 20 29  Config.mnReq<1 )
35d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
35e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
35f0: 52 65 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Req = 1;.      }
3600: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
3610: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
3620: 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b 0a 20 20  eq>(1<<12) ){.  
3630: 20 20 20 20 20 20 2f 2a 20 63 61 70 20 6d 69 6e        /* cap min
3640: 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 61 74   request size at
3650: 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20 20 20 20   2^12 */.       
3660: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3670: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 28 31 3c  nfig.mnReq = (1<
3680: 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  <12);.      }.. 
3690: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
36a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
36b0: 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ap==0 ){.       
36c0: 20 2f 2a 20 49 66 20 74 68 65 20 68 65 61 70 20   /* If the heap 
36d0: 70 6f 69 6e 74 65 72 20 69 73 20 4e 55 4c 4c 2c  pointer is NULL,
36e0: 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68   then restore th
36f0: 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65  e malloc impleme
3700: 6e 74 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  ntation.        
3710: 2a 2a 20 62 61 63 6b 20 74 6f 20 4e 55 4c 4c 20  ** back to NULL 
3720: 70 6f 69 6e 74 65 72 73 20 74 6f 6f 2e 20 20 54  pointers too.  T
3730: 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
3740: 68 65 20 6d 61 6c 6c 6f 63 20 74 6f 20 67 6f 0a  he malloc to go.
3750: 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20          ** back 
3760: 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74 20 69  to its default i
3770: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 68  mplementation wh
3780: 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  en sqlite3_initi
3790: 61 6c 69 7a 65 28 29 20 69 73 0a 20 20 20 20 20  alize() is.     
37a0: 20 20 20 2a 2a 20 72 75 6e 2e 0a 20 20 20 20 20     ** run..     
37b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65     */.        me
37c0: 6d 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f  mset(&sqlite3Glo
37d0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20  balConfig.m, 0, 
37e0: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c  sizeof(sqlite3Gl
37f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a  obalConfig.m));.
3800: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3810: 20 20 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70       /* The heap
3820: 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20   pointer is not 
3830: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e 73 74 61  NULL, then insta
3840: 6c 6c 20 6f 6e 65 20 6f 66 20 74 68 65 0a 20 20  ll one of the.  
3850: 20 20 20 20 20 20 2a 2a 20 6d 65 6d 35 2e 63 2f        ** mem5.c/
3860: 6d 65 6d 33 2e 63 20 6d 65 74 68 6f 64 73 2e 20  mem3.c methods. 
3870: 49 66 20 6e 65 69 74 68 65 72 20 45 4e 41 42 4c  If neither ENABL
3880: 45 5f 4d 45 4d 53 59 53 33 20 6e 6f 72 0a 20 20  E_MEMSYS3 nor.  
3890: 20 20 20 20 20 20 2a 2a 20 45 4e 41 42 4c 45 5f        ** ENABLE_
38a0: 4d 45 4d 53 59 53 35 20 69 73 20 64 65 66 69 6e  MEMSYS5 is defin
38b0: 65 64 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  ed, return an er
38c0: 72 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ror..        */.
38d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
38e0: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20  ABLE_MEMSYS3.   
38f0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3900: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
3910: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
3920: 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  s3();.#endif.#if
3930: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3940: 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20  E_MEMSYS5.      
3950: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3960: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
3970: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28  e3MemGetMemsys5(
3980: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
3990: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
39a0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
39b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
39c0: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
39d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
39e0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
39f0: 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28  kaside = va_arg(
3a00: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
3a10: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3a20: 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  fig.nLookaside =
3a30: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
3a40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3a50: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a     }.    .    /*
3a60: 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   Record a pointe
3a70: 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20  r to the logger 
3a80: 66 75 6e 63 63 74 69 6f 6e 20 61 6e 64 20 69 74  funcction and it
3a90: 73 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  s first argument
3aa0: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66  ..    ** The def
3ab0: 61 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c  ault is NULL.  L
3ac0: 6f 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c  ogging is disabl
3ad0: 65 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  ed if the functi
3ae0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20  on pointer is.  
3af0: 20 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a    ** NULL..    *
3b00: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
3b10: 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a  E_CONFIG_LOG: {.
3b20: 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73        /* MSVC is
3b30: 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c   picky about pul
3b40: 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66  ling func ptrs f
3b50: 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20  rom va lists..  
3b60: 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75      ** http://su
3b70: 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e  pport.microsoft.
3b80: 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20  com/kb/47961.   
3b90: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f     ** sqlite3Glo
3ba0: 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d  balConfig.xLog =
3bb0: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
3bc0: 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  (*)(void*,int,co
3bd0: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20  nst char*));.   
3be0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65     */.      type
3bf0: 64 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e  def void(*LOGFUN
3c00: 43 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  C_t)(void*,int,c
3c10: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
3c20: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3c30: 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61  Config.xLog = va
3c40: 5f 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43  _arg(ap, LOGFUNC
3c50: 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  _t);.      sqlit
3c60: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
3c70: 4c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28  LogArg = va_arg(
3c80: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
3c90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
3ca0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3cb0: 43 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20  CONFIG_URI: {.  
3cc0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3cd0: 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69  lConfig.bOpenUri
3ce0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3cf0: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
3d00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61  .    }..    defa
3d10: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  ult: {.      rc 
3d20: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
3d30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3d40: 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28   }.  }.  va_end(
3d50: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ap);.  return rc
3d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
3d70: 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  p the lookaside 
3d80: 62 75 66 66 65 72 73 20 66 6f 72 20 61 20 64 61  buffers for a da
3d90: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
3da0: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  n..** Return SQL
3db0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
3dc0: 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61  s.  .** If looka
3dd0: 73 69 64 65 20 69 73 20 61 6c 72 65 61 64 79 20  side is already 
3de0: 61 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53  active, return S
3df0: 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a  QLITE_BUSY..**.*
3e00: 2a 20 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74  * The sz paramet
3e10: 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  er is the number
3e20: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 65 61 63   of bytes in eac
3e30: 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  h lookaside slot
3e40: 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72  ..** The cnt par
3e50: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75  ameter is the nu
3e60: 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20  mber of slots.  
3e70: 49 66 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c  If pStart is NUL
3e80: 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66  L the.** space f
3e90: 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  or the lookaside
3ea0: 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69   memory is obtai
3eb0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
3ec0: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66  _malloc()..** If
3ed0: 20 70 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e   pStart is not N
3ee0: 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73  ULL then it is s
3ef0: 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d  z*cnt bytes of m
3f00: 65 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72  emory to use for
3f10: 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64  .** the lookasid
3f20: 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
3f30: 74 69 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f  tic int setupLoo
3f40: 6b 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a  kaside(sqlite3 *
3f50: 64 62 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  db, void *pBuf, 
3f60: 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29  int sz, int cnt)
3f70: 7b 0a 20 20 76 6f 69 64 20 2a 70 53 74 61 72 74  {.  void *pStart
3f80: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  ;.  if( db->look
3f90: 61 73 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20 20  aside.nOut ){.  
3fa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3fb0: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46  BUSY;.  }.  /* F
3fc0: 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ree any existing
3fd0: 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65   lookaside buffe
3fe0: 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64 6c  r for this handl
3ff0: 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6c  e before.  ** al
4000: 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f  locating a new o
4010: 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 68  ne so we don't h
4020: 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61 63  ave to have spac
4030: 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74 68  e for .  ** both
4040: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
4050: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  e..  */.  if( db
4060: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
4070: 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  loced ){.    sql
4080: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f  ite3_free(db->lo
4090: 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b  okaside.pStart);
40a0: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 69  .  }.  /* The si
40b0: 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69 64  ze of a lookasid
40c0: 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f 55  e slot after ROU
40d0: 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74 6f  NDDOWN8 needs to
40e0: 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a 20   be larger.  ** 
40f0: 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  than a pointer t
4100: 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20 2a  o be useful..  *
4110: 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f  /.  sz = ROUNDDO
4120: 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d 50  WN8(sz);  /* IMP
4130: 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32 20  : R-33038-09382 
4140: 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69 6e  */.  if( sz<=(in
4150: 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69  t)sizeof(Lookasi
4160: 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d 20  deSlot*) ) sz = 
4170: 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20 29  0;.  if( cnt<0 )
4180: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20   cnt = 0;.  if( 
4190: 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30 20  sz==0 || cnt==0 
41a0: 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20  ){.    sz = 0;. 
41b0: 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20     pStart = 0;. 
41c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66 3d   }else if( pBuf=
41d0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
41e0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
41f0: 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72 74  oc();.    pStart
4200: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
4210: 28 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a 20  ( sz*cnt );  /* 
4220: 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35 37  IMP: R-61949-357
4230: 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  27 */.    sqlite
4240: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
4250: 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  ();.    if( pSta
4260: 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69 74  rt ) cnt = sqlit
4270: 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53 74  e3MallocSize(pSt
4280: 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65  art)/sz;.  }else
4290: 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  {.    pStart = p
42a0: 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c  Buf;.  }.  db->l
42b0: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
42c0: 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e  = pStart;.  db->
42d0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20  lookaside.pFree 
42e0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  = 0;.  db->looka
42f0: 73 69 64 65 2e 73 7a 20 3d 20 28 75 31 36 29 73  side.sz = (u16)s
4300: 7a 3b 0a 20 20 69 66 28 20 70 53 74 61 72 74 20  z;.  if( pStart 
4310: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
4320: 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20    LookasideSlot 
4330: 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  *p;.    assert( 
4340: 73 7a 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f 66  sz > (int)sizeof
4350: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
4360: 20 29 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f 6f   );.    p = (Loo
4370: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70 53 74 61  kasideSlot*)pSta
4380: 72 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e  rt;.    for(i=cn
4390: 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  t-1; i>=0; i--){
43a0: 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  .      p->pNext 
43b0: 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  = db->lookaside.
43c0: 70 46 72 65 65 3b 0a 20 20 20 20 20 20 64 62 2d  pFree;.      db-
43d0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65  >lookaside.pFree
43e0: 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 3d 20   = p;.      p = 
43f0: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
4400: 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20  &((u8*)p)[sz];. 
4410: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f     }.    db->loo
4420: 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 70 3b  kaside.pEnd = p;
4430: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
4440: 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 31 3b  de.bEnabled = 1;
4450: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
4460: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 70  de.bMalloced = p
4470: 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d  Buf==0 ?1:0;.  }
4480: 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f  else{.    db->lo
4490: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 30  okaside.pEnd = 0
44a0: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
44b0: 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30  ide.bEnabled = 0
44c0: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
44d0: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20  ide.bMalloced = 
44e0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
44f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4500: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
4510: 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  utex associated 
4520: 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20  with a database 
4530: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
4540: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 73 71  qlite3_mutex *sq
4550: 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 73  lite3_db_mutex(s
4560: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
4570: 65 74 75 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b  eturn db->mutex;
4580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75  .}../*.** Free u
4590: 70 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  p as much memory
45a0: 20 61 73 20 77 65 20 63 61 6e 20 66 72 6f 6d 20   as we can from 
45b0: 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61  the given databa
45c0: 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
45d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
45e0: 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  _db_release_memo
45f0: 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ry(sqlite3 *db){
4600: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
4610: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
4620: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
4630: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
4640: 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d  ll(db);.  for(i=
4650: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
4660: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
4670: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
4680: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
4690: 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20   ){.      Pager 
46a0: 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  *pPager = sqlite
46b0: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
46c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
46d0: 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67 65  agerShrink(pPage
46e0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
46f0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
4700: 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69  eAll(db);.  sqli
4710: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
4720: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
4730: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4740: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
4750: 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20  ration settings 
4760: 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61  for an individua
4770: 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  l database conne
4780: 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ction.*/.int sql
4790: 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73  ite3_db_config(s
47a0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
47b0: 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  op, ...){.  va_l
47c0: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63  ist ap;.  int rc
47d0: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
47e0: 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20   op);.  switch( 
47f0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
4800: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c  QLITE_DBCONFIG_L
4810: 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20  OOKASIDE: {.    
4820: 20 20 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76    void *pBuf = v
4830: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4840: 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33  ; /* IMP: R-2683
4850: 35 2d 31 30 39 36 34 20 2a 2f 0a 20 20 20 20 20  5-10964 */.     
4860: 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67   int sz = va_arg
4870: 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20  (ap, int);      
4880: 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37 31   /* IMP: R-47871
4890: 2d 32 35 39 39 34 20 2a 2f 0a 20 20 20 20 20 20  -25994 */.      
48a0: 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67  int cnt = va_arg
48b0: 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20  (ap, int);      
48c0: 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d  /* IMP: R-04460-
48d0: 35 33 33 38 36 20 2a 2f 0a 20 20 20 20 20 20 72  53386 */.      r
48e0: 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69  c = setupLookasi
48f0: 64 65 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c  de(db, pBuf, sz,
4900: 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   cnt);.      bre
4910: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
4920: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
4930: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
4940: 63 74 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ct {.        int
4950: 20 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65   op;      /* The
4960: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   opcode */.     
4970: 20 20 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20     u32 mask;    
4980: 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 62  /* Mask of the b
4990: 69 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c  it in sqlite3.fl
49a0: 61 67 73 20 74 6f 20 73 65 74 2f 63 6c 65 61 72  ags to set/clear
49b0: 20 2a 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c 61   */.      } aFla
49c0: 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  gOp[] = {.      
49d0: 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e    { SQLITE_DBCON
49e0: 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c  FIG_ENABLE_FKEY,
49f0: 20 20 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69      SQLITE_Forei
4a00: 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20  gnKeys    },.   
4a10: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
4a20: 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52  CONFIG_ENABLE_TR
4a30: 49 47 47 45 52 2c 20 53 51 4c 49 54 45 5f 45 6e  IGGER, SQLITE_En
4a40: 61 62 6c 65 54 72 69 67 67 65 72 20 20 7d 2c 0a  ableTrigger  },.
4a50: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 75        };.      u
4a60: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
4a70: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4a80: 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20  _ERROR; /* IMP: 
4a90: 52 2d 34 32 37 39 30 2d 32 33 33 37 32 20 2a 2f  R-42790-23372 */
4aa0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4ab0: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 6c 61  i<ArraySize(aFla
4ac0: 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  gOp); i++){.    
4ad0: 20 20 20 20 69 66 28 20 61 46 6c 61 67 4f 70 5b      if( aFlagOp[
4ae0: 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20  i].op==op ){.   
4af0: 20 20 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66         int onoff
4b00: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4b10: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  t);.          in
4b20: 74 20 2a 70 52 65 73 20 3d 20 76 61 5f 61 72 67  t *pRes = va_arg
4b30: 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20  (ap, int*);.    
4b40: 20 20 20 20 20 20 69 6e 74 20 6f 6c 64 46 6c 61        int oldFla
4b50: 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
4b60: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e            if( on
4b70: 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  off>0 ){.       
4b80: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
4b90: 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73  = aFlagOp[i].mas
4ba0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  k;.          }el
4bb0: 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20  se if( onoff==0 
4bc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ){.            d
4bd0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46 6c  b->flags &= ~aFl
4be0: 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20  agOp[i].mask;.  
4bf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4c00: 20 20 20 20 69 66 28 20 6f 6c 64 46 6c 61 67 73      if( oldFlags
4c10: 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20  !=db->flags ){. 
4c20: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
4c30: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
4c40: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
4c50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4c60: 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29        if( pRes )
4c70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
4c80: 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  Res = (db->flags
4c90: 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61   & aFlagOp[i].ma
4ca0: 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20  sk)!=0;.        
4cb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
4cc0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4cd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4ce0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4cf0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4d00: 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64    }.  }.  va_end
4d10: 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (ap);.  return r
4d20: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
4d30: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
4d40: 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d  buffer z[0..n-1]
4d50: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70   contains all sp
4d60: 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aces..*/.static 
4d70: 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f  int allSpaces(co
4d80: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
4d90: 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e   n){.  while( n>
4da0: 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27  0 && z[n-1]==' '
4db0: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74   ){ n--; }.  ret
4dc0: 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  urn n==0;.}../*.
4dd0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 64  ** This is the d
4de0: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
4df0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
4e00: 22 42 49 4e 41 52 59 22 20 77 68 69 63 68 20 69  "BINARY" which i
4e10: 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69  s always.** avai
4e20: 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lable..**.** If 
4e30: 74 68 65 20 70 61 64 46 6c 61 67 20 61 72 67 75  the padFlag argu
4e40: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
4e50: 20 74 68 65 6e 20 73 70 61 63 65 20 70 61 64 64   then space padd
4e60: 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a  ing at the end.*
4e70: 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20  * of strings is 
4e80: 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69  ignored.  This i
4e90: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54  mplements the RT
4ea0: 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a  RIM collation..*
4eb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e  /.static int bin
4ec0: 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64  CollFunc(.  void
4ed0: 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74   *padFlag,.  int
4ee0: 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
4ef0: 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74  id *pKey1,.  int
4f00: 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f   nKey2, const vo
4f10: 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69  id *pKey2.){.  i
4f20: 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20  nt rc, n;.  n = 
4f30: 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b  nKey1<nKey2 ? nK
4f40: 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 72  ey1 : nKey2;.  r
4f50: 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31  c = memcmp(pKey1
4f60: 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69  , pKey2, n);.  i
4f70: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
4f80: 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20  if( padFlag.    
4f90: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
4fa0: 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20  char*)pKey1)+n, 
4fb0: 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26  nKey1-n).     &&
4fc0: 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61   allSpaces(((cha
4fd0: 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65  r*)pKey2)+n, nKe
4fe0: 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  y2-n).    ){.   
4ff0: 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 20 75     /* Leave rc u
5000: 6e 63 68 61 6e 67 65 64 20 61 74 20 30 20 2a 2f  nchanged at 0 */
5010: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5020: 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e    rc = nKey1 - n
5030: 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Key2;.    }.  }.
5040: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5050: 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75  /*.** Another bu
5060: 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67  ilt-in collating
5070: 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53   sequence: NOCAS
5080: 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  E. .**.** This c
5090: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
50a0: 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  e is intended to
50b0: 20 62 65 20 75 73 65 64 20 66 6f 72 20 22 63 61   be used for "ca
50c0: 73 65 20 69 6e 64 65 70 65 6e 64 61 6e 74 0a 2a  se independant.*
50d0: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53  * comparison". S
50e0: 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67  QLite's knowledg
50f0: 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c  e of upper and l
5100: 6f 77 65 72 20 63 61 73 65 20 65 71 75 69 76 61  ower case equiva
5110: 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73  lents.** extends
5120: 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20   only to the 26 
5130: 63 68 61 72 61 63 74 65 72 73 20 75 73 65 64 20  characters used 
5140: 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c  in the English l
5150: 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41  anguage..**.** A
5160: 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65  t the moment the
5170: 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46  re is only a UTF
5180: 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  -8 implementatio
5190: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
51a0: 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67   nocaseCollating
51b0: 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  Func(.  void *No
51c0: 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65  tUsed,.  int nKe
51d0: 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
51e0: 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65  pKey1,.  int nKe
51f0: 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y2, const void *
5200: 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72  pKey2.){.  int r
5210: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43   = sqlite3StrNIC
5220: 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74  mp(.      (const
5230: 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28   char *)pKey1, (
5240: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
5250: 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32  y2, (nKey1<nKey2
5260: 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a  )?nKey1:nKey2);.
5270: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
5280: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69  ER(NotUsed);.  i
5290: 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72  f( 0==r ){.    r
52a0: 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a   = nKey1-nKey2;.
52b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
52c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
52d0: 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 68 65  the ROWID of the
52e0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73   most recent ins
52f0: 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e  ert.*/.sqlite_in
5300: 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  t64 sqlite3_last
5310: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71  _insert_rowid(sq
5320: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
5330: 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77  turn db->lastRow
5340: 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  id;.}../*.** Ret
5350: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
5360: 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65  f changes in the
5370: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
5380: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65  l to sqlite3_exe
5390: 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  c()..*/.int sqli
53a0: 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  te3_changes(sqli
53b0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
53c0: 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a  rn db->nChange;.
53d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
53e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
53f0: 61 6e 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  anges since the 
5400: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
5410: 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69  was opened..*/.i
5420: 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  nt sqlite3_total
5430: 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  _changes(sqlite3
5440: 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20   *db){.  return 
5450: 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
5460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
5470: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
5480: 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ints. This funct
5490: 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  ion only manipul
54a0: 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74  ates fields of t
54b0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
54c0: 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74  andle object, it
54d0: 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20   does not close 
54e0: 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
54f0: 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a  hat may be open.
5500: 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72 65 65  ** at the b-tree
5510: 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f  /pager level..*/
5520: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f  .void sqlite3Clo
5530: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c  seSavepoints(sql
5540: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69  ite3 *db){.  whi
5550: 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  le( db->pSavepoi
5560: 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f  nt ){.    Savepo
5570: 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e  int *pTmp = db->
5580: 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  pSavepoint;.    
5590: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
55a0: 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   pTmp->pNext;.  
55b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
55c0: 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20  db, pTmp);.  }. 
55d0: 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20   db->nSavepoint 
55e0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74  = 0;.  db->nStat
55f0: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  ement = 0;.  db-
5600: 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
5610: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  vepoint = 0;.}..
5620: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
5630: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
5640: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
5650: 77 69 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20  with FuncDef p, 
5660: 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a  if any. Except,.
5670: 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ** if this is no
5680: 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20  t the last copy 
5690: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c  of the function,
56a0: 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69   do not invoke i
56b0: 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63  t. Multiple.** c
56c0: 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  opies of a singl
56d0: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63  e function are c
56e0: 72 65 61 74 65 64 20 77 68 65 6e 20 63 72 65 61  reated when crea
56f0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  te_function() is
5700: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20   called.** with 
5710: 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68  SQLITE_ANY as th
5720: 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  e encoding..*/.s
5730: 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74  tatic void funct
5740: 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74  ionDestroy(sqlit
5750: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
5760: 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72  *p){.  FuncDestr
5770: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
5780: 6f 72 20 3d 20 70 2d 3e 70 44 65 73 74 72 75 63  or = p->pDestruc
5790: 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74  tor;.  if( pDest
57a0: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44  ructor ){.    pD
57b0: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d  estructor->nRef-
57c0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65 73 74  -;.    if( pDest
57d0: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20  ructor->nRef==0 
57e0: 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74 72 75  ){.      pDestru
57f0: 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79 28 70  ctor->xDestroy(p
5800: 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55 73 65  Destructor->pUse
5810: 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71  rData);.      sq
5820: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5830: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
5840: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
5850: 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69   Close an existi
5860: 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ng SQLite databa
5870: 73 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  se.*/.int sqlite
5880: 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20  3_close(sqlite3 
5890: 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  *db){.  HashElem
58a0: 20 2a 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   *i;            
58b0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
58c0: 74 61 62 6c 65 20 69 74 65 72 61 74 6f 72 20 2a  table iterator *
58d0: 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 69 66  /.  int j;..  if
58e0: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
58f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
5900: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
5910: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
5920: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
5930: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
5940: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
5950: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
5960: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
5970: 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 65  ..  /* Force xDe
5980: 73 74 72 6f 79 20 63 61 6c 6c 73 20 6f 6e 20 61  stroy calls on a
5990: 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ll virtual table
59a0: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 65  s */.  sqlite3Re
59b0: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
59c0: 61 28 64 62 2c 20 2d 31 29 3b 0a 0a 20 20 2f 2a  a(db, -1);..  /*
59d0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
59e0: 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 20 52  n is open, the R
59f0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
5a00: 6d 61 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a  ma() call above.
5a10: 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61    ** will not ha
5a20: 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20 78 44  ve called the xD
5a30: 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68  isconnect() meth
5a40: 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74 75 61  od on any virtua
5a50: 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e  l.  ** tables in
5a60: 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73   the db->aVTrans
5a70: 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66 6f  [] array. The fo
5a80: 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 56  llowing sqlite3V
5a90: 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20  tabRollback().  
5aa0: 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20  ** call will do 
5ab0: 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f 20 64  so. We need to d
5ac0: 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 74 68  o this before th
5ad0: 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63 74 69  e check for acti
5ae0: 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  ve.  ** SQL stat
5af0: 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73  ements below, as
5b00: 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69 6d 70   the v-table imp
5b10: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
5b20: 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20  be storing.  ** 
5b30: 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20 73 74  some prepared st
5b40: 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61  atements interna
5b50: 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  lly..  */.  sqli
5b60: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
5b70: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  db);..  /* If th
5b80: 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73  ere are any outs
5b90: 74 61 6e 64 69 6e 67 20 56 4d 73 2c 20 72 65 74  tanding VMs, ret
5ba0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
5bb0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 56   */.  if( db->pV
5bc0: 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dbe ){.    sqlit
5bd0: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
5be0: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
5bf0: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f    "unable to clo
5c00: 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61  se due to unfina
5c10: 6c 69 73 65 64 20 73 74 61 74 65 6d 65 6e 74 73  lised statements
5c20: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ");.    sqlite3_
5c30: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
5c40: 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75  mutex);.    retu
5c50: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
5c60: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
5c70: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
5c80: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 3b 0a  SickOrOk(db) );.
5c90: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62  .  for(j=0; j<db
5ca0: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nDb; j++){.   
5cb0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
5cc0: 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20  ->aDb[j].pBt;.  
5cd0: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
5ce0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61 63  ite3BtreeIsInBac
5cf0: 6b 75 70 28 70 42 74 29 20 29 7b 0a 20 20 20 20  kup(pBt) ){.    
5d00: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
5d10: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
5d20: 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 61 62  .          "unab
5d30: 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20  le to close due 
5d40: 74 6f 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61  to unfinished ba
5d50: 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e 22 29  ckup operation")
5d60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5d70: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
5d80: 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 72 65  mutex);.      re
5d90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
5da0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
5db0: 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74  * Free any outst
5dc0: 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74  anding Savepoint
5dd0: 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a   structures. */.
5de0: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
5df0: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20  vepoints(db);.. 
5e00: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e   for(j=0; j<db->
5e10: 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73  nDb; j++){.    s
5e20: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
5e30: 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20  &db->aDb[j];.   
5e40: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b   if( pDb->pBt ){
5e50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
5e60: 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42  reeClose(pDb->pB
5e70: 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70  t);.      pDb->p
5e80: 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  Bt = 0;.      if
5e90: 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ( j!=1 ){.      
5ea0: 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d    pDb->pSchema =
5eb0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
5ec0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
5ed0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
5ee0: 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 0a 20 20 2f  ma(db, -1);..  /
5ef0: 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20  * Tell the code 
5f00: 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74  in notify.c that
5f10: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
5f20: 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20  no longer holds 
5f30: 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61  any.  ** locks a
5f40: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  nd does not requ
5f50: 69 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 20  ire any further 
5f60: 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
5f70: 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
5f80: 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
5f90: 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20  nClosed(db);..  
5fa0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c  assert( db->nDb<
5fb0: 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
5fc0: 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62  db->aDb==db->aDb
5fd0: 53 74 61 74 69 63 20 29 3b 0a 20 20 66 6f 72 28  Static );.  for(
5fe0: 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65  j=0; j<ArraySize
5ff0: 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a  (db->aFunc.a); j
6000: 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  ++){.    FuncDef
6010: 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c   *pNext, *pHash,
6020: 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64   *p;.    for(p=d
6030: 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70  b->aFunc.a[j]; p
6040: 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20 20  ; p=pHash){.    
6050: 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61    pHash = p->pHa
6060: 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  sh;.      while(
6070: 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 75   p ){.        fu
6080: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
6090: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , p);.        pN
60a0: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
60b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
60c0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
60d0: 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b        p = pNext;
60e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
60f0: 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74   }.  for(i=sqlit
6100: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
6110: 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d  aCollSeq); i; i=
6120: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
6130: 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  )){.    CollSeq 
6140: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
6150: 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  q *)sqliteHashDa
6160: 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e  ta(i);.    /* In
6170: 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63  voke any destruc
6180: 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20  tors registered 
6190: 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  for collation se
61a0: 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61  quence user data
61b0: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30  . */.    for(j=0
61c0: 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
61d0: 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e     if( pColl[j].
61e0: 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
61f0: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43  pColl[j].xDel(pC
6200: 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20  oll[j].pUser);. 
6210: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6220: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6230: 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, pColl);.  }. 
6240: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
6250: 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  r(&db->aCollSeq)
6260: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
6270: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6280: 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  LE.  for(i=sqlit
6290: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
62a0: 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73  aModule); i; i=s
62b0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
62c0: 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  ){.    Module *p
62d0: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29  Mod = (Module *)
62e0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
62f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d  );.    if( pMod-
6300: 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >xDestroy ){.   
6310: 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f     pMod->xDestro
6320: 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20  y(pMod->pAux);. 
6330: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6340: 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29  DbFree(db, pMod)
6350: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
6360: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d  ashClear(&db->aM
6370: 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
6380: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
6390: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  b, SQLITE_OK, 0)
63a0: 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73  ; /* Deallocates
63b0: 20 61 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f   any cached erro
63c0: 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20  r strings. */.  
63d0: 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a  if( db->pErr ){.
63e0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
63f0: 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a  Free(db->pErr);.
6400: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f    }.  sqlite3Clo
6410: 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  seExtensions(db)
6420: 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  ;..  db->magic =
6430: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52   SQLITE_MAGIC_ER
6440: 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74  ROR;..  /* The t
6450: 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63 68  emp-database sch
6460: 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ema is allocated
6470: 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f   differently fro
6480: 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68 65  m the other sche
6490: 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20  ma.  ** objects 
64a0: 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c  (using sqliteMal
64b0: 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c 20  loc() directly, 
64c0: 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74  instead of sqlit
64d0: 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29 29  e3BtreeSchema())
64e0: 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65  ..  ** So it nee
64f0: 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 68  ds to be freed h
6500: 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e  ere. Todo: Why n
6510: 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70  ot roll the temp
6520: 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a   schema into.  *
6530: 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69 74  * the same sqlit
6540: 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68 65  eMalloc() as the
6550: 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63 61   one that alloca
6560: 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  tes the database
6570: 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65   .  ** structure
6580: 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ?.  */.  sqlite3
6590: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
65a0: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a  Db[1].pSchema);.
65b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
65c0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
65d0: 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ;.  db->magic = 
65e0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
65f0: 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  SED;.  sqlite3_m
6600: 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75  utex_free(db->mu
6610: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
6620: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
6630: 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61 69  ut==0 );  /* Fai
6640: 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69 64  ls on a lookasid
6650: 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f  e memory leak */
6660: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
6670: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
6680: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
6690: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
66a0: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 23 69  .pStart);.  }.#i
66b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
66c0: 4c 45 5f 53 51 4c 52 52 0a 20 20 53 52 52 65 63  LE_SQLRR.  SRRec
66d0: 43 6c 6f 73 65 28 64 62 29 3b 0a 23 65 6e 64 69  Close(db);.#endi
66e0: 66 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 66  f.  .  sqlite3_f
66f0: 72 65 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72  ree(db);.  retur
6700: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6710: 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
6720: 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ll database file
6730: 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65 20  s.  If tripCode 
6740: 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
6750: 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 6f 70  , then.** any op
6760: 65 6e 20 63 75 72 73 6f 72 73 20 61 72 65 20 69  en cursors are i
6770: 6e 76 61 6c 69 64 61 74 65 64 20 28 22 74 72 69  nvalidated ("tri
6780: 70 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74  pped" - as in "t
6790: 72 69 70 70 69 6e 67 20 61 20 63 69 72 63 75 69  ripping a circui
67a0: 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61  t.** breaker") a
67b0: 6e 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72  nd made to retur
67c0: 6e 20 74 72 69 70 43 6f 64 65 20 69 66 20 74 68  n tripCode if th
67d0: 65 72 65 20 61 72 65 20 61 6e 79 20 66 75 72 74  ere are any furt
67e0: 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  her.** attempts 
67f0: 74 6f 20 75 73 65 20 74 68 61 74 20 63 75 72 73  to use that curs
6800: 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  or..*/.void sqli
6810: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73  te3RollbackAll(s
6820: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
6830: 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74  tripCode){.  int
6840: 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e   i;.  int inTran
6850: 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  s = 0;.  assert(
6860: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6870: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
6880: 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
6890: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
68a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
68b0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
68c0: 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61  Btree *p = db->a
68d0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
68e0: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 69 66  f( p ){.      if
68f0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
6900: 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20  InTrans(p) ){.  
6910: 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20        inTrans = 
6920: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
6930: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
6940: 6c 62 61 63 6b 28 70 2c 20 74 72 69 70 43 6f 64  lback(p, tripCod
6950: 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  e);.      db->aD
6960: 62 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 3d 20 30  b[i].inTrans = 0
6970: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
6980: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
6990: 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  k(db);.  sqlite3
69a0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
69b0: 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c  );..  if( db->fl
69c0: 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72  ags&SQLITE_Inter
69d0: 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20  nChanges ){.    
69e0: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
69f0: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
6a00: 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
6a10: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
6a20: 65 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 20 20 7d  ema(db, -1);.  }
6a30: 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72  ..  /* Any defer
6a40: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  red constraint v
6a50: 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e  iolations have n
6a60: 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  ow been resolved
6a70: 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65  . */.  db->nDefe
6a80: 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 0a 20  rredCons = 0;.. 
6a90: 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62   /* If one has b
6aa0: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  een configured, 
6ab0: 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62  invoke the rollb
6ac0: 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  ack-hook callbac
6ad0: 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78  k */.  if( db->x
6ae0: 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
6af0: 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20   && (inTrans || 
6b00: 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29  !db->autoCommit)
6b10: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c   ){.    db->xRol
6b20: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62  lbackCallback(db
6b30: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b  ->pRollbackArg);
6b40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
6b50: 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74  turn a static st
6b60: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
6b70: 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20  bes the kind of 
6b80: 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20  error specified 
6b90: 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65  in the.** argume
6ba0: 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  nt..*/.const cha
6bb0: 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72  r *sqlite3ErrStr
6bc0: 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74  (int rc){.  stat
6bd0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63  ic const char* c
6be0: 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a  onst aMsg[] = {.
6bf0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b      /* SQLITE_OK
6c00: 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f            */ "no
6c10: 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20  t an error",.   
6c20: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52   /* SQLITE_ERROR
6c30: 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c         */ "SQL l
6c40: 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69  ogic error or mi
6c50: 73 73 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c  ssing database",
6c60: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
6c70: 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c  NTERNAL    */ 0,
6c80: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50  .    /* SQLITE_P
6c90: 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61  ERM        */ "a
6ca0: 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
6cb0: 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a   denied",.    /*
6cc0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20   SQLITE_ABORT   
6cd0: 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b      */ "callback
6ce0: 20 72 65 71 75 65 73 74 65 64 20 71 75 65 72 79   requested query
6cf0: 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20   abort",.    /* 
6d00: 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20  SQLITE_BUSY     
6d10: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
6d20: 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20  is locked",.    
6d30: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  /* SQLITE_LOCKED
6d40: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
6d50: 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
6d60: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
6d70: 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a  TE_NOMEM       *
6d80: 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  / "out of memory
6d90: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6da0: 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20  _READONLY    */ 
6db0: 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74  "attempt to writ
6dc0: 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74  e a readonly dat
6dd0: 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53  abase",.    /* S
6de0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
6df0: 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65    */ "interrupte
6e00: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
6e10: 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f  E_IOERR       */
6e20: 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72   "disk I/O error
6e30: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6e40: 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20  _CORRUPT     */ 
6e50: 22 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  "database disk i
6e60: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
6e70: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
6e80: 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f  E_NOTFOUND    */
6e90: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74   "unknown operat
6ea0: 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ion",.    /* SQL
6eb0: 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20  ITE_FULL        
6ec0: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72 20  */ "database or 
6ed0: 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20  disk is full",. 
6ee0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e     /* SQLITE_CAN
6ef0: 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61  TOPEN    */ "una
6f00: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
6f10: 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20  base file",.    
6f20: 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  /* SQLITE_PROTOC
6f30: 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e  OL    */ "lockin
6f40: 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20  g protocol",.   
6f50: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59   /* SQLITE_EMPTY
6f60: 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62 6c 65         */ "table
6f70: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
6f80: 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  a",.    /* SQLIT
6f90: 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20 2a 2f  E_SCHEMA      */
6fa0: 20 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d   "database schem
6fb0: 61 20 68 61 73 20 63 68 61 6e 67 65 64 22 2c 0a  a has changed",.
6fc0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f      /* SQLITE_TO
6fd0: 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22 73 74  OBIG      */ "st
6fe0: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f  ring or blob too
6ff0: 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51   big",.    /* SQ
7000: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
7010: 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74 20   */ "constraint 
7020: 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20  failed",.    /* 
7030: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20  SQLITE_MISMATCH 
7040: 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70 65 20     */ "datatype 
7050: 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f  mismatch",.    /
7060: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  * SQLITE_MISUSE 
7070: 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61 72 79       */ "library
7080: 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20   routine called 
7090: 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65 22  out of sequence"
70a0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
70b0: 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22  NOLFS       */ "
70c0: 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f  large file suppo
70d0: 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c  rt is disabled",
70e0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41  .    /* SQLITE_A
70f0: 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61  UTH        */ "a
7100: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e  uthorization den
7110: 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ied",.    /* SQL
7120: 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20  ITE_FORMAT      
7130: 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20 64 61  */ "auxiliary da
7140: 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72  tabase format er
7150: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
7160: 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20  ITE_RANGE       
7170: 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75  */ "bind or colu
7180: 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20  mn index out of 
7190: 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53  range",.    /* S
71a0: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20  QLITE_NOTADB    
71b0: 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 65 6e    */ "file is en
71c0: 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f  crypted or is no
71d0: 74 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20  t a database",. 
71e0: 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   };.  const char
71f0: 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77   *zErr = "unknow
7200: 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77 69 74  n error";.  swit
7210: 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61  ch( rc ){.    ca
7220: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  se SQLITE_ABORT_
7230: 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20  ROLLBACK: {.    
7240: 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72 74 20    zErr = "abort 
7250: 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22  due to ROLLBACK"
7260: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7270: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
7280: 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26 3d 20  : {.      rc &= 
7290: 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20  0xff;.      if( 
72a0: 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26  ALWAYS(rc>=0) &&
72b0: 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28 61 4d   rc<ArraySize(aM
72c0: 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21  sg) && aMsg[rc]!
72d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45  =0 ){.        zE
72e0: 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20  rr = aMsg[rc];. 
72f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7300: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
7310: 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a  return zErr;.}..
7320: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7330: 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20  ne implements a 
7340: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68  busy callback th
7350: 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72  at sleeps and tr
7360: 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74  ies.** again unt
7370: 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c  il a timeout val
7380: 75 65 20 69 73 20 72 65 61 63 68 65 64 2e 20 20  ue is reached.  
7390: 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75  The timeout valu
73a0: 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67  e is.** an integ
73b0: 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  er number of mil
73c0: 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64  liseconds passed
73d0: 20 69 6e 20 61 73 20 74 68 65 20 66 69 72 73 74   in as the first
73e0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
73f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
7400: 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c  teDefaultBusyCal
7410: 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74  lback(. void *pt
7420: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
7430: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
7440: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20  nection */. int 
7450: 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20 20  count           
7460: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7470: 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61  f times table ha
7480: 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29  s been busy */.)
7490: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
74a0: 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e 65 64 28  WIN || (defined(
74b0: 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20  HAVE_USLEEP) && 
74c0: 48 41 56 45 5f 55 53 4c 45 45 50 29 0a 20 20 73  HAVE_USLEEP).  s
74d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 64  tatic const u8 d
74e0: 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  elays[] =.     {
74f0: 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35   1, 2, 5, 10, 15
7500: 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32  , 20, 25, 25,  2
7510: 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30 30  5,  50,  50, 100
7520: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
7530: 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d  st u8 totals[] =
7540: 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c  .     { 0, 1, 3,
7550: 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c    8, 18, 33, 53,
7560: 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20 31   78, 103, 128, 1
7570: 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65 66  78, 228 };.# def
7580: 69 6e 65 20 4e 44 45 4c 41 59 20 41 72 72 61 79  ine NDELAY Array
7590: 53 69 7a 65 28 64 65 6c 61 79 73 29 0a 20 20 73  Size(delays).  s
75a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
75b0: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
75c0: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d  nt timeout = db-
75d0: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
75e0: 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72  int delay, prior
75f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  ;..  assert( cou
7600: 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63  nt>=0 );.  if( c
7610: 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b  ount < NDELAY ){
7620: 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c  .    delay = del
7630: 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20  ays[count];.    
7640: 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63  prior = totals[c
7650: 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ount];.  }else{.
7660: 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61      delay = dela
7670: 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20  ys[NDELAY-1];.  
7680: 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73    prior = totals
7690: 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c  [NDELAY-1] + del
76a0: 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41  ay*(count-(NDELA
76b0: 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Y-1));.  }.  if(
76c0: 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e   prior + delay >
76d0: 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20   timeout ){.    
76e0: 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74 20  delay = timeout 
76f0: 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28  - prior;.    if(
7700: 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75   delay<=0 ) retu
7710: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
7720: 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70  te3OsSleep(db->p
7730: 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29  Vfs, delay*1000)
7740: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
7750: 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  lse.  sqlite3 *d
7760: 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70  b = (sqlite3 *)p
7770: 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75  tr;.  int timeou
7780: 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29  t = ((sqlite3 *)
7790: 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75  ptr)->busyTimeou
77a0: 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b  t;.  if( (count+
77b0: 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f 75  1)*1000 > timeou
77c0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
77d0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
77e0: 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73  OsSleep(db->pVfs
77f0: 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72 65  , 1000000);.  re
7800: 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
7810: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
7820: 68 65 20 67 69 76 65 6e 20 62 75 73 79 20 68 61  he given busy ha
7830: 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ndler..**.** Thi
7840: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7850: 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65 72  led when an oper
7860: 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77 69 74  ation failed wit
7870: 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20  h a lock..** If 
7880: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
7890: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
78a0: 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69  he lock is retri
78b0: 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65  ed.  If it.** re
78c0: 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65  turns 0, the ope
78d0: 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69  ration aborts wi
78e0: 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53  th an SQLITE_BUS
78f0: 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  Y error..*/.int 
7900: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
7910: 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e  yHandler(BusyHan
7920: 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  dler *p){.  int 
7930: 72 63 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  rc;.  if( NEVER(
7940: 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e  p==0) || p->xFun
7950: 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79  c==0 || p->nBusy
7960: 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <0 ) return 0;. 
7970: 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70   rc = p->xFunc(p
7980: 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79  ->pArg, p->nBusy
7990: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
79a0: 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d  {.    p->nBusy =
79b0: 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
79c0: 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20    p->nBusy++;.  
79d0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a  }.  return rc; .
79e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
79f0: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 62  utine sets the b
7a00: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  usy callback for
7a10: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
7a20: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
7a30: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
7a40: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
7a50: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  iven argument..*
7a60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75  /.int sqlite3_bu
7a70: 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  sy_handler(.  sq
7a80: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
7a90: 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c   (*xBusy)(void*,
7aa0: 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  int),.  void *pA
7ab0: 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  rg.){.  sqlite3_
7ac0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
7ad0: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75  mutex);.  db->bu
7ae0: 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20  syHandler.xFunc 
7af0: 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62  = xBusy;.  db->b
7b00: 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72 67 20  usyHandler.pArg 
7b10: 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75  = pArg;.  db->bu
7b20: 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
7b30: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
7b40: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
7b50: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
7b60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
7b70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7b80: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
7b90: 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACK./*.** This r
7ba0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
7bb0: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
7bc0: 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20  k for an Sqlite 
7bd0: 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a  database to the.
7be0: 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  ** given callbac
7bf0: 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  k function with 
7c00: 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65  the given argume
7c10: 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73  nt. The progress
7c20: 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a   callback will.*
7c30: 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65  * be invoked eve
7c40: 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e  ry nOps opcodes.
7c50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7c60: 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
7c70: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
7c80: 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20  , .  int nOps,. 
7c90: 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73   int (*xProgress
7ca0: 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69  )(void*), .  voi
7cb0: 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c  d *pArg.){.  sql
7cc0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
7cd0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
7ce0: 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20  f( nOps>0 ){.   
7cf0: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
7d00: 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20   xProgress;.    
7d10: 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73  db->nProgressOps
7d20: 20 3d 20 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d   = nOps;.    db-
7d30: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
7d40: 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pArg;.  }else{. 
7d50: 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73     db->xProgress
7d60: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50   = 0;.    db->nP
7d70: 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a  rogressOps = 0;.
7d80: 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73      db->pProgres
7d90: 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  sArg = 0;.  }.  
7da0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
7db0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
7dc0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
7dd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   This routine in
7de0: 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74  stalls a default
7df0: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68   busy handler th
7e00: 61 74 20 77 61 69 74 73 20 66 6f 72 20 74 68 65  at waits for the
7e10: 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75  .** specified nu
7e20: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
7e30: 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74 75  onds before retu
7e40: 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rning 0..*/.int 
7e50: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
7e60: 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eout(sqlite3 *db
7e70: 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20 69 66 28  , int ms){.  if(
7e80: 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d   ms>0 ){.    db-
7e90: 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d  >busyTimeout = m
7ea0: 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  s;.    sqlite3_b
7eb0: 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20  usy_handler(db, 
7ec0: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
7ed0: 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  yCallback, (void
7ee0: 2a 29 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  *)db);.  }else{.
7ef0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
7f00: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20  _handler(db, 0, 
7f10: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
7f20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
7f30: 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70  *.** Cause any p
7f40: 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ending operation
7f50: 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20   to stop at its 
7f60: 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75  earliest opportu
7f70: 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nity..*/.void sq
7f80: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
7f90: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
7fa0: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
7fb0: 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  pted = 1;.}.../*
7fc0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
7fd0: 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74 68 65  n is exactly the
7fe0: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
7ff0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
8000: 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68  (), except.** th
8010: 61 74 20 69 74 20 69 73 20 64 65 73 69 67 6e 65  at it is designe
8020: 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62  d to be called b
8030: 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e  y internal code.
8040: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
8050: 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20  is.** that if a 
8060: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69  malloc() fails i
8070: 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  n sqlite3_create
8080: 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20  _function(), an 
8090: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
80a0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
80b0: 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  e mallocFailed f
80c0: 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f  lag cleared. .*/
80d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61  .int sqlite3Crea
80e0: 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  teFunc(.  sqlite
80f0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
8100: 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61  har *zFunctionNa
8110: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  me,.  int nArg,.
8120: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
8130: 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20  d *pUserData,.  
8140: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
8150: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
8160: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
8170: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
8180: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
8190: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
81a0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
81b0: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
81c0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
81d0: 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  ,.  FuncDestruct
81e0: 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a  or *pDestructor.
81f0: 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b  ){.  FuncDef *p;
8200: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20  .  int nName;.. 
8210: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8220: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
8230: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
8240: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30  zFunctionName==0
8250: 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63   ||.      (xFunc
8260: 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78   && (xFinal || x
8270: 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20  Step)) || .     
8280: 20 28 21 78 46 75 6e 63 20 26 26 20 28 78 46 69   (!xFunc && (xFi
8290: 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29 29 20  nal && !xStep)) 
82a0: 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63  ||.      (!xFunc
82b0: 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20   && (!xFinal && 
82c0: 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20  xStep)) ||.     
82d0: 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72   (nArg<-1 || nAr
82e0: 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  g>SQLITE_MAX_FUN
82f0: 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20  CTION_ARG) ||.  
8300: 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20      (255<(nName 
8310: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
8320: 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  0( zFunctionName
8330: 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ))) ){.    retur
8340: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
8350: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 0a 23 69 66  BKPT;.  }.  .#if
8360: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8370: 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53  _UTF16.  /* If S
8380: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73  QLITE_UTF16 is s
8390: 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20  pecified as the 
83a0: 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74  encoding type, t
83b0: 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20  ransform this.  
83c0: 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c  ** to one of SQL
83d0: 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
83e0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73  QLITE_UTF16BE us
83f0: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  ing the.  ** SQL
8400: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
8410: 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54  macro. SQLITE_UT
8420: 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20  F16 is not used 
8430: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a  internally..  **
8440: 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  ** If SQLITE_
8450: 41 4e 59 20 69 73 20 73 70 65 63 69 66 69 65 64  ANY is specified
8460: 2c 20 61 64 64 20 74 68 72 65 65 20 76 65 72 73  , add three vers
8470: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63  ions of the func
8480: 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tion.  ** to the
8490: 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a   hash table..  *
84a0: 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c  /.  if( enc==SQL
84b0: 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20  ITE_UTF16 ){.   
84c0: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
84d0: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c  F16NATIVE;.  }el
84e0: 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49  se if( enc==SQLI
84f0: 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e  TE_ANY ){.    in
8500: 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  t rc;.    rc = s
8510: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
8520: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
8530: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
8540: 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20  _UTF8,.         
8550: 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63  pUserData, xFunc
8560: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
8570: 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20   pDestructor);. 
8580: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8590: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
85a0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
85b0: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69  Func(db, zFuncti
85c0: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51  onName, nArg, SQ
85d0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 0a 20 20  LITE_UTF16LE,.  
85e0: 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74          pUserDat
85f0: 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  a, xFunc, xStep,
8600: 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75   xFinal, pDestru
8610: 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ctor);.    }.   
8620: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8630: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
8640: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
8650: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
8660: 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65  F16BE;.  }.#else
8670: 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  .  enc = SQLITE_
8680: 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a  UTF8;.#endif.  .
8690: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e    /* Check if an
86a0: 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69   existing functi
86b0: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72  on is being over
86c0: 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65  ridden or delete
86d0: 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61  d. If so,.  ** a
86e0: 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74  nd there are act
86f0: 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65  ive VMs, then re
8700: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
8710: 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a  . If a function.
8720: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76    ** is being ov
8730: 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64  erridden/deleted
8740: 20 62 75 74 20 74 68 65 72 65 20 61 72 65 20 6e   but there are n
8750: 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c  o active VMs, al
8760: 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  low the.  ** ope
8770: 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e  ration to contin
8780: 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74  ue but invalidat
8790: 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65  e all precompile
87a0: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
87b0: 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
87c0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
87d0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
87e0: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38  nName, nArg, (u8
87f0: 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  )enc, 0);.  if( 
8800: 70 20 26 26 20 70 2d 3e 69 50 72 65 66 45 6e 63  p && p->iPrefEnc
8810: 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67  ==enc && p->nArg
8820: 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66  ==nArg ){.    if
8830: 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ( db->activeVdbe
8840: 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Cnt ){.      sql
8850: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
8860: 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
8870: 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64      "unable to d
8880: 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65  elete/modify use
8890: 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74  r-function due t
88a0: 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
88b0: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73  nts");.      ass
88c0: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
88d0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
88e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
88f0: 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SY;.    }else{. 
8900: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69       sqlite3Expi
8910: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
8920: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a  ents(db);.    }.
8930: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
8940: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
8950: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
8960: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  , nName, nArg, (
8970: 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73  u8)enc, 1);.  as
8980: 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61  sert(p || db->ma
8990: 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69  llocFailed);.  i
89a0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
89b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
89c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
89d0: 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20  n older version 
89e0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
89f0: 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65  with a configure
8a00: 64 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a  d destructor is.
8a10: 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61    ** being repla
8a20: 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64  ced invoke the d
8a30: 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69  estructor functi
8a40: 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75  on here. */.  fu
8a50: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
8a60: 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65  , p);..  if( pDe
8a70: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
8a80: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
8a90: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 44  f++;.  }.  p->pD
8aa0: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73  estructor = pDes
8ab0: 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 6c  tructor;.  p->fl
8ac0: 61 67 73 20 3d 20 30 3b 0a 20 20 70 2d 3e 78 46  ags = 0;.  p->xF
8ad0: 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70  unc = xFunc;.  p
8ae0: 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b  ->xStep = xStep;
8af0: 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20  .  p->xFinalize 
8b00: 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70  = xFinal;.  p->p
8b10: 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65 72  UserData = pUser
8b20: 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20  Data;.  p->nArg 
8b30: 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72  = (u16)nArg;.  r
8b40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8b50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
8b60: 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74 69   new user functi
8b70: 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
8b80: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8b90: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
8ba0: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
8bb0: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
8bc0: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
8bd0: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
8be0: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
8bf0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
8c00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8c10: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
8c20: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
8c30: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
8c40: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
8c50: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
8c60: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
8c70: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
8c80: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
8c90: 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20  n_v2(db, zFunc, 
8ca0: 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46  nArg, enc, p, xF
8cb0: 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20  unc, xStep,.    
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ce0: 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69  xFinal, 0);.}..i
8cf0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
8d00: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20  e_function_v2(. 
8d10: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
8d20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
8d30: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
8d40: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
8d50: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
8d60: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
8d70: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
8d80: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
8d90: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
8da0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
8db0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
8dc0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
8dd0: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
8de0: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
8df0: 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64  (*xDestroy)(void
8e00: 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   *).){.  int rc 
8e10: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
8e20: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
8e30: 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20 73 71   *pArg = 0;.  sq
8e40: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
8e50: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
8e60: 69 66 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a  if( xDestroy ){.
8e70: 20 20 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63      pArg = (Func
8e80: 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c  Destructor *)sql
8e90: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
8ea0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63  (db, sizeof(Func
8eb0: 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20  Destructor));.  
8ec0: 20 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20    if( !pArg ){. 
8ed0: 20 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29       xDestroy(p)
8ee0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74  ;.      goto out
8ef0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67  ;.    }.    pArg
8f00: 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65  ->xDestroy = xDe
8f10: 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d  stroy;.    pArg-
8f20: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a  >pUserData = p;.
8f30: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
8f40: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
8f50: 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e   zFunc, nArg, en
8f60: 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74  c, p, xFunc, xSt
8f70: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72 67  ep, xFinal, pArg
8f80: 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20 26 26  );.  if( pArg &&
8f90: 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29   pArg->nRef==0 )
8fa0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
8fb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
8fc0: 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a     xDestroy(p);.
8fd0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8fe0: 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d  e(db, pArg);.  }
8ff0: 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73  .. out:.  rc = s
9000: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
9010: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
9020: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
9030: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
9040: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
9050: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
9060: 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  16.int sqlite3_c
9070: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
9080: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
9090: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
90a0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
90b0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
90c0: 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64  eTextRep,.  void
90d0: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
90e0: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
90f0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
9100: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
9110: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
9120: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
9130: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
9140: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
9150: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
9160: 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  ext*).){.  int r
9170: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63  c;.  char *zFunc
9180: 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  8;.  sqlite3_mut
9190: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
91a0: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
91b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
91c0: 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73   );.  zFunc8 = s
91d0: 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
91e0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
91f0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
9200: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20  16NATIVE);.  rc 
9210: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
9220: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20  unc(db, zFunc8, 
9230: 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20  nArg, eTextRep, 
9240: 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  p, xFunc, xStep,
9250: 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71   xFinal,0);.  sq
9260: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9270: 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20  zFunc8);.  rc = 
9280: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
9290: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
92a0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
92b0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
92c0: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
92d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
92e0: 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  that a function 
92f0: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61  has been overloa
9300: 64 65 64 20 62 79 20 61 20 76 69 72 74 75 61 6c  ded by a virtual
9310: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
9320: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c   the function al
9330: 72 65 61 64 79 20 65 78 69 73 74 73 20 61 73 20  ready exists as 
9340: 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c  a regular global
9350: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a   function, then.
9360: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
9370: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20  is a no-op.  If 
9380: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
9390: 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
93a0: 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65  n create.** a ne
93b0: 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79  w one that alway
93c0: 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74  s throws a run-t
93d0: 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a  ime error.  .**.
93e0: 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20  ** When virtual 
93f0: 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f  tables intend to
9400: 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72   provide an over
9410: 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c  loaded function,
9420: 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20   they.** should 
9430: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
9440: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
9450: 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  he global functi
9460: 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20  on exists..** A 
9470: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
9480: 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72  must exist in or
9490: 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73  der for name res
94a0: 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a  olution to work.
94b0: 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a  ** properly..*/.
94c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72  int sqlite3_over
94d0: 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  load_function(. 
94e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
94f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
9500: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b  e,.  int nArg.){
9510: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
9520: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
9530: 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 20  Name);.  int rc 
9540: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
9550: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
9560: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
9570: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
9580: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  Function(db, zNa
9590: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
95a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
95b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
95c0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
95d0: 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  c(db, zName, nAr
95e0: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9600: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71             0, sq
9610: 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63  lite3InvalidFunc
9620: 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tion, 0, 0, 0);.
9630: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
9640: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
9650: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
9660: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
9670: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
9680: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
9690: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
96a0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
96b0: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20  trace function. 
96c0: 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74   The pArg from t
96d0: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  he previously re
96e0: 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a  gistered trace.*
96f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  * is returned.  
9700: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72  .**.** A NULL tr
9710: 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61  ace function mea
9720: 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69  ns that no traci
9730: 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20  ng is executes. 
9740: 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74   A non-NULL.** t
9750: 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65  race is a pointe
9760: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
9770: 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  that is invoked 
9780: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
9790: 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74  each.** SQL stat
97a0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ement..*/.void *
97b0: 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71  sqlite3_trace(sq
97c0: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
97d0: 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c  (*xTrace)(void*,
97e0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f  const char*), vo
97f0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69  id *pArg){.  voi
9800: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
9810: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
9820: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
9830: 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72  d = db->pTraceAr
9840: 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20  g;.  db->xTrace 
9850: 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e  = xTrace;.  db->
9860: 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67  pTraceArg = pArg
9870: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
9880: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
9890: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
98a0: 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  d;.}./*.** Regis
98b0: 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75  ter a profile fu
98c0: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72  nction.  The pAr
98d0: 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  g from the previ
98e0: 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
98f0: 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e   .** profile fun
9900: 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65  ction is returne
9910: 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  d.  .**.** A NUL
9920: 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  L profile functi
9930: 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  on means that no
9940: 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78   profiling is ex
9950: 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e  ecutes.  A non-N
9960: 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69  ULL.** profile i
9970: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
9980: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
9990: 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
99a0: 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a   conclusion of.*
99b0: 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  * each SQL state
99c0: 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e  ment that is run
99d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
99e0: 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71  e3_profile(.  sq
99f0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
9a00: 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f  d (*xProfile)(vo
9a10: 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  id*,const char*,
9a20: 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a  sqlite_uint64),.
9a30: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
9a40: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20    void *pOld;.  
9a50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
9a60: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
9a70: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72    pOld = db->pPr
9a80: 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e  ofileArg;.  db->
9a90: 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66  xProfile = xProf
9aa0: 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66  ile;.  db->pProf
9ab0: 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ileArg = pArg;. 
9ac0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
9ad0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
9ae0: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
9af0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9b00: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f  TE_OMIT_TRACE */
9b10: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
9b20: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62   a function to b
9b30: 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61  e invoked when a
9b40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
9b50: 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20  mits..** If the 
9b60: 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e  invoked function
9b70: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
9b80: 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d  o, then the comm
9b90: 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20  it becomes a.** 
9ba0: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  rollback..*/.voi
9bb0: 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69  d *sqlite3_commi
9bc0: 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  t_hook(.  sqlite
9bd0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
9be0: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
9bf0: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
9c00: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
9c10: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
9c20: 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69  id*),  /* Functi
9c30: 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20  on to invoke on 
9c40: 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  each commit */. 
9c50: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
9c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
9c70: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
9c80: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
9c90: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c  oid *pOld;.  sql
9ca0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
9cb0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
9cc0: 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69  Old = db->pCommi
9cd0: 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d  tArg;.  db->xCom
9ce0: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  mitCallback = xC
9cf0: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
9d00: 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67  CommitArg = pArg
9d10: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
9d20: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
9d30: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
9d40: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  d;.}../*.** Regi
9d50: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
9d60: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
9d70: 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73  ch time a row is
9d80: 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73   updated,.** ins
9d90: 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64  erted or deleted
9da0: 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61   using this data
9db0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
9dc0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
9dd0: 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20  3_update_hook(. 
9de0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
9df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
9e00: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
9e10: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
9e20: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
9e30: 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  back)(void*,int,
9e40: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61  char const *,cha
9e50: 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65  r const *,sqlite
9e60: 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  _int64),.  void 
9e70: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
9e80: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
9e90: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
9ea0: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
9eb0: 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Ret;.  sqlite3_m
9ec0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
9ed0: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
9ee0: 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a  db->pUpdateArg;.
9ef0: 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c    db->xUpdateCal
9f00: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
9f10: 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65  k;.  db->pUpdate
9f20: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
9f30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9f40: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
9f50: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
9f60: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
9f70: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
9f80: 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
9f90: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
9fa0: 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  is rolled.** bac
9fb0: 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  k by this databa
9fc0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
9fd0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
9fe0: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20  rollback_hook(. 
9ff0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
a000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
a010: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
a020: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
a030: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
a040: 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a  back)(void*), /*
a050: 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   Callback functi
a060: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  on */.  void *pA
a070: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
a080: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
a090: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
a0a0: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
a0b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
a0c0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
a0d0: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
a0e0: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20  >pRollbackArg;. 
a0f0: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
a100: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
a110: 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62  ck;.  db->pRollb
a120: 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ackArg = pArg;. 
a130: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
a140: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
a150: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
a160: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
a170: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
a180: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c   The sqlite3_wal
a190: 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b  _hook() callback
a1a0: 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 73   registered by s
a1b0: 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
a1c0: 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20  heckpoint()..** 
a1d0: 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77  Invoke sqlite3_w
a1e0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  al_checkpoint if
a1f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
a200: 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
a210: 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
a220: 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33  ter than sqlite3
a230: 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f  .pWalArg cast to
a240: 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65   an integer (the
a250: 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
a260: 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f  d by.** wal_auto
a270: 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a  checkpoint())..*
a280: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61  / .int sqlite3Wa
a290: 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20  lDefaultHook(.  
a2a0: 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74  void *pClientDat
a2b0: 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  a,     /* Argume
a2c0: 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  nt */.  sqlite3 
a2d0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f  *db,           /
a2e0: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  * Connection */.
a2f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
a300: 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
a310: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  base */.  int nF
a320: 72 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  rame            
a330: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20   /* Size of WAL 
a340: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61  */.){.  if( nFra
a350: 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54  me>=SQLITE_PTR_T
a360: 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74  O_INT(pClientDat
a370: 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  a) ){.    sqlite
a380: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
a390: 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oc();.    sqlite
a3a0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
a3b0: 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73  (db, zDb);.    s
a3c0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
a3d0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72  alloc();.  }.  r
a3e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a3f0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
a400: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
a410: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65  ./*.** Configure
a420: 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   an sqlite3_wal_
a430: 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20  hook() callback 
a440: 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
a450: 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61   checkpoint.** a
a460: 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
a470: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
a480: 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
a490: 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a  e are nFrame or.
a4a0: 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69  ** more frames i
a4b0: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
a4c0: 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20  Passing zero or 
a4d0: 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  a negative value
a4e0: 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d   as the.** nFram
a4f0: 65 20 70 61 72 61 6d 65 74 65 72 20 64 69 73 61  e parameter disa
a500: 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63  bles automatic c
a510: 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72  heckpoints entir
a520: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ely..**.** The c
a530: 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72  allback register
a540: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
a550: 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79  ion replaces any
a560: 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61   existing callba
a570: 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64  ck.** registered
a580: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77   using sqlite3_w
a590: 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77  al_hook(). Likew
a5a0: 69 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67  ise, registering
a5b0: 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75   a callback.** u
a5c0: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c  sing sqlite3_wal
a5d0: 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73  _hook() disables
a5e0: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63   the automatic c
a5f0: 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e  heckpoint mechan
a600: 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65  ism.** configure
a610: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
a620: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
a630: 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
a640: 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
a650: 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a  b, int nFrame){.
a660: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
a670: 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f  IT_WAL.  UNUSED_
a680: 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
a690: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
a6a0: 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65  R(nFrame);.#else
a6b0: 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20  .  if( nFrame>0 
a6c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  ){.    sqlite3_w
a6d0: 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69  al_hook(db, sqli
a6e0: 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
a6f0: 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  k, SQLITE_INT_TO
a700: 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20  _PTR(nFrame));. 
a710: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
a720: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c  te3_wal_hook(db,
a730: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
a740: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
a750: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
a760: 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
a770: 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
a780: 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72  d each time a tr
a790: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69  ansaction is wri
a7a0: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  tten.** into the
a7b0: 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67   write-ahead-log
a7c0: 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
a7d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
a7e0: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77  .void *sqlite3_w
a7f0: 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  al_hook(.  sqlit
a800: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
a810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
a820: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
a830: 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20   this db handle 
a840: 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62  */.  int(*xCallb
a850: 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c  ack)(void *, sql
a860: 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61  ite3*, const cha
a870: 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64  r*, int),.  void
a880: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
a890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
a8a0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
a8b0: 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63  ssed to xCallbac
a8c0: 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  k() */.){.#ifnde
a8d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
a8e0: 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  L.  void *pRet;.
a8f0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a900: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
a910: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
a920: 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57  WalArg;.  db->xW
a930: 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  alCallback = xCa
a940: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57  llback;.  db->pW
a950: 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  alArg = pArg;.  
a960: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
a970: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
a980: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23    return pRet;.#
a990: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b  else.  return 0;
a9a0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
a9b0: 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61   Checkpoint data
a9c0: 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74  base zDb..*/.int
a9d0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
a9e0: 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71  ckpoint_v2(.  sq
a9f0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa10: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
aa20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
aa30: 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20   *zDb,          
aa40: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
aa50: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
aa60: 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  se (or NULL) */.
aa70: 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20    int eMode,    
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa90: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
aaa0: 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a  KPOINT_* value *
aab0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20  /.  int *pnLog, 
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aad0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
aae0: 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66   of WAL log in f
aaf0: 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  rames */.  int *
ab00: 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20 20  pnCkpt          
ab10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
ab20: 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  T: Total number 
ab30: 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70  of frames checkp
ab40: 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66  ointed */.){.#if
ab50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ab60: 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  WAL.  return SQL
ab70: 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
ab80: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aba0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
abb0: 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51  /.  int iDb = SQ
abc0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
abd0: 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61  D;  /* sqlite3.a
abe0: 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62  Db[] index of db
abf0: 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a   to checkpoint *
ac00: 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  /..  /* Initiali
ac10: 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  ze the output va
ac20: 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e  riables to -1 in
ac30: 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
ac40: 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20  ccurs. */.  if( 
ac50: 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d  pnLog ) *pnLog =
ac60: 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70   -1;.  if( pnCkp
ac70: 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31  t ) *pnCkpt = -1
ac80: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  ;..  assert( SQL
ac90: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
aca0: 55 4c 4c 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b  ULL>SQLITE_CHECK
acb0: 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 29 3b  POINT_PASSIVE );
acc0: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
acd0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
ace0: 4c 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  L<SQLITE_CHECKPO
acf0: 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20  INT_RESTART );. 
ad00: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
ad10: 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
ad20: 56 45 2b 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45  VE+2==SQLITE_CHE
ad30: 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20  CKPOINT_RESTART 
ad40: 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53  );.  if( eMode<S
ad50: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
ad60: 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64  _PASSIVE || eMod
ad70: 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  e>SQLITE_CHECKPO
ad80: 49 4e 54 5f 52 45 53 54 41 52 54 20 29 7b 0a 20  INT_RESTART ){. 
ad90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ada0: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20  _MISUSE;.  }..  
adb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
adc0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
add0: 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62    if( zDb && zDb
ade0: 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d  [0] ){.    iDb =
adf0: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
ae00: 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d  me(db, zDb);.  }
ae10: 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a  .  if( iDb<0 ){.
ae20: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ae30: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
ae40: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
ae50: 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f  TE_ERROR, "unkno
ae60: 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22  wn database: %s"
ae70: 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  , zDb);.  }else{
ae80: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ae90: 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  3Checkpoint(db, 
aea0: 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  iDb, eMode, pnLo
aeb0: 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
aec0: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
aed0: 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72   rc, 0);.  }.  r
aee0: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
aef0: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
af00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
af10: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
af20: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
af30: 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  f.}.../*.** Chec
af40: 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
af50: 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e  zDb. If zDb is N
af60: 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62  ULL, or if the b
af70: 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73  uffer zDb points
af80: 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20  .** to contains 
af90: 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74  a zero-length st
afa0: 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68  ring, all attach
afb0: 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ed databases are
afc0: 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65   .** checkpointe
afd0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
afe0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
aff0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
b000: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
b010: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b020: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
b030: 76 32 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49  v2(db, zDb, SQLI
b040: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
b050: 53 53 49 56 45 2c 20 30 2c 20 30 29 3b 0a 7d 0a  SSIVE, 0, 0);.}.
b060: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b070: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52  OMIT_WAL./*.** R
b080: 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  un a checkpoint 
b090: 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  on database iDb.
b0a0: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
b0b0: 20 69 66 20 64 61 74 61 62 61 73 65 20 69 44 62   if database iDb
b0c0: 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65   is.** not curre
b0d0: 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c  ntly open in WAL
b0e0: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   mode..**.** If 
b0f0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
b100: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
b110: 61 62 61 73 65 20 62 65 69 6e 67 20 63 68 65 63  abase being chec
b120: 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a  kpointed, this .
b130: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
b140: 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rns SQLITE_LOCKE
b150: 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69  D and a checkpoi
b160: 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  nt is not attemp
b170: 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ted. If .** an e
b180: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
b190: 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68  e running the ch
b1a0: 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c  eckpoint, an SQL
b1b0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
b1c0: 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28  s .** returned (
b1d0: 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  i.e. SQLITE_IOER
b1e0: 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  R). Otherwise, S
b1f0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
b200: 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74  The mutex on dat
b210: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20  abase handle db 
b220: 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62  should be held b
b230: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68  y the caller. Th
b240: 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63  e mutex.** assoc
b250: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73  iated with the s
b260: 70 65 63 69 66 69 63 20 62 2d 74 72 65 65 20 62  pecific b-tree b
b270: 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65  eing checkpointe
b280: 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a  d is taken by.**
b290: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
b2a0: 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f  hile the checkpo
b2b0: 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a  int is running..
b2c0: 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20  **.** If iDb is 
b2d0: 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41  passed SQLITE_MA
b2e0: 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e  X_ATTACHED, then
b2f0: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
b300: 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63  tabases are.** c
b310: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20  heckpointed. If 
b320: 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
b330: 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 72 65  untered it is re
b340: 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  turned immediate
b350: 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d  ly -.** no attem
b360: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68  pt is made to ch
b370: 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d  eckpoint any rem
b380: 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73  aining databases
b390: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
b3a0: 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f  r eMode is one o
b3b0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  f SQLITE_CHECKPO
b3c0: 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c  INT_PASSIVE, FUL
b3d0: 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f  L or RESTART..*/
b3e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
b3f0: 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
b400: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  db, int iDb, int
b410: 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c   eMode, int *pnL
b420: 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29  og, int *pnCkpt)
b430: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b440: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
b450: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
b460: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  de */.  int i;  
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
b490: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
b4a0: 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73 20  gh attached dbs 
b4b0: 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d  */.  int bBusy =
b4c0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b4d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
b4e0: 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20  SQLITE_BUSY has 
b4f0: 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
b500: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
b510: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b520: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
b530: 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67    assert( !pnLog
b540: 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29   || *pnLog==-1 )
b550: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 43  ;.  assert( !pnC
b560: 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d  kpt || *pnCkpt==
b570: 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  -1 );..  for(i=0
b580: 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72  ; i<db->nDb && r
b590: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
b5a0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69  +){.    if( i==i
b5b0: 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54  Db || iDb==SQLIT
b5c0: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29  E_MAX_ATTACHED )
b5d0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
b5e0: 69 74 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f  ite3BtreeCheckpo
b5f0: 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  int(db->aDb[i].p
b600: 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67  Bt, eMode, pnLog
b610: 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20  , pnCkpt);.     
b620: 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20   pnLog = 0;.    
b630: 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20    pnCkpt = 0;.  
b640: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
b650: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
b660: 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20     bBusy = 1;.  
b670: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
b680: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
b690: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
b6a0: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
b6b0: 20 26 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c   && bBusy) ? SQL
b6c0: 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d  ITE_BUSY : rc;.}
b6d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b6e0: 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
b6f0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
b700: 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20  on returns true 
b710: 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73  if main-memory s
b720: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e  hould be used in
b730: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65  stead of.** a te
b740: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72  mporary file for
b750: 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72   transient pager
b760: 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65   files and state
b770: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a  ment journals..*
b780: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
b790: 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  rned depends on 
b7a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d  the value of db-
b7b0: 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e  >temp_store (run
b7c0: 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  time.** paramete
b7d0: 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  r) and the compi
b7e0: 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66  le time value of
b7f0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
b800: 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  RE. The.** follo
b810: 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
b820: 69 62 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f  ibes the relatio
b830: 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 74 68  nship between th
b840: 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  ese two values.*
b850: 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  * and this funct
b860: 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75  ions return valu
b870: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54  e..**.**   SQLIT
b880: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20  E_TEMP_STORE    
b890: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
b8a0: 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20      Location of 
b8b0: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
b8c0: 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  se.**   --------
b8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
b8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
b8f0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
b900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
b910: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
b920: 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20             any  
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
b940: 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
b950: 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  0).**   1       
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
b970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b980: 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
b990: 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9b0: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
b9c0: 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
b9d0: 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20  eturn 1).**   1 
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
ba00: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
ba10: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
ba20: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
ba30: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
ba40: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
ba50: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
ba60: 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
ba70: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
ba90: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
baa0: 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bad0: 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
bae0: 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20  n 1).**   3     
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb00: 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
bb10: 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
bb20: 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73  turn 1).*/.int s
bb30: 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
bb40: 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ry(const sqlite3
bb50: 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54   *db){.#if SQLIT
bb60: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a  E_TEMP_STORE==1.
bb70: 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
bb80: 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a  emp_store==2 );.
bb90: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
bba0: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a  E_TEMP_STORE==2.
bbb0: 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
bbc0: 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a  emp_store!=1 );.
bbd0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
bbe0: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a  E_TEMP_STORE==3.
bbf0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
bc00: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
bc10: 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51  MP_STORE<1 || SQ
bc20: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e  LITE_TEMP_STORE>
bc30: 33 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  3.  return 0;.#e
bc40: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
bc50: 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64  turn UTF-8 encod
bc60: 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  ed English langu
bc70: 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  age explanation 
bc80: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
bc90: 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a  nt.** error..*/.
bca0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
bcb0: 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74  te3_errmsg(sqlit
bcc0: 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74  e3 *db){.  const
bcd0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
bce0: 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
bcf0: 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
bd00: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
bd10: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
bd20: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
bd30: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
bd40: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
bd50: 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55  rStr(SQLITE_MISU
bd60: 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20  SE_BKPT);.  }.  
bd70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
bd80: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
bd90: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
bda0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
bdb0: 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  = sqlite3ErrStr(
bdc0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
bdd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20   }else{.    z = 
bde0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
bdf0: 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45  alue_text(db->pE
be00: 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rr);.    assert(
be10: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
be20: 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  ed );.    if( z=
be30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  =0 ){.      z = 
be40: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
be50: 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20  ->errCode);.    
be60: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
be70: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
be80: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
be90: 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   z;.}..#ifndef S
bea0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
beb0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
bec0: 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67  F-16 encoded Eng
bed0: 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
bee0: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  planation of the
bef0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
bf00: 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  error..*/.const 
bf10: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72  void *sqlite3_er
bf20: 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a  rmsg16(sqlite3 *
bf30: 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  db){.  static co
bf40: 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d  nst u16 outOfMem
bf50: 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20  [] = {.    'o', 
bf60: 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27  'u', 't', ' ', '
bf70: 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d  o', 'f', ' ', 'm
bf80: 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27  ', 'e', 'm', 'o'
bf90: 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20  , 'r', 'y', 0.  
bfa0: 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
bfb0: 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d  t u16 misuse[] =
bfc0: 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27 2c   {.    'l', 'i',
bfd0: 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c 20   'b', 'r', 'a', 
bfe0: 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a  'r', 'y', ' ', .
bff0: 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27 75      'r', 'o', 'u
c000: 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e 27  ', 't', 'i', 'n'
c010: 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'e', ' ', .   
c020: 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20   'c', 'a', 'l', 
c030: 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20 27  'l', 'e', 'd', '
c040: 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 75   ', .    'o', 'u
c050: 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20 20  ', 't', ' ', .  
c060: 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c    'o', 'f', ' ',
c070: 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c 20   .    's', 'e', 
c080: 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20 27  'q', 'u', 'e', '
c090: 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30 0a  n', 'c', 'e', 0.
c0a0: 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f    };..  const vo
c0b0: 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62  id *z;.  if( !db
c0c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
c0d0: 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b  void *)outOfMem;
c0e0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
c0f0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
c100: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
c110: 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a    return (void *
c120: 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73  )misuse;.  }.  s
c130: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
c140: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
c150: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
c160: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d  ailed ){.    z =
c170: 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65   (void *)outOfMe
c180: 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  m;.  }else{.    
c190: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
c1a0: 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72  e_text16(db->pEr
c1b0: 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  r);.    if( z==0
c1c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c1d0: 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
c1e0: 3e 70 45 72 72 2c 20 2d 31 2c 20 73 71 6c 69 74  >pErr, -1, sqlit
c1f0: 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72  e3ErrStr(db->err
c200: 43 6f 64 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Code),.         
c210: 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53    SQLITE_UTF8, S
c220: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
c230: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
c240: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
c250: 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20  ->pErr);.    }. 
c260: 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29     /* A malloc()
c270: 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65 64   may have failed
c280: 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
c290: 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   to sqlite3_valu
c2a0: 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a  e_text16().    *
c2b0: 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73  * above. If this
c2c0: 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
c2d0: 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  en the db->mallo
c2e0: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65  cFailed flag nee
c2f0: 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
c300: 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 72  cleared before r
c310: 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69  eturning. Do thi
c320: 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  s directly, inst
c330: 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a  ead of via.    *
c340: 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  * sqlite3ApiExit
c350: 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74  (), to avoid set
c360: 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
c370: 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d  e handle error m
c380: 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  essage..    */. 
c390: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
c3a0: 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  led = 0;.  }.  s
c3b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
c3c0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
c3d0: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e   return z;.}.#en
c3e0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
c3f0: 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
c400: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** Return the mo
c410: 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20  st recent error 
c420: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
c430: 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74  y an SQLite rout
c440: 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a  ine. If NULL is.
c450: 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ** passed to thi
c460: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61  s function, we a
c470: 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29  ssume a malloc()
c480: 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73   failed during s
c490: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a  qlite3_open()..*
c4a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72  /.int sqlite3_er
c4b0: 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
c4c0: 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
c4d0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
c4e0: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
c4f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c500: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
c510: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20  ;.  }.  if( !db 
c520: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
c530: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
c540: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
c550: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d    }.  return db-
c560: 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65  >errCode & db->e
c570: 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71  rrMask;.}.int sq
c580: 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
c590: 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a  rrcode(sqlite3 *
c5a0: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26  db){.  if( db &&
c5b0: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
c5c0: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
c5d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
c5e0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
c5f0: 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62  T;.  }.  if( !db
c600: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
c610: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
c620: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
c630: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62  .  }.  return db
c640: 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  ->errCode;.}../*
c650: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
c660: 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
c670: 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65  ion for database
c680: 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65   "db".  The name
c690: 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64   is zName.** and
c6a0: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73   the encoding is
c6b0: 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   enc..*/.static 
c6c0: 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  int createCollat
c6d0: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  ion(.  sqlite3* 
c6e0: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
c6f0: 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65   *zName, .  u8 e
c700: 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  nc,.  void* pCtx
c710: 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
c720: 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
c730: 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
c740: 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
c750: 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
c760: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
c770: 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b  oll;.  int enc2;
c780: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
c790: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
c7a0: 4e 61 6d 65 29 3b 0a 20 20 0a 20 20 61 73 73 65  Name);.  .  asse
c7b0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
c7c0: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
c7d0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51  ) );..  /* If SQ
c7e0: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70  LITE_UTF16 is sp
c7f0: 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65  ecified as the e
c800: 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72  ncoding type, tr
c810: 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a  ansform this.  *
c820: 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49  * to one of SQLI
c830: 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51  TE_UTF16LE or SQ
c840: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69  LITE_UTF16BE usi
c850: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ng the.  ** SQLI
c860: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d  TE_UTF16NATIVE m
c870: 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46  acro. SQLITE_UTF
c880: 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  16 is not used i
c890: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
c8a0: 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20    enc2 = enc;.  
c8b0: 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
c8c0: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a  SQLITE_UTF16 );.
c8d0: 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
c8e0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  ==SQLITE_UTF16_A
c8f0: 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20  LIGNED );.  if( 
c900: 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
c910: 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49  16 || enc2==SQLI
c920: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
c930: 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53   ){.    enc2 = S
c940: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
c950: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63  E;.  }.  if( enc
c960: 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  2<SQLITE_UTF8 ||
c970: 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46   enc2>SQLITE_UTF
c980: 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75  16BE ){.    retu
c990: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
c9a0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
c9b0: 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63   Check if this c
c9c0: 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20  all is removing 
c9d0: 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20  or replacing an 
c9e0: 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69  existing collati
c9f0: 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  on .  ** sequenc
ca00: 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68  e. If so, and th
ca10: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
ca20: 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e  Ms, return busy.
ca30: 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61   If there.  ** a
ca40: 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
ca50: 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  , invalidate any
ca60: 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
ca70: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
ca80: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
ca90: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
caa0: 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
cab0: 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   0);.  if( pColl
cac0: 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   && pColl->xCmp 
cad0: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  ){.    if( db->a
cae0: 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a  ctiveVdbeCnt ){.
caf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
cb00: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
cb10: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
cb20: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
cb30: 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  odify collation 
cb40: 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20  sequence due to 
cb50: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
cb60: 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
cb70: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
cb80: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
cb90: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
cba0: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20  atements(db);.. 
cbb0: 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69     /* If collati
cbc0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
cbd0: 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69  l was created di
cbe0: 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c  rectly by a call
cbf0: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
cc00: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
cc10: 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e  ion, and not gen
cc20: 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43  erated by synthC
cc30: 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a  ollSeq(),.    **
cc40: 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73   then any copies
cc50: 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f   made by synthCo
cc60: 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20  llSeq() need to 
cc70: 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  be invalidated..
cc80: 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c      ** Also, col
cc90: 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f  lation destructo
cca0: 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c  r - CollSeq.xDel
ccb0: 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61  () - function ma
ccc0: 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  y need.    ** to
ccd0: 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20   be called..    
cce0: 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f  */ .    if( (pCo
ccf0: 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54  ll->enc & ~SQLIT
cd00: 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
cd10: 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20  ==enc2 ){.      
cd20: 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d  CollSeq *aColl =
cd30: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
cd40: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
cd50: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
cd60: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
cd70: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
cd80: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
cd90: 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c  llSeq *p = &aCol
cda0: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
cdb0: 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  ( p->enc==pColl-
cdc0: 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  >enc ){.        
cdd0: 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b    if( p->xDel ){
cde0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
cdf0: 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a  xDel(p->pUser);.
ce00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ce10: 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20        p->xCmp = 
ce20: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
ce30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
ce40: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
ce50: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
ce60: 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
ce70: 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 1);.  if( pCol
ce80: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
ce90: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 43  LITE_NOMEM;.  pC
cea0: 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d  oll->xCmp = xCom
ceb0: 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70  pare;.  pColl->p
cec0: 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70  User = pCtx;.  p
ced0: 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65  Coll->xDel = xDe
cee0: 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20  l;.  pColl->enc 
cef0: 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65  = (u8)(enc2 | (e
cf00: 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31  nc & SQLITE_UTF1
cf10: 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73  6_ALIGNED));.  s
cf20: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
cf30: 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
cf40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cf50: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  K;.}.../*.** Thi
cf60: 73 20 61 72 72 61 79 20 64 65 66 69 6e 65 73 20  s array defines 
cf70: 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64  hard upper bound
cf80: 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65  s on limit value
cf90: 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69  s.  The.** initi
cfa0: 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20 6b  alizer must be k
cfb0: 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74 68  ept in sync with
cfc0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49   the SQLITE_LIMI
cfd0: 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20  T_*.** #defines 
cfe0: 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f  in sqlite3.h..*/
cff0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e  .static const in
d000: 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d  t aHardLimit[] =
d010: 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f   {.  SQLITE_MAX_
d020: 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
d030: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c  _MAX_SQL_LENGTH,
d040: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
d050: 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LUMN,.  SQLITE_M
d060: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a 20  AX_EXPR_DEPTH,. 
d070: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
d080: 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53  OUND_SELECT,.  S
d090: 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
d0a0: 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  P,.  SQLITE_MAX_
d0b0: 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20  FUNCTION_ARG,.  
d0c0: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
d0d0: 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  HED,.  SQLITE_MA
d0e0: 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
d0f0: 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
d100: 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
d110: 42 45 52 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  BER,.  SQLITE_MA
d120: 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c  X_TRIGGER_DEPTH,
d130: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  .};../*.** Make 
d140: 73 75 72 65 20 74 68 65 20 68 61 72 64 20 6c 69  sure the hard li
d150: 6d 69 74 73 20 61 72 65 20 73 65 74 20 74 6f 20  mits are set to 
d160: 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65  reasonable value
d170: 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  s.*/.#if SQLITE_
d180: 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23  MAX_LENGTH<100.#
d190: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
d1a0: 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  X_LENGTH must be
d1b0: 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65   at least 100.#e
d1c0: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
d1d0: 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31  MAX_SQL_LENGTH<1
d1e0: 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
d1f0: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
d200: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
d210: 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66  t 100.#endif.#if
d220: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
d230: 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41  LENGTH>SQLITE_MA
d240: 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72  X_LENGTH.# error
d250: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
d260: 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20  LENGTH must not 
d270: 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
d280: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
d290: 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  H.#endif.#if SQL
d2a0: 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
d2b0: 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f  _SELECT<2.# erro
d2c0: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  r SQLITE_MAX_COM
d2d0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73  POUND_SELECT mus
d2e0: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a  t be at least 2.
d2f0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
d300: 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30  E_MAX_VDBE_OP<40
d310: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
d320: 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74  MAX_VDBE_OP must
d330: 20 62 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a   be at least 40.
d340: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
d350: 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
d360: 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  RG<0 || SQLITE_M
d370: 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e  AX_FUNCTION_ARG>
d380: 31 30 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  1000.# error SQL
d390: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
d3a0: 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62 65 74  _ARG must be bet
d3b0: 77 65 65 6e 20 30 20 61 6e 64 20 31 30 30 30 0a  ween 0 and 1000.
d3c0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
d3d0: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30  E_MAX_ATTACHED<0
d3e0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41   || SQLITE_MAX_A
d3f0: 54 54 41 43 48 45 44 3e 36 32 0a 23 20 65 72 72  TTACHED>62.# err
d400: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  or SQLITE_MAX_AT
d410: 54 41 43 48 45 44 20 6d 75 73 74 20 62 65 20 62  TACHED must be b
d420: 65 74 77 65 65 6e 20 30 20 61 6e 64 20 36 32 0a  etween 0 and 62.
d430: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
d440: 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
d450: 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72  RN_LENGTH<1.# er
d460: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
d470: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
d480: 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
d490: 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  ast 1.#endif.#if
d4a0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
d4b0: 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72  MN>32767.# error
d4c0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
d4d0: 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65  MN must not exce
d4e0: 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a  ed 32767.#endif.
d4f0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  #if SQLITE_MAX_T
d500: 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23  RIGGER_DEPTH<1.#
d510: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
d520: 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
d530: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
d540: 20 31 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   1.#endif.../*.*
d550: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
d560: 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20  ue of a limit.  
d570: 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  Report the old v
d580: 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69  alue..** If an i
d590: 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64  nvalid limit ind
d5a0: 65 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20  ex is supplied, 
d5b0: 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61  report -1..** Ma
d5c0: 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75  ke no changes bu
d5d0: 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74  t still report t
d5e0: 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20  he old value if 
d5f0: 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74  the.** new limit
d600: 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   is negative..**
d610: 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20  .** A new lower 
d620: 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73  limit does not s
d630: 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63  hrink existing c
d640: 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74  onstructs..** It
d650: 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73   merely prevents
d660: 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20   new constructs 
d670: 74 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20  that exceed the 
d680: 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f  limit.** from fo
d690: 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rming..*/.int sq
d6a0: 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69  lite3_limit(sqli
d6b0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d  te3 *db, int lim
d6c0: 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d  itId, int newLim
d6d0: 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69  it){.  int oldLi
d6e0: 6d 69 74 3b 0a 0a 0a 20 20 2f 2a 20 45 56 49 44  mit;...  /* EVID
d6f0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39  ENCE-OF: R-30189
d700: 2d 35 34 30 39 37 20 46 6f 72 20 65 61 63 68 20  -54097 For each 
d710: 6c 69 6d 69 74 20 63 61 74 65 67 6f 72 79 20 53  limit category S
d720: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45  QLITE_LIMIT_NAME
d730: 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61  .  ** there is a
d740: 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e   hard upper boun
d750: 64 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  d set at compile
d760: 2d 74 69 6d 65 20 62 79 20 61 20 43 20 70 72 65  -time by a C pre
d770: 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d  processor.  ** m
d780: 61 63 72 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49  acro called SQLI
d790: 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68  TE_MAX_NAME. (Th
d7a0: 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74  e "_LIMIT_" in t
d7b0: 68 65 20 6e 61 6d 65 20 69 73 20 63 68 61 6e 67  he name is chang
d7c0: 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58  ed to.  ** "_MAX
d7d0: 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65  _".).  */.  asse
d7e0: 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
d7f0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
d800: 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
d810: 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65  LENGTH );.  asse
d820: 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
d830: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f  QLITE_LIMIT_SQL_
d840: 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  LENGTH]==SQLITE_
d850: 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29  MAX_SQL_LENGTH )
d860: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
d870: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
d880: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c  MIT_COLUMN]==SQL
d890: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29  ITE_MAX_COLUMN )
d8a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
d8b0: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
d8c0: 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d  MIT_EXPR_DEPTH]=
d8d0: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  =SQLITE_MAX_EXPR
d8e0: 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
d8f0: 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
d900: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
d910: 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51  OUND_SELECT]==SQ
d920: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
d930: 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61 73 73  D_SELECT);.  ass
d940: 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
d950: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42  SQLITE_LIMIT_VDB
d960: 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  E_OP]==SQLITE_MA
d970: 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61  X_VDBE_OP );.  a
d980: 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
d990: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46  t[SQLITE_LIMIT_F
d9a0: 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51  UNCTION_ARG]==SQ
d9b0: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
d9c0: 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73 73 65 72  N_ARG );.  asser
d9d0: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
d9e0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43  LITE_LIMIT_ATTAC
d9f0: 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  HED]==SQLITE_MAX
da00: 5f 41 54 54 41 43 48 45 44 20 29 3b 0a 20 20 61  _ATTACHED );.  a
da10: 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
da20: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
da30: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
da40: 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20 20 20  TH]==.          
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da70: 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f       SQLITE_MAX_
da80: 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
da90: 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  GTH );.  assert(
daa0: 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
dab0: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
dac0: 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54  E_NUMBER]==SQLIT
dad0: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
dae0: 55 4d 42 45 52 29 3b 0a 20 20 61 73 73 65 72 74  UMBER);.  assert
daf0: 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
db00: 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
db10: 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
db20: 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
db30: 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
db40: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
db50: 47 47 45 52 5f 44 45 50 54 48 3d 3d 28 53 51 4c  GGER_DEPTH==(SQL
db60: 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29  ITE_N_LIMIT-1) )
db70: 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69 74 49  ;...  if( limitI
db80: 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d  d<0 || limitId>=
db90: 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29  SQLITE_N_LIMIT )
dba0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
dbb0: 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20  .  }.  oldLimit 
dbc0: 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d  = db->aLimit[lim
dbd0: 69 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77  itId];.  if( new
dbe0: 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20 20 20  Limit>=0 ){     
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dc00: 20 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d 32 38   IMP: R-52476-28
dc10: 37 33 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  732 */.    if( n
dc20: 65 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d  ewLimit>aHardLim
dc30: 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20  it[limitId] ){. 
dc40: 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
dc50: 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74  aHardLimit[limit
dc60: 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  Id];  /* IMP: R-
dc70: 35 31 34 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20  51463-25634 */. 
dc80: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69     }.    db->aLi
dc90: 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e  mit[limitId] = n
dca0: 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72  ewLimit;.  }.  r
dcb0: 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20  eturn oldLimit; 
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33      /* IMP: R-53
dce0: 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 23  341-35419 */.}.#
dcf0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
dd00: 45 5f 45 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52  E_ENABLE_AUTO_PR
dd10: 4f 46 49 4c 45 29 0a 2f 2a 20 73 74 64 65 72 72  OFILE)./* stderr
dd20: 20 6c 6f 67 67 69 6e 67 20 2a 2f 0a 76 6f 69 64   logging */.void
dd30: 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 70 72   _sqlite_auto_pr
dd40: 6f 66 69 6c 65 28 76 6f 69 64 20 2a 61 75 78 2c  ofile(void *aux,
dd50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
dd60: 2c 20 75 36 34 20 6e 73 29 3b 0a 76 6f 69 64 20  , u64 ns);.void 
dd70: 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61  _sqlite_auto_tra
dd80: 63 65 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f  ce(void *aux, co
dd90: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 29 3b 0a  nst char *sql);.
dda0: 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74  void _sqlite_aut
ddb0: 6f 5f 70 72 6f 66 69 6c 65 28 76 6f 69 64 20 2a  o_profile(void *
ddc0: 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  aux, const char 
ddd0: 2a 73 71 6c 2c 20 75 36 34 20 6e 73 29 20 7b 0a  *sql, u64 ns) {.
dde0: 23 70 72 61 67 6d 61 20 75 6e 75 73 65 64 28 61  #pragma unused(a
ddf0: 75 78 29 0a 09 66 70 72 69 6e 74 66 28 73 74 64  ux)..fprintf(std
de00: 65 72 72 2c 20 22 51 75 65 72 79 3a 20 25 73 5c  err, "Query: %s\
de10: 6e 20 45 78 65 63 75 74 69 6f 6e 20 54 69 6d 65  n Execution Time
de20: 3a 20 25 6c 6c 75 20 6d 73 5c 6e 22 2c 20 73 71  : %llu ms\n", sq
de30: 6c 2c 20 6e 73 20 2f 20 31 30 30 30 30 30 30 29  l, ns / 1000000)
de40: 3b 0a 7d 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65  ;.}.void _sqlite
de50: 5f 61 75 74 6f 5f 74 72 61 63 65 28 76 6f 69 64  _auto_trace(void
de60: 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61   *aux, const cha
de70: 72 20 2a 73 71 6c 29 20 7b 0a 09 66 70 72 69 6e  r *sql) {..fprin
de80: 74 66 28 73 74 64 65 72 72 2c 20 22 54 72 61 63  tf(stderr, "Trac
de90: 65 53 51 4c 28 25 70 29 3a 20 25 73 5c 6e 22 2c  eSQL(%p): %s\n",
dea0: 20 61 75 78 2c 20 73 71 6c 29 3b 0a 7d 0a 0a 2f   aux, sql);.}../
deb0: 2a 20 73 79 73 6c 6f 67 20 6c 6f 67 67 69 6e 67  * syslog logging
dec0: 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73   */.#include <as
ded0: 6c 2e 68 3e 0a 73 74 61 74 69 63 20 61 73 6c 63  l.h>.static aslc
dee0: 6c 69 65 6e 74 20 61 75 74 6f 6c 6f 67 5f 63 6c  lient autolog_cl
def0: 69 65 6e 74 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61  ient = NULL;.sta
df00: 74 69 63 20 76 6f 69 64 20 5f 63 6c 6f 73 65 5f  tic void _close_
df10: 61 73 6c 5f 6c 6f 67 28 29 20 7b 0a 20 20 69 66  asl_log() {.  if
df20: 28 20 4e 55 4c 4c 21 3d 61 75 74 6f 6c 6f 67 5f  ( NULL!=autolog_
df30: 63 6c 69 65 6e 74 20 29 7b 0a 20 20 20 20 61 73  client ){.    as
df40: 6c 5f 63 6c 6f 73 65 28 61 75 74 6f 6c 6f 67 5f  l_close(autolog_
df50: 63 6c 69 65 6e 74 29 3b 0a 20 20 20 20 61 75 74  client);.    aut
df60: 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 3d 20 4e 55  olog_client = NU
df70: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  LL;.  }.}.static
df80: 20 76 6f 69 64 20 5f 6f 70 65 6e 5f 61 73 6c 5f   void _open_asl_
df90: 6c 6f 67 28 29 20 7b 0a 20 20 69 66 28 20 4e 55  log() {.  if( NU
dfa0: 4c 4c 3d 3d 61 75 74 6f 6c 6f 67 5f 63 6c 69 65  LL==autolog_clie
dfb0: 6e 74 20 29 7b 0a 20 20 20 20 61 75 74 6f 6c 6f  nt ){.    autolo
dfc0: 67 5f 63 6c 69 65 6e 74 20 3d 20 61 73 6c 5f 6f  g_client = asl_o
dfd0: 70 65 6e 28 22 53 51 4c 69 74 65 22 2c 20 4e 55  pen("SQLite", NU
dfe0: 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 61 74 65 78  LL, 0);.    atex
dff0: 69 74 28 5f 63 6c 6f 73 65 5f 61 73 6c 5f 6c 6f  it(_close_asl_lo
e000: 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20  g);.  }.}..void 
e010: 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f  _sqlite_auto_pro
e020: 66 69 6c 65 5f 73 79 73 6c 6f 67 28 76 6f 69 64  file_syslog(void
e030: 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61   *aux, const cha
e040: 72 20 2a 73 71 6c 2c 20 75 36 34 20 6e 73 29 3b  r *sql, u64 ns);
e050: 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75  .void _sqlite_au
e060: 74 6f 5f 74 72 61 63 65 5f 73 79 73 6c 6f 67 28  to_trace_syslog(
e070: 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74  void *aux, const
e080: 20 63 68 61 72 20 2a 73 71 6c 29 3b 0a 76 6f 69   char *sql);.voi
e090: 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 70  d _sqlite_auto_p
e0a0: 72 6f 66 69 6c 65 5f 73 79 73 6c 6f 67 28 76 6f  rofile_syslog(vo
e0b0: 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63  id *aux, const c
e0c0: 68 61 72 20 2a 73 71 6c 2c 20 75 36 34 20 6e 73  har *sql, u64 ns
e0d0: 29 20 7b 0a 23 70 72 61 67 6d 61 20 75 6e 75 73  ) {.#pragma unus
e0e0: 65 64 28 61 75 78 29 0a 09 61 73 6c 5f 6c 6f 67  ed(aux)..asl_log
e0f0: 28 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 2c  (autolog_client,
e100: 20 4e 55 4c 4c 2c 20 41 53 4c 5f 4c 45 56 45 4c   NULL, ASL_LEVEL
e110: 5f 4e 4f 54 49 43 45 2c 20 22 51 75 65 72 79 3a  _NOTICE, "Query:
e120: 20 25 73 5c 6e 20 45 78 65 63 75 74 69 6f 6e 20   %s\n Execution 
e130: 54 69 6d 65 3a 20 25 6c 6c 75 20 6d 73 5c 6e 22  Time: %llu ms\n"
e140: 2c 20 73 71 6c 2c 20 6e 73 20 2f 20 31 30 30 30  , sql, ns / 1000
e150: 30 30 30 29 3b 0a 7d 0a 76 6f 69 64 20 5f 73 71  000);.}.void _sq
e160: 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 5f  lite_auto_trace_
e170: 73 79 73 6c 6f 67 28 76 6f 69 64 20 2a 61 75 78  syslog(void *aux
e180: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  , const char *sq
e190: 6c 29 20 7b 0a 09 61 73 6c 5f 6c 6f 67 28 61 75  l) {..asl_log(au
e1a0: 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 2c 20 4e 55  tolog_client, NU
e1b0: 4c 4c 2c 20 41 53 4c 5f 4c 45 56 45 4c 5f 4e 4f  LL, ASL_LEVEL_NO
e1c0: 54 49 43 45 2c 20 22 54 72 61 63 65 53 51 4c 28  TICE, "TraceSQL(
e1d0: 25 70 29 3a 20 25 73 5c 6e 22 2c 20 61 75 78 2c  %p): %s\n", aux,
e1e0: 20 73 71 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a   sql);.}.#endif.
e1f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
e200: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
e210: 70 61 72 73 65 20 62 6f 74 68 20 55 52 49 73 20  parse both URIs 
e220: 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65  and non-URI file
e230: 6e 61 6d 65 73 20 70 61 73 73 65 64 20 62 79 20  names passed by 
e240: 74 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41  the.** user to A
e250: 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c  PI functions sql
e260: 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73  ite3_open() or s
e270: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
e280: 2c 20 61 6e 64 20 66 6f 72 20 64 61 74 61 62 61  , and for databa
e290: 73 65 0a 2a 2a 20 55 52 49 73 20 73 70 65 63 69  se.** URIs speci
e2a0: 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  fied as part of 
e2b0: 41 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74  ATTACH statement
e2c0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  s..**.** The fir
e2d0: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  st argument to t
e2e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
e2f0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
e300: 56 46 53 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a  VFS to use (or.*
e310: 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e  * a NULL to sign
e320: 69 66 79 20 74 68 65 20 64 65 66 61 75 6c 74 20  ify the default 
e330: 56 46 53 29 20 69 66 20 74 68 65 20 55 52 49 20  VFS) if the URI 
e340: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
e350: 20 61 20 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20   a "vfs=xxx".** 
e360: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
e370: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
e380: 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  ment contains th
e390: 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52  e URI (or non-UR
e3a0: 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69  I filename).** i
e3b0: 74 73 65 6c 66 2e 20 57 68 65 6e 20 74 68 69 73  tself. When this
e3c0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
e3d0: 6c 65 64 20 74 68 65 20 2a 70 46 6c 61 67 73 20  led the *pFlags 
e3e0: 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20  variable should 
e3f0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64  contain.** the d
e400: 65 66 61 75 6c 74 20 66 6c 61 67 73 20 74 6f 20  efault flags to 
e410: 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  open the databas
e420: 65 20 68 61 6e 64 6c 65 20 77 69 74 68 2e 20 54  e handle with. T
e430: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
e440: 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61  in.** *pFlags ma
e450: 79 20 62 65 20 75 70 64 61 74 65 64 20 62 65 66  y be updated bef
e460: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 66  ore returning if
e470: 20 74 68 65 20 55 52 49 20 66 69 6c 65 6e 61 6d   the URI filenam
e480: 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22  e contains .** "
e490: 63 61 63 68 65 3d 78 78 78 22 20 6f 72 20 22 6d  cache=xxx" or "m
e4a0: 6f 64 65 3d 78 78 78 22 20 71 75 65 72 79 20 70  ode=xxx" query p
e4b0: 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  arameters..**.**
e4c0: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
e4d0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
e4e0: 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  urned. In this c
e4f0: 61 73 65 20 2a 70 70 56 66 73 20 69 73 20 73 65  ase *ppVfs is se
e500: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a  t to point to.**
e510: 20 74 68 65 20 56 46 53 20 74 68 61 74 20 73 68   the VFS that sh
e520: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20  ould be used to 
e530: 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  open the databas
e540: 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20  e file. *pzFile 
e550: 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69  is set to.** poi
e560: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
e570: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61  ontaining the na
e580: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  me of the file t
e590: 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73 20 74 68  o open. It is th
e5a0: 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
e5b0: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
e5c0: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
e5d0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72   call sqlite3_fr
e5e0: 65 65 28 29 20 74 6f 20 72 65 6c 65 61 73 65 0a  ee() to release.
e5f0: 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 2e 0a  ** this buffer..
e600: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
e610: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 61  r occurs, then a
e620: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
e630: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
e640: 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a  and *pzErrMsg.**
e650: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70   may be set to p
e660: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
e670: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45   containing an E
e680: 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
e690: 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67  error .** messag
e6a0: 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
e6b0: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
e6c0: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
e6d0: 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a  ntually release.
e6e0: 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62  ** this buffer b
e6f0: 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
e700: 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74  3_free()..*/.int
e710: 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
e720: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
e730: 7a 44 65 66 61 75 6c 74 56 66 73 2c 20 20 20 20  zDefaultVfs,    
e740: 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
e750: 65 20 69 66 20 6e 6f 20 22 76 66 73 3d 78 78 78  e if no "vfs=xxx
e760: 22 20 71 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a  " query option *
e770: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
e780: 7a 55 72 69 2c 20 20 20 20 20 20 20 20 20 20 20  zUri,           
e790: 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69      /* Nul-termi
e7a0: 6e 61 74 65 64 20 55 52 49 20 74 6f 20 70 61 72  nated URI to par
e7b0: 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  se */.  unsigned
e7c0: 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20   int *pFlags,   
e7d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
e7e0: 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58  T: SQLITE_OPEN_X
e7f0: 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71  XX flags */.  sq
e800: 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70 70 56 66  lite3_vfs **ppVf
e810: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
e820: 20 4f 55 54 3a 20 56 46 53 20 74 6f 20 75 73 65   OUT: VFS to use
e830: 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a   */ .  char **pz
e840: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
e850: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46         /* OUT: F
e860: 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e  ilename componen
e870: 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63 68  t of URI */.  ch
e880: 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20  ar **pzErrMsg   
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e8a0: 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73   OUT: Error mess
e8b0: 61 67 65 20 28 69 66 20 72 63 21 3d 53 51 4c 49  age (if rc!=SQLI
e8c0: 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69  TE_OK) */.){.  i
e8d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e8e0: 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  K;.  unsigned in
e8f0: 74 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67  t flags = *pFlag
e900: 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  s;.  const char 
e910: 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61 75 6c 74  *zVfs = zDefault
e920: 56 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  Vfs;.  char *zFi
e930: 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20  le;.  char c;.  
e940: 69 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c 69 74  int nUri = sqlit
e950: 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 72 69 29  e3Strlen30(zUri)
e960: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 7a  ;..  assert( *pz
e970: 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20  ErrMsg==0 );..  
e980: 69 66 28 20 28 28 66 6c 61 67 73 20 26 20 53 51  if( ((flags & SQ
e990: 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c  LITE_OPEN_URI) |
e9a0: 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  | sqlite3GlobalC
e9b0: 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 29 20  onfig.bOpenUri) 
e9c0: 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35 20 26  .   && nUri>=5 &
e9d0: 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20 22  & memcmp(zUri, "
e9e0: 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 0a 20  file:", 5)==0 . 
e9f0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   ){.    char *zO
ea00: 70 74 3b 0a 20 20 20 20 69 6e 74 20 65 53 74 61  pt;.    int eSta
ea10: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
ea20: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
ea30: 73 74 61 74 65 20 77 68 65 6e 20 70 61 72 73 69  state when parsi
ea40: 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e  ng URI */.    in
ea50: 74 20 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20  t iIn;          
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
ea70: 6e 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69  nput character i
ea80: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
ea90: 69 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  iOut = 0;       
eaa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
eab0: 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e  put character in
eac0: 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  dex */.    int n
ead0: 42 79 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20  Byte = nUri+2;  
eae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
eaf0: 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c  s of space to al
eb00: 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f  locate */..    /
eb10: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
eb20: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20  SQLITE_OPEN_URI 
eb30: 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 69  flag is set to i
eb40: 6e 64 69 63 61 74 65 20 74 6f 20 74 68 65 20 56  ndicate to the V
eb50: 46 53 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a  FS xOpen .    **
eb60: 20 6d 65 74 68 6f 64 20 74 68 61 74 20 74 68 65   method that the
eb70: 72 65 20 6d 61 79 20 62 65 20 65 78 74 72 61 20  re may be extra 
eb80: 70 61 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f  parameters follo
eb90: 77 69 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e 61  wing the file-na
eba0: 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67  me.  */.    flag
ebb0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
ebc0: 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69  _URI;..    for(i
ebd0: 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20  In=0; iIn<nUri; 
ebe0: 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20  iIn++) nByte += 
ebf0: 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29  (zUri[iIn]=='&')
ec00: 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71  ;.    zFile = sq
ec10: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79  lite3_malloc(nBy
ec20: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46  te);.    if( !zF
ec30: 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ile ) return SQL
ec40: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20  ITE_NOMEM;..    
ec50: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 73  /* Discard the s
ec60: 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72  cheme and author
ec70: 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20  ity segments of 
ec80: 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20  the URI. */.    
ec90: 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27  if( zUri[5]=='/'
eca0: 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27   && zUri[6]=='/'
ecb0: 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20   ){.      iIn = 
ecc0: 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  7;.      while( 
ecd0: 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72  zUri[iIn] && zUr
ece0: 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49  i[iIn]!='/' ) iI
ecf0: 6e 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  n++;..      if( 
ed00: 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d  iIn!=7 && (iIn!=
ed10: 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f  16 || memcmp("lo
ed20: 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b  calhost", &zUri[
ed30: 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20  7], 9)) ){.     
ed40: 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
ed50: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
ed60: 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74 68  invalid uri auth
ed70: 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20  ority: %.*s", . 
ed80: 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37             iIn-7
ed90: 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20  , &zUri[7]);.   
eda0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
edb0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
edc0: 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
edd0: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
ede0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 49 6e  }else{.      iIn
edf0: 20 3d 20 35 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 5;.    }..   
ee00: 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c   /* Copy the fil
ee10: 65 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75  ename and any qu
ee20: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 69  ery parameters i
ee30: 6e 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75  nto the zFile bu
ee40: 66 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65  ffer. .    ** De
ee50: 63 6f 64 65 20 25 48 48 20 65 73 63 61 70 65 20  code %HH escape 
ee60: 63 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20  codes along the 
ee70: 77 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  way. .    **.   
ee80: 20 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20   ** Within this 
ee90: 6c 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65  loop, variable e
eea0: 53 74 61 74 65 20 6d 61 79 20 62 65 20 73 65 74  State may be set
eeb0: 20 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64   to 0, 1 or 2, d
eec0: 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20  epending.    ** 
eed0: 6f 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20 63  on the parsing c
eee0: 6f 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f  ontext. As follo
eef0: 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ws:.    **.    *
ef00: 2a 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66  *   0: Parsing f
ef10: 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a  ile-name..    **
ef20: 20 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61     1: Parsing na
ef30: 6d 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20  me section of a 
ef40: 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79  name=value query
ef50: 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20   parameter..    
ef60: 2a 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20  **   2: Parsing 
ef70: 76 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66  value section of
ef80: 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75   a name=value qu
ef90: 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20  ery parameter.. 
efa0: 20 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65     */.    eState
efb0: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
efc0: 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29   (c = zUri[iIn])
efd0: 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b  !=0 && c!='#' ){
efe0: 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20  .      iIn++;.  
eff0: 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a      if( c=='%' .
f000: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
f010: 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69  3Isxdigit(zUri[i
f020: 49 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20  In]) .       && 
f030: 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
f040: 7a 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20  zUri[iIn+1]) .  
f050: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
f060: 6e 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69  nt octet = (sqli
f070: 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69  te3HexToInt(zUri
f080: 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a  [iIn++]) << 4);.
f090: 20 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d          octet +=
f0a0: 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74   sqlite3HexToInt
f0b0: 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a  (zUri[iIn++]);..
f0c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f0d0: 6f 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65  octet>=0 && octe
f0e0: 74 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20  t<256 );.       
f0f0: 20 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b   if( octet==0 ){
f100: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
f110: 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
f120: 65 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61 70  en when "%00" ap
f130: 70 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65  pears within the
f140: 20 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20   URI. In this.  
f150: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
f160: 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65  we ignore all te
f170: 78 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e  xt in the remain
f180: 64 65 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c  der of the path,
f190: 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20   name or.       
f1a0: 20 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72     ** value curr
f1b0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73  ently being pars
f1c0: 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68  ed. So ignore th
f1d0: 65 20 63 75 72 72 65 6e 74 20 63 68 61 72 61 63  e current charac
f1e0: 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ter.          **
f1f0: 20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65   and skip to the
f200: 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f   next "?", "=" o
f210: 72 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70  r "&", as approp
f220: 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20  riate. */.      
f230: 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
f240: 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26  zUri[iIn])!=0 &&
f250: 20 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20   c!='#' .       
f260: 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
f270: 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a  e!=0 || c!='?').
f280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
f290: 20 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28   (eState!=1 || (
f2a0: 63 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27  c!='=' && c!='&'
f2b0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
f2c0: 20 26 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c   && (eState!=2 |
f2d0: 7c 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20  | c!='&').      
f2e0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
f2f0: 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20     iIn++;.      
f300: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f310: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
f320: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20    }.        c = 
f330: 6f 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c  octet;.      }el
f340: 73 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31  se if( eState==1
f350: 20 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63   && (c=='&' || c
f360: 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20  =='=') ){.      
f370: 20 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74    if( zFile[iOut
f380: 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1]==0 ){.      
f390: 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20      /* An empty 
f3a0: 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e  option name. Ign
f3b0: 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20  ore this option 
f3c0: 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20  altogether. */. 
f3d0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
f3e0: 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72  zUri[iIn] && zUr
f3f0: 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a  i[iIn]!='#' && z
f400: 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20  Uri[iIn-1]!='&' 
f410: 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  ) iIn++;.       
f420: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
f430: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
f440: 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20  f( c=='&' ){.   
f450: 20 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75         zFile[iOu
f460: 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  t++] = '\0';.   
f470: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f480: 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 32        eState = 2
f490: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f4a0: 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
f4b0: 20 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74 61   }else if( (eSta
f4c0: 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29  te==0 && c=='?')
f4d0: 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20 26   || (eState==2 &
f4e0: 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20  & c=='&') ){.   
f4f0: 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
f500: 20 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b 0a      eState = 1;.
f510: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46        }.      zF
f520: 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b  ile[iOut++] = c;
f530: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
f540: 53 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65  State==1 ) zFile
f550: 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
f560: 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  .    zFile[iOut+
f570: 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  +] = '\0';.    z
f580: 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
f590: 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  \0';..    /* Che
f5a0: 63 6b 20 69 66 20 74 68 65 72 65 20 77 65 72 65  ck if there were
f5b0: 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70 65   any options spe
f5c0: 63 69 66 69 65 64 20 74 68 61 74 20 73 68 6f 75  cified that shou
f5d0: 6c 64 20 62 65 20 69 6e 74 65 72 70 72 65 74 65  ld be interprete
f5e0: 64 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e 20  d .    ** here. 
f5f0: 4f 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65  Options that are
f600: 20 69 6e 74 65 72 70 72 65 74 65 64 20 68 65 72   interpreted her
f610: 65 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22 20  e include "vfs" 
f620: 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a 20  and those that. 
f630: 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64     ** correspond
f640: 20 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20 6d   to flags that m
f650: 61 79 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  ay be passed to 
f660: 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  the sqlite3_open
f670: 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74  _v2().    ** met
f680: 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74  hod. */.    zOpt
f690: 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65   = &zFile[sqlite
f6a0: 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
f6b0: 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  +1];.    while( 
f6c0: 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  zOpt[0] ){.     
f6d0: 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69   int nOpt = sqli
f6e0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74  te3Strlen30(zOpt
f6f0: 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  );.      char *z
f700: 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74  Val = &zOpt[nOpt
f710: 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  +1];.      int n
f720: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Val = sqlite3Str
f730: 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20  len30(zVal);..  
f740: 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20      if( nOpt==3 
f750: 26 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c  && memcmp("vfs",
f760: 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a   zOpt, 3)==0 ){.
f770: 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 7a          zVfs = z
f780: 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Val;.      }else
f790: 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
f7a0: 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20   OpenMode {.    
f7b0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
f7c0: 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 69   *z;.          i
f7d0: 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  nt mode;.       
f7e0: 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20   } *aMode = 0;. 
f7f0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f         char *zMo
f800: 64 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  deType = 0;.    
f810: 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30      int mask = 0
f820: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 69  ;.        int li
f830: 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  mit = 0;..      
f840: 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26    if( nOpt==5 &&
f850: 20 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22 2c   memcmp("cache",
f860: 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a   zOpt, 5)==0 ){.
f870: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
f880: 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
f890: 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20   aCacheMode[] = 
f8a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  {.            { 
f8b0: 22 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49 54  "shared",  SQLIT
f8c0: 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
f8d0: 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  HE },.          
f8e0: 20 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20 53    { "private", S
f8f0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
f900: 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20  TECACHE },.     
f910: 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a         { 0, 0 }.
f920: 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20            };..  
f930: 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53          mask = S
f940: 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
f950: 44 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50  DCACHE|SQLITE_OP
f960: 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 3b  EN_PRIVATECACHE;
f970: 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65  .          aMode
f980: 20 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20   = aCacheMode;. 
f990: 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d           limit =
f9a0: 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20   mask;.         
f9b0: 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63 61   zModeType = "ca
f9c0: 63 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  che";.        }.
f9d0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74          if( nOpt
f9e0: 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d  ==4 && memcmp("m
f9f0: 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d  ode", zOpt, 4)==
fa00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
fa10: 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65  tatic struct Ope
fa20: 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b  nMode aOpenMode[
fa30: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
fa40: 20 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49 54    { "ro",  SQLIT
fa50: 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
fa60: 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
fa70: 20 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f   "rw",  SQLITE_O
fa80: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c  PEN_READWRITE },
fa90: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20   .            { 
faa0: 22 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50  "rwc", SQLITE_OP
fab0: 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
fac0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
fad0: 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
fae0: 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20   { 0, 0 }.      
faf0: 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20      };..        
fb00: 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f    mask = SQLITE_
fb10: 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
fb20: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
fb30: 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
fb40: 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 20 20  CREATE;.        
fb50: 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d    aMode = aOpenM
fb60: 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  ode;.          l
fb70: 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c  imit = mask & fl
fb80: 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ags;.          z
fb90: 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63 65  ModeType = "acce
fba0: 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ss";.        }..
fbb0: 20 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64          if( aMod
fbc0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
fbd0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
fbe0: 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  int mode = 0;.  
fbf0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
fc00: 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b   aMode[i].z; i++
fc10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
fc20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
fc30: 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20  Mode[i].z;.     
fc40: 20 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d         if( nVal=
fc50: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
fc60: 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  (z) && 0==memcmp
fc70: 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20  (zVal, z, nVal) 
fc80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
fc90: 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d   mode = aMode[i]
fca0: 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  .mode;.         
fcb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fcc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fcd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
fce0: 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20  if( mode==0 ){. 
fcf0: 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72             *pzEr
fd00: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
fd10: 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20  printf("no such 
fd20: 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d  %s mode: %s", zM
fd30: 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a  odeType, zVal);.
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
fd50: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
fd60: 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
fd70: 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
fd80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
fd90: 20 20 20 20 20 69 66 28 20 6d 6f 64 65 3e 6c 69       if( mode>li
fda0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mit ){.         
fdb0: 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
fdc0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
fdd0: 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f  %s mode not allo
fde0: 77 65 64 3a 20 25 73 22 2c 0a 20 20 20 20 20 20  wed: %s",.      
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe10: 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61    zModeType, zVa
fe20: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
fe30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d  rc = SQLITE_PERM
fe40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
fe50: 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
fe60: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
fe70: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20          flags = 
fe80: 28 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29 20  (flags & ~mask) 
fe90: 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  | mode;.        
fea0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
feb0: 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56   zOpt = &zVal[nV
fec0: 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  al+1];.    }..  
fed0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65  }else{.    zFile
fee0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
fef0: 63 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69  c(nUri+2);.    i
ff00: 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75  f( !zFile ) retu
ff10: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
ff20: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c  .    memcpy(zFil
ff30: 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a  e, zUri, nUri);.
ff40: 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20      zFile[nUri] 
ff50: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
ff60: 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27  e[nUri+1] = '\0'
ff70: 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20  ;.  }..  *ppVfs 
ff80: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
ff90: 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20  nd(zVfs);.  if( 
ffa0: 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20  *ppVfs==0 ){.   
ffb0: 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
ffc0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f  ite3_mprintf("no
ffd0: 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20   such vfs: %s", 
ffe0: 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d 20  zVfs);.    rc = 
fff0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
10000 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  }. parse_uri_out
10010 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
10020 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
10030 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 29  ite3_free(zFile)
10040 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b  ;.    zFile = 0;
10050 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d  .  }.  *pFlags =
10060 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c   flags;.  *pzFil
10070 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74  e = zFile;.  ret
10080 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64  urn rc;.}..#if d
10090 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
100a0 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49 4c  ABLE_AUTO_PROFIL
100b0 45 29 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54  E).#define SQLIT
100c0 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54  E_AUTOLOGGING_ST
100d0 44 45 52 52 20 31 0a 23 64 65 66 69 6e 65 20 53  DERR 1.#define S
100e0 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e  QLITE_AUTOLOGGIN
100f0 47 5f 53 59 53 4c 4f 47 20 32 0a 73 74 61 74 69  G_SYSLOG 2.stati
10100 63 20 76 6f 69 64 20 65 6e 61 62 6c 65 41 75 74  c void enableAut
10110 6f 4c 6f 67 67 69 6e 67 28 0a 20 20 73 71 6c 69  oLogging(.  sqli
10120 74 65 33 20 2a 64 62 0a 29 7b 0a 20 20 63 68 61  te3 *db.){.  cha
10130 72 20 2a 65 6e 76 70 72 6f 66 69 6c 65 20 3d 20  r *envprofile = 
10140 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 41  getenv("SQLITE_A
10150 55 54 4f 5f 50 52 4f 46 49 4c 45 22 29 3b 0a 20  UTO_PROFILE");. 
10160 20 0a 20 20 69 66 28 20 65 6e 76 70 72 6f 66 69   .  if( envprofi
10170 6c 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  le!=NULL ){.    
10180 69 6e 74 20 77 68 65 72 65 20 3d 20 30 3b 0a 20  int where = 0;. 
10190 20 20 20 69 66 28 20 21 73 74 72 6e 63 61 73 65     if( !strncase
101a0 63 6d 70 28 22 31 22 2c 20 65 6e 76 70 72 6f 66  cmp("1", envprof
101b0 69 6c 65 2c 20 31 29 20 29 7b 0a 20 20 20 20 20  ile, 1) ){.     
101c0 20 69 66 28 20 69 73 61 74 74 79 28 53 54 44 45   if( isatty(STDE
101d0 52 52 5f 46 49 4c 45 4e 4f 29 20 29 7b 0a 20 20  RR_FILENO) ){.  
101e0 20 20 20 20 20 20 77 68 65 72 65 20 3d 20 53 51        where = SQ
101f0 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47  LITE_AUTOLOGGING
10200 5f 53 54 44 45 52 52 3b 0a 20 20 20 20 20 20 7d  _STDERR;.      }
10210 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68  else{.        wh
10220 65 72 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54  ere = SQLITE_AUT
10230 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 3b  OLOGGING_SYSLOG;
10240 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
10250 6c 73 65 20 69 66 28 20 21 73 74 72 6e 63 61 73  lse if( !strncas
10260 65 63 6d 70 28 22 73 74 64 65 72 72 22 2c 20 65  ecmp("stderr", e
10270 6e 76 70 72 6f 66 69 6c 65 2c 20 36 29 20 29 7b  nvprofile, 6) ){
10280 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d 20 53  .      where = S
10290 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e  QLITE_AUTOLOGGIN
102a0 47 5f 53 54 44 45 52 52 3b 0a 20 20 20 20 7d 20  G_STDERR;.    } 
102b0 65 6c 73 65 20 69 66 28 20 21 73 74 72 6e 63 61  else if( !strnca
102c0 73 65 63 6d 70 28 22 73 79 73 6c 6f 67 22 2c 20  secmp("syslog", 
102d0 65 6e 76 70 72 6f 66 69 6c 65 2c 20 36 29 20 29  envprofile, 6) )
102e0 7b 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d 20  {.      where = 
102f0 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
10300 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20 20 20 20 7d  NG_SYSLOG;.    }
10310 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 3d 3d  .    if( where==
10320 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
10330 4e 47 5f 53 54 44 45 52 52 20 29 7b 0a 20 20 20  NG_STDERR ){.   
10340 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69     sqlite3_profi
10350 6c 65 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61  le(db, _sqlite_a
10360 75 74 6f 5f 70 72 6f 66 69 6c 65 2c 20 64 62 29  uto_profile, db)
10370 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
10380 77 68 65 72 65 3d 3d 53 51 4c 49 54 45 5f 41 55  where==SQLITE_AU
10390 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47  TOLOGGING_SYSLOG
103a0 20 29 7b 0a 20 20 20 20 20 20 5f 6f 70 65 6e 5f   ){.      _open_
103b0 61 73 6c 5f 6c 6f 67 28 29 3b 0a 20 20 20 20 20  asl_log();.     
103c0 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65   sqlite3_profile
103d0 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75 74  (db, _sqlite_aut
103e0 6f 5f 70 72 6f 66 69 6c 65 5f 73 79 73 6c 6f 67  o_profile_syslog
103f0 2c 20 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , db);.    }.  }
10400 0a 20 20 63 68 61 72 20 2a 65 6e 76 74 72 61 63  .  char *envtrac
10410 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  e = getenv("SQLI
10420 54 45 5f 41 55 54 4f 5f 54 52 41 43 45 22 29 3b  TE_AUTO_TRACE");
10430 0a 20 20 69 66 28 20 65 6e 76 74 72 61 63 65 21  .  if( envtrace!
10440 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74  =NULL ){.    int
10450 20 77 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20   where = 0;.    
10460 69 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70  if( !strncasecmp
10470 28 22 31 22 2c 20 65 6e 76 74 72 61 63 65 2c 20  ("1", envtrace, 
10480 31 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  1) ){.      if( 
10490 69 73 61 74 74 79 28 53 54 44 45 52 52 5f 46 49  isatty(STDERR_FI
104a0 4c 45 4e 4f 29 20 29 7b 0a 20 20 20 20 20 20 20  LENO) ){.       
104b0 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45 5f   where = SQLITE_
104c0 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44 45  AUTOLOGGING_STDE
104d0 52 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  RR;.      }else{
104e0 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 20 3d  .        where =
104f0 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47   SQLITE_AUTOLOGG
10500 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20 20 20 20  ING_SYSLOG;.    
10510 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69    }.    } else i
10520 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70 28  f( !strncasecmp(
10530 22 73 74 64 65 72 72 22 2c 20 65 6e 76 74 72 61  "stderr", envtra
10540 63 65 2c 20 36 29 20 29 7b 0a 20 20 20 20 20 20  ce, 6) ){.      
10550 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45 5f 41  where = SQLITE_A
10560 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44 45 52  UTOLOGGING_STDER
10570 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  R;.    } else if
10580 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70 28 22  ( !strncasecmp("
10590 73 79 73 6c 6f 67 22 2c 20 65 6e 76 74 72 61 63  syslog", envtrac
105a0 65 2c 20 36 29 20 29 7b 0a 20 20 20 20 20 20 77  e, 6) ){.      w
105b0 68 65 72 65 20 3d 20 53 51 4c 49 54 45 5f 41 55  here = SQLITE_AU
105c0 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47  TOLOGGING_SYSLOG
105d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
105e0 77 68 65 72 65 3d 3d 53 51 4c 49 54 45 5f 41 55  where==SQLITE_AU
105f0 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44 45 52 52  TOLOGGING_STDERR
10600 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10610 33 5f 74 72 61 63 65 28 64 62 2c 20 5f 73 71 6c  3_trace(db, _sql
10620 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 2c 20  ite_auto_trace, 
10630 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  db);.    }else i
10640 66 28 20 77 68 65 72 65 3d 3d 53 51 4c 49 54 45  f( where==SQLITE
10650 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53  _AUTOLOGGING_SYS
10660 4c 4f 47 20 29 7b 0a 20 20 20 20 20 20 5f 6f 70  LOG ){.      _op
10670 65 6e 5f 61 73 6c 5f 6c 6f 67 28 29 3b 0a 20 20  en_asl_log();.  
10680 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63      sqlite3_trac
10690 65 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75  e(db, _sqlite_au
106a0 74 6f 5f 74 72 61 63 65 5f 73 79 73 6c 6f 67 2c  to_trace_syslog,
106b0 20 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   db);.    }.  }.
106c0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
106d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
106e0 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70  s the work of op
106f0 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ening a database
10700 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a   on behalf of.**
10710 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20   sqlite3_open() 
10720 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  and sqlite3_open
10730 31 36 28 29 2e 20 54 68 65 20 64 61 74 61 62 61  16(). The databa
10740 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69  se filename "zFi
10750 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20  lename"  .** is 
10760 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a  UTF-8 encoded..*
10770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
10780 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e  nDatabase(.  con
10790 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
107a0 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20  me, /* Database 
107b0 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65  filename UTF-8 e
107c0 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  ncoded */.  sqli
107d0 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20  te3 **ppDb,     
107e0 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
107f0 6e 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ned database han
10800 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  dle */.  unsigne
10810 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20  d int flags,    
10820 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66  /* Operational f
10830 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
10840 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20  char *zVfs      
10850 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
10860 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b  VFS to use */.){
10870 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10890 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f     /* Store allo
108a0 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65 72  cated handle her
108b0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108d0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
108e0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
108f0 73 54 68 72 65 61 64 73 61 66 65 3b 20 20 20 20  sThreadsafe;    
10900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
10910 75 65 20 66 6f 72 20 74 68 72 65 61 64 73 61 66  ue for threadsaf
10920 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  e connections */
10930 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d  .  char *zOpen =
10940 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10950 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61     /* Filename a
10960 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
10970 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20 2a  to BtreeOpen() *
10980 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  /.  char *zErrMs
10990 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
109a0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73      /* Error mes
109b0 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  sage from sqlite
109c0 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a  3ParseUri() */..
109d0 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
109e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
109f0 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
10a00 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
10a10 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
10a20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
10a30 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61  dif..  /* Only a
10a40 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f  llow sensible co
10a50 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69  mbinations of bi
10a60 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20  ts in the flags 
10a70 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a  argument.  .  **
10a80 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   Throw an error 
10a90 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65  if any non-sense
10aa0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20   combination is 
10ab0 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a  used.  If we.  *
10ac0 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69  * do not block i
10ad0 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69  llegal combinati
10ae0 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75  ons here, it cou
10af0 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20  ld trigger.  ** 
10b00 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
10b10 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61  nts in deeper la
10b20 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20  yers.  Sensible 
10b30 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a  combinations.  *
10b40 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  * are:.  **.  **
10b50 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    1:  SQLITE_OPE
10b60 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20  N_READONLY.  ** 
10b70 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   2:  SQLITE_OPEN
10b80 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20  _READWRITE.  ** 
10b90 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   6:  SQLITE_OPEN
10ba0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
10bb0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
10bc0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53    */.  assert( S
10bd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
10be0 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a  NLY  == 0x01 );.
10bf0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
10c00 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
10c10 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73 73  == 0x02 );.  ass
10c20 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
10c30 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30 78  _CREATE    == 0x
10c40 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  04 );.  testcase
10c50 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
10c60 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45 41  ==0x02 ); /* REA
10c70 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63  DONLY */.  testc
10c80 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
10c90 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20  7))==0x04 ); /* 
10ca0 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20 74  READWRITE */.  t
10cb0 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
10cc0 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29 3b  ags&7))==0x40 );
10cd0 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c 20   /* READWRITE | 
10ce0 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28 20  CREATE */.  if( 
10cf0 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 20  ((1<<(flags&7)) 
10d00 26 20 30 78 34 36 29 3d 3d 30 20 29 20 72 65 74  & 0x46)==0 ) ret
10d10 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
10d20 45 5f 42 4b 50 54 3b 0a 0a 20 20 69 66 28 20 73  E_BKPT;..  if( s
10d30 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
10d40 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30  ig.bCoreMutex==0
10d50 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64   ){.    isThread
10d60 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  safe = 0;.  }els
10d70 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
10d80 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
10d90 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  X ){.    isThrea
10da0 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
10db0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
10dc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
10dd0 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
10de0 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20 20  readsafe = 1;.  
10df0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68 72  }else{.    isThr
10e00 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74 65  eadsafe = sqlite
10e10 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
10e20 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20  ullMutex;.  }.  
10e30 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
10e40 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
10e50 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61 67  ACHE ){.    flag
10e60 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
10e70 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  N_SHAREDCACHE;. 
10e80 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
10e90 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
10ea0 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
10eb0 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  d ){.    flags |
10ec0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  = SQLITE_OPEN_SH
10ed0 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
10ee0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d    /* Remove harm
10ef0 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68  ful bits from th
10f00 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
10f10 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  r.  **.  ** The 
10f20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
10f30 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  TEX and SQLITE_O
10f40 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c  PEN_FULLMUTEX fl
10f50 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64 65  ags were.  ** de
10f60 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65 20  alt with in the 
10f70 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62 6c  previous code bl
10f80 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74 68  ock.  Besides th
10f90 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20  ese, the only.  
10fa0 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20 66  ** valid input f
10fb0 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33  lags for sqlite3
10fc0 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20 53  _open_v2() are S
10fd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
10fe0 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  NLY,.  ** SQLITE
10ff0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 2c  _OPEN_READWRITE,
11000 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
11010 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ATE, SQLITE_OPEN
11020 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20 20  _SHAREDCACHE,.  
11030 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  ** SQLITE_OPEN_P
11040 52 49 56 41 54 45 43 41 43 48 45 2c 20 61 6e 64  RIVATECACHE, and
11050 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20 62   some reserved b
11060 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d  its.  Silently m
11070 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c  ask.  ** off all
11080 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20   other flags..  
11090 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e  */.  flags &=  ~
110a0 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  ( SQLITE_OPEN_DE
110b0 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20  LETEONCLOSE |.  
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
110d0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
110e0 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  VE |.           
110f0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
11100 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20  MAIN_DB |.      
11110 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
11120 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a  OPEN_TEMP_DB | .
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
11140 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
11150 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20 20  IENT_DB | .     
11160 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
11170 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
11180 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  AL | .          
11190 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
111a0 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20  _TEMP_JOURNAL | 
111b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
111c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
111d0 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
111e0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
111f0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
11200 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20 20  NAL |.          
11210 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
11220 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20 20  _NOMUTEX |.     
11230 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
11240 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
11250 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
11260 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
11270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  .             );
11280 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
11290 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61 20  the sqlite data 
112a0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 64  structure */.  d
112b0 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  b = sqlite3Mallo
112c0 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73 71  cZero( sizeof(sq
112d0 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28 20  lite3) );.  if( 
112e0 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65  db==0 ) goto ope
112f0 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69  ndb_out;.  if( i
11300 73 54 68 72 65 61 64 73 61 66 65 20 29 7b 0a 20  sThreadsafe ){. 
11310 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73     db->mutex = s
11320 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
11330 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
11340 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69 66  CURSIVE);.    if
11350 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  ( db->mutex==0 )
11360 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
11370 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20 20  free(db);.      
11380 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f  db = 0;.      go
11390 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
113a0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
113b0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
113c0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
113d0 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b  >errMask = 0xff;
113e0 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a  .  db->nDb = 2;.
113f0 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
11400 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b  LITE_MAGIC_BUSY;
11410 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d  .  db->aDb = db-
11420 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20 20 61  >aDbStatic;..  a
11430 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62  ssert( sizeof(db
11440 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f  ->aLimit)==sizeo
11450 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b  f(aHardLimit) );
11460 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c  .  memcpy(db->aL
11470 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74  imit, aHardLimit
11480 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69  , sizeof(db->aLi
11490 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 75 74  mit));.  db->aut
114a0 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64  oCommit = 1;.  d
114b0 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d  b->nextAutovac =
114c0 20 2d 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50   -1;.  db->nextP
114d0 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64  agesize = 0;.  d
114e0 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
114f0 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
11500 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e   | SQLITE_AutoIn
11510 64 65 78 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61  dex | SQLITE_Ena
11520 62 6c 65 54 72 69 67 67 65 72 0a 23 69 66 20 53  bleTrigger.#if S
11530 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 4b  QLITE_DEFAULT_CK
11540 50 54 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20  PTFULLFSYNC.    
11550 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
11560 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53  QLITE_CkptFullFS
11570 79 6e 63 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  ync.#endif.#if S
11580 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
11590 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20  LE_FORMAT<4.    
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
115b0 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65  QLITE_LegacyFile
115c0 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  Fmt.#endif.#ifde
115d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
115e0 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11600 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74  | SQLITE_LoadExt
11610 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69  ension.#endif.#i
11620 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
11630 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49 47 47  _RECURSIVE_TRIGG
11640 45 52 53 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERS.            
11650 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65       | SQLITE_Re
11660 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66  cTriggers.#endif
11670 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
11680 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45  ITE_DEFAULT_FORE
11690 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c  IGN_KEYS) && SQL
116a0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45  ITE_DEFAULT_FORE
116b0 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20  IGN_KEYS.       
116c0 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
116d0 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23  TE_ForeignKeys.#
116e0 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20  endif.      ;.  
116f0 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
11700 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a  &db->aCollSeq);.
11710 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11720 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
11730 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
11740 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  it(&db->aModule)
11750 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
11760 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  dd the default c
11770 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
11780 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59  e BINARY. BINARY
11790 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20   works for both 
117a0 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55  UTF-8.  ** and U
117b0 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20  TF-16, so add a 
117c0 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68  version for each
117d0 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e   to avoid any un
117e0 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63  necessary.  ** c
117f0 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20  onversions. The 
11800 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20  only error that 
11810 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69  can occur here i
11820 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  s a malloc() fai
11830 6c 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63 72 65  lure..  */.  cre
11840 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
11850 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
11860 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f  E_UTF8, 0, binCo
11870 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
11880 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
11890 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
118a0 54 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62  TE_UTF16BE, 0, b
118b0 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
118c0 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
118d0 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20  n(db, "BINARY", 
118e0 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20  SQLITE_UTF16LE, 
118f0 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  0, binCollFunc, 
11900 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
11910 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d  ation(db, "RTRIM
11920 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
11930 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c  (void*)1, binCol
11940 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28  lFunc, 0);.  if(
11950 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11960 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
11970 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  endb_out;.  }.  
11980 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20  db->pDfltColl = 
11990 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
119a0 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54  eq(db, SQLITE_UT
119b0 46 38 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29  F8, "BINARY", 0)
119c0 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
119d0 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a  pDfltColl!=0 );.
119e0 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61  .  /* Also add a
119f0 20 55 54 46 2d 38 20 63 61 73 65 2d 69 6e 73 65   UTF-8 case-inse
11a00 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f  nsitive collatio
11a10 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20  n sequence. */. 
11a20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
11a30 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53  (db, "NOCASE", S
11a40 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e  QLITE_UTF8, 0, n
11a50 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75  ocaseCollatingFu
11a60 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 50 61  nc, 0);..  /* Pa
11a70 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  rse the filename
11a80 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20 2a  /URI argument. *
11a90 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67  /.  db->openFlag
11aa0 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63 20  s = flags;.  rc 
11ab0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72  = sqlite3ParseUr
11ac0 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  i(zVfs, zFilenam
11ad0 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e  e, &flags, &db->
11ae0 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a  pVfs, &zOpen, &z
11af0 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72  ErrMsg);.  if( r
11b00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11b10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11b20 54 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d  TE_NOMEM ) db->m
11b30 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
11b40 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
11b50 72 28 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73  r(db, rc, zErrMs
11b60 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a 45  g ? "%s" : 0, zE
11b70 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
11b80 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
11b90 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  );.    goto open
11ba0 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  db_out;.  }..  /
11bb0 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65  * Open the backe
11bc0 6e 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76  nd database driv
11bd0 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  er */.  rc = sql
11be0 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62  ite3BtreeOpen(db
11bf0 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64  ->pVfs, zOpen, d
11c00 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  b, &db->aDb[0].p
11c10 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  Bt, 0,.         
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
11c30 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50  lags | SQLITE_OP
11c40 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69  EN_MAIN_DB);.  i
11c50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11c60 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
11c70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
11c80 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  EM ){.      rc =
11c90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11ca0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
11cb0 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
11cc0 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  ;.    goto opend
11cd0 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d  b_out;.  }.  db-
11ce0 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20  >aDb[0].pSchema 
11cf0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47  = sqlite3SchemaG
11d00 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30  et(db, db->aDb[0
11d10 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44  ].pBt);.  db->aD
11d20 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73  b[1].pSchema = s
11d30 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
11d40 64 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54  db, 0);...  /* T
11d50 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74  he default safet
11d60 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20  y_level for the 
11d70 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
11d80 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65   'full'; for the
11d90 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62   temp.  ** datab
11da0 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27  ase it is 'NONE'
11db0 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74  . This matches t
11dc0 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64  he pager layer d
11dd0 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a  efaults.  .  */.
11de0 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61    db->aDb[0].zNa
11df0 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64  me = "main";.  d
11e00 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79  b->aDb[0].safety
11e10 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62  _level = 3;.  db
11e20 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d  ->aDb[1].zName =
11e30 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61   "temp";.  db->a
11e40 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[1].safety_lev
11e50 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d  el = 1;..  db->m
11e60 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
11e70 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20  GIC_OPEN;.  if( 
11e80 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11e90 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
11ea0 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ndb_out;.  }..  
11eb0 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20  /* Register all 
11ec0 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f  built-in functio
11ed0 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61  ns, but do not a
11ee0 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74  ttempt to read t
11ef0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
11f00 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69   schema yet. Thi
11f10 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74  s is delayed unt
11f20 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  il the first tim
11f30 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  e the database. 
11f40 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e   ** is accessed.
11f50 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
11f60 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
11f70 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  OK, 0);.  sqlite
11f80 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e  3RegisterBuiltin
11f90 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a  Functions(db);..
11fa0 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61    /* Load automa
11fb0 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d  tic extensions -
11fc0 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74   extensions that
11fd0 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73   have been regis
11fe0 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67  tered.  ** using
11ff0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74   the sqlite3_aut
12000 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e  omatic_extension
12010 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72  () API..  */.  r
12020 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
12030 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72  ode(db);.  if( r
12040 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12050 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c      sqlite3AutoL
12060 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62  oadExtensions(db
12070 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
12080 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
12090 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
120a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
120b0 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
120c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
120d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
120e0 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d  _FTS1.  if( !db-
120f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
12100 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
12110 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28  sqlite3Fts1Init(
12120 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72  sqlite3*);.    r
12130 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49  c = sqlite3Fts1I
12140 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
12150 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
12160 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20  TE_ENABLE_FTS2. 
12170 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
12180 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
12190 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65  LITE_OK ){.    e
121a0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
121b0 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65  3Fts2Init(sqlite
121c0 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
121d0 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64 62  lite3Fts2Init(db
121e0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
121f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
12200 42 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20 21  BLE_FTS3.  if( !
12210 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12220 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
12230 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
12240 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62  lite3Fts3Init(db
12250 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
12260 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
12270 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64  BLE_ICU.  if( !d
12280 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12290 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
122a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
122b0 69 74 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b  ite3IcuInit(db);
122c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
122d0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
122e0 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21 64  E_RTREE.  if( !d
122f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12300 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
12310 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
12320 74 65 33 52 74 72 65 65 49 6e 69 74 28 64 62 29  te3RtreeInit(db)
12330 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
12340 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
12350 20 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 2d   rc, 0);..  /* -
12360 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  DSQLITE_DEFAULT_
12370 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d  LOCKING_MODE=1 m
12380 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20 74  akes EXCLUSIVE t
12390 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
123a0 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d  ng.  ** mode.  -
123b0 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  DSQLITE_DEFAULT_
123c0 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d  LOCKING_MODE=0 m
123d0 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64  ake NORMAL the d
123e0 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20  efault locking. 
123f0 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67   ** mode.  Doing
12400 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20   nothing at all 
12410 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41  also makes NORMA
12420 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20  L the default.. 
12430 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
12440 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
12450 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c  G_MODE.  db->dfl
12460 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49  tLockMode = SQLI
12470 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
12480 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74  NG_MODE;.  sqlit
12490 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
124a0 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  de(sqlite3BtreeP
124b0 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  ager(db->aDb[0].
124c0 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20  pBt),.          
124d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124e0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
124f0 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65  OCKING_MODE);.#e
12500 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c  ndif..  /* Enabl
12510 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d  e the lookaside-
12520 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
12530 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61   */.  setupLooka
12540 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69  side(db, 0, sqli
12550 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
12560 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20  szLookaside,.   
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12580 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
12590 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73  alConfig.nLookas
125a0 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  ide);..  sqlite3
125b0 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
125c0 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  int(db, SQLITE_D
125d0 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43  EFAULT_WAL_AUTOC
125e0 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65  HECKPOINT);..ope
125f0 6e 64 62 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ndb_out:.  sqlit
12600 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b 0a  e3_free(zOpen);.
12610 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20    if( db ){.    
12620 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65  assert( db->mute
12630 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61 64  x!=0 || isThread
12640 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  safe==0 || sqlit
12650 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
12660 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a  FullMutex==0 );.
12670 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12680 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
12690 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  x);.  }.  rc = s
126a0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
126b0 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  b);.  assert( db
126c0 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  !=0 || rc==SQLIT
126d0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28  E_NOMEM );.  if(
126e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
126f0 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  M ){.    sqlite3
12700 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20  _close(db);.    
12710 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  db = 0;.  }else 
12720 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12730 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  K ){.    db->mag
12740 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
12750 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 23 69 66 20  C_SICK;.  }.#if 
12760 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
12770 5f 29 20 26 26 20 45 4e 41 42 4c 45 5f 46 4f 52  _) && ENABLE_FOR
12780 43 45 5f 57 41 4c 0a 20 20 69 66 28 20 64 62 20  CE_WAL.  if( db 
12790 26 26 20 21 72 63 20 29 7b 0a 20 20 20 20 69 66  && !rc ){.    if
127a0 20 28 28 30 20 3d 3d 20 61 63 63 65 73 73 28 22   ((0 == access("
127b0 2f 76 61 72 2f 64 62 2f 65 6e 61 62 6c 65 46 6f  /var/db/enableFo
127c0 72 63 65 57 41 4c 22 2c 20 52 5f 4f 4b 29 29 29  rceWAL", R_OK)))
127d0 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   {.#ifdef SQLITE
127e0 5f 44 45 42 55 47 0a 20 20 20 20 20 20 66 70 72  _DEBUG.      fpr
127f0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51  intf(stderr, "SQ
12800 4c 69 74 65 20 57 41 4c 20 6a 6f 75 72 6e 61 6c  Lite WAL journal
12810 5f 6d 6f 64 65 20 45 4e 41 42 4c 45 44 20 62 79  _mode ENABLED by
12820 20 64 65 66 61 75 6c 74 2e 5c 6e 22 29 3b 0a 23   default.\n");.#
12830 65 6e 64 69 66 0a 20 20 20 20 20 20 0a 20 20 20  endif.      .   
12840 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
12850 64 62 2c 20 22 70 72 61 67 6d 61 20 6a 6f 75 72  db, "pragma jour
12860 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 2c 20 4e  nal_mode=wal", N
12870 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
12880 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
12890 44 45 42 55 47 0a 2f 2f 20 20 20 20 7d 20 65 6c  DEBUG.//    } el
128a0 73 65 20 7b 0a 2f 2f 20 20 20 20 20 20 66 70 72  se {.//      fpr
128b0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51  intf(stderr, "SQ
128c0 4c 69 74 65 20 57 41 4c 20 6a 6f 75 72 6e 61 6c  Lite WAL journal
128d0 5f 6d 6f 64 65 20 4e 4f 54 20 45 4e 41 42 4c 45  _mode NOT ENABLE
128e0 44 20 62 79 20 64 65 66 61 75 6c 74 2e 5c 6e 22  D by default.\n"
128f0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
12900 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
12910 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
12920 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49 4c  ABLE_AUTO_PROFIL
12930 45 29 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  E).  if( db && !
12940 72 63 20 29 7b 0a 20 20 20 20 65 6e 61 62 6c 65  rc ){.    enable
12950 41 75 74 6f 4c 6f 67 67 69 6e 67 28 64 62 29 3b  AutoLogging(db);
12960 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
12970 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65 66  pDb = db;.#ifdef
12980 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
12990 51 4c 52 52 0a 20 20 53 52 52 65 63 4f 70 65 6e  QLRR.  SRRecOpen
129a0 28 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  (db, zFilename, 
129b0 66 6c 61 67 73 29 3b 0a 23 65 6e 64 69 66 0a 20  flags);.#endif. 
129c0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
129d0 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d  piExit(0, rc);.}
129e0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
129f0 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ew database hand
12a00 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
12a10 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74  e3_open(.  const
12a20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
12a30 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  , .  sqlite3 **p
12a40 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e  pDb .){.  return
12a50 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46   openDatabase(zF
12a60 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20  ilename, ppDb,. 
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
12a90 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
12aa0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
12ab0 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
12ac0 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f  e3_open_v2(.  co
12ad0 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61  nst char *filena
12ae0 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73  me,   /* Databas
12af0 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d  e filename (UTF-
12b00 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  8) */.  sqlite3 
12b10 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 20  **ppDb,         
12b20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64  /* OUT: SQLite d
12b30 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
12b40 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
12b50 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a        /* Flags *
12b60 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
12b70 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e  zVfs        /* N
12b80 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c  ame of VFS modul
12b90 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20  e to use */.){. 
12ba0 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61   return openData
12bb0 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70  base(filename, p
12bc0 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  pDb, (unsigned i
12bd0 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b  nt)flags, zVfs);
12be0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
12bf0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
12c00 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
12c10 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
12c20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
12c30 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76  pen16(.  const v
12c40 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  oid *zFilename, 
12c50 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
12c60 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  b.){.  char cons
12c70 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20  t *zFilename8;  
12c80 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e   /* zFilename en
12c90 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69  coded in UTF-8 i
12ca0 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36  nstead of UTF-16
12cb0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
12cc0 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
12cd0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
12ce0 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 61  zFilename );.  a
12cf0 73 73 65 72 74 28 20 70 70 44 62 20 29 3b 0a 20  ssert( ppDb );. 
12d00 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e   *ppDb = 0;.#ifn
12d10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12d20 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20  AUTOINIT.  rc = 
12d30 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
12d40 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
12d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
12d60 69 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  if.  pVal = sqli
12d70 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
12d80 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
12d90 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a  tStr(pVal, -1, z
12da0 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45  Filename, SQLITE
12db0 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51  _UTF16NATIVE, SQ
12dc0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
12dd0 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c  zFilename8 = sql
12de0 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
12df0 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  al, SQLITE_UTF8)
12e00 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
12e10 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  e8 ){.    rc = o
12e20 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c  penDatabase(zFil
12e30 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20  ename8, ppDb,.  
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
12e60 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
12e70 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
12e80 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
12e90 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c  *ppDb || rc==SQL
12ea0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
12eb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12ec0 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f 70  OK && !DbHasProp
12ed0 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44  erty(*ppDb, 0, D
12ee0 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20  B_SchemaLoaded) 
12ef0 29 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a 70 70  ){.      ENC(*pp
12f00 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  Db) = SQLITE_UTF
12f10 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a  16NATIVE;.    }.
12f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
12f30 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
12f40 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c    }.  sqlite3Val
12f50 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20  ueFree(pVal);.. 
12f60 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
12f70 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d  piExit(0, rc);.}
12f80 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12f90 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
12fa0 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
12fb0 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
12fc0 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
12fd0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
12fe0 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
12ff0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
13000 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ation(.  sqlite3
13010 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
13020 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
13030 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
13040 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
13050 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
13060 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
13070 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
13080 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
13090 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
130a0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
130b0 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
130c0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
130d0 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
130e0 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  ion(db, zName, (
130f0 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  u8)enc, pCtx, xC
13100 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 72 63  ompare, 0);.  rc
13110 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
13120 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
13130 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
13140 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
13150 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13160 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
13170 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
13180 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
13190 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
131a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
131b0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
131c0 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a  n_v2(.  sqlite3*
131d0 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68   db, .  const ch
131e0 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e  ar *zName, .  in
131f0 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
13200 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
13210 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
13220 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
13230 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20  ,const void*),. 
13240 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69   void(*xDel)(voi
13250 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  d*).){.  int rc;
13260 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13270 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
13280 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
13290 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
132a0 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43  ;.  rc = createC
132b0 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
132c0 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74  me, (u8)enc, pCt
132d0 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65  x, xCompare, xDe
132e0 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  l);.  rc = sqlit
132f0 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
13300 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
13310 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
13320 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
13330 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
13340 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
13350 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
13360 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
13370 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
13380 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
13390 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
133a0 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
133b0 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33  ion16(.  sqlite3
133c0 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76  * db, .  const v
133d0 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  oid *zName,.  in
133e0 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
133f0 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
13400 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
13410 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
13420 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
13430 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13440 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
13450 4e 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65 33  Name8;.  sqlite3
13460 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
13470 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
13480 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
13490 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38  iled );.  zName8
134a0 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74   = sqlite3Utf16t
134b0 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31  o8(db, zName, -1
134c0 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
134d0 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61  TIVE);.  if( zNa
134e0 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
134f0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
13500 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29  db, zName8, (u8)
13510 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
13520 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  are, 0);.    sql
13530 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
13540 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63  Name8);.  }.  rc
13550 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
13560 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
13570 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
13580 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
13590 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
135a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
135b0 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
135c0 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c  * Register a col
135d0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
135e0 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b  factory callback
135f0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
13600 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
13610 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65   Replace any pre
13620 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65  viously installe
13630 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
13640 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f  ence factory..*/
13650 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  .int sqlite3_col
13660 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20  lation_needed(. 
13670 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
13680 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64   void *pCollNeed
13690 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a  edArg, .  void(*
136a0 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69  xCollNeeded)(voi
136b0 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20  d*,sqlite3*,int 
136c0 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63  eTextRep,const c
136d0 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74  har*).){.  sqlit
136e0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
136f0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
13700 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78  >xCollNeeded = x
13710 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62  CollNeeded;.  db
13720 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20  ->xCollNeeded16 
13730 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c  = 0;.  db->pColl
13740 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c  NeededArg = pCol
13750 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71  lNeededArg;.  sq
13760 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
13770 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
13780 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13790 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
137a0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
137b0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
137c0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
137d0 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62  ce factory callb
137e0 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74  ack with the dat
137f0 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
13800 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20  db. Replace any 
13810 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61  previously insta
13820 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  lled collation s
13830 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e  equence factory.
13840 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
13850 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
13860 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
13870 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c  b, .  void *pCol
13880 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76  lNeededArg, .  v
13890 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64  oid(*xCollNeeded
138a0 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65  16)(void*,sqlite
138b0 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c  3*,int eTextRep,
138c0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
138d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
138e0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
138f0 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
13900 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78  ded = 0;.  db->x
13910 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78  CollNeeded16 = x
13920 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20  CollNeeded16;.  
13930 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41  db->pCollNeededA
13940 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64  rg = pCollNeeded
13950 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
13960 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
13970 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
13980 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
13990 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
139a0 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66  IT_UTF16 */..#if
139b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
139c0 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a  _DEPRECATED./*.*
139d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
139e0 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72  is now an anachr
139f0 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74  onism. It used t
13a00 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63  o be used to rec
13a10 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d  over from a.** m
13a20 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c  alloc() failure,
13a30 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20   but SQLite now 
13a40 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61  does this automa
13a50 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  tically..*/.int 
13a60 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72  sqlite3_global_r
13a70 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20  ecover(void){.  
13a80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13a90 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
13aa0 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68  * Test to see wh
13ab0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
13ac0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
13ad0 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63  tion is in autoc
13ae0 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20  ommit.** mode.  
13af0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  Return TRUE if i
13b00 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69  t is and FALSE i
13b10 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d  f not.  Autocomm
13b20 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a  it mode is on.**
13b30 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75   by default.  Au
13b40 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61  tocommit is disa
13b50 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e 20  bled by a BEGIN 
13b60 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65  statement and re
13b70 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68  enabled.** by th
13b80 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72  e next COMMIT or
13b90 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a   ROLLBACK..**.**
13ba0 2a 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20 41 4e  ***** THIS IS AN
13bb0 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 41 50   EXPERIMENTAL AP
13bc0 49 20 41 4e 44 20 49 53 20 53 55 42 4a 45 43 54  I AND IS SUBJECT
13bd0 20 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a 2a 2a   TO CHANGE *****
13be0 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
13bf0 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
13c00 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
13c10 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43  return db->autoC
13c20 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ommit;.}../*.** 
13c30 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
13c40 75 74 69 6e 65 73 20 61 72 65 20 73 75 62 74 69  utines are subti
13c50 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74 61  tutes for consta
13c60 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  nts SQLITE_CORRU
13c70 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49  PT,.** SQLITE_MI
13c80 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  SUSE, SQLITE_CAN
13c90 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49 4f  TOPEN, SQLITE_IO
13ca0 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c 79  ERR and possibly
13cb0 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20   other error.** 
13cc0 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 79  constants.  They
13cd0 20 73 65 72 76 65 72 20 74 77 6f 20 70 75 72 70   server two purp
13ce0 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  oses:.**.**   1.
13cf0 20 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e    Serve as a con
13d00 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f  venient place to
13d10 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
13d20 74 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a  t in a debugger.
13d30 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65  **       to dete
13d40 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20  ct when version 
13d50 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73  error conditions
13d60 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20   occurs..**.**  
13d70 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69   2.  Invoke sqli
13d80 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f  te3_log() to pro
13d90 76 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20  vide the source 
13da0 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68  code location wh
13db0 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c  ere.**       a l
13dc0 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69  ow-level error i
13dd0 73 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64  s first detected
13de0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13df0 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74  CorruptError(int
13e00 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
13e10 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
13e20 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
13e30 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
13e40 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  og(SQLITE_CORRUP
13e50 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
13e60 20 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75   "database corru
13e70 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25 64  ption at line %d
13e80 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20   of [%.10s]",.  
13e90 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
13ea0 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73  no, 20+sqlite3_s
13eb0 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65  ourceid());.  re
13ec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
13ed0 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  UPT;.}.int sqlit
13ee0 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e  e3MisuseError(in
13ef0 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
13f00 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
13f10 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
13f20 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
13f30 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55 53  log(SQLITE_MISUS
13f40 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
13f50 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69 6e    "misuse at lin
13f60 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
13f70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13f80 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
13f90 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
13fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13fb0 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73 71  MISUSE;.}.int sq
13fc0 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72 72  lite3CantopenErr
13fd0 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
13fe0 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
13ff0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
14000 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c  xLog!=0 );.  sql
14010 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
14020 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20 20  CANTOPEN, .     
14030 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
14040 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c 69   open file at li
14050 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d  ne %d of [%.10s]
14060 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
14070 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69   lineno, 20+sqli
14080 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b  te3_sourceid());
14090 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
140a0 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23  _CANTOPEN;.}...#
140b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
140c0 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
140d0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f  .** This is a co
140e0 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e  nvenience routin
140f0 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
14100 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61  e that all threa
14110 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61  d-specific.** da
14120 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65  ta for this thre
14130 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c  ad has been deal
14140 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  located..**.** S
14150 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  QLite no longer 
14160 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63  uses thread-spec
14170 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69  ific data so thi
14180 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77  s routine is now
14190 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74   a.** no-op.  It
141a0 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72   is retained for
141b0 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
141c0 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f  atibility..*/.vo
141d0 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  id sqlite3_threa
141e0 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b  d_cleanup(void){
141f0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
14200 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66   Return meta inf
14210 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
14220 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e   specific column
14230 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74   of a database t
14240 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  able..** See com
14250 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e  ment in sqlite3.
14260 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20  h (sqlite.h.in) 
14270 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
14280 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
14290 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
142a0 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65 33  DATA.int sqlite3
142b0 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
142c0 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65  tadata(.  sqlite
142d0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
142e0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
142f0 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ion handle */.  
14300 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
14310 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44  ame,        /* D
14320 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20  atabase name or 
14330 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  NULL */.  const 
14340 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65  char *zTableName
14350 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e  ,     /* Table n
14360 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ame */.  const c
14370 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  har *zColumnName
14380 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  ,    /* Column n
14390 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ame */.  char co
143a0 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65  nst **pzDataType
143b0 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20  ,    /* OUTPUT: 
143c0 44 65 63 6c 61 72 65 64 20 64 61 74 61 20 74 79  Declared data ty
143d0 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  pe */.  char con
143e0 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20  st **pzCollSeq, 
143f0 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43      /* OUTPUT: C
14400 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
14410 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  e name */.  int 
14420 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20  *pNotNull,      
14430 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
14440 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e  T: True if NOT N
14450 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  ULL constraint e
14460 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  xists */.  int *
14470 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20  pPrimaryKey,    
14480 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
14490 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e  : True if column
144a0 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20   part of PK */. 
144b0 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20   int *pAutoinc  
144c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
144d0 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
144e0 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69  column is auto-i
144f0 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  ncrement */.){. 
14500 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
14510 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
14520 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
14530 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20  .  Column *pCol 
14540 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  = 0;.  int iCol;
14550 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ..  char const *
14560 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20  zDataType = 0;. 
14570 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
14580 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74  llSeq = 0;.  int
14590 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20   notnull = 0;.  
145a0 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d  int primarykey =
145b0 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e   0;.  int autoin
145c0 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73  c = 0;..  /* Ens
145d0 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
145e0 20 73 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e   schema has been
145f0 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c   loaded */.  sql
14600 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14610 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
14620 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14630 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20  All(db);.  rc = 
14640 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20  sqlite3Init(db, 
14650 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
14660 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
14670 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72  {.    goto error
14680 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
14690 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
146a0 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a   in question */.
146b0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
146c0 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54  FindTable(db, zT
146d0 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d  ableName, zDbNam
146e0 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20  e);.  if( !pTab 
146f0 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
14700 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30   ){.    pTab = 0
14710 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72  ;.    goto error
14720 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
14730 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Find the column 
14740 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69  for which info i
14750 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  s requested */. 
14760 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52 6f   if( sqlite3IsRo
14770 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29  wid(zColumnName)
14780 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
14790 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
147a0 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
147b0 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61       pCol = &pTa
147c0 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
147d0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
147e0 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
147f0 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
14800 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43  Col++){.      pC
14810 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
14820 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66  [iCol];.      if
14830 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  ( 0==sqlite3StrI
14840 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c  Cmp(pCol->zName,
14850 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b   zColumnName) ){
14860 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
14870 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14880 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62    if( iCol==pTab
14890 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
148a0 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
148b0 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
148c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
148d0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
148e0 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d  ock stores the m
148f0 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
14900 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
14910 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68  urned.  ** to th
14920 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61  e caller in loca
14930 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74  l variables zDat
14940 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c  aType, zCollSeq,
14950 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72   notnull, primar
14960 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75  ykey.  ** and au
14970 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70  toinc. At this p
14980 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65 20 74  oint there are t
14990 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  wo possibilities
149a0 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20  :.  ** .  **    
149b0 20 31 2e 20 54 68 65 20 73 70 65 63 69 66 69 65   1. The specifie
149c0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61  d column name wa
149d0 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20  s rowid", "oid" 
149e0 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20  or "_rowid_" .  
149f0 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74 68  **        and th
14a00 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63  ere is no explic
14a10 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50  itly declared IP
14a20 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a  K column. .  **.
14a30 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20    **     2. The 
14a40 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76  table is not a v
14a50 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75  iew and the colu
14a60 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69  mn name identifi
14a70 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20  ed an .  **     
14a80 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65     explicitly de
14a90 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43  clared column. C
14aa0 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  opy meta informa
14ab0 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e  tion from *pCol.
14ac0 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f  .  */ .  if( pCo
14ad0 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79  l ){.    zDataTy
14ae0 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  pe = pCol->zType
14af0 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d  ;.    zCollSeq =
14b00 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20   pCol->zColl;.  
14b10 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c    notnull = pCol
14b20 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20  ->notNull!=0;.  
14b30 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20    primarykey  = 
14b40 70 43 6f 6c 2d 3e 69 73 50 72 69 6d 4b 65 79 21  pCol->isPrimKey!
14b50 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20  =0;.    autoinc 
14b60 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69  = pTab->iPKey==i
14b70 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61  Col && (pTab->ta
14b80 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
14b90 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20  increment)!=0;. 
14ba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74   }else{.    zDat
14bb0 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  aType = "INTEGER
14bc0 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65  ";.    primaryke
14bd0 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  y = 1;.  }.  if(
14be0 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20   !zCollSeq ){.  
14bf0 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22 42 49    zCollSeq = "BI
14c00 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f  NARY";.  }..erro
14c10 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  r_out:.  sqlite3
14c20 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
14c30 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72  );..  /* Whether
14c40 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61   the function ca
14c50 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72 20  ll succeeded or 
14c60 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20  failed, set the 
14c70 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
14c80 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76  s.  ** to whatev
14c90 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63  er their local c
14ca0 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74  ounterparts cont
14cb0 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ain. If an error
14cc0 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a   did occur,.  **
14cd0 20 74 68 69 73 20 68 61 73 20 74 68 65 20 65 66   this has the ef
14ce0 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20  fect of zeroing 
14cf0 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d  all output param
14d00 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eters..  */.  if
14d10 28 20 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a  ( pzDataType ) *
14d20 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61  pzDataType = zDa
14d30 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a  taType;.  if( pz
14d40 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c  CollSeq ) *pzCol
14d50 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b  lSeq = zCollSeq;
14d60 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20  .  if( pNotNull 
14d70 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f  ) *pNotNull = no
14d80 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72  tnull;.  if( pPr
14d90 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69  imaryKey ) *pPri
14da0 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72  maryKey = primar
14db0 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74  ykey;.  if( pAut
14dc0 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63  oinc ) *pAutoinc
14dd0 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69   = autoinc;..  i
14de0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63  f( SQLITE_OK==rc
14df0 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
14e00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
14e10 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b, zErrMsg);.   
14e20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74   zErrMsg = sqlit
14e30 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e  e3MPrintf(db, "n
14e40 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c  o such table col
14e50 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61  umn: %s.%s", zTa
14e60 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  bleName,.       
14e70 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20   zColumnName);. 
14e80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
14e90 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  RROR;.  }.  sqli
14ea0 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c  te3Error(db, rc,
14eb0 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a 30   (zErrMsg?"%s":0
14ec0 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  ), zErrMsg);.  s
14ed0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14ee0 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63 20   zErrMsg);.  rc 
14ef0 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
14f00 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
14f10 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14f20 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
14f30 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
14f40 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  f../*.** Sleep f
14f50 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
14f60 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
14f70 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
14f80 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ept..*/.int sqli
14f90 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73  te3_sleep(int ms
14fa0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
14fb0 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63   *pVfs;.  int rc
14fc0 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74  ;.  pVfs = sqlit
14fd0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
14fe0 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20    if( pVfs==0 ) 
14ff0 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
15000 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f  This function wo
15010 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f  rks in milliseco
15020 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64  nds, but the und
15030 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28  erlying OsSleep(
15040 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73  ) .  ** API uses
15050 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48   microseconds. H
15060 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73 2e  ence the 1000's.
15070 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71  .  */.  rc = (sq
15080 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66  lite3OsSleep(pVf
15090 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30  s, 1000*ms)/1000
150a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
150b0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  }../*.** Enable 
150c0 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 65  or disable the e
150d0 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63  xtended result c
150e0 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  odes..*/.int sql
150f0 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65  ite3_extended_re
15100 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74  sult_codes(sqlit
15110 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66  e3 *db, int onof
15120 66 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  f){.  sqlite3_mu
15130 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
15140 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d  tex);.  db->errM
15150 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78  ask = onoff ? 0x
15160 66 66 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b  ffffffff : 0xff;
15170 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
15180 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
15190 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
151a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
151b0 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65  Invoke the xFile
151c0 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f  Control method o
151d0 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  n a particular d
151e0 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
151f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
15200 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  trol(sqlite3 *db
15210 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
15220 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76  bName, int op, v
15230 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e  oid *pArg){.  in
15240 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  t rc = SQLITE_ER
15250 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70 42  ROR;.  Btree *pB
15260 74 72 65 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33  tree;..  sqlite3
15270 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
15280 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74 72 65  >mutex);.  pBtre
15290 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  e = sqlite3DbNam
152a0 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
152b0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 42 74  Name);.  if( pBt
152c0 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ree ){.    Pager
152d0 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71   *pPager;.    sq
152e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a  lite3_file *fd;.
152f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
15300 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
15310 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
15320 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
15330 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72  tree);.    asser
15340 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
15350 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65 33      fd = sqlite3
15360 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72  PagerFile(pPager
15370 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66  );.    assert( f
15380 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  d!=0 );.    if( 
15390 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
153a0 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b  _FILE_POINTER ){
153b0 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33  .      *(sqlite3
153c0 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66  _file**)pArg = f
153d0 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  d;.      rc = SQ
153e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
153f0 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68  se if( fd->pMeth
15400 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ods ){.      rc 
15410 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
15420 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70  ontrol(fd, op, p
15430 41 72 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Arg);.#ifndef SQ
15440 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
15450 20 20 20 20 69 66 28 20 28 6f 70 3d 3d 53 51 4c      if( (op==SQL
15460 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45  ITE_FCNTL_LAST_E
15470 52 52 4e 4f 29 26 26 28 2a 28 69 6e 74 20 2a 29  RRNO)&&(*(int *)
15480 70 41 72 67 3d 3d 30 29 20 29 7b 0a 20 20 20 20  pArg==0) ){.    
15490 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
154a0 20 2a 70 57 61 6c 46 64 20 3d 20 73 71 6c 69 74   *pWalFd = sqlit
154b0 65 33 50 61 67 65 72 57 61 6c 46 69 6c 65 28 70  e3PagerWalFile(p
154c0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
154d0 69 66 28 20 70 57 61 6c 46 64 26 26 28 70 57 61  if( pWalFd&&(pWa
154e0 6c 46 64 2d 3e 70 4d 65 74 68 6f 64 73 29 20 29  lFd->pMethods) )
154f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
15500 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
15510 6e 74 72 6f 6c 28 70 57 61 6c 46 64 2c 20 6f 70  ntrol(pWalFd, op
15520 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20  , pArg);.       
15530 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
15540 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
15550 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
15560 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20  OTFOUND;.    }. 
15570 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
15580 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
15590 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
155a0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
155b0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
155c0 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74     .}../*.** Int
155d0 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65  erface to the te
155e0 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a  sting logic..*/.
155f0 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74  int sqlite3_test
15600 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c  _control(int op,
15610 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20   ...){.  int rc 
15620 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
15630 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
15640 5f 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74 20  _TEST.  va_list 
15650 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
15660 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
15670 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a  ( op ){..    /*.
15680 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20      ** Save the 
15690 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
156a0 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a   the PRNG..    *
156b0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
156c0 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
156d0 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SAVE: {.      sq
156e0 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61  lite3PrngSaveSta
156f0 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
15700 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
15710 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20  .    ** Restore 
15720 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
15730 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73   PRNG to the las
15740 74 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73  t state saved us
15750 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f  ing.    ** PRNG_
15760 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53  SAVE.  If PRNG_S
15770 41 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65  AVE has never be
15780 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64  fore been called
15790 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
157a0 69 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b  is verb acts lik
157b0 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20  e PRNG_RESET..  
157c0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
157d0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
157e0 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20  NG_RESTORE: {.  
157f0 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52      sqlite3PrngR
15800 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20  estoreState();. 
15810 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15820 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
15830 20 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20   Reset the PRNG 
15840 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e  back to its unin
15850 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e  itialized state.
15860 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a    The next call.
15870 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
15880 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77  3_randomness() w
15890 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50  ill reseed the P
158a0 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67  RNG using a sing
158b0 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  le call.    ** t
158c0 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73  o the xRandomnes
158d0 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  s method of the 
158e0 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20  default VFS..   
158f0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
15900 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
15910 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20  G_RESET: {.     
15920 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 65   sqlite3PrngRese
15930 74 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  tState();.      
15940 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
15950 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
15960 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
15970 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73  l(BITVEC_TEST, s
15980 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20  ize, program).  
15990 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20    **.    ** Run 
159a0 61 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61  a test against a
159b0 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f   Bitvec object o
159c0 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f  f size.  The pro
159d0 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20  gram argument.  
159e0 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79    ** is an array
159f0 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61   of integers tha
15a00 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65  t defines the te
15a10 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f  st.  Return -1 o
15a20 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72  n a.    ** memor
15a30 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
15a40 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73  or, 0 on success
15a50 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  , or non-zero fo
15a60 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  r an error..    
15a70 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74  ** See the sqlit
15a80 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
15a90 65 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  est() for additi
15aa0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
15ab0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
15ac0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
15ad0 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b  L_BITVEC_TEST: {
15ae0 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  .      int sz = 
15af0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
15b00 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f  .      int *aPro
15b10 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  g = va_arg(ap, i
15b20 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt*);.      rc =
15b30 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
15b40 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50  iltinTest(sz, aP
15b50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rog);.      brea
15b60 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
15b70 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
15b80 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45  _test_control(BE
15b90 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b  NIGN_MALLOC_HOOK
15ba0 53 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29  S, xBegin, xEnd)
15bb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
15bc0 65 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f  egister hooks to
15bd0 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74   call to indicat
15be0 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29  e which malloc()
15bf0 20 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a   failures .    *
15c00 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20  * are benign..  
15c10 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
15c20 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45  LITE_TESTCTRL_BE
15c30 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b  NIGN_MALLOC_HOOK
15c40 53 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64  S: {.      typed
15c50 65 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66  ef void (*void_f
15c60 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a  unction)(void);.
15c70 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74        void_funct
15c80 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e  ion xBenignBegin
15c90 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e  ;.      void_fun
15ca0 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64  ction xBenignEnd
15cb0 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42  ;.      xBenignB
15cc0 65 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70  egin = va_arg(ap
15cd0 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  , void_function)
15ce0 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45  ;.      xBenignE
15cf0 6e 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  nd = va_arg(ap, 
15d00 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a  void_function);.
15d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e        sqlite3Ben
15d20 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78  ignMallocHooks(x
15d30 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65  BenignBegin, xBe
15d40 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20  nignEnd);.      
15d50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
15d60 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
15d70 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
15d80 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
15d90 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  L_PENDING_BYTE, 
15da0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a  unsigned int X).
15db0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65      **.    ** Se
15dc0 74 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  t the PENDING by
15dd0 74 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  te to the value 
15de0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c  in the argument,
15df0 20 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20   if X>0..    ** 
15e00 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
15e10 69 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e  if X==0.  Return
15e20 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
15e30 65 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20  e pending byte. 
15e40 20 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73     ** as it exis
15e50 74 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73  ting before this
15e60 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
15e70 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  led..    **.    
15e80 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43  ** IMPORTANT:  C
15e90 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44  hanging the PEND
15ea0 49 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78  ING byte from 0x
15eb0 34 30 30 30 30 30 30 30 20 72 65 73 75 6c 74 73  40000000 results
15ec0 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e   in.    ** an in
15ed0 63 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62  compatible datab
15ee0 61 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ase file format.
15ef0 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50    Changing the P
15f00 45 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20  ENDING byte.    
15f10 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74  ** while any dat
15f20 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
15f30 20 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73   is open results
15f40 20 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e   in undefined an
15f50 64 0a 20 20 20 20 2a 2a 20 64 69 6c 65 74 65 72  d.    ** dileter
15f60 69 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20  ious behavior.. 
15f70 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
15f80 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
15f90 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20  ENDING_BYTE: {. 
15fa0 20 20 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e       rc = PENDIN
15fb0 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20  G_BYTE;.#ifndef 
15fc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
15fd0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
15fe0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77  unsigned int new
15ff0 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Val = va_arg(ap,
16000 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a   unsigned int);.
16010 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 56          if( newV
16020 61 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64  al ) sqlite3Pend
16030 69 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c  ingByte = newVal
16040 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
16050 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16060 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
16070 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
16080 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
16090 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c  TESTCTRL_ASSERT,
160a0 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
160b0 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f     ** This actio
160c0 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e  n provides a run
160d0 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65  -time test to se
160e0 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
160f0 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29  .    ** assert()
16100 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20   was enabled at 
16110 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49  compile-time.  I
16120 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 20  f X is true and 
16130 61 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20  assert().    ** 
16140 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
16150 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
16160 65 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 58  e is true.  If X
16170 20 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20   is true and.   
16180 20 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73 20   ** assert() is 
16190 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
161a0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
161b0 69 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69  is zero.  If X i
161c0 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61  s.    ** false a
161d0 6e 64 20 61 73 73 65 72 74 28 29 20 69 73 20 65  nd assert() is e
161e0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
161f0 20 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73   assertion fires
16200 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
16210 70 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20  process aborts. 
16220 20 49 66 20 58 20 69 73 20 66 61 6c 73 65 20 61   If X is false a
16230 6e 64 20 61 73 73 65 72 74 28 29 20 69 73 20 64  nd assert() is d
16240 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
16250 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  e.    ** return 
16260 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20  value is zero.. 
16270 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
16280 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
16290 53 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76  SSERT: {.      v
162a0 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20  olatile int x = 
162b0 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
162c0 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   (x = va_arg(ap,
162d0 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  int))!=0 );.    
162e0 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20    rc = x;.      
162f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20  break;.    }... 
16300 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
16310 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
16320 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
16330 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58  RL_ALWAYS, int X
16340 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
16350 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
16360 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
16370 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20  test to see how 
16380 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20  the ALWAYS and. 
16390 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72     ** NEVER macr
163a0 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20  os were defined 
163b0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
163c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
163d0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
163e0 69 73 20 41 4c 57 41 59 53 28 58 29 2e 20 20 0a  is ALWAYS(X).  .
163f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
16400 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65  e recommended te
16410 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20  st is X==2.  If 
16420 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
16430 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e   is 2, that mean
16440 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28  s.    ** ALWAYS(
16450 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72  ) and NEVER() ar
16460 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73  e both no-op pas
16470 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73  s-through macros
16480 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 20  , which is the. 
16490 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65     ** default se
164a0 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72  tting.  If the r
164b0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31  eturn value is 1
164c0 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20  , then ALWAYS() 
164d0 69 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a  is either.    **
164e0 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74   hard-coded to t
164f0 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61  rue or else it a
16500 73 73 65 72 74 73 20 69 66 20 69 74 73 20 61 72  sserts if its ar
16510 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e  gument is false.
16520 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73  .    ** The firs
16530 74 20 62 65 68 61 76 69 6f 72 20 28 68 61 72 64  t behavior (hard
16540 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20  -coded to true) 
16550 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
16560 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
16570 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
16580 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
16590 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64   is disabled and
165a0 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20   the second.    
165b0 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73 73  ** behavior (ass
165c0 65 72 74 20 69 66 20 74 68 65 20 61 72 67 75 6d  ert if the argum
165d0 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20  ent to ALWAYS() 
165e0 69 73 20 66 61 6c 73 65 29 20 69 73 20 74 68 65  is false) is the
165f0 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
16600 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
16610 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
16620 74 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  t assert() is en
16630 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  abled..    **.  
16640 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d    ** The run-tim
16650 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65  e test procedure
16660 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65   might look some
16670 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a  thing like this:
16680 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
16690 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65    if( sqlite3_te
166a0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
166b0 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
166c0 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20  S, 2)==2 ){.    
166d0 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59  **      // ALWAY
166e0 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20  S() and NEVER() 
166f0 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74  are no-op pass-t
16700 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20  hrough macros.  
16710 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66    **    }else if
16720 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  ( sqlite3_test_c
16730 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
16740 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31  STCTRL_ASSERT, 1
16750 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  ) ){.    **     
16760 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73   // ALWAYS(x) as
16770 73 65 72 74 73 20 74 68 61 74 20 78 20 69 73 20  serts that x is 
16780 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61  true. NEVER(x) a
16790 73 73 65 72 74 73 20 78 20 69 73 20 66 61 6c 73  sserts x is fals
167a0 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c  e..    **    }el
167b0 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  se{.    **      
167c0 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73 20  // ALWAYS(x) is 
167d0 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e  a constant 1.  N
167e0 45 56 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e  EVER(x) is a con
167f0 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20  stant 0..    ** 
16800 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20     }.    */.    
16810 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
16820 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20  CTRL_ALWAYS: {. 
16830 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
16840 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
16850 20 20 20 72 63 20 3d 20 41 4c 57 41 59 53 28 78     rc = ALWAYS(x
16860 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16870 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
16880 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
16890 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
168a0 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73 71  CTRL_RESERVE, sq
168b0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
168c0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
168d0 53 65 74 20 74 68 65 20 6e 52 65 73 65 72 76 65  Set the nReserve
168e0 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74   size to N for t
168f0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
16900 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
16910 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69  .    ** connecti
16920 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20  on db..    */.  
16930 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
16940 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20  STCTRL_RESERVE: 
16950 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
16960 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  *db = va_arg(ap,
16970 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20   sqlite3*);.    
16980 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67    int x = va_arg
16990 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
169a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
169b0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
169c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
169d0 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 64 62  eeSetPageSize(db
169e0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c  ->aDb[0].pBt, 0,
169f0 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   x, 0);.      sq
16a00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
16a10 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
16a20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16a30 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65  ..    /*  sqlite
16a40 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
16a50 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
16a60 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71  PTIMIZATIONS, sq
16a70 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
16a80 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
16a90 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
16aa0 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69  e various optimi
16ab0 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73 74  zations for test
16ac0 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54  ing purposes.  T
16ad0 68 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d  he .    ** argum
16ae0 65 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d 61  ent N is a bitma
16af0 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69  sk of optimizati
16b00 6f 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ons to be disabl
16b10 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a  ed.  For normal.
16b20 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
16b30 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 20   N should be 0. 
16b40 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
16b50 74 20 61 20 74 65 73 74 20 70 72 6f 67 72 61 6d  t a test program
16b60 20 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20 2a   (like the.    *
16b70 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73 74  * SQL Logic Test
16b80 20 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f 64   or SLT test mod
16b90 75 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68 65  ule) can run the
16ba0 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70   same SQL multip
16bb0 6c 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20  le times.    ** 
16bc0 77 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70 74  with various opt
16bd0 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61 62  imizations disab
16be0 6c 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68  led to verify th
16bf0 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  at the same answ
16c00 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62 74  er.    ** is obt
16c10 61 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20 63  ained in every c
16c20 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
16c30 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
16c40 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
16c50 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NS: {.      sqli
16c60 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67  te3 *db = va_arg
16c70 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a  (ap, sqlite3*);.
16c80 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61        int x = va
16c90 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
16ca0 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20      db->flags = 
16cb0 28 78 20 26 20 53 51 4c 49 54 45 5f 4f 70 74 4d  (x & SQLITE_OptM
16cc0 61 73 6b 29 20 7c 20 28 64 62 2d 3e 66 6c 61 67  ask) | (db->flag
16cd0 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 70 74 4d  s & ~SQLITE_OptM
16ce0 61 73 6b 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ask);.      brea
16cf0 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  k;.    }..#ifdef
16d00 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
16d10 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  D.    /* sqlite3
16d20 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
16d30 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53  LITE_TESTCTRL_IS
16d40 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74 20 63  KEYWORD, const c
16d50 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20 20 20  har *zWord).    
16d60 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a 57 6f  **.    ** If zWo
16d70 72 64 20 69 73 20 61 20 6b 65 79 77 6f 72 64 20  rd is a keyword 
16d80 72 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 74 68  recognized by th
16d90 65 20 70 61 72 73 65 72 2c 20 74 68 65 6e 20 72  e parser, then r
16da0 65 74 75 72 6e 20 74 68 65 0a 20 20 20 20 2a 2a  eturn the.    **
16db0 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 77 6f   number of keywo
16dc0 72 64 73 2e 20 20 4f 72 20 69 66 20 7a 57 6f 72  rds.  Or if zWor
16dd0 64 20 69 73 20 6e 6f 74 20 61 20 6b 65 79 77 6f  d is not a keywo
16de0 72 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  rd, return 0..  
16df0 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54 68 69    ** .    ** Thi
16e00 73 20 74 65 73 74 20 66 65 61 74 75 72 65 20 69  s test feature i
16e10 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
16e20 20 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   in the amalgama
16e30 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20 20 2a  tion since.    *
16e40 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 5f 4b  * the SQLITE_N_K
16e50 45 59 57 4f 52 44 20 6d 61 63 72 6f 20 69 73 20  EYWORD macro is 
16e60 6e 6f 74 20 64 65 66 69 6e 65 64 20 69 6e 20 74  not defined in t
16e70 68 69 73 20 66 69 6c 65 20 69 66 20 53 51 4c 69  his file if SQLi
16e80 74 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 75 69  te.    ** is bui
16e90 6c 74 20 75 73 69 6e 67 20 73 65 70 61 72 61 74  lt using separat
16ea0 65 20 73 6f 75 72 63 65 20 66 69 6c 65 73 2e 0a  e source files..
16eb0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
16ec0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
16ed0 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20 20 20  ISKEYWORD: {.   
16ee0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
16ef0 57 6f 72 64 20 3d 20 76 61 5f 61 72 67 28 61 70  Word = va_arg(ap
16f00 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
16f10 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
16f20 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 57  lite3Strlen30(zW
16f30 6f 72 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ord);.      rc =
16f40 20 28 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64   (sqlite3Keyword
16f50 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72 64 2c  Code((u8*)zWord,
16f60 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20 53 51   n)!=TK_ID) ? SQ
16f70 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a  LITE_N_KEYWORD :
16f80 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
16f90 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a  .    }.#endif ..
16fa0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74      /* sqlite3_t
16fb0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
16fc0 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41  TE_TESTCTRL_SCRA
16fd0 54 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26  TCHMALLOC, sz, &
16fe0 70 4e 65 77 2c 20 70 46 72 65 65 29 3b 0a 20 20  pNew, pFree);.  
16ff0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73    **.    ** Pass
17000 20 70 46 72 65 65 20 69 6e 74 6f 20 73 71 6c 69   pFree into sqli
17010 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 29  te3ScratchFree()
17020 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e  . .    ** If sz>
17030 30 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  0 then allocate 
17040 61 20 73 63 72 61 74 63 68 20 62 75 66 66 65 72  a scratch buffer
17050 20 69 6e 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20   into pNew.  .  
17060 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
17070 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43  LITE_TESTCTRL_SC
17080 52 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  RATCHMALLOC: {. 
17090 20 20 20 20 20 76 6f 69 64 20 2a 70 46 72 65 65       void *pFree
170a0 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20  , **ppNew;.     
170b0 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 73   int sz;.      s
170c0 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
170d0 6e 74 29 3b 0a 20 20 20 20 20 20 70 70 4e 65 77  nt);.      ppNew
170e0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
170f0 69 64 2a 2a 29 3b 0a 20 20 20 20 20 20 70 46 72  id**);.      pFr
17100 65 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ee = va_arg(ap, 
17110 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 66  void*);.      if
17120 28 20 73 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20  ( sz ) *ppNew = 
17130 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
17140 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20  lloc(sz);.      
17150 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
17160 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20  ee(pFree);.     
17170 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
17180 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
17190 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
171a0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
171b0 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e  ALTIME_FAULT, in
171c0 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a  t onoff);.    **
171d0 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d  .    ** If param
171e0 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f  eter onoff is no
171f0 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72  n-zero, configur
17200 65 20 74 68 65 20 77 72 61 70 70 65 72 73 20 73  e the wrappers s
17210 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a  o that all.    *
17220 2a 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * subsequent cal
17230 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28  ls to localtime(
17240 29 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20 66  ) and variants f
17250 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73  ail. If onoff is
17260 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e   zero,.    ** un
17270 64 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e  do this setting.
17280 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
17290 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
172a0 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
172b0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
172c0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c  3GlobalConfig.bL
172d0 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20  ocaltimeFault = 
172e0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
172f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17300 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64    }..#if defined
17310 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
17320 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 20  REE_EXPLAIN).   
17330 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
17340 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
17350 45 5f 54 45 53 54 43 54 52 4c 5f 45 58 50 4c 41  E_TESTCTRL_EXPLA
17360 49 4e 5f 53 54 4d 54 2c 0a 20 20 20 20 2a 2a 20  IN_STMT,.    ** 
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17380 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
17390 74 6d 74 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  tmt*,const char*
173a0 2a 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  *);.    **.    *
173b0 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69  * If compiled wi
173c0 74 68 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  th SQLITE_ENABLE
173d0 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 2c 20 65  _TREE_EXPLAIN, e
173e0 61 63 68 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ach sqlite3_stmt
173f0 20 68 6f 6c 64 73 0a 20 20 20 20 2a 2a 20 61 20   holds.    ** a 
17400 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
17410 72 69 62 65 73 20 74 68 65 20 6f 70 74 69 6d 69  ribes the optimi
17420 7a 65 64 20 70 61 72 73 65 20 74 72 65 65 2e 20  zed parse tree. 
17430 20 54 68 69 73 20 74 65 73 74 2d 63 6f 6e 74 72   This test-contr
17440 6f 6c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  ol.    ** return
17450 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
17460 68 61 74 20 73 74 72 69 6e 67 2e 0a 20 20 20 20  hat string..    
17470 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
17480 54 45 5f 54 45 53 54 43 54 52 4c 5f 45 58 50 4c  TE_TESTCTRL_EXPL
17490 41 49 4e 5f 53 54 4d 54 3a 20 7b 0a 20 20 20 20  AIN_STMT: {.    
174a0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
174b0 70 53 74 6d 74 20 3d 20 76 61 5f 61 72 67 28 61  pStmt = va_arg(a
174c0 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  p, sqlite3_stmt*
174d0 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
174e0 68 61 72 20 2a 2a 70 7a 52 65 74 20 3d 20 76 61  har **pzRet = va
174f0 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63  _arg(ap, const c
17500 68 61 72 2a 2a 29 3b 0a 20 20 20 20 20 20 2a 70  har**);.      *p
17510 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64  zRet = sqlite3Vd
17520 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 28 56  beExplanation((V
17530 64 62 65 2a 29 70 53 74 6d 74 29 3b 0a 20 20 20  dbe*)pStmt);.   
17540 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17550 23 65 6e 64 69 66 0a 0a 20 20 7d 0a 20 20 76 61  #endif..  }.  va
17560 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66  _end(ap);.#endif
17570 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
17580 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a  BUILTIN_TEST */.
17590 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
175a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
175b0 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c  utility routine,
175c0 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69   useful to VFS i
175d0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20  mplementations, 
175e0 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  that checks.** t
175f0 6f 20 73 65 65 20 69 66 20 61 20 64 61 74 61 62  o see if a datab
17600 61 73 65 20 66 69 6c 65 20 77 61 73 20 61 20 55  ase file was a U
17610 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65  RI that containe
17620 64 20 61 20 73 70 65 63 69 66 69 63 20 71 75 65  d a specific que
17630 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ry .** parameter
17640 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 61  , and if so obta
17650 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ins the value of
17660 20 74 68 65 20 71 75 65 72 79 20 70 61 72 61 6d   the query param
17670 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eter..**.** The 
17680 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
17690 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61  nt is the filena
176a0 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65  me pointer passe
176b0 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e  d into the xOpen
176c0 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ().** method of 
176d0 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61  a VFS implementa
176e0 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72 61  tion.  The zPara
176f0 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  m argument is th
17700 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
17710 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
17720 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73 20   we seek.  This 
17730 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
17740 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
17750 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d   zParam.** param
17760 65 74 65 72 20 69 66 20 69 74 20 65 78 69 73 74  eter if it exist
17770 73 2e 20 20 49 66 20 74 68 65 20 70 61 72 61 6d  s.  If the param
17780 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78  eter does not ex
17790 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ist, this routin
177a0 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 4e  e.** returns a N
177b0 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ULL pointer..*/.
177c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
177d0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
177e0 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  r(const char *zF
177f0 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  ilename, const c
17800 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20  har *zParam){.  
17810 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
17820 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a   ) return 0;.  z
17830 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
17840 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
17850 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68  ename) + 1;.  wh
17860 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  ile( zFilename[0
17870 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ] ){.    int x =
17880 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
17890 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20  e, zParam);.    
178a0 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c  zFilename += sql
178b0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
178c0 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  lename) + 1;.   
178d0 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75   if( x==0 ) retu
178e0 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  rn zFilename;.  
178f0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
17900 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
17910 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
17920 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
17930 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
17940 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66   boolean value f
17950 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d  or a query param
17960 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eter..*/.int sql
17970 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
17980 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
17990 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  lename, const ch
179a0 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20  ar *zParam, int 
179b0 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20  bDflt){.  const 
179c0 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
179d0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
179e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
179f0 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44  m);.  bDflt = bD
17a00 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e  flt!=0;.  return
17a10 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42   z ? sqlite3GetB
17a20 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29  oolean(z, bDflt)
17a30 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   : bDflt;.}../*.
17a40 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62  ** Return a 64-b
17a50 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  it integer value
17a60 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72   for a query par
17a70 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74  ameter..*/.sqlit
17a80 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
17a90 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f  _uri_int64(.  co
17aa0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
17ab0 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e  ame,    /* Filen
17ac0 61 6d 65 20 61 73 20 70 61 73 73 65 64 20 74 6f  ame as passed to
17ad0 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73   xOpen */.  cons
17ae0 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20  t char *zParam, 
17af0 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72        /* URI par
17b00 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f  ameter sought */
17b10 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
17b20 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20   bDflt       /* 
17b30 72 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65  return if parame
17b40 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a  ter is missing *
17b50 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
17b60 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75  r *z = sqlite3_u
17b70 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69  ri_parameter(zFi
17b80 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
17b90 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
17ba0 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73   v;.  if( z && s
17bb0 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c 20  qlite3Atoi64(z, 
17bc0 26 76 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  &v, sqlite3Strle
17bd0 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55  n30(z), SQLITE_U
17be0 54 46 38 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  TF8)==SQLITE_OK 
17bf0 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20 76  ){.    bDflt = v
17c00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62  ;.  }.  return b
17c10 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Dflt;.}../*.** R
17c20 65 74 75 72 6e 20 74 68 65 20 42 74 72 65 65 20  eturn the Btree 
17c30 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66 69  pointer identifi
17c40 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20  ed by zDbName.  
17c50 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
17c60 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72  ot found..*/.Btr
17c70 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d  ee *sqlite3DbNam
17c80 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65 33  eToBtree(sqlite3
17c90 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
17ca0 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e   *zDbName){.  in
17cb0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
17cc0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
17cd0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62  .    if( db->aDb
17ce0 5b 69 5d 2e 70 42 74 0a 20 20 20 20 20 26 26 20  [i].pBt.     && 
17cf0 28 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73  (zDbName==0 || s
17d00 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
17d10 62 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69  bName, db->aDb[i
17d20 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 29 0a 20 20 20  ].zName)==0).   
17d30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17d40 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
17d50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17d60 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
17d70 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 6e  Return the filen
17d80 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
17d90 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
17da0 69 74 68 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ith a database.*
17db0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  * connection..*/
17dc0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
17dd0 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65  ite3_db_filename
17de0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
17df0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
17e00 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  e){.  Btree *pBt
17e10 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65   = sqlite3DbName
17e20 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e  ToBtree(db, zDbN
17e30 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
17e40 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65  Bt ? sqlite3Btre
17e50 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 70 42 74  eGetFilename(pBt
17e60 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ) : 0;.}../*.** 
17e70 52 65 74 75 72 6e 20 31 20 69 66 20 64 61 74 61  Return 1 if data
17e80 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c  base is read-onl
17e90 79 20 6f 72 20 30 20 69 66 20 72 65 61 64 2f 77  y or 0 if read/w
17ea0 72 69 74 65 2e 20 20 52 65 74 75 72 6e 20 2d 31  rite.  Return -1
17eb0 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 64   if.** no such d
17ec0 61 74 61 62 61 73 65 20 65 78 69 73 74 73 2e 0a  atabase exists..
17ed0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
17ee0 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74  b_readonly(sqlit
17ef0 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
17f00 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20  ar *zDbName){.  
17f10 42 74 72 65 65 20 2a 70 42 74 20 3d 20 73 71 6c  Btree *pBt = sql
17f20 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
17f30 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  e(db, zDbName);.
17f40 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73    return pBt ? s
17f50 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
17f60 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 42 74 72  donly(sqlite3Btr
17f70 65 65 50 61 67 65 72 28 70 42 74 29 29 20 3a 20  eePager(pBt)) : 
17f80 2d 31 3b 0a 7d 0a 0a 23 69 66 20 28 53 51 4c 49  -1;.}..#if (SQLI
17f90 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f  TE_ENABLE_APPLE_
17fa0 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65  SPI>0) && define
17fb0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 0a 23 69  d(__APPLE__)..#i
17fc0 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 5f  nclude "sqlite3_
17fd0 70 72 69 76 61 74 65 2e 68 22 0a 0a 2f 2a 20 0a  private.h"../* .
17fe0 2a 2a 20 54 65 73 74 69 6e 67 20 61 20 66 69 6c  ** Testing a fil
17ff0 65 20 70 61 74 68 20 66 6f 72 20 73 71 6c 69 74  e path for sqlit
18000 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  e locks held by 
18010 61 20 70 72 6f 63 65 73 73 20 49 44 2e 20 0a 2a  a process ID. .*
18020 2a 20 52 65 74 75 72 6e 73 20 53 51 4c 49 54 45  * Returns SQLITE
18030 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 4e 20 69 66  _LOCKSTATE_ON if
18040 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65   locks are prese
18050 6e 74 20 6f 6e 20 70 61 74 68 0a 2a 2a 20 74 68  nt on path.** th
18060 61 74 20 77 6f 75 6c 64 20 70 72 65 76 65 6e 74  at would prevent
18070 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
18080 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
18090 20 5f 73 71 6c 69 74 65 33 5f 6c 6f 63 6b 73 74   _sqlite3_lockst
180a0 61 74 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ate(const char *
180b0 70 61 74 68 2c 20 70 69 64 5f 74 20 70 69 64 29  path, pid_t pid)
180c0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
180d0 3d 20 4e 55 4c 4c 3b 0a 20 20 0a 20 20 69 66 28  = NULL;.  .  if(
180e0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
180f0 28 70 61 74 68 2c 20 26 64 62 2c 20 53 51 4c 49  (path, &db, SQLI
18100 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
18110 2c 20 4e 55 4c 4c 29 20 3d 3d 20 53 51 4c 49 54  , NULL) == SQLIT
18120 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 4c 6f 63 6b  E_OK ){.    Lock
18130 73 74 61 74 65 50 49 44 20 6c 6f 63 6b 73 74 61  statePID locksta
18140 74 65 20 3d 20 7b 70 69 64 2c 20 2d 31 7d 3b 0a  te = {pid, -1};.
18150 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
18160 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
18170 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  L, SQLITE_FCNTL_
18180 4c 4f 43 4b 53 54 41 54 45 5f 50 49 44 2c 20 26  LOCKSTATE_PID, &
18190 6c 6f 63 6b 73 74 61 74 65 29 3b 0a 20 20 20 20  lockstate);.    
181a0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
181b0 29 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 65  );.    int state
181c0 20 3d 20 6c 6f 63 6b 73 74 61 74 65 2e 73 74 61   = lockstate.sta
181d0 74 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  te;.    return s
181e0 74 61 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  tate;.  }.  if( 
181f0 4e 55 4c 4c 21 3d 64 62 20 29 7b 20 0a 20 20 20  NULL!=db ){ .   
18200 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
18210 62 29 3b 20 2f 2a 20 6e 65 65 64 20 74 6f 20 63  b); /* need to c
18220 6c 6f 73 65 20 65 76 65 6e 20 69 66 20 6f 70 65  lose even if ope
18230 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  n returns an err
18240 6f 72 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  or */.  }.  retu
18250 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54  rn SQLITE_LOCKST
18260 41 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23 65  ATE_ERROR;.}..#e
18270 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
18280 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 20  NABLE_APPLE_SPI 
18290 2a 2f 0a                                         */.