/ Hex Artifact Content
Login

Artifact f076eae7069da190d22175b8cf0823a6500e49d5:


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 66 20 74 68 65 20 66  ../*.** If the f
0a40: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
0a50: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
0a60: 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63  to a string whic
0a70: 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65  h is the.** name
0a80: 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c   of a directory,
0a90: 20 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63   then that direc
0aa0: 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65  tory will be use
0ab0: 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 61 6c  d to store.** al
0ac0: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  l database files
0ad0: 20 73 70 65 63 69 66 69 65 64 20 77 69 74 68 20   specified with 
0ae0: 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
0af0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ame..**.** See a
0b00: 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41 20  lso the "PRAGMA 
0b10: 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
0b20: 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61 6e  tory" SQL comman
0b30: 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  d..*/.char *sqli
0b40: 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
0b50: 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49  ry = 0;../*.** I
0b60: 6e 69 74 69 61 6c 69 7a 65 20 53 51 4c 69 74 65  nitialize SQLite
0b70: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  .  .**.** This r
0b80: 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
0b90: 61 6c 6c 65 64 20 74 6f 20 69 6e 69 74 69 61 6c  alled to initial
0ba0: 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ize the memory a
0bb0: 6c 6c 6f 63 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46  llocation,.** VF
0bc0: 53 2c 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62  S, and mutex sub
0bd0: 73 79 73 74 65 6d 73 20 70 72 69 6f 72 20 74 6f  systems prior to
0be0: 20 64 6f 69 6e 67 20 61 6e 79 20 73 65 72 69 6f   doing any serio
0bf0: 75 73 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20  us work with.** 
0c00: 53 51 4c 69 74 65 2e 20 20 42 75 74 20 61 73 20  SQLite.  But as 
0c10: 6c 6f 6e 67 20 61 73 20 79 6f 75 20 64 6f 20 6e  long as you do n
0c20: 6f 74 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20  ot compile with 
0c30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
0c40: 49 4e 49 54 0a 2a 2a 20 74 68 69 73 20 72 6f 75  INIT.** this rou
0c50: 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
0c60: 6c 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  led automaticall
0c70: 79 20 62 79 20 6b 65 79 20 72 6f 75 74 69 6e 65  y by key routine
0c80: 73 20 73 75 63 68 20 61 73 0a 2a 2a 20 73 71 6c  s such as.** sql
0c90: 69 74 65 33 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a  ite3_open().  .*
0ca0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0cb0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 65 78 63  e is a no-op exc
0cc0: 65 70 74 20 6f 6e 20 69 74 73 20 76 65 72 79 20  ept on its very 
0cd0: 66 69 72 73 74 20 63 61 6c 6c 20 66 6f 72 20 74  first call for t
0ce0: 68 65 20 70 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f  he process,.** o
0cf0: 72 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  r for the first 
0d00: 63 61 6c 6c 20 61 66 74 65 72 20 61 20 63 61 6c  call after a cal
0d10: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 68 75  l to sqlite3_shu
0d20: 74 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tdown..**.** The
0d30: 20 66 69 72 73 74 20 74 68 72 65 61 64 20 74 6f   first thread to
0d40: 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
0d50: 6e 65 20 72 75 6e 73 20 74 68 65 20 69 6e 69 74  ne runs the init
0d60: 69 61 6c 69 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a  ialization to.**
0d70: 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 66   completion.  If
0d80: 20 73 75 62 73 65 71 75 65 6e 74 20 74 68 72 65   subsequent thre
0d90: 61 64 73 20 63 61 6c 6c 20 74 68 69 73 20 72 6f  ads call this ro
0da0: 75 74 69 6e 65 20 62 65 66 6f 72 65 20 74 68 65  utine before the
0db0: 20 66 69 72 73 74 0a 2a 2a 20 74 68 72 65 61 64   first.** thread
0dc0: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 74 68   has finished th
0dd0: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
0de0: 20 70 72 6f 63 65 73 73 2c 20 74 68 65 6e 20 74   process, then t
0df0: 68 65 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  he subsequent.**
0e00: 20 74 68 72 65 61 64 73 20 6d 75 73 74 20 62 6c   threads must bl
0e10: 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ock until the fi
0e20: 72 73 74 20 74 68 72 65 61 64 20 66 69 6e 69 73  rst thread finis
0e30: 68 65 73 20 77 69 74 68 20 74 68 65 20 69 6e 69  hes with the ini
0e40: 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a  tialization..**.
0e50: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 68 72  ** The first thr
0e60: 65 61 64 20 6d 69 67 68 74 20 63 61 6c 6c 20 74  ead might call t
0e70: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 63 75  his routine recu
0e80: 72 73 69 76 65 6c 79 2e 20 20 52 65 63 75 72 73  rsively.  Recurs
0e90: 69 76 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ive.** calls to 
0ea0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  this routine sho
0eb0: 75 6c 64 20 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f  uld not block, o
0ec0: 66 20 63 6f 75 72 73 65 2e 20 20 4f 74 68 65 72  f course.  Other
0ed0: 77 69 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74  wise the.** init
0ee0: 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65  ialization proce
0ef0: 73 73 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 63  ss would never c
0f00: 6f 6d 70 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c  omplete..**.** L
0f10: 65 74 20 58 20 62 65 20 74 68 65 20 66 69 72 73  et X be the firs
0f20: 74 20 74 68 72 65 61 64 20 74 6f 20 65 6e 74 65  t thread to ente
0f30: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  r this routine. 
0f40: 20 4c 65 74 20 59 20 62 65 20 73 6f 6d 65 20 6f   Let Y be some o
0f50: 74 68 65 72 0a 2a 2a 20 74 68 72 65 61 64 2e 20  ther.** thread. 
0f60: 20 54 68 65 6e 20 77 68 69 6c 65 20 74 68 65 20   Then while the 
0f70: 69 6e 69 74 69 61 6c 20 69 6e 76 6f 63 61 74 69  initial invocati
0f80: 6f 6e 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  on of this routi
0f90: 6e 65 20 62 79 20 58 20 69 73 0a 2a 2a 20 69 6e  ne by X is.** in
0fa0: 63 6f 6d 70 6c 65 74 65 2c 20 69 74 20 69 73 20  complete, it is 
0fb0: 72 65 71 75 69 72 65 64 20 74 68 61 74 3a 0a 2a  required that:.*
0fc0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 61 6c 6c 73  *.**    *  Calls
0fd0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
0fe0: 20 66 72 6f 6d 20 59 20 6d 75 73 74 20 62 6c 6f   from Y must blo
0ff0: 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 6f 75 74  ck until the out
1000: 65 72 2d 6d 6f 73 74 0a 2a 2a 20 20 20 20 20 20  er-most.**      
1010: 20 63 61 6c 6c 20 62 79 20 58 20 63 6f 6d 70 6c   call by X compl
1020: 65 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  etes..**.**    *
1030: 20 20 52 65 63 75 72 73 69 76 65 20 63 61 6c 6c    Recursive call
1040: 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  s to this routin
1050: 65 20 66 72 6f 6d 20 74 68 72 65 61 64 20 58 20  e from thread X 
1060: 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
1070: 6c 79 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68  ly.**       with
1080: 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  out blocking..*/
1090: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 69  .int sqlite3_ini
10a0: 74 69 61 6c 69 7a 65 28 76 6f 69 64 29 7b 0a 20  tialize(void){. 
10b0: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
10c0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61  lite3_mutex *pMa
10d0: 73 74 65 72 3b 20 29 20 20 20 20 20 20 20 2f 2a  ster; )       /*
10e0: 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69 63   The main static
10f0: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 69 6e 74 20   mutex */.  int 
1100: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1120: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1130: 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64  lt code */..#ifd
1140: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1150: 53 44 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  SD.  rc = sqlite
1160: 33 5f 77 73 64 5f 69 6e 69 74 28 34 30 39 36 2c  3_wsd_init(4096,
1170: 20 32 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d   24);.  if( rc!=
1180: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1190: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11a0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
11b0: 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64  SQLite is alread
11c0: 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 6e 69  y completely ini
11d0: 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20 74  tialized, then t
11e0: 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f  his call.  ** to
11f0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1200: 69 7a 65 28 29 20 73 68 6f 75 6c 64 20 62 65 20  ize() should be 
1210: 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 74 68  a no-op.  But th
1220: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
1230: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 63 6f  .  ** must be co
1240: 6d 70 6c 65 74 65 2e 20 20 53 6f 20 69 73 49 6e  mplete.  So isIn
1250: 69 74 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 73  it must not be s
1260: 65 74 20 75 6e 74 69 6c 20 74 68 65 20 76 65 72  et until the ver
1270: 79 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68  y end.  ** of th
1280: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f  is routine..  */
1290: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
12a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69  obalConfig.isIni
12b0: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
12c0: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  E_OK;..  /* Make
12d0: 20 73 75 72 65 20 74 68 65 20 6d 75 74 65 78 20   sure the mutex 
12e0: 73 75 62 73 79 73 74 65 6d 20 69 73 20 69 6e 69  subsystem is ini
12f0: 74 69 61 6c 69 7a 65 64 2e 20 20 49 66 20 75 6e  tialized.  If un
1300: 61 62 6c 65 20 74 6f 20 0a 20 20 2a 2a 20 69 6e  able to .  ** in
1310: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 75 74  itialize the mut
1320: 65 78 20 73 75 62 73 79 73 74 65 6d 2c 20 72 65  ex subsystem, re
1330: 74 75 72 6e 20 65 61 72 6c 79 20 77 69 74 68 20  turn early with 
1340: 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 20  the error..  ** 
1350: 49 66 20 74 68 65 20 73 79 73 74 65 6d 20 69 73  If the system is
1360: 20 73 6f 20 73 69 63 6b 20 74 68 61 74 20 77 65   so sick that we
1370: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 61   are unable to a
1380: 6c 6c 6f 63 61 74 65 20 61 20 6d 75 74 65 78 2c  llocate a mutex,
1390: 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 6e  .  ** there is n
13a0: 6f 74 20 6d 75 63 68 20 53 51 4c 69 74 65 20 69  ot much SQLite i
13b0: 73 20 67 6f 69 6e 67 20 74 6f 20 62 65 20 61 62  s going to be ab
13c0: 6c 65 20 74 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20  le to do..  **. 
13d0: 20 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 73 75   ** The mutex su
13e0: 62 73 79 73 74 65 6d 20 6d 75 73 74 20 74 61 6b  bsystem must tak
13f0: 65 20 63 61 72 65 20 6f 66 20 73 65 72 69 61 6c  e care of serial
1400: 69 7a 69 6e 67 20 69 74 73 20 6f 77 6e 0a 20 20  izing its own.  
1410: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ** initializatio
1420: 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  n..  */.  rc = s
1430: 71 6c 69 74 65 33 4d 75 74 65 78 49 6e 69 74 28  qlite3MutexInit(
1440: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1450: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49  turn rc;..  /* I
1460: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61  nitialize the ma
1470: 6c 6c 6f 63 28 29 20 73 79 73 74 65 6d 20 61 6e  lloc() system an
1480: 64 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  d the recursive 
1490: 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65 78  pInitMutex mutex
14a0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 70 65 72  ..  ** This oper
14b0: 61 74 69 6f 6e 20 69 73 20 70 72 6f 74 65 63 74  ation is protect
14c0: 65 64 20 62 79 20 74 68 65 20 53 54 41 54 49 43  ed by the STATIC
14d0: 5f 4d 41 53 54 45 52 20 6d 75 74 65 78 2e 20 20  _MASTER mutex.  
14e0: 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 4d  Note that.  ** M
14f0: 75 74 65 78 41 6c 6c 6f 63 28 29 20 69 73 20 63  utexAlloc() is c
1500: 61 6c 6c 65 64 20 66 6f 72 20 61 20 73 74 61 74  alled for a stat
1510: 69 63 20 6d 75 74 65 78 20 70 72 69 6f 72 20 74  ic mutex prior t
1520: 6f 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  o initializing t
1530: 68 65 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73  he.  ** malloc s
1540: 75 62 73 79 73 74 65 6d 20 2d 20 74 68 69 73 20  ubsystem - this 
1550: 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65  implies that the
1560: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61   allocation of a
1570: 20 73 74 61 74 69 63 0a 20 20 2a 2a 20 6d 75 74   static.  ** mut
1580: 65 78 20 6d 75 73 74 20 6e 6f 74 20 72 65 71 75  ex must not requ
1590: 69 72 65 20 73 75 70 70 6f 72 74 20 66 72 6f 6d  ire support from
15a0: 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 75 62 73   the malloc subs
15b0: 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 4d 55  ystem..  */.  MU
15c0: 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
15d0: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
15e0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
15f0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
1600: 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
1610: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
1620: 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  ter);.  sqlite3G
1630: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75  lobalConfig.isMu
1640: 74 65 78 49 6e 69 74 20 3d 20 31 3b 0a 20 20 69  texInit = 1;.  i
1650: 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61  f( !sqlite3Globa
1660: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
1670: 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d  Init ){.    rc =
1680: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 49 6e   sqlite3MallocIn
1690: 69 74 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  it();.  }.  if( 
16a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
16c0: 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f  alConfig.isMallo
16d0: 63 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 69  cInit = 1;.    i
16e0: 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61  f( !sqlite3Globa
16f0: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1700: 65 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ex ){.      sqli
1710: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1720: 70 49 6e 69 74 4d 75 74 65 78 20 3d 0a 20 20 20  pInitMutex =.   
1730: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
1740: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
1750: 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
1760: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
1770: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1780: 2e 62 43 6f 72 65 4d 75 74 65 78 20 26 26 20 21  .bCoreMutex && !
1790: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17a0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29  fig.pInitMutex )
17b0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
17c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
17d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
17e0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17f0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1800: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1810: 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20  efInitMutex++;. 
1820: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1830: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1840: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20 69  );..  /* If rc i
1850: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
1860: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
1870: 68 65 6e 20 65 69 74 68 65 72 20 74 68 65 20 6d  hen either the m
1880: 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79  alloc.  ** subsy
1890: 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62  stem could not b
18a0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72  e initialized or
18b0: 20 74 68 65 20 73 79 73 74 65 6d 20 66 61 69 6c   the system fail
18c0: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  ed to allocate. 
18d0: 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d 75 74   ** the pInitMut
18e0: 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75 72 6e  ex mutex. Return
18f0: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74   an error in eit
1900: 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  her case.  */.  
1910: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1920: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1930: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  rc;.  }..  /* Do
1940: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1950: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1960: 75 6e 64 65 72 20 74 68 65 20 72 65 63 75 72 73  under the recurs
1970: 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a  ive mutex so.  *
1980: 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  * that we will b
1990: 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65  e able to handle
19a0: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
19b0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74   into.  ** sqlit
19c0: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e  e3_initialize().
19d0: 20 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20    The recursive 
19e0: 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  calls normally c
19f0: 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  ome through.  **
1a00: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
1a10: 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b  () when it invok
1a20: 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  es sqlite3_vfs_r
1a30: 65 67 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f  egister(), but o
1a40: 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73  ther.  ** recurs
1a50: 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20  ive calls might 
1a60: 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65  also be possible
1a70: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
1a80: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
1a90: 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53 51 4c  -00140-37445 SQL
1aa0: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
1ab0: 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c  y serializes cal
1ac0: 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  ls.  ** to the x
1ad0: 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20  Init method, so 
1ae0: 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64  the xInit method
1af0: 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72   need not be thr
1b00: 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20  eadsafe..  **.  
1b10: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1b20: 20 6d 75 74 65 78 20 69 73 20 77 68 61 74 20 73   mutex is what s
1b30: 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65 73 73  erializes access
1b40: 20 74 6f 20 74 68 65 20 61 70 70 64 65 66 20 70   to the appdef p
1b50: 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a  cache xInit.  **
1b60: 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 73   methods.  The s
1b70: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
1b80: 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20 61 6c  thods.xInit() al
1b90: 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20 69 6e  l is embedded in
1ba0: 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74   the.  ** call t
1bb0: 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49  o sqlite3PcacheI
1bc0: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a  nitialize()..  *
1bd0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1be0: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47  x_enter(sqlite3G
1bf0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
1c00: 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  tMutex);.  if( s
1c10: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1c20: 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20  ig.isInit==0 && 
1c30: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1c40: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d  fig.inProgress==
1c50: 30 20 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  0 ){.    FuncDef
1c60: 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26 47  Hash *pHash = &G
1c70: 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66 48 61 73  LOBAL(FuncDefHas
1c80: 68 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  h, sqlite3Global
1c90: 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20 20 20  Functions);.    
1ca0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1cb0: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d  fig.inProgress =
1cc0: 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   1;.    memset(p
1cd0: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
1ce0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e  sqlite3GlobalFun
1cf0: 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20 73 71  ctions));.    sq
1d00: 6c 69 74 65 33 52 65 67 69 73 74 65 72 47 6c 6f  lite3RegisterGlo
1d10: 62 61 6c 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a  balFunctions();.
1d20: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1d30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
1d40: 61 63 68 65 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  acheInit==0 ){. 
1d50: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d60: 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a  3PcacheInitializ
1d70: 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  e();.    }.    i
1d80: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1da0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1db0: 50 43 61 63 68 65 49 6e 69 74 20 3d 20 31 3b 0a  PCacheInit = 1;.
1dc0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1dd0: 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20 20 20 20  e3OsInit();.    
1de0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1df0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e00: 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 42 75   sqlite3PCacheBu
1e10: 66 66 65 72 53 65 74 75 70 28 20 73 71 6c 69 74  fferSetup( sqlit
1e20: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1e30: 50 61 67 65 2c 20 0a 20 20 20 20 20 20 20 20 20  Page, .         
1e40: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1e50: 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c  nfig.szPage, sql
1e60: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1e70: 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 73  .nPage);.      s
1e80: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1e90: 69 67 2e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  ig.isInit = 1;. 
1ea0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1eb0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
1ec0: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 7d  rogress = 0;.  }
1ed0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1ee0: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 47 6c  _leave(sqlite3Gl
1ef0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1f00: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f  Mutex);..  /* Go
1f10: 20 62 61 63 6b 20 75 6e 64 65 72 20 74 68 65 20   back under the 
1f20: 73 74 61 74 69 63 20 6d 75 74 65 78 20 61 6e 64  static mutex and
1f30: 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65   clean up the re
1f40: 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 6d 75 74  cursive.  ** mut
1f50: 65 78 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20  ex to prevent a 
1f60: 72 65 73 6f 75 72 63 65 20 6c 65 61 6b 2e 0a 20  resource leak.. 
1f70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1f80: 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
1f90: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f  r);.  sqlite3Glo
1fa0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
1fb0: 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28  itMutex--;.  if(
1fc0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1fd0: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1fe0: 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ex<=0 ){.    ass
1ff0: 65 72 74 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ert( sqlite3Glob
2000: 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69  alConfig.nRefIni
2010: 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20  tMutex==0 );.   
2020: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
2030: 72 65 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ree(sqlite3Globa
2040: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
2050: 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
2060: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
2070: 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 7d  itMutex = 0;.  }
2080: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2090: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
20a0: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
20b0: 77 69 6e 67 20 69 73 20 6a 75 73 74 20 61 20 73  wing is just a s
20c0: 61 6e 69 74 79 20 63 68 65 63 6b 20 74 6f 20 6d  anity check to m
20d0: 61 6b 65 20 73 75 72 65 20 53 51 4c 69 74 65 20  ake sure SQLite 
20e0: 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f  has.  ** been co
20f0: 6d 70 69 6c 65 64 20 63 6f 72 72 65 63 74 6c 79  mpiled correctly
2100: 2e 20 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  .  It is importa
2110: 6e 74 20 74 6f 20 72 75 6e 20 74 68 69 73 20 63  nt to run this c
2120: 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a 20 77 65  ode, but.  ** we
2130: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
2140: 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74 65 6e 20  un it too often 
2150: 61 6e 64 20 73 6f 61 6b 20 75 70 20 43 50 55 20  and soak up CPU 
2160: 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f 0a 20 20  cycles for no.  
2170: 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53 6f 20 77  ** reason.  So w
2180: 65 20 72 75 6e 20 69 74 20 6f 6e 63 65 20 64 75  e run it once du
2190: 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74  ring initializat
21a0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ion..  */.#ifnde
21b0: 66 20 4e 44 45 42 55 47 0a 23 69 66 6e 64 65 66  f NDEBUG.#ifndef
21c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
21d0: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a  ATING_POINT.  /*
21e0: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 6f 66   This section of
21f0: 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20 22 6f 75   code's only "ou
2200: 74 70 75 74 22 20 69 73 20 76 69 61 20 61 73 73  tput" is via ass
2210: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
2220: 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72 63 3d 3d  . */.  if ( rc==
2230: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2240: 20 75 36 34 20 78 20 3d 20 28 28 28 75 36 34 29   u64 x = (((u64)
2250: 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20 20 20 64  1)<<63)-1;.    d
2260: 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 61 73 73  ouble y;.    ass
2270: 65 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 38  ert(sizeof(x)==8
2280: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69  );.    assert(si
2290: 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65 6f 66 28  zeof(x)==sizeof(
22a0: 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  y));.    memcpy(
22b0: 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20  &y, &x, 8);.    
22c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 49  assert( sqlite3I
22d0: 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20 7d 0a 23  sNaN(y) );.  }.#
22e0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
22f0: 2f 2a 20 44 6f 20 65 78 74 72 61 20 69 6e 69 74  /* Do extra init
2300: 69 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73  ialization steps
2310: 20 72 65 71 75 65 73 74 65 64 20 62 79 20 74 68   requested by th
2320: 65 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  e SQLITE_EXTRA_I
2330: 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65  NIT.  ** compile
2340: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20 20  -time option..  
2350: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2360: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 66  _EXTRA_INIT.  if
2370: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2380: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
2390: 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 7b  Config.isInit ){
23a0: 0a 20 20 20 20 69 6e 74 20 53 51 4c 49 54 45 5f  .    int SQLITE_
23b0: 45 58 54 52 41 5f 49 4e 49 54 28 63 6f 6e 73 74  EXTRA_INIT(const
23c0: 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 72 63 20   char*);.    rc 
23d0: 3d 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  = SQLITE_EXTRA_I
23e0: 4e 49 54 28 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  NIT(0);.  }.#end
23f0: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
2400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74  .}../*.** Undo t
2410: 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 73 71  he effects of sq
2420: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
2430: 28 29 2e 20 20 4d 75 73 74 20 6e 6f 74 20 62 65  ().  Must not be
2440: 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 0a 2a 2a   called while.**
2450: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
2460: 61 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20  anding database 
2470: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d  connections or m
2480: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2490: 73 20 6f 72 0a 2a 2a 20 77 68 69 6c 65 20 61 6e  s or.** while an
24a0: 79 20 70 61 72 74 20 6f 66 20 53 51 4c 69 74 65  y part of SQLite
24b0: 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 69 6e   is otherwise in
24c0: 20 75 73 65 20 69 6e 20 61 6e 79 20 74 68 72 65   use in any thre
24d0: 61 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ad.  This.** rou
24e0: 74 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 72 65  tine is not thre
24f0: 61 64 73 61 66 65 2e 20 20 42 75 74 20 69 74 20  adsafe.  But it 
2500: 69 73 20 73 61 66 65 20 74 6f 20 69 6e 76 6f 6b  is safe to invok
2510: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  e this routine.*
2520: 2a 20 6f 6e 20 77 68 65 6e 20 53 51 4c 69 74 65  * on when SQLite
2530: 20 69 73 20 61 6c 72 65 61 64 79 20 73 68 75 74   is already shut
2540: 20 64 6f 77 6e 2e 20 20 49 66 20 53 51 4c 69 74   down.  If SQLit
2550: 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 68 75  e is already shu
2560: 74 20 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20 74  t down.** when t
2570: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
2580: 6e 76 6f 6b 65 64 2c 20 74 68 65 6e 20 74 68 69  nvoked, then thi
2590: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  s routine is a h
25a0: 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a  armless no-op..*
25b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68  /.int sqlite3_sh
25c0: 75 74 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 20 20  utdown(void){.  
25d0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
25e0: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  lConfig.isInit )
25f0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
2600: 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e 0a 20  EXTRA_SHUTDOWN. 
2610: 20 20 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 45     void SQLITE_E
2620: 58 54 52 41 5f 53 48 55 54 44 4f 57 4e 28 76 6f  XTRA_SHUTDOWN(vo
2630: 69 64 29 3b 0a 20 20 20 20 53 51 4c 49 54 45 5f  id);.    SQLITE_
2640: 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e 28 29  EXTRA_SHUTDOWN()
2650: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
2660: 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a 20  ite3_os_end();. 
2670: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
2680: 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28  _auto_extension(
2690: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
26a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69  obalConfig.isIni
26b0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
26c0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
26d0: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
26e0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
26f0: 50 63 61 63 68 65 53 68 75 74 64 6f 77 6e 28 29  PcacheShutdown()
2700: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
2710: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
2720: 68 65 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  heInit = 0;.  }.
2730: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2740: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c  balConfig.isMall
2750: 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  ocInit ){.    sq
2760: 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 29  lite3MallocEnd()
2770: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
2780: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c  balConfig.isMall
2790: 6f 63 49 6e 69 74 20 3d 20 30 3b 0a 0a 23 69 66  ocInit = 0;..#if
27a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27b0: 5f 53 48 55 54 44 4f 57 4e 5f 44 49 52 45 43 54  _SHUTDOWN_DIRECT
27c0: 4f 52 49 45 53 0a 20 20 20 20 2f 2a 20 54 68 65  ORIES.    /* The
27d0: 20 68 65 61 70 20 73 75 62 73 79 73 74 65 6d 20   heap subsystem 
27e0: 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 73 68 75  has now been shu
27f0: 74 64 6f 77 6e 20 61 6e 64 20 74 68 65 73 65 20  tdown and these 
2800: 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f  values are suppo
2810: 73 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  sed.    ** to be
2820: 20 4e 55 4c 4c 20 6f 72 20 70 6f 69 6e 74 20 74   NULL or point t
2830: 6f 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61  o memory that wa
2840: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
2850: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
2860: 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77  ,.    ** which w
2870: 6f 75 6c 64 20 72 65 6c 79 20 6f 6e 20 74 68 61  ould rely on tha
2880: 74 20 68 65 61 70 20 73 75 62 73 79 73 74 65 6d  t heap subsystem
2890: 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6d 61 6b  ; therefore, mak
28a0: 65 20 73 75 72 65 20 74 68 65 73 65 0a 20 20 20  e sure these.   
28b0: 20 2a 2a 20 76 61 6c 75 65 73 20 63 61 6e 6e 6f   ** values canno
28c0: 74 20 72 65 66 65 72 20 74 6f 20 68 65 61 70 20  t refer to heap 
28d0: 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20  memory that was 
28e0: 6a 75 73 74 20 69 6e 76 61 6c 69 64 61 74 65 64  just invalidated
28f0: 20 77 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   when the.    **
2900: 20 68 65 61 70 20 73 75 62 73 79 73 74 65 6d 20   heap subsystem 
2910: 77 61 73 20 73 68 75 74 64 6f 77 6e 2e 20 20 54  was shutdown.  T
2920: 68 69 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65  his is only done
2930: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
2940: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 74  call to.    ** t
2950: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73  his function res
2960: 75 6c 74 65 64 20 69 6e 20 74 68 65 20 68 65 61  ulted in the hea
2970: 70 20 73 75 62 73 79 73 74 65 6d 20 61 63 74 75  p subsystem actu
2980: 61 6c 6c 79 20 62 65 69 6e 67 20 73 68 75 74 64  ally being shutd
2990: 6f 77 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  own..    */.    
29a0: 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
29b0: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20  ectory = 0;.    
29c0: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
29d0: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 65 6e 64  ectory = 0;.#end
29e0: 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  if.  }.  if( sql
29f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2a00: 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 29 7b 0a  .isMutexInit ){.
2a10: 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78      sqlite3Mutex
2a20: 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  End();.    sqlit
2a30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2a40: 73 4d 75 74 65 78 49 6e 69 74 20 3d 20 30 3b 0a  sMutexInit = 0;.
2a50: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
2a60: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2a70: 2a 20 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77  * This API allow
2a80: 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74  s applications t
2a90: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f  o modify the glo
2aa0: 62 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  bal configuratio
2ab0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69  n of.** the SQLi
2ac0: 74 65 20 6c 69 62 72 61 72 79 20 61 74 20 72 75  te library at ru
2ad0: 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-time..**.** Th
2ae0: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
2af0: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
2b00: 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
2b10: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a  no outstanding.*
2b20: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
2b30: 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79  ctions or memory
2b40: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54   allocations.  T
2b50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
2b60: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65  ot.** threadsafe
2b70: 2e 20 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65  .  Failure to he
2b80: 65 64 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67  ed these warning
2b90: 73 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e  s can lead to un
2ba0: 70 72 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62  predictable.** b
2bb0: 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  ehavior..*/.int 
2bc0: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69  sqlite3_config(i
2bd0: 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76  nt op, ...){.  v
2be0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74  a_list ap;.  int
2bf0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c00: 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63  ..  /* sqlite3_c
2c10: 6f 6e 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65  onfig() shall re
2c20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
2c30: 53 45 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f  SE if it is invo
2c40: 6b 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74  ked while.  ** t
2c50: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
2c60: 79 20 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a  y is in use. */.
2c70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2c80: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
2c90: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2ca0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20  _MISUSE_BKPT;.. 
2cb0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70   va_start(ap, op
2cc0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  );.  switch( op 
2cd0: 29 7b 0a 0a 20 20 20 20 2f 2a 20 4d 75 74 65 78  ){..    /* Mutex
2ce0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   configuration o
2cf0: 70 74 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20  ptions are only 
2d00: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 20 74  available in a t
2d10: 68 72 65 61 64 73 61 66 65 0a 20 20 20 20 2a 2a  hreadsafe.    **
2d20: 20 63 6f 6d 70 69 6c 65 2e 20 0a 20 20 20 20 2a   compile. .    *
2d30: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
2d40: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 29  LITE_THREADSAFE)
2d50: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
2d60: 44 53 41 46 45 3e 30 0a 20 20 20 20 63 61 73 65  DSAFE>0.    case
2d70: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
2d80: 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20  INGLETHREAD: {. 
2d90: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
2da0: 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a  all mutexing */.
2db0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2dc0: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
2dd0: 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  utex = 0;.      
2de0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2df0: 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d  fig.bFullMutex =
2e00: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
2e10: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2e20: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55  SQLITE_CONFIG_MU
2e30: 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a 20 20 20  LTITHREAD: {.   
2e40: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75     /* Disable mu
2e50: 74 65 78 69 6e 67 20 6f 66 20 64 61 74 61 62 61  texing of databa
2e60: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  se connections *
2e70: 2f 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c  /.      /* Enabl
2e80: 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20 63 6f  e mutexing of co
2e90: 72 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  re data structur
2ea0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  es */.      sqli
2eb0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2ec0: 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 0a  bCoreMutex = 1;.
2ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2ee0: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
2ef0: 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  utex = 0;.      
2f00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2f10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2f20: 46 49 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20  FIG_SERIALIZED: 
2f30: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c  {.      /* Enabl
2f40: 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a  e all mutexing *
2f50: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
2f60: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
2f70: 65 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20  eMutex = 1;.    
2f80: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2f90: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
2fa0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
2fb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
2fc0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
2fd0: 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f  MUTEX: {.      /
2fe0: 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74  * Specify an alt
2ff0: 65 72 6e 61 74 69 76 65 20 6d 75 74 65 78 20 69  ernative mutex i
3000: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  mplementation */
3010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3020: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78  obalConfig.mutex
3030: 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73   = *va_arg(ap, s
3040: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74  qlite3_mutex_met
3050: 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72  hods*);.      br
3060: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
3070: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3080: 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a 20 20  G_GETMUTEX: {.  
3090: 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20      /* Retrieve 
30a0: 74 68 65 20 63 75 72 72 65 6e 74 20 6d 75 74 65  the current mute
30b0: 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  x implementation
30c0: 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72   */.      *va_ar
30d0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75  g(ap, sqlite3_mu
30e0: 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20  tex_methods*) = 
30f0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3100: 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20 20 20  fig.mutex;.     
3110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3120: 6e 64 69 66 0a 0a 0a 20 20 20 20 63 61 73 65 20  ndif...    case 
3130: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41  SQLITE_CONFIG_MA
3140: 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LLOC: {.      /*
3150: 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65   Specify an alte
3160: 72 6e 61 74 69 76 65 20 6d 61 6c 6c 6f 63 20 69  rnative malloc i
3170: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  mplementation */
3180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3190: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a  obalConfig.m = *
31a0: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
31b0: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29  e3_mem_methods*)
31c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
31d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
31e0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d  LITE_CONFIG_GETM
31f0: 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f  ALLOC: {.      /
3200: 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63  * Retrieve the c
3210: 75 72 72 65 6e 74 20 6d 61 6c 6c 6f 63 28 29 20  urrent malloc() 
3220: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
3230: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
3240: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3250: 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73  m.xMalloc==0 ) s
3260: 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61  qlite3MemSetDefa
3270: 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 2a 76 61  ult();.      *va
3280: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3290: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d  _mem_methods*) =
32a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
32b0: 6e 66 69 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72  nfig.m;.      br
32c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
32d0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
32e0: 47 5f 4d 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20  G_MEMSTATUS: {. 
32f0: 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6f       /* Enable o
3300: 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 6d 61  r disable the ma
3310: 6c 6c 6f 63 20 73 74 61 74 75 73 20 63 6f 6c 6c  lloc status coll
3320: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ection */.      
3330: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3340: 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20 76  fig.bMemstat = v
3350: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
3360: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3370: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3380: 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43  TE_CONFIG_SCRATC
3390: 48 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65  H: {.      /* De
33a0: 73 69 67 6e 61 74 65 20 61 20 62 75 66 66 65 72  signate a buffer
33b0: 20 66 6f 72 20 73 63 72 61 74 63 68 20 6d 65 6d   for scratch mem
33c0: 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ory space */.   
33d0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
33e0: 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68 20  Config.pScratch 
33f0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3400: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
3410: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
3420: 7a 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72  zScratch = va_ar
3430: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3440: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3450: 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 20 3d  onfig.nScratch =
3460: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
3470: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3480: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3490: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45  LITE_CONFIG_PAGE
34a0: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
34b0: 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20 62 75  * Designate a bu
34c0: 66 66 65 72 20 66 6f 72 20 70 61 67 65 20 63 61  ffer for page ca
34d0: 63 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  che memory space
34e0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
34f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50  3GlobalConfig.pP
3500: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
3510: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73   void*);.      s
3520: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3530: 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f 61  ig.szPage = va_a
3540: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
3550: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3560: 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76  Config.nPage = v
3570: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
3580: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3590: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
35a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
35b0: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  E: {.      /* no
35c0: 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  -op */.      bre
35d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
35e0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
35f0: 5f 47 45 54 50 43 41 43 48 45 3a 20 7b 0a 20 20  _GETPCACHE: {.  
3600: 20 20 20 20 2f 2a 20 6e 6f 77 20 61 6e 20 65 72      /* now an er
3610: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ror */.      rc 
3620: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
3630: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3640: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
3650: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
3660: 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53  E2: {.      /* S
3670: 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e  pecify an altern
3680: 61 74 69 76 65 20 70 61 67 65 20 63 61 63 68 65  ative page cache
3690: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
36a0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61  GlobalConfig.pca
36c0: 63 68 65 32 20 3d 20 2a 76 61 5f 61 72 67 28 61  che2 = *va_arg(a
36d0: 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  p, sqlite3_pcach
36e0: 65 5f 6d 65 74 68 6f 64 73 32 2a 29 3b 0a 20 20  e_methods2*);.  
36f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3700: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3710: 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48  _CONFIG_GETPCACH
3720: 45 32 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  E2: {.      if( 
3730: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3740: 66 69 67 2e 70 63 61 63 68 65 32 2e 78 49 6e 69  fig.pcache2.xIni
3750: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
3760: 73 71 6c 69 74 65 33 50 43 61 63 68 65 53 65 74  sqlite3PCacheSet
3770: 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20  Default();.     
3780: 20 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67   }.      *va_arg
3790: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61  (ap, sqlite3_pca
37a0: 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 20 3d  che_methods2*) =
37b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
37c0: 6e 66 69 67 2e 70 63 61 63 68 65 32 3b 0a 20 20  nfig.pcache2;.  
37d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
37e0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
37f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
3800: 59 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  YS3) || defined(
3810: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
3820: 4d 53 59 53 35 29 0a 20 20 20 20 63 61 73 65 20  MSYS5).    case 
3830: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45  SQLITE_CONFIG_HE
3840: 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  AP: {.      /* D
3850: 65 73 69 67 6e 61 74 65 20 61 20 62 75 66 66 65  esignate a buffe
3860: 72 20 66 6f 72 20 68 65 61 70 20 6d 65 6d 6f 72  r for heap memor
3870: 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20  y space */.     
3880: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3890: 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 76 61 5f  nfig.pHeap = va_
38a0: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
38b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
38c0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20  balConfig.nHeap 
38d0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
38e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
38f0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
3900: 65 71 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  eq = va_arg(ap, 
3910: 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  int);..      if(
3920: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3930: 6e 66 69 67 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a  nfig.mnReq<1 ){.
3940: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
3950: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65  lobalConfig.mnRe
3960: 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  q = 1;.      }el
3970: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  se if( sqlite3Gl
3980: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71  obalConfig.mnReq
3990: 3e 28 31 3c 3c 31 32 29 20 29 7b 0a 20 20 20 20  >(1<<12) ){.    
39a0: 20 20 20 20 2f 2a 20 63 61 70 20 6d 69 6e 20 72      /* cap min r
39b0: 65 71 75 65 73 74 20 73 69 7a 65 20 61 74 20 32  equest size at 2
39c0: 5e 31 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  ^12 */.        s
39d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
39e0: 69 67 2e 6d 6e 52 65 71 20 3d 20 28 31 3c 3c 31  ig.mnReq = (1<<1
39f0: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  2);.      }..   
3a00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
3a10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70  obalConfig.pHeap
3a20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
3a30: 2a 20 49 66 20 74 68 65 20 68 65 61 70 20 70 6f  * If the heap po
3a40: 69 6e 74 65 72 20 69 73 20 4e 55 4c 4c 2c 20 74  inter is NULL, t
3a50: 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
3a60: 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74  malloc implement
3a70: 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ation.        **
3a80: 20 62 61 63 6b 20 74 6f 20 4e 55 4c 4c 20 70 6f   back to NULL po
3a90: 69 6e 74 65 72 73 20 74 6f 6f 2e 20 20 54 68 69  inters too.  Thi
3aa0: 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  s will cause the
3ab0: 20 6d 61 6c 6c 6f 63 20 74 6f 20 67 6f 0a 20 20   malloc to go.  
3ac0: 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f        ** back to
3ad0: 20 69 74 73 20 64 65 66 61 75 6c 74 20 69 6d 70   its default imp
3ae0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e  lementation when
3af0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
3b00: 69 7a 65 28 29 20 69 73 0a 20 20 20 20 20 20 20  ize() is.       
3b10: 20 2a 2a 20 72 75 6e 2e 0a 20 20 20 20 20 20 20   ** run..       
3b20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   */.        mems
3b30: 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62 61  et(&sqlite3Globa
3b40: 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69  lConfig.m, 0, si
3b50: 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f 62  zeof(sqlite3Glob
3b60: 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20  alConfig.m));.  
3b70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3b80: 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70 20 70     /* The heap p
3b90: 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55  ointer is not NU
3ba0: 4c 4c 2c 20 74 68 65 6e 20 69 6e 73 74 61 6c 6c  LL, then install
3bb0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 20 20 20 20   one of the.    
3bc0: 20 20 20 20 2a 2a 20 6d 65 6d 35 2e 63 2f 6d 65      ** mem5.c/me
3bd0: 6d 33 2e 63 20 6d 65 74 68 6f 64 73 2e 20 49 66  m3.c methods. If
3be0: 20 6e 65 69 74 68 65 72 20 45 4e 41 42 4c 45 5f   neither ENABLE_
3bf0: 4d 45 4d 53 59 53 33 20 6e 6f 72 0a 20 20 20 20  MEMSYS3 nor.    
3c00: 20 20 20 20 2a 2a 20 45 4e 41 42 4c 45 5f 4d 45      ** ENABLE_ME
3c10: 4d 53 59 53 35 20 69 73 20 64 65 66 69 6e 65 64  MSYS5 is defined
3c20: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
3c30: 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  r..        */.#i
3c40: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3c50: 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20  LE_MEMSYS3.     
3c60: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3c70: 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69  Config.m = *sqli
3c80: 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33  te3MemGetMemsys3
3c90: 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ();.#endif.#ifde
3ca0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
3cb0: 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20  MEMSYS5.        
3cc0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3cd0: 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33  fig.m = *sqlite3
3ce0: 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b  MemGetMemsys5();
3cf0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
3d00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3d10: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63   }.#endif..    c
3d20: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3d30: 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20  G_LOOKASIDE: {. 
3d40: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3d50: 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61  alConfig.szLooka
3d60: 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70  side = va_arg(ap
3d70: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
3d80: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3d90: 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76  g.nLookaside = v
3da0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
3db0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3dc0: 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 52   }.    .    /* R
3dd0: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
3de0: 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75  to the logger fu
3df0: 6e 63 63 74 69 6f 6e 20 61 6e 64 20 69 74 73 20  ncction and its 
3e00: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
3e10: 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75      ** The defau
3e20: 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67  lt is NULL.  Log
3e30: 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64  ging is disabled
3e40: 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   if the function
3e50: 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20 20   pointer is.    
3e60: 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  ** NULL..    */.
3e70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3e80: 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20  CONFIG_LOG: {.  
3e90: 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70      /* MSVC is p
3ea0: 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69  icky about pulli
3eb0: 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f  ng func ptrs fro
3ec0: 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20  m va lists..    
3ed0: 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70    ** http://supp
3ee0: 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f  ort.microsoft.co
3ef0: 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20  m/kb/47961.     
3f00: 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   ** sqlite3Globa
3f10: 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76  lConfig.xLog = v
3f20: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28 2a  a_arg(ap, void(*
3f30: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
3f40: 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20  t char*));.     
3f50: 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65   */.      typede
3f60: 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f  f void(*LOGFUNC_
3f70: 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  t)(void*,int,con
3f80: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
3f90: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3fa0: 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61  nfig.xLog = va_a
3fb0: 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74  rg(ap, LOGFUNC_t
3fc0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3fd0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f  GlobalConfig.pLo
3fe0: 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  gArg = va_arg(ap
3ff0: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
4000: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4010: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
4020: 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20  NFIG_URI: {.    
4030: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4040: 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 20 3d  onfig.bOpenUri =
4050: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4060: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4070: 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
4080: 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t: {.      rc = 
4090: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
40a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
40b0: 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
40c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
40d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
40e0: 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75  the lookaside bu
40f0: 66 66 65 72 73 20 66 6f 72 20 61 20 64 61 74 61  ffers for a data
4100: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
4110: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
4120: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
4130: 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69    .** If lookasi
4140: 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  de is already ac
4150: 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  tive, return SQL
4160: 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20  ITE_BUSY..**.** 
4170: 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74 65 72  The sz parameter
4180: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
4190: 66 20 62 79 74 65 73 20 69 6e 20 65 61 63 68 20  f bytes in each 
41a0: 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a  lookaside slot..
41b0: 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72 61 6d  ** The cnt param
41c0: 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62  eter is the numb
41d0: 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66  er of slots.  If
41e0: 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c 4c 20   pStart is NULL 
41f0: 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72  the.** space for
4200: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d   the lookaside m
4210: 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69 6e 65  emory is obtaine
4220: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
4230: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70  alloc()..** If p
4240: 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c  Start is not NUL
4250: 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73 7a 2a  L then it is sz*
4260: 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d 65 6d  cnt bytes of mem
4270: 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a  ory to use for.*
4280: 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  * the lookaside 
4290: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
42a0: 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61  c int setupLooka
42b0: 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  side(sqlite3 *db
42c0: 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
42d0: 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  t sz, int cnt){.
42e0: 20 20 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a    void *pStart;.
42f0: 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73    if( db->lookas
4300: 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20 20 20 20  ide.nOut ){.    
4310: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
4320: 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 72 65  SY;.  }.  /* Fre
4330: 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6c  e any existing l
4340: 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 20  ookaside buffer 
4350: 66 6f 72 20 74 68 69 73 20 68 61 6e 64 6c 65 20  for this handle 
4360: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f  before.  ** allo
4370: 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65  cating a new one
4380: 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 68 61 76   so we don't hav
4390: 65 20 74 6f 20 68 61 76 65 20 73 70 61 63 65 20  e to have space 
43a0: 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74 68 20 61  for .  ** both a
43b0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
43c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
43d0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
43e0: 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ced ){.    sqlit
43f0: 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b  e3_free(db->look
4400: 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20  aside.pStart);. 
4410: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 69 7a 65   }.  /* The size
4420: 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20   of a lookaside 
4430: 73 6c 6f 74 20 61 66 74 65 72 20 52 4f 55 4e 44  slot after ROUND
4440: 44 4f 57 4e 38 20 6e 65 65 64 73 20 74 6f 20 62  DOWN8 needs to b
4450: 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a 20 74 68  e larger.  ** th
4460: 61 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  an a pointer to 
4470: 62 65 20 75 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a  be useful..  */.
4480: 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e    sz = ROUNDDOWN
4490: 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d 50 3a 20  8(sz);  /* IMP: 
44a0: 52 2d 33 33 30 33 38 2d 30 39 33 38 32 20 2a 2f  R-33038-09382 */
44b0: 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69 6e 74 29  .  if( sz<=(int)
44c0: 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65  sizeof(Lookaside
44d0: 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d 20 30 3b  Slot*) ) sz = 0;
44e0: 0a 20 20 69 66 28 20 63 6e 74 3c 30 20 29 20 63  .  if( cnt<0 ) c
44f0: 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 7a  nt = 0;.  if( sz
4500: 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b  ==0 || cnt==0 ){
4510: 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20  .    sz = 0;.   
4520: 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 7d   pStart = 0;.  }
4530: 65 6c 73 65 20 69 66 28 20 70 42 75 66 3d 3d 30  else if( pBuf==0
4540: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
4550: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
4560: 28 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d  ();.    pStart =
4570: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
4580: 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a 20 49 4d  sz*cnt );  /* IM
4590: 50 3a 20 52 2d 36 31 39 34 39 2d 33 35 37 32 37  P: R-61949-35727
45a0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
45b0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
45c0: 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  ;.    if( pStart
45d0: 20 29 20 63 6e 74 20 3d 20 73 71 6c 69 74 65 33   ) cnt = sqlite3
45e0: 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53 74 61 72  MallocSize(pStar
45f0: 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t)/sz;.  }else{.
4600: 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 42 75      pStart = pBu
4610: 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f  f;.  }.  db->loo
4620: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20 3d 20  kaside.pStart = 
4630: 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f  pStart;.  db->lo
4640: 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20  okaside.pFree = 
4650: 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  0;.  db->lookasi
4660: 64 65 2e 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b  de.sz = (u16)sz;
4670: 0a 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b  .  if( pStart ){
4680: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
4690: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70  LookasideSlot *p
46a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
46b0: 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c   > (int)sizeof(L
46c0: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29  ookasideSlot*) )
46d0: 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61  ;.    p = (Looka
46e0: 73 69 64 65 53 6c 6f 74 2a 29 70 53 74 61 72 74  sideSlot*)pStart
46f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d  ;.    for(i=cnt-
4700: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
4710: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
4720: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46  db->lookaside.pF
4730: 72 65 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c  ree;.      db->l
4740: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d  ookaside.pFree =
4750: 20 70 3b 0a 20 20 20 20 20 20 70 20 3d 20 28 4c   p;.      p = (L
4760: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 26 28  ookasideSlot*)&(
4770: 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20  (u8*)p)[sz];.   
4780: 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61   }.    db->looka
4790: 73 69 64 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20  side.pEnd = p;. 
47a0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
47b0: 2e 62 45 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 20  .bEnabled = 1;. 
47c0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
47d0: 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75  .bMalloced = pBu
47e0: 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c  f==0 ?1:0;.  }el
47f0: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  se{.    db->look
4800: 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 30 3b 0a  aside.pEnd = 0;.
4810: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4820: 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a  e.bEnabled = 0;.
4830: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4840: 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b  e.bMalloced = 0;
4850: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
4860: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
4870: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 75 74  * Return the mut
4880: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
4890: 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
48a0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c  nnection..*/.sql
48b0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69  ite3_mutex *sqli
48c0: 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c  te3_db_mutex(sql
48d0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74  ite3 *db){.  ret
48e0: 75 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d  urn db->mutex;.}
48f0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20  ../*.** Free up 
4900: 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
4910: 73 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68  s we can from th
4920: 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65  e given database
4930: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  .** connection..
4940: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
4950: 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  b_release_memory
4960: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
4970: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
4980: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
4990: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69  ->mutex);.  sqli
49a0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
49b0: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
49c0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
49d0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
49e0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
49f0: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 29  t;.    if( pBt )
4a00: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
4a10: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
4a20: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
4a30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
4a40: 65 72 53 68 72 69 6e 6b 28 70 50 61 67 65 72 29  erShrink(pPager)
4a50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
4a60: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
4a70: 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  ll(db);.  sqlite
4a80: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
4a90: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
4aa0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
4ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61  ./*.** Configura
4ac0: 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20 66 6f  tion settings fo
4ad0: 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20  r an individual 
4ae0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
4af0: 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ion.*/.int sqlit
4b00: 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c  e3_db_config(sql
4b10: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70  ite3 *db, int op
4b20: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
4b30: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  t ap;.  int rc;.
4b40: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f    va_start(ap, o
4b50: 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p);.  switch( op
4b60: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
4b70: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f  ITE_DBCONFIG_LOO
4b80: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
4b90: 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f  void *pBuf = va_
4ba0: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20  arg(ap, void*); 
4bb0: 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d  /* IMP: R-26835-
4bc0: 31 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69  10964 */.      i
4bd0: 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
4be0: 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f  p, int);       /
4bf0: 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32  * IMP: R-47871-2
4c00: 35 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e  5994 */.      in
4c10: 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61  t cnt = va_arg(a
4c20: 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a  p, int);      /*
4c30: 20 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33   IMP: R-04460-53
4c40: 33 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  386 */.      rc 
4c50: 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65  = setupLookaside
4c60: 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63  (db, pBuf, sz, c
4c70: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
4c80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
4c90: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61  ult: {.      sta
4ca0: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
4cb0: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f   {.        int o
4cc0: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  p;      /* The o
4cd0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20  pcode */.       
4ce0: 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a   u32 mask;    /*
4cf0: 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74   Mask of the bit
4d00: 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67   in sqlite3.flag
4d10: 73 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a  s to set/clear *
4d20: 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f  /.      } aFlagO
4d30: 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  p[] = {.        
4d40: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
4d50: 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20  G_ENABLE_FKEY,  
4d60: 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e    SQLITE_Foreign
4d70: 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20 20 20  Keys    },.     
4d80: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
4d90: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47  NFIG_ENABLE_TRIG
4da0: 47 45 52 2c 20 53 51 4c 49 54 45 5f 45 6e 61 62  GER, SQLITE_Enab
4db0: 6c 65 54 72 69 67 67 65 72 20 20 7d 2c 0a 20 20  leTrigger  },.  
4dc0: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73      };.      uns
4dd0: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20  igned int i;.   
4de0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
4df0: 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  RROR; /* IMP: R-
4e00: 34 32 37 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20  42790-23372 */. 
4e10: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
4e20: 41 72 72 61 79 53 69 7a 65 28 61 46 6c 61 67 4f  ArraySize(aFlagO
4e30: 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  p); i++){.      
4e40: 20 20 69 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d    if( aFlagOp[i]
4e50: 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20  .op==op ){.     
4e60: 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d       int onoff =
4e70: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4e80: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
4e90: 2a 70 52 65 73 20 3d 20 76 61 5f 61 72 67 28 61  *pRes = va_arg(a
4ea0: 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
4eb0: 20 20 20 20 69 6e 74 20 6f 6c 64 46 6c 61 67 73      int oldFlags
4ec0: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
4ed0: 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e 6f 66          if( onof
4ee0: 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  f>0 ){.         
4ef0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
4f00: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b  aFlagOp[i].mask;
4f10: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
4f20: 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b   if( onoff==0 ){
4f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
4f40: 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46 6c 61 67  >flags &= ~aFlag
4f50: 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  Op[i].mask;.    
4f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4f70: 20 20 69 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d    if( oldFlags!=
4f80: 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20  db->flags ){.   
4f90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4fa0: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
4fb0: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
4fc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4fd0: 20 20 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a      if( pRes ){.
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
4ff0: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
5000: 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b   aFlagOp[i].mask
5010: 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )!=0;.          
5020: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
5030: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5040: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5060: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5070: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
5080: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
5090: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
50a0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 62 75  n true if the bu
50b0: 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63  ffer z[0..n-1] c
50c0: 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70 61 63  ontains all spac
50d0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
50e0: 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73  t allSpaces(cons
50f0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
5100: 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  ){.  while( n>0 
5110: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29  && z[n-1]==' ' )
5120: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72  { n--; }.  retur
5130: 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n n==0;.}../*.**
5140: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
5150: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66  ault collating f
5160: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42  unction named "B
5170: 49 4e 41 52 59 22 20 77 68 69 63 68 20 69 73 20  INARY" which is 
5180: 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61  always.** availa
5190: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
51a0: 65 20 70 61 64 46 6c 61 67 20 61 72 67 75 6d 65  e padFlag argume
51b0: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  nt is not NULL t
51c0: 68 65 6e 20 73 70 61 63 65 20 70 61 64 64 69 6e  hen space paddin
51d0: 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20  g at the end.** 
51e0: 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20 69 67  of strings is ig
51f0: 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 6d 70  nored.  This imp
5200: 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54 52 49  lements the RTRI
5210: 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  M collation..*/.
5220: 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f  static int binCo
5230: 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  llFunc(.  void *
5240: 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e  padFlag,.  int n
5250: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
5260: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
5270: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
5280: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
5290: 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b   rc, n;.  n = nK
52a0: 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79  ey1<nKey2 ? nKey
52b0: 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 72 63 20  1 : nKey2;.  rc 
52c0: 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20  = memcmp(pKey1, 
52d0: 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28  pKey2, n);.  if(
52e0: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
52f0: 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20 20 26  ( padFlag.     &
5300: 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68  & allSpaces(((ch
5310: 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b  ar*)pKey1)+n, nK
5320: 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26 20 61  ey1-n).     && a
5330: 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a  llSpaces(((char*
5340: 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32  )pKey2)+n, nKey2
5350: 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  -n).    ){.     
5360: 20 2f 2a 20 4c 65 61 76 65 20 72 63 20 75 6e 63   /* Leave rc unc
5370: 68 61 6e 67 65 64 20 61 74 20 30 20 2a 2f 0a 20  hanged at 0 */. 
5380: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5390: 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65  rc = nKey1 - nKe
53a0: 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  y2;.    }.  }.  
53b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
53c0: 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75 69 6c  .** Another buil
53d0: 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73  t-in collating s
53e0: 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e  equence: NOCASE.
53f0: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c   .**.** This col
5400: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
5410: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
5420: 65 20 75 73 65 64 20 66 6f 72 20 22 63 61 73 65  e used for "case
5430: 20 69 6e 64 65 70 65 6e 64 61 6e 74 0a 2a 2a 20   independant.** 
5440: 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c  comparison". SQL
5450: 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20  ite's knowledge 
5460: 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77  of upper and low
5470: 65 72 20 63 61 73 65 20 65 71 75 69 76 61 6c 65  er case equivale
5480: 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f  nts.** extends o
5490: 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20 63 68  nly to the 26 ch
54a0: 61 72 61 63 74 65 72 73 20 75 73 65 64 20 69 6e  aracters used in
54b0: 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e   the English lan
54c0: 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20  guage..**.** At 
54d0: 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65  the moment there
54e0: 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38   is only a UTF-8
54f0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
5500: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
5510: 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75  ocaseCollatingFu
5520: 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nc(.  void *NotU
5530: 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  sed,.  int nKey1
5540: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
5550: 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32  ey1,.  int nKey2
5560: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
5570: 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d  ey2.){.  int r =
5580: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
5590: 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63  (.      (const c
55a0: 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f  har *)pKey1, (co
55b0: 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 32  nst char *)pKey2
55c0: 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f  , (nKey1<nKey2)?
55d0: 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20  nKey1:nKey2);.  
55e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
55f0: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  (NotUsed);.  if(
5600: 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d   0==r ){.    r =
5610: 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20   nKey1-nKey2;.  
5620: 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
5630: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5640: 65 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d  e ROWID of the m
5650: 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72  ost recent inser
5660: 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36  t.*/.sqlite_int6
5670: 34 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  4 sqlite3_last_i
5680: 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69  nsert_rowid(sqli
5690: 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
56a0: 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  rn db->lastRowid
56b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
56c0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
56d0: 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d  changes in the m
56e0: 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20  ost recent call 
56f0: 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
5700: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
5710: 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  3_changes(sqlite
5720: 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  3 *db){.  return
5730: 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a   db->nChange;.}.
5740: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5750: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
5760: 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 64 61  ges since the da
5770: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61  tabase handle wa
5780: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  s opened..*/.int
5790: 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63   sqlite3_total_c
57a0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
57b0: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
57c0: 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a  ->nTotalChange;.
57d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
57e0: 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
57f0: 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ts. This functio
5800: 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74  n only manipulat
5810: 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  es fields of the
5820: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
5830: 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74 20 64  dle object, it d
5840: 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e  oes not close an
5850: 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61  y savepoints tha
5860: 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a  t may be open.**
5870: 20 61 74 20 74 68 65 20 62 2d 74 72 65 65 2f 70   at the b-tree/p
5880: 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76  ager level..*/.v
5890: 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  oid sqlite3Close
58a0: 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c 69 74  Savepoints(sqlit
58b0: 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65  e3 *db){.  while
58c0: 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  ( db->pSavepoint
58d0: 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f 69 6e   ){.    Savepoin
58e0: 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53  t *pTmp = db->pS
58f0: 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62  avepoint;.    db
5900: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  ->pSavepoint = p
5910: 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Tmp->pNext;.    
5920: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5930: 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64  , pTmp);.  }.  d
5940: 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  b->nSavepoint = 
5950: 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0;.  db->nStatem
5960: 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69  ent = 0;.  db->i
5970: 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65  sTransactionSave
5980: 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  point = 0;.}../*
5990: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 64  .** Invoke the d
59a0: 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69  estructor functi
59b0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
59c0: 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20 69 66  th FuncDef p, if
59d0: 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a   any. Except,.**
59e0: 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
59f0: 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20 6f 66  the last copy of
5a00: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64   the function, d
5a10: 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e  o not invoke it.
5a20: 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70   Multiple.** cop
5a30: 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ies of a single 
5a40: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63 72 65  function are cre
5a50: 61 74 65 64 20 77 68 65 6e 20 63 72 65 61 74 65  ated when create
5a60: 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 63  _function() is c
5a70: 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51  alled.** with SQ
5a80: 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68 65 20  LITE_ANY as the 
5a90: 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61  encoding..*/.sta
5aa0: 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74 69 6f  tic void functio
5ab0: 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33  nDestroy(sqlite3
5ac0: 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70   *db, FuncDef *p
5ad0: 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63  ){.  FuncDestruc
5ae0: 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72  tor *pDestructor
5af0: 20 3d 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f   = p->pDestructo
5b00: 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74 72 75  r;.  if( pDestru
5b10: 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73  ctor ){.    pDes
5b20: 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b  tructor->nRef--;
5b30: 0a 20 20 20 20 69 66 28 20 70 44 65 73 74 72 75  .    if( pDestru
5b40: 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  ctor->nRef==0 ){
5b50: 0a 20 20 20 20 20 20 70 44 65 73 74 72 75 63 74  .      pDestruct
5b60: 6f 72 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65  or->xDestroy(pDe
5b70: 73 74 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44  structor->pUserD
5b80: 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ata);.      sqli
5b90: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
5ba0: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
5bb0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
5bc0: 69 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71  isconnect all sq
5bd0: 6c 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63  lite3_vtab objec
5be0: 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ts that belong t
5bf0: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  o database conne
5c00: 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69  ction.** db. Thi
5c10: 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  s is called when
5c20: 20 64 62 20 69 73 20 62 65 69 6e 67 20 63 6c 6f   db is being clo
5c30: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sed..*/.static v
5c40: 6f 69 64 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  oid disconnectAl
5c50: 6c 56 74 61 62 28 73 71 6c 69 74 65 33 20 2a 64  lVtab(sqlite3 *d
5c60: 62 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  b){.#ifndef SQLI
5c70: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
5c80: 41 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ABLE.  int i;.  
5c90: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
5ca0: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
5cb0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
5cc0: 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d 61  i++){.    Schema
5cd0: 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e   *pSchema = db->
5ce0: 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a  aDb[i].pSchema;.
5cf0: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
5d00: 69 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  i].pSchema ){.  
5d10: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
5d20: 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  .      for(p=sql
5d30: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53  iteHashFirst(&pS
5d40: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
5d50: 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68   p; p=sqliteHash
5d60: 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20  Next(p)){.      
5d70: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
5d80: 28 54 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48  (Table *)sqliteH
5d90: 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20  ashData(p);.    
5da0: 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
5db0: 6c 28 70 54 61 62 29 20 29 20 73 71 6c 69 74 65  l(pTab) ) sqlite
5dc0: 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28  3VtabDisconnect(
5dd0: 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
5de0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
5df0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
5e00: 41 6c 6c 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20  All(db);.#else. 
5e10: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
5e20: 52 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  R(db);.#endif.}.
5e30: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
5e40: 55 45 20 69 66 20 64 61 74 61 62 61 73 65 20 63  UE if database c
5e50: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 73  onnection db has
5e60: 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65   unfinalized pre
5e70: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
5e80: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
5e90: 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  d sqlite3_backup
5ea0: 20 6f 62 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a 73   objects.  .*/.s
5eb0: 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 6e 65 63  tatic int connec
5ec0: 74 69 6f 6e 49 73 42 75 73 79 28 73 71 6c 69 74  tionIsBusy(sqlit
5ed0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6a  e3 *db){.  int j
5ee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5ef0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
5f00: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  b->mutex) );.  i
5f10: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 20 72  f( db->pVdbe ) r
5f20: 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 6a  eturn 1;.  for(j
5f30: 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a  =0; j<db->nDb; j
5f40: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
5f50: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d  pBt = db->aDb[j]
5f60: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
5f70: 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  t && sqlite3Btre
5f80: 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29  eIsInBackup(pBt)
5f90: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
5fa0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
5fb0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65  /*.** Close an e
5fc0: 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64  xisting SQLite d
5fd0: 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69  atabase.*/.stati
5fe0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 43 6c 6f  c int sqlite3Clo
5ff0: 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  se(sqlite3 *db, 
6000: 69 6e 74 20 66 6f 72 63 65 5a 6f 6d 62 69 65 29  int forceZombie)
6010: 7b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  {.  if( !db ){. 
6020: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6030: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
6040: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
6050: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
6060: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6070: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
6080: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
6090: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
60a0: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72  utex);..  /* For
60b0: 63 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63  ce xDisconnect c
60c0: 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74  alls on all virt
60d0: 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ual tables */.  
60e0: 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61  disconnectAllVta
60f0: 62 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  b(db);..  /* If 
6100: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
6110: 20 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f   open, the disco
6120: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63  nnectAllVtab() c
6130: 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77  all above.  ** w
6140: 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c  ill not have cal
6150: 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e  led the xDisconn
6160: 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20  ect() method on 
6170: 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a  any virtual.  **
6180: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64   tables in the d
6190: 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72  b->aVTrans[] arr
61a0: 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ay. The followin
61b0: 67 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c  g sqlite3VtabRol
61c0: 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c  lback().  ** cal
61d0: 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65  l will do so. We
61e0: 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73   need to do this
61f0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63   before the chec
6200: 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a  k for active.  *
6210: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
6220: 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76   below, as the v
6230: 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  -table implement
6240: 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f  ation may be sto
6250: 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70  ring.  ** some p
6260: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
6270: 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ts internally.. 
6280: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61   */.  sqlite3Vta
6290: 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a  bRollback(db);..
62a0: 20 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61    /* Legacy beha
62b0: 76 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c  vior (sqlite3_cl
62c0: 6f 73 65 28 29 20 62 65 68 61 76 69 6f 72 29 20  ose() behavior) 
62d0: 69 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a  is to return.  *
62e0: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66  * SQLITE_BUSY if
62f0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
6300: 63 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65  can not be close
6310: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
6320: 20 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65   */.  if( !force
6330: 5a 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63  Zombie && connec
6340: 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29  tionIsBusy(db) )
6350: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
6360: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
6370: 53 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 63  SY, "unable to c
6380: 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69  lose due to unfi
6390: 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20 20 20 20  nalized ".      
63a0: 20 22 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20   "statements or 
63b0: 75 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b 75  unfinished backu
63c0: 70 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ps");.    sqlite
63d0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
63e0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65  ->mutex);.    re
63f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
6400: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76  ;.  }..  /* Conv
6410: 65 72 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ert the connecti
6420: 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65  on into a zombie
6430: 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65 20   and then close 
6440: 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d  it..  */.  db->m
6450: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
6460: 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71  GIC_ZOMBIE;.  sq
6470: 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41  lite3LeaveMutexA
6480: 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62  ndCloseZombie(db
6490: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
64a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
64b0: 54 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20 6f  Two variations o
64c0: 6e 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e 74  n the public int
64d0: 65 72 66 61 63 65 20 66 6f 72 20 63 6c 6f 73 69  erface for closi
64e0: 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  ng a database.**
64f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65   connection. The
6500: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29   sqlite3_close()
6510: 20 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e 73   version returns
6520: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
6530: 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68 65 20 63  .** leaves the c
6540: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e  onnection option
6550: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 75 6e   if there are un
6560: 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72  finalized prepar
6570: 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ed.** statements
6580: 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73   or unfinished s
6590: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 73 2e 20  qlite3_backups. 
65a0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f   The sqlite3_clo
65b0: 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73 69  se_v2().** versi
65c0: 6f 6e 20 66 6f 72 63 65 73 20 74 68 65 20 63 6f  on forces the co
65d0: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f  nnection to beco
65e0: 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69 66 20 74  me a zombie if t
65f0: 68 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c  here are.** uncl
6600: 6f 73 65 64 20 72 65 73 6f 75 72 63 65 73 2c 20  osed resources, 
6610: 61 6e 64 20 61 72 72 61 6e 67 65 73 20 66 6f 72  and arranges for
6620: 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68   deallocation wh
6630: 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70  en the last.** p
6640: 72 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74  repare statement
6650: 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b   or sqlite3_back
6660: 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e  up closes..*/.in
6670: 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  t sqlite3_close(
6680: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65  sqlite3 *db){ re
6690: 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73  turn sqlite3Clos
66a0: 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73  e(db,0); }.int s
66b0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
66c0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65  sqlite3 *db){ re
66d0: 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73  turn sqlite3Clos
66e0: 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a  e(db,1); }.../*.
66f0: 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d 75 74  ** Close the mut
6700: 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 63  ex on database c
6710: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a  onnection db..**
6720: 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  .** Furthermore,
6730: 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   if database con
6740: 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20 61 20  nection db is a 
6750: 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67 20  zombie (meaning 
6760: 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 68 61  that there.** ha
6770: 73 20 62 65 65 6e 20 61 20 70 72 69 6f 72 20 63  s been a prior c
6780: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
6790: 6c 6f 73 65 28 64 62 29 20 6f 72 20 73 71 6c 69  lose(db) or sqli
67a0: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29  te3_close_v2(db)
67b0: 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73  ) and.** every s
67c0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 61 73 20  qlite3_stmt has 
67d0: 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  now been finaliz
67e0: 65 64 20 61 6e 64 20 65 76 65 72 79 20 73 71 6c  ed and every sql
67f0: 69 74 65 33 5f 62 61 63 6b 75 70 20 68 61 73 0a  ite3_backup has.
6800: 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 74 68 65  ** finished, the
6810: 6e 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75  n free all resou
6820: 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rces..*/.void sq
6830: 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41  lite3LeaveMutexA
6840: 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71  ndCloseZombie(sq
6850: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61  lite3 *db){.  Ha
6860: 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20  shElem *i;      
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6880: 20 48 61 73 68 20 74 61 62 6c 65 20 69 74 65 72   Hash table iter
6890: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ator */.  int j;
68a0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
68b0: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
68c0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72 20  sqlite3_stmt or 
68d0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f  sqlite3_backup o
68e0: 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69  bjects.  ** or i
68f0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
6900: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
6910: 6e 20 63 6c 6f 73 65 64 20 62 79 20 73 71 6c 69  n closed by sqli
6920: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a  te3_close_v2(),.
6930: 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c    ** then just l
6940: 65 61 76 65 20 74 68 65 20 6d 75 74 65 78 20 61  eave the mutex a
6950: 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
6960: 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 21    if( db->magic!
6970: 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f  =SQLITE_MAGIC_ZO
6980: 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69  MBIE || connecti
6990: 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a  onIsBusy(db) ){.
69a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
69b0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
69c0: 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  x);.    return;.
69d0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
69e0: 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
69f0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
6a00: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
6a10: 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a  nection has.  **
6a20: 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69   closed all sqli
6a30: 74 65 33 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c  te3_stmt and sql
6a40: 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65  ite3_backup obje
6a50: 63 74 73 20 61 6e 64 20 68 61 73 20 62 65 65 6e  cts and has been
6a60: 0a 20 20 2a 2a 20 70 61 73 65 64 20 74 6f 20 73  .  ** pased to s
6a70: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65  qlite3_close (me
6a80: 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20 69 73  aning that it is
6a90: 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65   a zombie).  The
6aa0: 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20  refore,.  ** go 
6ab0: 61 68 65 61 64 20 61 6e 64 20 66 72 65 65 20 61  ahead and free a
6ac0: 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ll resources..  
6ad0: 2a 2f 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e  */..  /* Free an
6ae0: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61  y outstanding Sa
6af0: 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
6b00: 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  es. */.  sqlite3
6b10: 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
6b20: 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  db);..  /* Close
6b30: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f   all database co
6b40: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 66  nnections */.  f
6b50: 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44  or(j=0; j<db->nD
6b60: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72  b; j++){.    str
6b70: 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64  uct Db *pDb = &d
6b80: 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69  b->aDb[j];.    i
6b90: 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20  f( pDb->pBt ){. 
6ba0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
6bb0: 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74 29  eClose(pDb->pBt)
6bc0: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42 74  ;.      pDb->pBt
6bd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
6be0: 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  j!=1 ){.        
6bf0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30  pDb->pSchema = 0
6c00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6c10: 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74    }.  /* Clear t
6c20: 68 65 20 54 45 4d 50 20 73 63 68 65 6d 61 20 73  he TEMP schema s
6c30: 65 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6c 61  eparately and la
6c40: 73 74 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  st */.  if( db->
6c50: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
6c60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63 68  {.    sqlite3Sch
6c70: 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62  emaClear(db->aDb
6c80: 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [1].pSchema);.  
6c90: 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  }.  sqlite3VtabU
6ca0: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a  nlockList(db);..
6cb0: 20 20 2f 2a 20 46 72 65 65 20 75 70 20 74 68 65    /* Free up the
6cc0: 20 61 72 72 61 79 20 6f 66 20 61 75 78 69 6c 69   array of auxili
6cd0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 2a 2f  ary databases */
6ce0: 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70  .  sqlite3Collap
6cf0: 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28  seDatabaseArray(
6d00: 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  db);.  assert( d
6d10: 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61  b->nDb<=2 );.  a
6d20: 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d  ssert( db->aDb==
6d30: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b  db->aDbStatic );
6d40: 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20  ..  /* Tell the 
6d50: 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63  code in notify.c
6d60: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63   that the connec
6d70: 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68  tion no longer h
6d80: 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f  olds any.  ** lo
6d90: 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  cks and does not
6da0: 20 72 65 71 75 69 72 65 20 61 6e 79 20 66 75 72   require any fur
6db0: 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69  ther unlock-noti
6dc0: 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20  fy callbacks..  
6dd0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  */.  sqlite3Conn
6de0: 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29  ectionClosed(db)
6df0: 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  ;..  for(j=0; j<
6e00: 41 72 72 61 79 53 69 7a 65 28 64 62 2d 3e 61 46  ArraySize(db->aF
6e10: 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20  unc.a); j++){.  
6e20: 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74    FuncDef *pNext
6e30: 2c 20 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20  , *pHash, *p;.  
6e40: 20 20 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e    for(p=db->aFun
6e50: 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61  c.a[j]; p; p=pHa
6e60: 73 68 29 7b 0a 20 20 20 20 20 20 70 48 61 73 68  sh){.      pHash
6e70: 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20   = p->pHash;.   
6e80: 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20     while( p ){. 
6e90: 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44         functionD
6ea0: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20  estroy(db, p);. 
6eb0: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
6ec0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
6ed0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6ee0: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70  b, p);.        p
6ef0: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20   = pNext;.      
6f00: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  }.    }.  }.  fo
6f10: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
6f20: 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  rst(&db->aCollSe
6f30: 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  q); i; i=sqliteH
6f40: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
6f50: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
6f60: 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c  = (CollSeq *)sql
6f70: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
6f80: 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e      /* Invoke an
6f90: 79 20 64 65 73 74 72 75 63 74 6f 72 73 20 72 65  y destructors re
6fa0: 67 69 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c  gistered for col
6fb0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
6fc0: 75 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20  user data. */.  
6fd0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
6fe0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
6ff0: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b  pColl[j].xDel ){
7000: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a  .        pColl[j
7010: 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e  ].xDel(pColl[j].
7020: 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pUser);.      }.
7030: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7040: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
7050: 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  l);.  }.  sqlite
7060: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
7070: 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64  aCollSeq);.#ifnd
7080: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
7090: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f  IRTUALTABLE.  fo
70a0: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
70b0: 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  rst(&db->aModule
70c0: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
70d0: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
70e0: 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28  Module *pMod = (
70f0: 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48  Module *)sqliteH
7100: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
7110: 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72  if( pMod->xDestr
7120: 6f 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64  oy ){.      pMod
7130: 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d  ->xDestroy(pMod-
7140: 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20  >pAux);.    }.  
7150: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7160: 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20  db, pMod);.  }. 
7170: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
7180: 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  r(&db->aModule);
7190: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
71a0: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
71b0: 54 45 5f 4f 4b 2c 20 30 29 3b 20 2f 2a 20 44 65  TE_OK, 0); /* De
71c0: 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61  allocates any ca
71d0: 63 68 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e  ched error strin
71e0: 67 73 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  gs. */.  if( db-
71f0: 3e 70 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >pErr ){.    sql
7200: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62  ite3ValueFree(db
7210: 2d 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73  ->pErr);.  }.  s
7220: 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e  qlite3CloseExten
7230: 73 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64 62  sions(db);..  db
7240: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
7250: 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20  _MAGIC_ERROR;.. 
7260: 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74   /* The temp-dat
7270: 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20  abase schema is 
7280: 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72  allocated differ
7290: 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f  ently from the o
72a0: 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a  ther schema.  **
72b0: 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20   objects (using 
72c0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64  sqliteMalloc() d
72d0: 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
72e0: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
72f0: 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20  Schema())..  ** 
7300: 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  So it needs to b
7310: 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f  e freed here. To
7320: 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c  do: Why not roll
7330: 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61   the temp schema
7340: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73   into.  ** the s
7350: 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ame sqliteMalloc
7360: 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68  () as the one th
7370: 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  at allocates the
7380: 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20   database .  ** 
7390: 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a  structure?.  */.
73a0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
73b0: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  db, db->aDb[1].p
73c0: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
73d0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
73e0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
73f0: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
7400: 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
7410: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
7420: 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ee(db->mutex);. 
7430: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f   assert( db->loo
7440: 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29  kaside.nOut==0 )
7450: 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61  ;  /* Fails on a
7460: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
7470: 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20  y leak */.  if( 
7480: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
7490: 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73  alloced ){.    s
74a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
74b0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
74c0: 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
74d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 52  LITE_ENABLE_SQLR
74e0: 52 0a 20 20 53 52 52 65 63 43 6c 6f 73 65 28 64  R.  SRRecClose(d
74f0: 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20  b);.#endif.  .  
7500: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29  sqlite3_free(db)
7510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
7520: 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ack all database
7530: 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72 69 70   files.  If trip
7540: 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49  Code is not SQLI
7550: 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61  TE_OK, then.** a
7560: 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  ny open cursors 
7570: 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20  are invalidated 
7580: 28 22 74 72 69 70 70 65 64 22 20 2d 20 61 73 20  ("tripped" - as 
7590: 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61 20 63  in "tripping a c
75a0: 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65  ircuit.** breake
75b0: 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74 6f 20  r") and made to 
75c0: 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64 65 20  return tripCode 
75d0: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
75e0: 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74 74 65   further.** atte
75f0: 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68 61 74  mpts to use that
7600: 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64   cursor..*/.void
7610: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
7620: 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  All(sqlite3 *db,
7630: 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a   int tripCode){.
7640: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
7650: 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 61 73  nTrans = 0;.  as
7660: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7670: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
7680: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
7690: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
76a0: 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  c();.  for(i=0; 
76b0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
76c0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20  .    Btree *p = 
76d0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
76e0: 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
76f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
7700: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20  reeIsInTrans(p) 
7710: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61  ){.        inTra
7720: 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ns = 1;.      }.
7730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
7740: 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72  eeRollback(p, tr
7750: 69 70 43 6f 64 65 29 3b 0a 20 20 20 20 20 20 64  ipCode);.      d
7760: 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72 61 6e  b->aDb[i].inTran
7770: 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  s = 0;.    }.  }
7780: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
7790: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71  llback(db);.  sq
77a0: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
77b0: 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 64  lloc();..  if( d
77c0: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
77d0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b  InternChanges ){
77e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
77f0: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
7800: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71  ents(db);.    sq
7810: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
7820: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
7830: 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  (db);.  }..  /* 
7840: 41 6e 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e  Any deferred con
7850: 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
7860: 6e 73 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  ns have now been
7870: 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20   resolved. */.  
7880: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
7890: 73 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  s = 0;..  /* If 
78a0: 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  one has been con
78b0: 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20  figured, invoke 
78c0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f  the rollback-hoo
78d0: 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  k callback */.  
78e0: 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  if( db->xRollbac
78f0: 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e  kCallback && (in
7900: 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75  Trans || !db->au
7910: 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20  toCommit) ){.   
7920: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
7930: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c  llback(db->pRoll
7940: 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a  backArg);.  }.}.
7950: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
7960: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68  static string th
7970: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
7980: 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73   kind of error s
7990: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a  pecified in the.
79a0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
79b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
79c0: 74 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63  te3ErrStr(int rc
79d0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
79e0: 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d  t char* const aM
79f0: 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  sg[] = {.    /* 
7a00: 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20  SQLITE_OK       
7a10: 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72     */ "not an er
7a20: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
7a30: 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20  ITE_ERROR       
7a40: 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72  */ "SQL logic er
7a50: 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64  ror or missing d
7a60: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
7a70: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
7a80: 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a      */ 0,.    /*
7a90: 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20   SQLITE_PERM    
7aa0: 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70      */ "access p
7ab0: 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64  ermission denied
7ac0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
7ad0: 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20  _ABORT       */ 
7ae0: 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73  "callback reques
7af0: 74 65 64 20 71 75 65 72 79 20 61 62 6f 72 74 22  ted query abort"
7b00: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
7b10: 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22  BUSY        */ "
7b20: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
7b30: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
7b40: 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a  TE_LOCKED      *
7b50: 2f 20 22 64 61 74 61 62 61 73 65 20 74 61 62 6c  / "database tabl
7b60: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
7b70: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45    /* SQLITE_NOME
7b80: 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20  M       */ "out 
7b90: 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20  of memory",.    
7ba0: 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  /* SQLITE_READON
7bb0: 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70  LY    */ "attemp
7bc0: 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61  t to write a rea
7bd0: 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c  donly database",
7be0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
7bf0: 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69  NTERRUPT   */ "i
7c00: 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20  nterrupted",.   
7c10: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   /* SQLITE_IOERR
7c20: 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20         */ "disk 
7c30: 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  I/O error",.    
7c40: 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  /* SQLITE_CORRUP
7c50: 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61  T     */ "databa
7c60: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
7c70: 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20   malformed",.   
7c80: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   /* SQLITE_NOTFO
7c90: 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f  UND    */ "unkno
7ca0: 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20  wn operation",. 
7cb0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c     /* SQLITE_FUL
7cc0: 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74  L        */ "dat
7cd0: 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73  abase or disk is
7ce0: 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53   full",.    /* S
7cf0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20  QLITE_CANTOPEN  
7d00: 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20    */ "unable to 
7d10: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
7d20: 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  le",.    /* SQLI
7d30: 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a  TE_PROTOCOL    *
7d40: 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  / "locking proto
7d50: 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  col",.    /* SQL
7d60: 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20 20  ITE_EMPTY       
7d70: 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69  */ "table contai
7d80: 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20  ns no data",.   
7d90: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d   /* SQLITE_SCHEM
7da0: 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  A      */ "datab
7db0: 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63  ase schema has c
7dc0: 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20  hanged",.    /* 
7dd0: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20  SQLITE_TOOBIG   
7de0: 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72     */ "string or
7df0: 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a   blob too big",.
7e00: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f      /* SQLITE_CO
7e10: 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f  NSTRAINT  */ "co
7e20: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
7e30: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
7e40: 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22  MISMATCH    */ "
7e50: 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63  datatype mismatc
7e60: 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  h",.    /* SQLIT
7e70: 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f  E_MISUSE      */
7e80: 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e   "library routin
7e90: 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20  e called out of 
7ea0: 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f  sequence",.    /
7eb0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20  * SQLITE_NOLFS  
7ec0: 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66       */ "large f
7ed0: 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64  ile support is d
7ee0: 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a  isabled",.    /*
7ef0: 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20   SQLITE_AUTH    
7f00: 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a      */ "authoriz
7f10: 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20  ation denied",. 
7f20: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
7f30: 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61 75 78  MAT      */ "aux
7f40: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
7f50: 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20  format error",. 
7f60: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e     /* SQLITE_RAN
7f70: 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62 69 6e  GE       */ "bin
7f80: 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65  d or column inde
7f90: 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c  x out of range",
7fa0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
7fb0: 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66  OTADB      */ "f
7fc0: 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65 64  ile is encrypted
7fd0: 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74   or is not a dat
7fe0: 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 63  abase",.  };.  c
7ff0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
8000: 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  = "unknown error
8010: 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63 20  ";.  switch( rc 
8020: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
8030: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
8040: 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20  K: {.      zErr 
8050: 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20  = "abort due to 
8060: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
8070: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8080: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
8090: 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20     rc &= 0xff;. 
80a0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
80b0: 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41 72 72  rc>=0) && rc<Arr
80c0: 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26 26 20  aySize(aMsg) && 
80d0: 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20  aMsg[rc]!=0 ){. 
80e0: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 61 4d         zErr = aM
80f0: 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a  sg[rc];.      }.
8100: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8110: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8120: 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zErr;.}../*.** T
8130: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
8140: 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61  ements a busy ca
8150: 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65  llback that slee
8160: 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20  ps and tries.** 
8170: 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69  again until a ti
8180: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72  meout value is r
8190: 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d  eached.  The tim
81a0: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a  eout value is.**
81b0: 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
81c0: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
81d0: 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  ds passed in as 
81e0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
81f0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
8200: 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75   int sqliteDefau
8210: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a  ltBusyCallback(.
8220: 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20   void *ptr,     
8230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
8240: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8250: 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20   */. int count  
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8270: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
8280: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
8290: 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53  busy */.){.#if S
82a0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20  QLITE_OS_WIN || 
82b0: 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53  (defined(HAVE_US
82c0: 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
82d0: 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63 20 63  LEEP).  static c
82e0: 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d  onst u8 delays[]
82f0: 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20   =.     { 1, 2, 
8300: 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32  5, 10, 15, 20, 2
8310: 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c  5, 25,  25,  50,
8320: 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73    50, 100 };.  s
8330: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74  tatic const u8 t
8340: 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  otals[] =.     {
8350: 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38   0, 1, 3,  8, 18
8360: 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30  , 33, 53, 78, 10
8370: 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38  3, 128, 178, 228
8380: 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45   };.# define NDE
8390: 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28 64 65  LAY ArraySize(de
83a0: 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20  lays).  sqlite3 
83b0: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
83c0: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
83d0: 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69  out = db->busyTi
83e0: 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c  meout;.  int del
83f0: 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73  ay, prior;..  as
8400: 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29  sert( count>=0 )
8410: 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20  ;.  if( count < 
8420: 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65  NDELAY ){.    de
8430: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75  lay = delays[cou
8440: 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  nt];.    prior =
8450: 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a   totals[count];.
8460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c    }else{.    del
8470: 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c  ay = delays[NDEL
8480: 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72  AY-1];.    prior
8490: 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59   = totals[NDELAY
84a0: 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75  -1] + delay*(cou
84b0: 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a  nt-(NDELAY-1));.
84c0: 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20    }.  if( prior 
84d0: 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75  + delay > timeou
84e0: 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  t ){.    delay =
84f0: 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72   timeout - prior
8500: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c  ;.    if( delay<
8510: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
8520: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
8530: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65  eep(db->pVfs, de
8540: 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  lay*1000);.  ret
8550: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73  urn 1;.#else.  s
8560: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
8570: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
8580: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73  nt timeout = ((s
8590: 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62  qlite3 *)ptr)->b
85a0: 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66  usyTimeout;.  if
85b0: 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30  ( (count+1)*1000
85c0: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
85d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
85e0: 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70    sqlite3OsSleep
85f0: 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30  (db->pVfs, 10000
8600: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
8610: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
8620: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
8630: 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a  n busy handler..
8640: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8650: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
8660: 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66  n an operation f
8670: 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63  ailed with a loc
8680: 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  k..** If this ro
8690: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f  utine returns no
86a0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
86b0: 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66   is retried.  If
86c0: 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30   it.** returns 0
86d0: 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  , the operation 
86e0: 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53  aborts with an S
86f0: 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
8700: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8710: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
8720: 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  r(BusyHandler *p
8730: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
8740: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c  f( NEVER(p==0) |
8750: 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c  | p->xFunc==0 ||
8760: 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65   p->nBusy<0 ) re
8770: 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70  turn 0;.  rc = p
8780: 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c  ->xFunc(p->pArg,
8790: 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66   p->nBusy);.  if
87a0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc==0 ){.    p
87b0: 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20  ->nBusy = -1;.  
87c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42  }else{.    p->nB
87d0: 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  usy++;.  }.  ret
87e0: 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  urn rc; .}../*.*
87f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
8800: 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c  ets the busy cal
8810: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
8820: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
8830: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
8840: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
8850: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
8860: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
8870: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
8880: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
8890: 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  db,.  int (*xBus
88a0: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20  y)(void*,int),. 
88b0: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
88c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
88d0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
88e0: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
88f0: 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79  er.xFunc = xBusy
8900: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
8910: 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b  ler.pArg = pArg;
8920: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
8930: 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
8940: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
8950: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
8960: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8970: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
8980: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
8990: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
89a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
89b0: 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73  sets the progres
89c0: 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  s callback for a
89d0: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
89e0: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
89f0: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
8a00: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
8a10: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  en argument. The
8a20: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
8a30: 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e  ck will.** be in
8a40: 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73  voked every nOps
8a50: 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69   opcodes..*/.voi
8a60: 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65  d sqlite3_progre
8a70: 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  ss_handler(.  sq
8a80: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
8a90: 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a  t nOps,.  int (*
8aa0: 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a  xProgress)(void*
8ab0: 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ), .  void *pArg
8ac0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
8ad0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
8ae0: 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73  tex);.  if( nOps
8af0: 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50  >0 ){.    db->xP
8b00: 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72  rogress = xProgr
8b10: 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  ess;.    db->nPr
8b20: 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f 70 73  ogressOps = nOps
8b30: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
8b40: 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  essArg = pArg;. 
8b50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
8b60: 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  xProgress = 0;. 
8b70: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
8b80: 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  Ops = 0;.    db-
8b90: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
8ba0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
8bb0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
8bc0: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
8bd0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
8be0: 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20  outine installs 
8bf0: 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68  a default busy h
8c00: 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74  andler that wait
8c10: 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65  s for the.** spe
8c20: 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66  cified number of
8c30: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65   milliseconds be
8c40: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30  fore returning 0
8c50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8c60: 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71  _busy_timeout(sq
8c70: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d  lite3 *db, int m
8c80: 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20 29  s){.  if( ms>0 )
8c90: 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69  {.    db->busyTi
8ca0: 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 20 20  meout = ms;.    
8cb0: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
8cc0: 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44  dler(db, sqliteD
8cd0: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
8ce0: 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a  ck, (void*)db);.
8cf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
8d00: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
8d10: 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  r(db, 0, 0);.  }
8d20: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8d30: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  _OK;.}../*.** Ca
8d40: 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20  use any pending 
8d50: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f  operation to sto
8d60: 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73  p at its earlies
8d70: 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a  t opportunity..*
8d80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69  /.void sqlite3_i
8d90: 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33  nterrupt(sqlite3
8da0: 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31 2e   *db){.  db->u1.
8db0: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20  isInterrupted = 
8dc0: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  1;.}.../*.** Thi
8dd0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78  s function is ex
8de0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61  actly the same a
8df0: 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  s sqlite3_create
8e00: 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63  _function(), exc
8e10: 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ept.** that it i
8e20: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65  s designed to be
8e30: 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72   called by inter
8e40: 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69  nal code. The di
8e50: 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74  fference is.** t
8e60: 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  hat if a malloc(
8e70: 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74  ) fails in sqlit
8e80: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
8e90: 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63  on(), an error c
8ea0: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ode.** is return
8eb0: 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f  ed and the mallo
8ec0: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65  cFailed flag cle
8ed0: 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  ared. .*/.int sq
8ee0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
8ef0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
8f00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
8f10: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69  unctionName,.  i
8f20: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
8f30: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65  nc,.  void *pUse
8f40: 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a  rData,.  void (*
8f50: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
8f60: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
8f70: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
8f80: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
8f90: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
8fa0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
8fb0: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
8fc0: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
8fd0: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e  context*),.  Fun
8fe0: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65  cDestructor *pDe
8ff0: 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75  structor.){.  Fu
9000: 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20  ncDef *p;.  int 
9010: 6e 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65 72 74  nName;..  assert
9020: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9030: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
9040: 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69  );.  if( zFuncti
9050: 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20  onName==0 ||.   
9060: 20 20 20 28 78 46 75 6e 63 20 26 26 20 28 78 46     (xFunc && (xF
9070: 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29 29 20  inal || xStep)) 
9080: 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46 75 6e  || .      (!xFun
9090: 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26 26 20  c && (xFinal && 
90a0: 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20  !xStep)) ||.    
90b0: 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 21 78    (!xFunc && (!x
90c0: 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70 29 29  Final && xStep))
90d0: 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72 67 3c   ||.      (nArg<
90e0: 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54  -1 || nArg>SQLIT
90f0: 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
9100: 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28 32 35  RG) ||.      (25
9110: 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  5<(nName = sqlit
9120: 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e  e3Strlen30( zFun
9130: 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a  ctionName))) ){.
9140: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9150: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
9160: 20 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51   }.  .#ifndef SQ
9170: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
9180: 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55    /* If SQLITE_U
9190: 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65  TF16 is specifie
91a0: 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  d as the encodin
91b0: 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72  g type, transfor
91c0: 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f  m this.  ** to o
91d0: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
91e0: 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
91f0: 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65  TF16BE using the
9200: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  .  ** SQLITE_UTF
9210: 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20  16NATIVE macro. 
9220: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
9230: 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
9240: 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  lly..  **.  ** I
9250: 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20  f SQLITE_ANY is 
9260: 73 70 65 63 69 66 69 65 64 2c 20 61 64 64 20 74  specified, add t
9270: 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  hree versions of
9280: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20   the function.  
9290: 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20 74  ** to the hash t
92a0: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
92b0: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46   enc==SQLITE_UTF
92c0: 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20  16 ){.    enc = 
92d0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
92e0: 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  VE;.  }else if( 
92f0: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20  enc==SQLITE_ANY 
9300: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
9310: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
9320: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
9330: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
9340: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
9350: 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61           pUserDa
9360: 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70  ta, xFunc, xStep
9370: 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72  , xFinal, pDestr
9380: 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  uctor);.    if( 
9390: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
93a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
93b0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
93c0: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
93d0: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
93e0: 46 31 36 4c 45 2c 0a 20 20 20 20 20 20 20 20 20  F16LE,.         
93f0: 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e   pUserData, xFun
9400: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
9410: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
9420: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
9430: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9440: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
9450: 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20      }.    enc = 
9460: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a  SQLITE_UTF16BE;.
9470: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20    }.#else.  enc 
9480: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
9490: 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68  endif.  .  /* Ch
94a0: 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69  eck if an existi
94b0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  ng function is b
94c0: 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20  eing overridden 
94d0: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73  or deleted. If s
94e0: 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72  o,.  ** and ther
94f0: 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
9500: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51  , then return SQ
9510: 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20  LITE_BUSY. If a 
9520: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
9530: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
9540: 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68  n/deleted but th
9550: 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76  ere are no activ
9560: 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65  e VMs, allow the
9570: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  .  ** operation 
9580: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20  to continue but 
9590: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
95a0: 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  recompiled state
95b0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20  ments..  */.  p 
95c0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
95d0: 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74  ction(db, zFunct
95e0: 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  ionName, nName, 
95f0: 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30  nArg, (u8)enc, 0
9600: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
9610: 3e 69 50 72 65 66 45 6e 63 3d 3d 65 6e 63 20 26  >iPrefEnc==enc &
9620: 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20  & p->nArg==nArg 
9630: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  ){.    if( db->a
9640: 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a  ctiveVdbeCnt ){.
9650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9660: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
9670: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
9680: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
9690: 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74  odify user-funct
96a0: 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76  ion due to activ
96b0: 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
96c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
96d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
96e0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
96f0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
9700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
9710: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
9720: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
9730: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
9740: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
9750: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
9760: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
9770: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
9780: 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20   1);.  assert(p 
9790: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
97a0: 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29  led);.  if( !p )
97b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
97c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
97d0: 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72    /* If an older
97e0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
97f0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20  function with a 
9800: 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72  configured destr
9810: 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65  uctor is.  ** be
9820: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76  ing replaced inv
9830: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
9840: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65  or function here
9850: 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44  . */.  functionD
9860: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a  estroy(db, p);..
9870: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
9880: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
9890: 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ctor->nRef++;.  
98a0: 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74  }.  p->pDestruct
98b0: 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72  or = pDestructor
98c0: 3b 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 30  ;.  p->flags = 0
98d0: 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78  ;.  p->xFunc = x
98e0: 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70  Func;.  p->xStep
98f0: 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78   = xStep;.  p->x
9900: 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61  Finalize = xFina
9910: 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74  l;.  p->pUserDat
9920: 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20  a = pUserData;. 
9930: 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29   p->nArg = (u16)
9940: 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53  nArg;.  return S
9950: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
9960: 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73  ** Create new us
9970: 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  er functions..*/
9980: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
9990: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
99a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
99b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
99c0: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
99d0: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
99e0: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  *p,.  void (*xFu
99f0: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
9a00: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
9a10: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
9a20: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
9a30: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
9a40: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
9a50: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
9a60: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
9a70: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75  text*).){.  retu
9a80: 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
9a90: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
9aa0: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
9ab0: 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  nc, p, xFunc, xS
9ac0: 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tep,.           
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c           xFinal,
9af0: 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69   0);.}..int sqli
9b00: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
9b10: 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
9b20: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
9b30: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
9b40: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
9b50: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
9b60: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
9b70: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
9b80: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
9b90: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
9ba0: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
9bb0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
9bc0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
9bd0: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
9be0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
9bf0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  ,.  void (*xDest
9c00: 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a  roy)(void *).){.
9c10: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
9c20: 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44  E_ERROR;.  FuncD
9c30: 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20  estructor *pArg 
9c40: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
9c50: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
9c60: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65  utex);.  if( xDe
9c70: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72  stroy ){.    pAr
9c80: 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63  g = (FuncDestruc
9c90: 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  tor *)sqlite3DbM
9ca0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
9cb0: 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63  zeof(FuncDestruc
9cc0: 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  tor));.    if( !
9cd0: 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44  pArg ){.      xD
9ce0: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20  estroy(p);.     
9cf0: 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d   goto out;.    }
9d00: 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74  .    pArg->xDest
9d10: 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a  roy = xDestroy;.
9d20: 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44      pArg->pUserD
9d30: 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72  ata = p;.  }.  r
9d40: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
9d50: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c  eFunc(db, zFunc,
9d60: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
9d70: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
9d80: 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66  nal, pArg);.  if
9d90: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
9da0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nRef==0 ){.    a
9db0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
9dc0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73  E_OK );.    xDes
9dd0: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c  troy(p);.    sql
9de0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9df0: 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a  Arg);.  }.. out:
9e00: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
9e10: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
9e20: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9e30: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
9e40: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
9e50: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9e60: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20  _OMIT_UTF16.int 
9e70: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
9e80: 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  unction16(.  sql
9e90: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
9ea0: 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f  t void *zFunctio
9eb0: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
9ec0: 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  g,.  int eTextRe
9ed0: 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  p,.  void *p,.  
9ee0: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
9ef0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
9f00: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
9f10: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
9f20: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
9f30: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
9f40: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
9f50: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
9f60: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
9f70: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
9f80: 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71  ar *zFunc8;.  sq
9f90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
9fa0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
9fb0: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
9fc0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
9fd0: 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55  Func8 = sqlite3U
9fe0: 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e  tf16to8(db, zFun
9ff0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53  ctionName, -1, S
a000: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
a010: 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  E);.  rc = sqlit
a020: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
a030: 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65   zFunc8, nArg, e
a040: 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46 75 6e  TextRep, p, xFun
a050: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
a060: 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ,0);.  sqlite3Db
a070: 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29  Free(db, zFunc8)
a080: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
a090: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
a0a0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a0b0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
a0c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
a0d0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
a0e0: 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
a0f0: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
a100: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
a110: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
a120: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
a130: 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
a140: 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
a150: 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
a160: 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
a170: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
a180: 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
a190: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
a1a0: 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
a1b0: 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
a1c0: 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
a1d0: 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
a1e0: 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
a1f0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
a200: 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
a210: 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
a220: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
a230: 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
a240: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
a250: 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
a260: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
a270: 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
a280: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
a290: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
a2a0: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
a2b0: 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
a2c0: 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
a2d0: 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
a2e0: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
a2f0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
a300: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
a310: 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
a320: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
a330: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
a340: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
a350: 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E_OK;.  sqlite3_
a360: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
a370: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71  mutex);.  if( sq
a380: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
a390: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  n(db, zName, nNa
a3a0: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
a3b0: 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a  _UTF8, 0)==0 ){.
a3c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a3d0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
a3e0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
a3f0: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a410: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e      0, sqlite3In
a420: 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  validFunction, 0
a430: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
a440: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
a450: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
a460: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
a470: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
a480: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
a490: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a4a0: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65  T_TRACE./*.** Re
a4b0: 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66  gister a trace f
a4c0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
a4d0: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
a4e0: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
a4f0: 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65  d trace.** is re
a500: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
a510: 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e  A NULL trace fun
a520: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
a530: 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65   no tracing is e
a540: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
a550: 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73  NULL.** trace is
a560: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
a570: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
a580: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
a590: 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a  start of each.**
a5a0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
a5b0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
a5c0: 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a  _trace(sqlite3 *
a5d0: 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63  db, void (*xTrac
a5e0: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
a5f0: 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
a600: 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  g){.  void *pOld
a610: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
a620: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
a630: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
a640: 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62  >pTraceArg;.  db
a650: 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63  ->xTrace = xTrac
a660: 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
a670: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
a680: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
a690: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
a6a0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a  eturn pOld;.}./*
a6b0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70  .** Register a p
a6c0: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e  rofile function.
a6d0: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
a6e0: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
a6f0: 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72  egistered .** pr
a700: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69  ofile function i
a710: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
a720: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69  .** A NULL profi
a730: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  le function mean
a740: 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c  s that no profil
a750: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
a760: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
a770: 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69  profile is a poi
a780: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
a790: 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
a7a0: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
a7b0: 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20  sion of.** each 
a7c0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68  SQL statement th
a7d0: 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f  at is run..*/.vo
a7e0: 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66  id *sqlite3_prof
a7f0: 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ile(.  sqlite3 *
a800: 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72  db,.  void (*xPr
a810: 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  ofile)(void*,con
a820: 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f  st char*,sqlite_
a830: 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  uint64),.  void 
a840: 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20  *pArg.){.  void 
a850: 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  *pOld;.  sqlite3
a860: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
a870: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
a880: 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72  = db->pProfileAr
a890: 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c  g;.  db->xProfil
a8a0: 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20  e = xProfile;.  
a8b0: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20  db->pProfileArg 
a8c0: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
a8d0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
a8e0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
a8f0: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69  rn pOld;.}.#endi
a900: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
a910: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
a920: 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63   Register a func
a930: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
a940: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
a950: 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a  ction commits..*
a960: 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64  * If the invoked
a970: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
a980: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
a990: 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f   the commit beco
a9a0: 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63  mes a.** rollbac
a9b0: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  k..*/.void *sqli
a9c0: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
a9d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a9f0: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
aa00: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
aa10: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
aa20: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
aa30: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
aa40: 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
aa50: 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
aa60: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
aa70: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
aa80: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
aa90: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
aaa0: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
aab0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
aac0: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
aad0: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20  b->pCommitArg;. 
aae0: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
aaf0: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
ab00: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ;.  db->pCommitA
ab10: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
ab20: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
ab30: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
ab40: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f  eturn pOld;.}../
ab50: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
ab60: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
ab70: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
ab80: 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
ab90: 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
aba0: 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
abb0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
abc0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
abd0: 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74  d *sqlite3_updat
abe0: 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
abf0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
ac00: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
ac10: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
ac20: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
ac30: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
ac40: 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  oid*,int,char co
ac50: 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74  nst *,char const
ac60: 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29   *,sqlite_int64)
ac70: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ac90: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
aca0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
acb0: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20    void *pRet;.  
acc0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
acd0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
ace0: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70    pRet = db->pUp
acf0: 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  dateArg;.  db->x
ad00: 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
ad10: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
ad20: 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70  ->pUpdateArg = p
ad30: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
ad40: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
ad50: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
ad60: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
ad70: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
ad80: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
ad90: 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
ada0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
adb0: 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68  ed.** back by th
adc0: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
add0: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
ade0: 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63  *sqlite3_rollbac
adf0: 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  k_hook(.  sqlite
ae00: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
ae10: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
ae20: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
ae30: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
ae40: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
ae50: 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61  oid*), /* Callba
ae60: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
ae70: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
ae80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
ae90: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
aea0: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
aeb0: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
aec0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
aed0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
aee0: 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62  Ret = db->pRollb
aef0: 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52  ackArg;.  db->xR
af00: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
af10: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
af20: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20  b->pRollbackArg 
af30: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
af40: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
af50: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
af60: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
af70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
af80: 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  WAL./*.** The sq
af90: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
afa0: 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
afb0: 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ered by sqlite3_
afc0: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
afd0: 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20  nt()..** Invoke 
afe0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
aff0: 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75  kpoint if the nu
b000: 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
b010: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a  n the log file.*
b020: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
b030: 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72  n sqlite3.pWalAr
b040: 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74  g cast to an int
b050: 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65 20  eger (the value 
b060: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a  configured by.**
b070: 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
b080: 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20  int())..*/ .int 
b090: 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
b0a0: 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70  tHook(.  void *p
b0b0: 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  ClientData,     
b0c0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20  /* Argument */. 
b0d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
b0e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
b0f0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ction */.  const
b100: 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
b110: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f    /* Database */
b120: 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20  .  int nFrame   
b130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
b140: 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20  e of WAL */.){. 
b150: 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c   if( nFrame>=SQL
b160: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
b170: 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20  ClientData) ){. 
b180: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
b190: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
b1a0: 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63     sqlite3_wal_c
b1b0: 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44  heckpoint(db, zD
b1c0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  b);.    sqlite3E
b1d0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
b1e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
b1f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
b200: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
b210: 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
b220: 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c  Configure an sql
b230: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
b240: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f  callback to auto
b250: 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70  matically checkp
b260: 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61  oint.** a databa
b270: 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74  se after committ
b280: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
b290: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
b2a0: 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65  Frame or.** more
b2b0: 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
b2c0: 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67  og file. Passing
b2d0: 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74   zero or a negat
b2e0: 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68 65  ive value as the
b2f0: 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d  .** nFrame param
b300: 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61 75  eter disables au
b310: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
b320: 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a  nts entirely..**
b330: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
b340: 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 74   registered by t
b350: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70  his function rep
b360: 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74 69  laces any existi
b370: 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72  ng callback.** r
b380: 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 20  egistered using 
b390: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
b3a0: 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65  (). Likewise, re
b3b0: 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c  gistering a call
b3c0: 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71  back.** using sq
b3d0: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
b3e0: 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 75   disables the au
b3f0: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
b400: 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20  nt mechanism.** 
b410: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68  configured by th
b420: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
b430: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
b440: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73  autocheckpoint(s
b450: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
b460: 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20  nFrame){.#ifdef 
b470: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
b480: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
b490: 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44  ER(db);.  UNUSED
b4a0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d  _PARAMETER(nFram
b4b0: 65 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  e);.#else.  if( 
b4c0: 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20  nFrame>0 ){.    
b4d0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
b4e0: 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44  (db, sqlite3WalD
b4f0: 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49  efaultHook, SQLI
b500: 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46  TE_INT_TO_PTR(nF
b510: 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  rame));.  }else{
b520: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
b530: 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b  _hook(db, 0, 0);
b540: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
b550: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b560: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
b570: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
b580: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
b590: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
b5a0: 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  on is written.**
b5b0: 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d   into the write-
b5c0: 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69  ahead-log by thi
b5d0: 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
b5e0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
b5f0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
b600: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b620: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
b630: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
b640: 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
b650: 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f  t(*xCallback)(vo
b660: 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  id *, sqlite3*, 
b670: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
b680: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  ),.  void *pArg 
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
b6b0: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
b6c0: 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a   xCallback() */.
b6d0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
b6e0: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69  E_OMIT_WAL.  voi
b6f0: 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
b700: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
b710: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
b720: 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b  t = db->pWalArg;
b730: 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62  .  db->xWalCallb
b740: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
b750: 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d  .  db->pWalArg =
b760: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
b770: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
b780: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
b790: 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20  n pRet;.#else.  
b7a0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
b7b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70  .}../*.** Checkp
b7c0: 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44  oint database zD
b7d0: 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
b7e0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
b7f0: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
b800: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
b810: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
b820: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  se handle */.  c
b830: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b850: 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68  * Name of attach
b860: 65 64 20 64 61 74 61 62 61 73 65 20 28 6f 72 20  ed database (or 
b870: 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65  NULL) */.  int e
b880: 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Mode,           
b890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
b8a0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
b8b0: 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  * value */.  int
b8c0: 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20   *pnLog,        
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b8e0: 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c  OUT: Size of WAL
b8f0: 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a   log in frames *
b900: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20  /.  int *pnCkpt 
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b920: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61      /* OUT: Tota
b930: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  l number of fram
b940: 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  es checkpointed 
b950: 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  */.){.#ifdef SQL
b960: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72  ITE_OMIT_WAL.  r
b970: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b980: 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
b9b0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
b9c0: 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41   iDb = SQLITE_MA
b9d0: 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20  X_ATTACHED;  /* 
b9e0: 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e  sqlite3.aDb[] in
b9f0: 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65  dex of db to che
ba00: 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  ckpoint */..  /*
ba10: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
ba20: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
ba30: 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61   to -1 in case a
ba40: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
ba50: 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29  */.  if( pnLog )
ba60: 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20   *pnLog = -1;.  
ba70: 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e  if( pnCkpt ) *pn
ba80: 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73  Ckpt = -1;..  as
ba90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
baa0: 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e 53 51 4c  CKPOINT_FULL>SQL
bab0: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
bac0: 41 53 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  ASSIVE );.  asse
bad0: 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
bae0: 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51 4c 49 54  POINT_FULL<SQLIT
baf0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
bb00: 54 41 52 54 20 29 3b 0a 20 20 61 73 73 65 72 74  TART );.  assert
bb10: 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
bb20: 49 4e 54 5f 50 41 53 53 49 56 45 2b 32 3d 3d 53  INT_PASSIVE+2==S
bb30: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
bb40: 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20 69 66  _RESTART );.  if
bb50: 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43  ( eMode<SQLITE_C
bb60: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
bb70: 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54  E || eMode>SQLIT
bb80: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
bb90: 54 41 52 54 20 29 7b 0a 20 20 20 20 72 65 74 75  TART ){.    retu
bba0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
bbb0: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
bbc0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
bbd0: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
bbe0: 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a  Db && zDb[0] ){.
bbf0: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
bc00: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
bc10: 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  zDb);.  }.  if( 
bc20: 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  iDb<0 ){.    rc 
bc30: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
bc40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bc50: 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f  (db, SQLITE_ERRO
bc60: 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  R, "unknown data
bc70: 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b  base: %s", zDb);
bc80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
bc90: 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70   = sqlite3Checkp
bca0: 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65 4d  oint(db, iDb, eM
bcb0: 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
bcc0: 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pt);.    sqlite3
bcd0: 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
bce0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
bcf0: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
bd00: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
bd10: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
bd20: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
bd30: 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
bd40: 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
bd50: 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66  database zDb. If
bd60: 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72   zDb is NULL, or
bd70: 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a   if the buffer z
bd80: 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  Db points.** to 
bd90: 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d  contains a zero-
bda0: 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20 61  length string, a
bdb0: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
bdc0: 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63 68  bases are .** ch
bdd0: 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69  eckpointed..*/.i
bde0: 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  nt sqlite3_wal_c
bdf0: 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
be00: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
be10: 72 20 2a 7a 44 62 29 7b 0a 20 20 72 65 74 75 72  r *zDb){.  retur
be20: 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  n sqlite3_wal_ch
be30: 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20  eckpoint_v2(db, 
be40: 7a 44 62 2c 20 53 51 4c 49 54 45 5f 43 48 45 43  zDb, SQLITE_CHEC
be50: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20  KPOINT_PASSIVE, 
be60: 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  0, 0);.}..#ifnde
be70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
be80: 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68  L./*.** Run a ch
be90: 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61  eckpoint on data
bea0: 62 61 73 65 20 69 44 62 2e 20 54 68 69 73 20 69  base iDb. This i
beb0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74  s a no-op if dat
bec0: 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20  abase iDb is.** 
bed0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  not currently op
bee0: 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a  en in WAL mode..
bef0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
bf00: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
bf10: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
bf20: 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65  eing checkpointe
bf30: 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  d, this .** func
bf40: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
bf50: 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61  ITE_LOCKED and a
bf60: 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e   checkpoint is n
bf70: 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66  ot attempted. If
bf80: 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63   .** an error oc
bf90: 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69  curs while runni
bfa0: 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  ng the checkpoin
bfb0: 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  t, an SQLite err
bfc0: 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
bfd0: 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51  eturned (i.e. SQ
bfe0: 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68  LITE_IOERR). Oth
bff0: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
c000: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  K..**.** The mut
c010: 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ex on database h
c020: 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20  andle db should 
c030: 62 65 20 68 65 6c 64 20 62 79 20 74 68 65 20 63  be held by the c
c040: 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78  aller. The mutex
c050: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
c060: 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 63  ith the specific
c070: 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68   b-tree being ch
c080: 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61  eckpointed is ta
c090: 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66  ken by.** this f
c0a0: 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68  unction while th
c0b0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  e checkpoint is 
c0c0: 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  running..**.** I
c0d0: 66 20 69 44 62 20 69 73 20 70 61 73 73 65 64 20  f iDb is passed 
c0e0: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
c0f0: 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74  HED, then all at
c100: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
c110: 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69   are.** checkpoi
c120: 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  nted. If an erro
c130: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
c140: 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20   it is returned 
c150: 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a  immediately -.**
c160: 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   no attempt is m
c170: 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e  ade to checkpoin
c180: 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20  t any remaining 
c190: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a  databases..**.**
c1a0: 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
c1b0: 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   is one of SQLIT
c1c0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
c1d0: 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45  SIVE, FULL or RE
c1e0: 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  START..*/.int sq
c1f0: 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
c200: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
c210: 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c   iDb, int eMode,
c220: 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74   int *pnLog, int
c230: 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74   *pnCkpt){.  int
c240: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c260: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
c270: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c290: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
c2a0: 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74 61  ate through atta
c2b0: 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e  ched dbs */.  in
c2c0: 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20 20  t bBusy = 0;    
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c2e0: 20 54 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f   True if SQLITE_
c2f0: 42 55 53 59 20 68 61 73 20 62 65 65 6e 20 65 6e  BUSY has been en
c300: 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20  countered */..  
c310: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c320: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
c330: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
c340: 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e  t( !pnLog || *pn
c350: 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73  Log==-1 );.  ass
c360: 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20  ert( !pnCkpt || 
c370: 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a  *pnCkpt==-1 );..
c380: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
c390: 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49  >nDb && rc==SQLI
c3a0: 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
c3b0: 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69   if( i==iDb || i
c3c0: 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41  Db==SQLITE_MAX_A
c3d0: 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20  TTACHED ){.     
c3e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
c3f0: 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d  eeCheckpoint(db-
c400: 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f  >aDb[i].pBt, eMo
c410: 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70  de, pnLog, pnCkp
c420: 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20  t);.      pnLog 
c430: 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70  = 0;.      pnCkp
c440: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
c450: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
c460: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75 73   ){.        bBus
c470: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  y = 1;.        r
c480: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c490: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c4a0: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
c4b0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42 75  SQLITE_OK && bBu
c4c0: 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  sy) ? SQLITE_BUS
c4d0: 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  Y : rc;.}.#endif
c4e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
c4f0: 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  WAL */../*.** Th
c500: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
c510: 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e  rns true if main
c520: 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62  -memory should b
c530: 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
c540: 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  f.** a temporary
c550: 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69   file for transi
c560: 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73 20  ent pager files 
c570: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  and statement jo
c580: 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76  urnals..** The v
c590: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64 65  alue returned de
c5a0: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
c5b0: 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73  ue of db->temp_s
c5c0: 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a  tore (runtime.**
c5d0: 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20   parameter) and 
c5e0: 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  the compile time
c5f0: 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45   value of SQLITE
c600: 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65  _TEMP_STORE. The
c610: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  .** following ta
c620: 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
c630: 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62  e relationship b
c640: 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f  etween these two
c650: 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74   values.** and t
c660: 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  his functions re
c670: 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  turn value..**.*
c680: 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  *   SQLITE_TEMP_
c690: 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65  STORE     db->te
c6a0: 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63  mp_store     Loc
c6b0: 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61  ation of tempora
c6c0: 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  ry database.**  
c6d0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
c6e0: 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
c6f0: 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
c700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c710: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20  --------.**   0 
c720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c730: 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
c740: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
c750: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
c760: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
c770: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
c780: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
c790: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
c7a0: 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
c7b0: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
c7d0: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
c7e0: 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c810: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
c820: 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
c850: 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
c860: 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20  turn 0).**   2  
c870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c880: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
c890: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
c8a0: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
c8b0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
c8c0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
c8d0: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
c8e0: 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
c8f0: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
c900: 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20           any    
c910: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
c920: 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
c930: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
c940: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73  empInMemory(cons
c950: 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t sqlite3 *db){.
c960: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
c970: 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72  STORE==1.  retur
c980: 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
c990: 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  re==2 );.#endif.
c9a0: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
c9b0: 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72  STORE==2.  retur
c9c0: 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
c9d0: 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a  re!=1 );.#endif.
c9e0: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
c9f0: 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74 75 72  STORE==3.  retur
ca00: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  n 1;.#endif.#if 
ca10: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
ca20: 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45  E<1 || SQLITE_TE
ca30: 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72 65 74  MP_STORE>3.  ret
ca40: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
ca50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
ca60: 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  F-8 encoded Engl
ca70: 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
ca80: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
ca90: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
caa0: 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  rror..*/.const c
cab0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
cac0: 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29  msg(sqlite3 *db)
cad0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
cae0: 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
caf0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
cb00: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
cb10: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66  NOMEM);.  }.  if
cb20: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
cb30: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
cb40: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
cb50: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
cb60: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
cb70: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
cb80: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
cb90: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
cba0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
cbb0: 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  ){.    z = sqlit
cbc0: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
cbd0: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b  NOMEM);.  }else{
cbe0: 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  .    z = (char*)
cbf0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
cc00: 78 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  xt(db->pErr);.  
cc10: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
cc20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
cc30: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
cc40: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
cc50: 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f  ErrStr(db->errCo
cc60: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  de);.    }.  }. 
cc70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
cc80: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
cc90: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
cca0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ccb0: 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
ccc0: 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e  Return UTF-16 en
ccd0: 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  coded English la
cce0: 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
ccf0: 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
cd00: 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a  ecent.** error..
cd10: 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
cd20: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28  qlite3_errmsg16(
cd30: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
cd40: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
cd50: 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a   outOfMem[] = {.
cd60: 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74      'o', 'u', 't
cd70: 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27  ', ' ', 'o', 'f'
cd80: 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c  , ' ', 'm', 'e',
cd90: 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20   'm', 'o', 'r', 
cda0: 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74  'y', 0.  };.  st
cdb0: 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d  atic const u16 m
cdc0: 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  isuse[] = {.    
cdd0: 27 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c 20 27  'l', 'i', 'b', '
cde0: 72 27 2c 20 27 61 27 2c 20 27 72 27 2c 20 27 79  r', 'a', 'r', 'y
cdf0: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 72 27  ', ' ', .    'r'
ce00: 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c  , 'o', 'u', 't',
ce10: 20 27 69 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20   'i', 'n', 'e', 
ce20: 27 20 27 2c 20 0a 20 20 20 20 27 63 27 2c 20 27  ' ', .    'c', '
ce30: 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65  a', 'l', 'l', 'e
ce40: 27 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'd', ' ', .  
ce50: 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c    'o', 'u', 't',
ce60: 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20   ' ', .    'o', 
ce70: 27 66 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'f', ' ', .    '
ce80: 73 27 2c 20 27 65 27 2c 20 27 71 27 2c 20 27 75  s', 'e', 'q', 'u
ce90: 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27 63 27  ', 'e', 'n', 'c'
cea0: 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20  , 'e', 0.  };.. 
ceb0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a   const void *z;.
cec0: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
ced0: 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29   return (void *)
cee0: 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20  outOfMem;.  }.  
cef0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
cf00: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
cf10: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
cf20: 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65  n (void *)misuse
cf30: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
cf40: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
cf50: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
cf60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
cf70: 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20  {.    z = (void 
cf80: 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65  *)outOfMem;.  }e
cf90: 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  lse{.    z = sql
cfa0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
cfb0: 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  6(db->pErr);.   
cfc0: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
cfd0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
cfe0: 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
cff0: 2d 31 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  -1, sqlite3ErrSt
d000: 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 2c 0a  r(db->errCode),.
d010: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
d020: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
d030: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7a 20  TATIC);.      z 
d040: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
d050: 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
d060: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  ;.    }.    /* A
d070: 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61   malloc() may ha
d080: 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69 6e  ve failed within
d090: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
d0a0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
d0b0: 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  6().    ** above
d0c0: 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
d0d0: 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
d0e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d0f0: 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20   flag needs to. 
d100: 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65 64     ** be cleared
d110: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
d120: 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65 63  g. Do this direc
d130: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
d140: 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  via.    ** sqlit
d150: 65 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20  e3ApiExit(), to 
d160: 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68  avoid setting th
d170: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
d180: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
d190: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e  .    */.    db->
d1a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
d1b0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
d1c0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
d1d0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
d1e0: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
d1f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
d200: 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  6 */../*.** Retu
d210: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
d220: 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65  nt error code ge
d230: 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53 51  nerated by an SQ
d240: 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66  Lite routine. If
d250: 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73   NULL is.** pass
d260: 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
d270: 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61  ion, we assume a
d280: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
d290: 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   during sqlite3_
d2a0: 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  open()..*/.int s
d2b0: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73  qlite3_errcode(s
d2c0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
d2d0: 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65  f( db && !sqlite
d2e0: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
d2f0: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
d300: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
d310: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
d320: 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
d330: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
d340: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d350: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
d360: 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64  eturn db->errCod
d370: 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  e & db->errMask;
d380: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  .}.int sqlite3_e
d390: 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
d3a0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
d3b0: 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
d3c0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
d3d0: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
d3e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
d3f0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
d400: 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
d410: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
d420: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d430: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
d440: 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
d450: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  de;.}../*.** Cre
d460: 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ate a new collat
d470: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ing function for
d480: 20 64 61 74 61 62 61 73 65 20 22 64 62 22 2e 20   database "db". 
d490: 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61   The name is zNa
d4a0: 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e  me.** and the en
d4b0: 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a  coding is enc..*
d4c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65  /.static int cre
d4d0: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  ateCollation(.  
d4e0: 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63  sqlite3* db,.  c
d4f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
d500: 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 76  , .  u8 enc,.  v
d510: 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
d520: 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
d530: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
d540: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
d550: 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c  *),.  void(*xDel
d560: 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f  )(void*).){.  Co
d570: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
d580: 69 6e 74 20 65 6e 63 32 3b 0a 20 20 69 6e 74 20  int enc2;.  int 
d590: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
d5a0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
d5b0: 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
d5c0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d5d0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
d5e0: 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54   /* If SQLITE_UT
d5f0: 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64  F16 is specified
d600: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
d610: 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d   type, transform
d620: 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e   this.  ** to on
d630: 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
d640: 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54  6LE or SQLITE_UT
d650: 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a  F16BE using the.
d660: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31    ** SQLITE_UTF1
d670: 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53  6NATIVE macro. S
d680: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e  QLITE_UTF16 is n
d690: 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
d6a0: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20  ly..  */.  enc2 
d6b0: 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73  = enc;.  testcas
d6c0: 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  e( enc2==SQLITE_
d6d0: 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63  UTF16 );.  testc
d6e0: 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
d6f0: 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
d700: 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53  );.  if( enc2==S
d710: 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65  QLITE_UTF16 || e
d720: 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
d730: 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20  6_ALIGNED ){.   
d740: 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55   enc2 = SQLITE_U
d750: 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a  TF16NATIVE;.  }.
d760: 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54    if( enc2<SQLIT
d770: 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53  E_UTF8 || enc2>S
d780: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b  QLITE_UTF16BE ){
d790: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d7a0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
d7b0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
d7c0: 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  if this call is 
d7d0: 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c  removing or repl
d7e0: 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  acing an existin
d7f0: 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a  g collation .  *
d800: 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73  * sequence. If s
d810: 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  o, and there are
d820: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74   active VMs, ret
d830: 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65  urn busy. If the
d840: 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61  re.  ** are no a
d850: 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c  ctive VMs, inval
d860: 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f  idate any pre-co
d870: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
d880: 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20  s..  */.  pColl 
d890: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
d8a0: 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
d8b0: 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  2, zName, 0);.  
d8c0: 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f  if( pColl && pCo
d8d0: 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20  ll->xCmp ){.    
d8e0: 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  if( db->activeVd
d8f0: 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  beCnt ){.      s
d900: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
d910: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
d920: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
d930: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63   delete/modify c
d940: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
d950: 65 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20  e due to active 
d960: 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20  statements");.  
d970: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d980: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
d990: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
d9a0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
d9b0: 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  s(db);..    /* I
d9c0: 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  f collation sequ
d9d0: 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63  ence pColl was c
d9e0: 72 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20  reated directly 
d9f0: 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20  by a call to.   
da00: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61   ** sqlite3_crea
da10: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e  te_collation, an
da20: 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20  d not generated 
da30: 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  by synthCollSeq(
da40: 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ),.    ** then a
da50: 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62  ny copies made b
da60: 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
da70: 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61   need to be inva
da80: 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  lidated..    ** 
da90: 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20  Also, collation 
daa0: 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c  destructor - Col
dab0: 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75  lSeq.xDel() - fu
dac0: 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a  nction may need.
dad0: 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c      ** to be cal
dae0: 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  led..    */ .   
daf0: 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63   if( (pColl->enc
db00: 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36   & ~SQLITE_UTF16
db10: 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20  _ALIGNED)==enc2 
db20: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
db30: 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *aColl = sqlite
db40: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
db50: 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20  CollSeq, zName, 
db60: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e  nName);.      in
db70: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
db80: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
db90: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
dba0: 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  p = &aColl[j];. 
dbb0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e         if( p->en
dbc0: 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
dbd0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
dbe0: 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->xDel ){.      
dbf0: 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d        p->xDel(p-
dc00: 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20  >pUser);.       
dc10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
dc20: 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20  ->xCmp = 0;.    
dc30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
dc40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c    }.  }..  pColl
dc50: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
dc60: 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
dc70: 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20  c2, zName, 1);. 
dc80: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
dc90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
dca0: 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43  MEM;.  pColl->xC
dcb0: 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20  mp = xCompare;. 
dcc0: 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20   pColl->pUser = 
dcd0: 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78  pCtx;.  pColl->x
dce0: 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43  Del = xDel;.  pC
dcf0: 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28  oll->enc = (u8)(
dd00: 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51  enc2 | (enc & SQ
dd10: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
dd20: 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ED));.  sqlite3E
dd30: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
dd40: 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  OK, 0);.  return
dd50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
dd60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79  /*.** This array
dd70: 20 64 65 66 69 6e 65 73 20 68 61 72 64 20 75 70   defines hard up
dd80: 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69  per bounds on li
dd90: 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65  mit values.  The
dda0: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  .** initializer 
ddb0: 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20  must be kept in 
ddc0: 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 53 51  sync with the SQ
ddd0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20  LITE_LIMIT_*.** 
dde0: 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69  #defines in sqli
ddf0: 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  te3.h..*/.static
de00: 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64   const int aHard
de10: 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51  Limit[] = {.  SQ
de20: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c  LITE_MAX_LENGTH,
de30: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  .  SQLITE_MAX_SQ
de40: 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  L_LENGTH,.  SQLI
de50: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20  TE_MAX_COLUMN,. 
de60: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
de70: 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45  _DEPTH,.  SQLITE
de80: 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
de90: 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LECT,.  SQLITE_M
dea0: 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51  AX_VDBE_OP,.  SQ
deb0: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
dec0: 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f  N_ARG,.  SQLITE_
ded0: 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20  MAX_ATTACHED,.  
dee0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
def0: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a  PATTERN_LENGTH,.
df00: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52    SQLITE_MAX_VAR
df10: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a 20 20  IABLE_NUMBER,.  
df20: 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
df30: 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a  ER_DEPTH,.};../*
df40: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
df50: 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72  e hard limits ar
df60: 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61  e set to reasona
df70: 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69  ble values.*/.#i
df80: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  f SQLITE_MAX_LEN
df90: 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
dfa0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
dfb0: 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
dfc0: 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
dfd0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
dfe0: 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
dff0: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ror SQLITE_MAX_S
e000: 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  QL_LENGTH must b
e010: 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
e020: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
e030: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e  _MAX_SQL_LENGTH>
e040: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
e050: 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  H.# error SQLITE
e060: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
e070: 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61  must not be grea
e080: 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  ter than SQLITE_
e090: 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69  MAX_LENGTH.#endi
e0a0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
e0b0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
e0c0: 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <2.# error SQLIT
e0d0: 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
e0e0: 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61 74  ELECT must be at
e0f0: 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a   least 2.#endif.
e100: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  #if SQLITE_MAX_V
e110: 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f  DBE_OP<40.# erro
e120: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  r SQLITE_MAX_VDB
e130: 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20  E_OP must be at 
e140: 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a  least 40.#endif.
e150: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  #if SQLITE_MAX_F
e160: 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c  UNCTION_ARG<0 ||
e170: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
e180: 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a 23 20  TION_ARG>1000.# 
e190: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
e1a0: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75  _FUNCTION_ARG mu
e1b0: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  st be between 0 
e1c0: 61 6e 64 20 31 30 30 30 0a 23 65 6e 64 69 66 0a  and 1000.#endif.
e1d0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  #if SQLITE_MAX_A
e1e0: 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c  TTACHED<0 || SQL
e1f0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
e200: 3e 36 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  >62.# error SQLI
e210: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20  TE_MAX_ATTACHED 
e220: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
e230: 30 20 61 6e 64 20 36 32 0a 23 65 6e 64 69 66 0a  0 and 62.#endif.
e240: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
e250: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
e260: 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  TH<1.# error SQL
e270: 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
e280: 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74  TERN_LENGTH must
e290: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
e2a0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
e2b0: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36  _MAX_COLUMN>3276
e2c0: 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  7.# error SQLITE
e2d0: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74  _MAX_COLUMN must
e2e0: 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37 36   not exceed 3276
e2f0: 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  7.#endif.#if SQL
e300: 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
e310: 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20  DEPTH<1.# error 
e320: 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
e330: 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65  ER_DEPTH must be
e340: 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64   at least 1.#end
e350: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  if.../*.** Chang
e360: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  e the value of a
e370: 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20   limit.  Report 
e380: 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a  the old value..*
e390: 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20  * If an invalid 
e3a0: 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73  limit index is s
e3b0: 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20  upplied, report 
e3c0: 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63  -1..** Make no c
e3d0: 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c  hanges but still
e3e0: 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20   report the old 
e3f0: 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20  value if the.** 
e400: 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  new limit is neg
e410: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ative..**.** A n
e420: 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64  ew lower limit d
e430: 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65  oes not shrink e
e440: 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63  xisting construc
e450: 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79  ts..** It merely
e460: 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f   prevents new co
e470: 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78  nstructs that ex
e480: 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a  ceed the limit.*
e490: 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a  * from forming..
e4a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c  */.int sqlite3_l
e4b0: 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  imit(sqlite3 *db
e4c0: 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69  , int limitId, i
e4d0: 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20  nt newLimit){.  
e4e0: 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 0a  int oldLimit;...
e4f0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
e500: 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20  : R-30189-54097 
e510: 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63  For each limit c
e520: 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c  ategory SQLITE_L
e530: 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74  IMIT_NAME.  ** t
e540: 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75  here is a hard u
e550: 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61  pper bound set a
e560: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62  t compile-time b
e570: 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73  y a C preprocess
e580: 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61  or.  ** macro ca
e590: 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lled SQLITE_MAX_
e5a0: 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d  NAME. (The "_LIM
e5b0: 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  IT_" in the name
e5c0: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20   is changed to. 
e5d0: 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20   ** "_MAX_".).  
e5e0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  */.  assert( aHa
e5f0: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
e600: 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  IMIT_LENGTH]==SQ
e610: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
e620: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
e630: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
e640: 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
e650: 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  ==SQLITE_MAX_SQL
e660: 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
e670: 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
e680: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
e690: 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  UMN]==SQLITE_MAX
e6a0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73  _COLUMN );.  ass
e6b0: 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
e6c0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
e6d0: 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
e6e0: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20  _MAX_EXPR_DEPTH 
e6f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
e700: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
e710: 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
e720: 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LECT]==SQLITE_MA
e730: 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
e740: 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  T);.  assert( aH
e750: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
e760: 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d  LIMIT_VDBE_OP]==
e770: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
e780: 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OP );.  assert( 
e790: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
e7a0: 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
e7b0: 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  _ARG]==SQLITE_MA
e7c0: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29  X_FUNCTION_ARG )
e7d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
e7e0: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
e7f0: 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53  MIT_ATTACHED]==S
e800: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
e810: 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
e820: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
e830: 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
e840: 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20  TERN_LENGTH]==. 
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
e880: 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
e890: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a  TTERN_LENGTH );.
e8a0: 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
e8b0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
e8c0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
e8d0: 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  R]==SQLITE_MAX_V
e8e0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b  ARIABLE_NUMBER);
e8f0: 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
e900: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
e910: 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
e920: 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  ]==SQLITE_MAX_TR
e930: 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20  IGGER_DEPTH );. 
e940: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
e950: 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
e960: 50 54 48 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c  PTH==(SQLITE_N_L
e970: 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69  IMIT-1) );...  i
e980: 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20  f( limitId<0 || 
e990: 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f  limitId>=SQLITE_
e9a0: 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72  N_LIMIT ){.    r
e9b0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
e9c0: 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61  oldLimit = db->a
e9d0: 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a  Limit[limitId];.
e9e0: 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
e9f0: 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
ea00: 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
ea10: 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a  -52476-28732 */.
ea20: 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
ea30: 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69  >aHardLimit[limi
ea40: 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65  tId] ){.      ne
ea50: 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c 69  wLimit = aHardLi
ea60: 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f  mit[limitId];  /
ea70: 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32  * IMP: R-51463-2
ea80: 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  5634 */.    }.  
ea90: 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d    db->aLimit[lim
eaa0: 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74  itId] = newLimit
eab0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ;.  }.  return o
eac0: 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20  ldLimit;        
ead0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eae0: 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35 34  IMP: R-53341-354
eaf0: 31 39 20 2a 2f 0a 7d 0a 23 69 66 20 64 65 66 69  19 */.}.#if defi
eb00: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
eb10: 45 5f 41 55 54 4f 5f 50 52 4f 46 49 4c 45 29 0a  E_AUTO_PROFILE).
eb20: 2f 2a 20 73 74 64 65 72 72 20 6c 6f 67 67 69 6e  /* stderr loggin
eb30: 67 20 2a 2f 0a 76 6f 69 64 20 5f 73 71 6c 69 74  g */.void _sqlit
eb40: 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65 28 76  e_auto_profile(v
eb50: 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20  oid *aux, const 
eb60: 63 68 61 72 20 2a 73 71 6c 2c 20 75 36 34 20 6e  char *sql, u64 n
eb70: 73 29 3b 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65  s);.void _sqlite
eb80: 5f 61 75 74 6f 5f 74 72 61 63 65 28 76 6f 69 64  _auto_trace(void
eb90: 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61   *aux, const cha
eba0: 72 20 2a 73 71 6c 29 3b 0a 76 6f 69 64 20 5f 73  r *sql);.void _s
ebb0: 71 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69  qlite_auto_profi
ebc0: 6c 65 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f  le(void *aux, co
ebd0: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 2c 20 75  nst char *sql, u
ebe0: 36 34 20 6e 73 29 20 7b 0a 23 70 72 61 67 6d 61  64 ns) {.#pragma
ebf0: 20 75 6e 75 73 65 64 28 61 75 78 29 0a 09 66 70   unused(aux)..fp
ec00: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 51  rintf(stderr, "Q
ec10: 75 65 72 79 3a 20 25 73 5c 6e 20 45 78 65 63 75  uery: %s\n Execu
ec20: 74 69 6f 6e 20 54 69 6d 65 3a 20 25 6c 6c 75 20  tion Time: %llu 
ec30: 6d 73 5c 6e 22 2c 20 73 71 6c 2c 20 6e 73 20 2f  ms\n", sql, ns /
ec40: 20 31 30 30 30 30 30 30 29 3b 0a 7d 0a 76 6f 69   1000000);.}.voi
ec50: 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74  d _sqlite_auto_t
ec60: 72 61 63 65 28 76 6f 69 64 20 2a 61 75 78 2c 20  race(void *aux, 
ec70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 29  const char *sql)
ec80: 20 7b 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65   {..fprintf(stde
ec90: 72 72 2c 20 22 54 72 61 63 65 53 51 4c 28 25 70  rr, "TraceSQL(%p
eca0: 29 3a 20 25 73 5c 6e 22 2c 20 61 75 78 2c 20 73  ): %s\n", aux, s
ecb0: 71 6c 29 3b 0a 7d 0a 0a 2f 2a 20 73 79 73 6c 6f  ql);.}../* syslo
ecc0: 67 20 6c 6f 67 67 69 6e 67 20 2a 2f 0a 23 69 6e  g logging */.#in
ecd0: 63 6c 75 64 65 20 3c 61 73 6c 2e 68 3e 0a 73 74  clude <asl.h>.st
ece0: 61 74 69 63 20 61 73 6c 63 6c 69 65 6e 74 20 61  atic aslclient a
ecf0: 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 3d 20  utolog_client = 
ed00: 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 76 6f 69  NULL;.static voi
ed10: 64 20 5f 63 6c 6f 73 65 5f 61 73 6c 5f 6c 6f 67  d _close_asl_log
ed20: 28 29 20 7b 0a 20 20 69 66 28 20 4e 55 4c 4c 21  () {.  if( NULL!
ed30: 3d 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20  =autolog_client 
ed40: 29 7b 0a 20 20 20 20 61 73 6c 5f 63 6c 6f 73 65  ){.    asl_close
ed50: 28 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 29  (autolog_client)
ed60: 3b 0a 20 20 20 20 61 75 74 6f 6c 6f 67 5f 63 6c  ;.    autolog_cl
ed70: 69 65 6e 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  ient = NULL;.  }
ed80: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f  .}.static void _
ed90: 6f 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28 29 20 7b  open_asl_log() {
eda0: 0a 20 20 69 66 28 20 4e 55 4c 4c 3d 3d 61 75 74  .  if( NULL==aut
edb0: 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 29 7b 0a 20  olog_client ){. 
edc0: 20 20 20 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e     autolog_clien
edd0: 74 20 3d 20 61 73 6c 5f 6f 70 65 6e 28 22 53 51  t = asl_open("SQ
ede0: 4c 69 74 65 22 2c 20 4e 55 4c 4c 2c 20 30 29 3b  Lite", NULL, 0);
edf0: 0a 20 20 20 20 61 74 65 78 69 74 28 5f 63 6c 6f  .    atexit(_clo
ee00: 73 65 5f 61 73 6c 5f 6c 6f 67 29 3b 0a 20 20 7d  se_asl_log);.  }
ee10: 0a 7d 0a 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65  .}..void _sqlite
ee20: 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65 5f 73 79  _auto_profile_sy
ee30: 73 6c 6f 67 28 76 6f 69 64 20 2a 61 75 78 2c 20  slog(void *aux, 
ee40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 2c  const char *sql,
ee50: 20 75 36 34 20 6e 73 29 3b 0a 76 6f 69 64 20 5f   u64 ns);.void _
ee60: 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63  sqlite_auto_trac
ee70: 65 5f 73 79 73 6c 6f 67 28 76 6f 69 64 20 2a 61  e_syslog(void *a
ee80: 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ux, const char *
ee90: 73 71 6c 29 3b 0a 76 6f 69 64 20 5f 73 71 6c 69  sql);.void _sqli
eea0: 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65 5f  te_auto_profile_
eeb0: 73 79 73 6c 6f 67 28 76 6f 69 64 20 2a 61 75 78  syslog(void *aux
eec0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  , const char *sq
eed0: 6c 2c 20 75 36 34 20 6e 73 29 20 7b 0a 23 70 72  l, u64 ns) {.#pr
eee0: 61 67 6d 61 20 75 6e 75 73 65 64 28 61 75 78 29  agma unused(aux)
eef0: 0a 09 61 73 6c 5f 6c 6f 67 28 61 75 74 6f 6c 6f  ..asl_log(autolo
ef00: 67 5f 63 6c 69 65 6e 74 2c 20 4e 55 4c 4c 2c 20  g_client, NULL, 
ef10: 41 53 4c 5f 4c 45 56 45 4c 5f 4e 4f 54 49 43 45  ASL_LEVEL_NOTICE
ef20: 2c 20 22 51 75 65 72 79 3a 20 25 73 5c 6e 20 45  , "Query: %s\n E
ef30: 78 65 63 75 74 69 6f 6e 20 54 69 6d 65 3a 20 25  xecution Time: %
ef40: 6c 6c 75 20 6d 73 5c 6e 22 2c 20 73 71 6c 2c 20  llu ms\n", sql, 
ef50: 6e 73 20 2f 20 31 30 30 30 30 30 30 29 3b 0a 7d  ns / 1000000);.}
ef60: 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75  .void _sqlite_au
ef70: 74 6f 5f 74 72 61 63 65 5f 73 79 73 6c 6f 67 28  to_trace_syslog(
ef80: 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74  void *aux, const
ef90: 20 63 68 61 72 20 2a 73 71 6c 29 20 7b 0a 09 61   char *sql) {..a
efa0: 73 6c 5f 6c 6f 67 28 61 75 74 6f 6c 6f 67 5f 63  sl_log(autolog_c
efb0: 6c 69 65 6e 74 2c 20 4e 55 4c 4c 2c 20 41 53 4c  lient, NULL, ASL
efc0: 5f 4c 45 56 45 4c 5f 4e 4f 54 49 43 45 2c 20 22  _LEVEL_NOTICE, "
efd0: 54 72 61 63 65 53 51 4c 28 25 70 29 3a 20 25 73  TraceSQL(%p): %s
efe0: 5c 6e 22 2c 20 61 75 78 2c 20 73 71 6c 29 3b 0a  \n", aux, sql);.
eff0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
f000: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
f010: 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62   used to parse b
f020: 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e  oth URIs and non
f030: 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70  -URI filenames p
f040: 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  assed by the.** 
f050: 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63  user to API func
f060: 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70  tions sqlite3_op
f070: 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  en() or sqlite3_
f080: 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66  open_v2(), and f
f090: 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55  or database.** U
f0a0: 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73  RIs specified as
f0b0: 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20   part of ATTACH 
f0c0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
f0d0: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
f0e0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
f0f0: 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d  ction is the nam
f100: 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
f110: 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c  use (or.** a NUL
f120: 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65  L to signify the
f130: 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66   default VFS) if
f140: 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f   the URI does no
f150: 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73  t contain a "vfs
f160: 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70  =xxx".** query p
f170: 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65  arameter. The se
f180: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f  cond argument co
f190: 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28  ntains the URI (
f1a0: 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  or non-URI filen
f1b0: 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20  ame).** itself. 
f1c0: 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
f1d0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  on is called the
f1e0: 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c   *pFlags variabl
f1f0: 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  e should contain
f200: 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20  .** the default 
f210: 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68  flags to open th
f220: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
f230: 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75  e with. The valu
f240: 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a  e stored in.** *
f250: 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70  pFlags may be up
f260: 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74  dated before ret
f270: 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52  urning if the UR
f280: 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61  I filename conta
f290: 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78  ins .** "cache=x
f2a0: 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78  xx" or "mode=xxx
f2b0: 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  " query paramete
f2c0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  rs..**.** If suc
f2d0: 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
f2e0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
f2f0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70  In this case *pp
f300: 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Vfs is set to po
f310: 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46  int to.** the VF
f320: 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  S that should be
f330: 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
f340: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
f350: 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20   *pzFile is set 
f360: 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  to.** point to a
f370: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
f380: 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ng the name of t
f390: 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  he file to open.
f3a0: 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
f3b0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
f3c0: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
f3d0: 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73  ventually call s
f3e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f  qlite3_free() to
f3f0: 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
f400: 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   buffer..**.** I
f410: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
f420: 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74  s, then an SQLit
f430: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
f440: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a  returned and *pz
f450: 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65  ErrMsg.** may be
f460: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
f470: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
f480: 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20  ning an English 
f490: 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a  language error .
f4a0: 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  ** message. It i
f4b0: 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
f4c0: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
f4d0: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
f4e0: 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
f4f0: 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69   buffer by calli
f500: 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
f510: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
f520: 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e  3ParseUri(.  con
f530: 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c  st char *zDefaul
f540: 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  tVfs,        /* 
f550: 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f  VFS to use if no
f560: 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79   "vfs=xxx" query
f570: 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e   option */.  con
f580: 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20  st char *zUri,  
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f5a0: 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55  Nul-terminated U
f5b0: 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20  RI to parse */. 
f5c0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70   unsigned int *p
f5d0: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
f5e0: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49   /* IN/OUT: SQLI
f5f0: 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
f600: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
f610: 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20  fs **ppVfs,     
f620: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
f630: 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20  FS to use */ .  
f640: 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20  char **pzFile,  
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f660: 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65  /* OUT: Filename
f670: 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52   component of UR
f680: 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  I */.  char **pz
f690: 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
f6a0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
f6b0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66  rror message (if
f6c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc!=SQLITE_OK) 
f6d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
f6e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
f6f0: 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73  signed int flags
f700: 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f   = *pFlags;.  co
f710: 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d  nst char *zVfs =
f720: 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20   zDefaultVfs;.  
f730: 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
f740: 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72  har c;.  int nUr
f750: 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
f760: 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73  n30(zUri);..  as
f770: 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d  sert( *pzErrMsg=
f780: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66  =0 );..  if( ((f
f790: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
f7a0: 45 4e 5f 55 52 49 29 20 7c 7c 20 73 71 6c 69 74  EN_URI) || sqlit
f7b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
f7c0: 4f 70 65 6e 55 72 69 29 20 0a 20 20 20 26 26 20  OpenUri) .   && 
f7d0: 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d  nUri>=5 && memcm
f7e0: 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c  p(zUri, "file:",
f7f0: 20 35 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20   5)==0 .  ){.   
f800: 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20   char *zOpt;.   
f810: 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20   int eState;    
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f830: 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20 77  * Parser state w
f840: 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20  hen parsing URI 
f850: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20  */.    int iIn; 
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f870: 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68       /* Input ch
f880: 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
f890: 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20  .    int iOut = 
f8a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
f8b0: 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61     /* Output cha
f8c0: 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a  racter index */.
f8d0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
f8e0: 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20  nUri+2;         
f8f0: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
f900: 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ace to allocate 
f910: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  */..    /* Make 
f920: 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f  sure the SQLITE_
f930: 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73  OPEN_URI flag is
f940: 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65   set to indicate
f950: 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65   to the VFS xOpe
f960: 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  n .    ** method
f970: 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79 20   that there may 
f980: 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65 74  be extra paramet
f990: 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ers following th
f9a0: 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f  e file-name.  */
f9b0: 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
f9c0: 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a  LITE_OPEN_URI;..
f9d0: 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69      for(iIn=0; i
f9e0: 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20  In<nUri; iIn++) 
f9f0: 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69  nByte += (zUri[i
fa00: 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a  In]=='&');.    z
fa10: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
fa20: 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
fa30: 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72    if( !zFile ) r
fa40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
fa50: 45 4d 3b 0a 0a 20 20 20 20 2f 2a 20 44 69 73 63  EM;..    /* Disc
fa60: 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20 61  ard the scheme a
fa70: 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65 67  nd authority seg
fa80: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52 49  ments of the URI
fa90: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55 72  . */.    if( zUr
faa0: 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72  i[5]=='/' && zUr
fab0: 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i[6]=='/' ){.   
fac0: 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20     iIn = 7;.    
fad0: 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
fae0: 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
faf0: 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 0a 20  ='/' ) iIn++;.. 
fb00: 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20       if( iIn!=7 
fb10: 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d  && (iIn!=16 || m
fb20: 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74  emcmp("localhost
fb30: 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29  ", &zUri[7], 9))
fb40: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
fb50: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
fb60: 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64  mprintf("invalid
fb70: 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20   uri authority: 
fb80: 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20  %.*s", .        
fb90: 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69      iIn-7, &zUri
fba0: 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [7]);.        rc
fbb0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
fbc0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
fbd0: 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
fbe0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
fbf0: 20 20 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 20        iIn = 5;. 
fc00: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
fc10: 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61  y the filename a
fc20: 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70 61 72  nd any query par
fc30: 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65  ameters into the
fc40: 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a   zFile buffer. .
fc50: 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48      ** Decode %H
fc60: 48 20 65 73 63 61 70 65 20 63 6f 64 65 73 20 61  H escape codes a
fc70: 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20  long the way. . 
fc80: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74     **.    ** Wit
fc90: 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76  hin this loop, v
fca0: 61 72 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d  ariable eState m
fcb0: 61 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20  ay be set to 0, 
fcc0: 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e  1 or 2, dependin
fcd0: 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  g.    ** on the 
fce0: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e  parsing context.
fcf0: 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   As follows:.   
fd00: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20   **.    **   0: 
fd10: 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d  Parsing file-nam
fd20: 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50  e..    **   1: P
fd30: 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74  arsing name sect
fd40: 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61  ion of a name=va
fd50: 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  lue query parame
fd60: 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a  ter..    **   2:
fd70: 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73   Parsing value s
fd80: 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65  ection of a name
fd90: 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72  =value query par
fda0: 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  ameter..    */. 
fdb0: 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20     eState = 0;. 
fdc0: 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
fdd0: 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20  Uri[iIn])!=0 && 
fde0: 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20  c!='#' ){.      
fdf0: 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  iIn++;.      if(
fe00: 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20   c=='%' .       
fe10: 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67  && sqlite3Isxdig
fe20: 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20  it(zUri[iIn]) . 
fe30: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
fe40: 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49  Isxdigit(zUri[iI
fe50: 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a  n+1]) .      ){.
fe60: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65          int octe
fe70: 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54  t = (sqlite3HexT
fe80: 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d  oInt(zUri[iIn++]
fe90: 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20  ) << 4);.       
fea0: 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65   octet += sqlite
feb0: 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69  3HexToInt(zUri[i
fec0: 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20  In++]);..       
fed0: 20 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d   assert( octet>=
fee0: 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29  0 && octet<256 )
fef0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 63  ;.        if( oc
ff00: 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tet==0 ){.      
ff10: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
ff20: 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
ff30: 20 22 25 30 30 22 20 61 70 70 65 61 72 73 20 77   "%00" appears w
ff40: 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49  ithin the URI. I
ff50: 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
ff60: 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f   ** case we igno
ff70: 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74  re all text in t
ff80: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
ff90: 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f  the path, name o
ffa0: 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76  r.          ** v
ffb0: 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62  alue currently b
ffc0: 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20  eing parsed. So 
ffd0: 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65  ignore the curre
ffe0: 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 20 20  nt character.   
fff0: 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b         ** and sk
10000 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22  ip to the next "
10010 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20  ?", "=" or "&", 
10020 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
10030 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  */.          whi
10040 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49  le( (c = zUri[iI
10050 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27  n])!=0 && c!='#'
10060 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
10070 26 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c  && (eState!=0 ||
10080 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20   c!='?').       
10090 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
100a0 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20  e!=1 || (c!='=' 
100b0 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20  && c!='&')).    
100c0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53            && (eS
100d0 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26  tate!=2 || c!='&
100e0 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  ').          ){.
100f0 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b              iIn+
10100 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
10110 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
10120 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
10130 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a       c = octet;.
10140 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10150 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d  eState==1 && (c=
10160 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20  ='&' || c=='=') 
10170 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
10180 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20  File[iOut-1]==0 
10190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
101a0 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20  An empty option 
101b0 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69  name. Ignore thi
101c0 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74  s option altoget
101d0 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  her. */.        
101e0 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
101f0 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
10200 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e  ='#' && zUri[iIn
10210 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b  -1]!='&' ) iIn++
10220 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
10230 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
10240 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
10250 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  &' ){.          
10260 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
10270 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65  '\0';.        }e
10280 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65  lse{.          e
10290 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20  State = 2;.     
102a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
102b0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
102c0 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26  if( (eState==0 &
102d0 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53  & c=='?') || (eS
102e0 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26  tate==2 && c=='&
102f0 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  ') ){.        c 
10300 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74  = 0;.        eSt
10310 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ate = 1;.      }
10320 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  .      zFile[iOu
10330 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a  t++] = c;.    }.
10340 20 20 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d      if( eState==
10350 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b  1 ) zFile[iOut++
10360 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
10370 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
10380 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f  0';.    zFile[iO
10390 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  ut++] = '\0';.. 
103a0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
103b0 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70  here were any op
103c0 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20  tions specified 
103d0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69  that should be i
103e0 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20 20 20  nterpreted .    
103f0 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73  ** here. Options
10400 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 72 70   that are interp
10410 72 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75  reted here inclu
10420 64 65 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f  de "vfs" and tho
10430 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  se that.    ** c
10440 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61  orrespond to fla
10450 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70  gs that may be p
10460 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c  assed to the sql
10470 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20  ite3_open_v2(). 
10480 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f     ** method. */
10490 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69  .    zOpt = &zFi
104a0 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  le[sqlite3Strlen
104b0 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20  30(zFile)+1];.  
104c0 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d    while( zOpt[0]
104d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
104e0 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  pt = sqlite3Strl
104f0 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20  en30(zOpt);.    
10500 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26    char *zVal = &
10510 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20  zOpt[nOpt+1];.  
10520 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73      int nVal = s
10530 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
10540 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  Val);..      if(
10550 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63   nOpt==3 && memc
10560 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20  mp("vfs", zOpt, 
10570 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  3)==0 ){.       
10580 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20   zVfs = zVal;.  
10590 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
105a0 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f     struct OpenMo
105b0 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63  de {.          c
105c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
105d0 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65          int mode
105e0 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f  ;.        } *aMo
105f0 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
10600 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20  char *zModeType 
10610 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
10620 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20   mask = 0;.     
10630 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30     int limit = 0
10640 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ;..        if( n
10650 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Opt==5 && memcmp
10660 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20  ("cache", zOpt, 
10670 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  5)==0 ){.       
10680 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
10690 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65   OpenMode aCache
106a0 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Mode[] = {.     
106b0 20 20 20 20 20 20 20 7b 20 22 73 68 61 72 65 64         { "shared
106c0 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
106d0 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20  SHAREDCACHE },. 
106e0 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 70 72             { "pr
106f0 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f  ivate", SQLITE_O
10700 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
10710 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
10720 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
10730 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
10740 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
10750 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c  PEN_SHAREDCACHE|
10760 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
10770 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20  ATECACHE;.      
10780 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63      aMode = aCac
10790 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  heMode;.        
107a0 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a    limit = mask;.
107b0 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
107c0 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20  ype = "cache";. 
107d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
107e0 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20   if( nOpt==4 && 
107f0 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a  memcmp("mode", z
10800 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 4)==0 ){.  
10810 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73          static s
10820 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61  truct OpenMode a
10830 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20  OpenMode[] = {. 
10840 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f             { "ro
10850 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
10860 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20  READONLY },.    
10870 20 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20          { "rw", 
10880 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
10890 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20  DWRITE }, .     
108a0 20 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20         { "rwc", 
108b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
108c0 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
108d0 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20  PEN_CREATE },.  
108e0 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d            { "mem
108f0 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ory", SQLITE_OPE
10900 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20  N_MEMORY },.    
10910 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d          { 0, 0 }
10920 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  .          };.. 
10930 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20           mask = 
10940 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
10950 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50  ONLY | SQLITE_OP
10960 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20  EN_READWRITE.   
10970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10980 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
10990 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
109a0 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20  EN_MEMORY;.     
109b0 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70       aMode = aOp
109c0 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  enMode;.        
109d0 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26    limit = mask &
109e0 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20   flags;.        
109f0 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61    zModeType = "a
10a00 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20  ccess";.        
10a10 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  }..        if( a
10a20 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
10a30 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
10a40 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b     int mode = 0;
10a50 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
10a60 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20  =0; aMode[i].z; 
10a70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
10a80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
10a90 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20  = aMode[i].z;.  
10aa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 56            if( nV
10ab0 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65  al==sqlite3Strle
10ac0 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d  n30(z) && 0==mem
10ad0 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61  cmp(zVal, z, nVa
10ae0 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
10af0 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65      mode = aMode
10b00 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  [i].mode;.      
10b10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10b20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
10b30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10b40 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29     if( mode==0 )
10b50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
10b60 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
10b70 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
10b80 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c  ch %s mode: %s",
10b90 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c   zModeType, zVal
10ba0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
10bb0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
10bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
10bd0 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
10be0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10bf0 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64          if( (mod
10c00 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  e & ~SQLITE_OPEN
10c10 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29  _MEMORY)>limit )
10c20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
10c30 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
10c40 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f  3_mprintf("%s mo
10c50 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20  de not allowed: 
10c60 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c80 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f               zMo
10c90 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20  deType, zVal);. 
10ca0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
10cb0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
10cc0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61           goto pa
10cd0 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
10ce0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10cf0 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67     flags = (flag
10d00 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64  s & ~mask) | mod
10d10 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
10d20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74     }..      zOpt
10d30 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d   = &zVal[nVal+1]
10d40 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
10d50 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71  {.    zFile = sq
10d60 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72  lite3_malloc(nUr
10d70 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  i+2);.    if( !z
10d80 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
10d90 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
10da0 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55  memcpy(zFile, zU
10db0 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a  ri, nUri);.    z
10dc0 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30  File[nUri] = '\0
10dd0 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72  ';.    zFile[nUr
10de0 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  i+1] = '\0';.   
10df0 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
10e00 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a  E_OPEN_URI;.  }.
10e10 0a 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69  .  *ppVfs = sqli
10e20 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66  te3_vfs_find(zVf
10e30 73 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73  s);.  if( *ppVfs
10e40 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72  ==0 ){.    *pzEr
10e50 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
10e60 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20  printf("no such 
10e70 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b  vfs: %s", zVfs);
10e80 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
10e90 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72  _ERROR;.  }. par
10ea0 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66  se_uri_out:.  if
10eb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10ec0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
10ed0 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20  ree(zFile);.    
10ee0 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zFile = 0;.  }. 
10ef0 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73   *pFlags = flags
10f00 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46  ;.  *pzFile = zF
10f10 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ile;.  return rc
10f20 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
10f30 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
10f40 55 54 4f 5f 50 52 4f 46 49 4c 45 29 0a 23 64 65  UTO_PROFILE).#de
10f50 66 69 6e 65 20 53 51 4c 49 54 45 5f 41 55 54 4f  fine SQLITE_AUTO
10f60 4c 4f 47 47 49 4e 47 5f 53 54 44 45 52 52 20 31  LOGGING_STDERR 1
10f70 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
10f80 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c  AUTOLOGGING_SYSL
10f90 4f 47 20 32 0a 73 74 61 74 69 63 20 76 6f 69 64  OG 2.static void
10fa0 20 65 6e 61 62 6c 65 41 75 74 6f 4c 6f 67 67 69   enableAutoLoggi
10fb0 6e 67 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ng(.  sqlite3 *d
10fc0 62 0a 29 7b 0a 20 20 63 68 61 72 20 2a 65 6e 76  b.){.  char *env
10fd0 70 72 6f 66 69 6c 65 20 3d 20 67 65 74 65 6e 76  profile = getenv
10fe0 28 22 53 51 4c 49 54 45 5f 41 55 54 4f 5f 50 52  ("SQLITE_AUTO_PR
10ff0 4f 46 49 4c 45 22 29 3b 0a 20 20 0a 20 20 69 66  OFILE");.  .  if
11000 28 20 65 6e 76 70 72 6f 66 69 6c 65 21 3d 4e 55  ( envprofile!=NU
11010 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20 77 68  LL ){.    int wh
11020 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ere = 0;.    if(
11030 20 21 73 74 72 6e 63 61 73 65 63 6d 70 28 22 31   !strncasecmp("1
11040 22 2c 20 65 6e 76 70 72 6f 66 69 6c 65 2c 20 31  ", envprofile, 1
11050 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
11060 73 61 74 74 79 28 32 29 20 29 7b 0a 20 20 20 20  satty(2) ){.    
11070 20 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49      where = SQLI
11080 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
11090 54 44 45 52 52 3b 0a 20 20 20 20 20 20 7d 65 6c  TDERR;.      }el
110a0 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72  se{.        wher
110b0 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c  e = SQLITE_AUTOL
110c0 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20  OGGING_SYSLOG;. 
110d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
110e0 65 20 69 66 28 20 21 73 74 72 6e 63 61 73 65 63  e if( !strncasec
110f0 6d 70 28 22 73 74 64 65 72 72 22 2c 20 65 6e 76  mp("stderr", env
11100 70 72 6f 66 69 6c 65 2c 20 36 29 20 29 7b 0a 20  profile, 6) ){. 
11110 20 20 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c       where = SQL
11120 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f  ITE_AUTOLOGGING_
11130 53 54 44 45 52 52 3b 0a 20 20 20 20 7d 20 65 6c  STDERR;.    } el
11140 73 65 20 69 66 28 20 21 73 74 72 6e 63 61 73 65  se if( !strncase
11150 63 6d 70 28 22 73 79 73 6c 6f 67 22 2c 20 65 6e  cmp("syslog", en
11160 76 70 72 6f 66 69 6c 65 2c 20 36 29 20 29 7b 0a  vprofile, 6) ){.
11170 20 20 20 20 20 20 77 68 65 72 65 20 3d 20 53 51        where = SQ
11180 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47  LITE_AUTOLOGGING
11190 5f 53 59 53 4c 4f 47 3b 0a 20 20 20 20 7d 0a 20  _SYSLOG;.    }. 
111a0 20 20 20 69 66 28 20 77 68 65 72 65 3d 3d 53 51     if( where==SQ
111b0 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47  LITE_AUTOLOGGING
111c0 5f 53 54 44 45 52 52 20 29 7b 0a 20 20 20 20 20  _STDERR ){.     
111d0 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65   sqlite3_profile
111e0 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75 74  (db, _sqlite_aut
111f0 6f 5f 70 72 6f 66 69 6c 65 2c 20 64 62 29 3b 0a  o_profile, db);.
11200 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68      }else if( wh
11210 65 72 65 3d 3d 53 51 4c 49 54 45 5f 41 55 54 4f  ere==SQLITE_AUTO
11220 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 20 29  LOGGING_SYSLOG )
11230 7b 0a 20 20 20 20 20 20 5f 6f 70 65 6e 5f 61 73  {.      _open_as
11240 6c 5f 6c 6f 67 28 29 3b 0a 20 20 20 20 20 20 73  l_log();.      s
11250 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 64  qlite3_profile(d
11260 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f  b, _sqlite_auto_
11270 70 72 6f 66 69 6c 65 5f 73 79 73 6c 6f 67 2c 20  profile_syslog, 
11280 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  db);.    }.  }. 
11290 20 63 68 61 72 20 2a 65 6e 76 74 72 61 63 65 20   char *envtrace 
112a0 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  = getenv("SQLITE
112b0 5f 41 55 54 4f 5f 54 52 41 43 45 22 29 3b 0a 20  _AUTO_TRACE");. 
112c0 20 69 66 28 20 65 6e 76 74 72 61 63 65 21 3d 4e   if( envtrace!=N
112d0 55 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20 77  ULL ){.    int w
112e0 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  here = 0;.    if
112f0 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70 28 22  ( !strncasecmp("
11300 31 22 2c 20 65 6e 76 74 72 61 63 65 2c 20 31 29  1", envtrace, 1)
11310 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
11320 61 74 74 79 28 32 29 20 29 7b 0a 20 20 20 20 20  atty(2) ){.     
11330 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54     where = SQLIT
11340 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54  E_AUTOLOGGING_ST
11350 44 45 52 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  DERR;.      }els
11360 65 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  e{.        where
11370 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f   = SQLITE_AUTOLO
11380 47 47 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20 20  GGING_SYSLOG;.  
11390 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
113a0 20 69 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d   if( !strncasecm
113b0 70 28 22 73 74 64 65 72 72 22 2c 20 65 6e 76 74  p("stderr", envt
113c0 72 61 63 65 2c 20 36 29 20 29 7b 0a 20 20 20 20  race, 6) ){.    
113d0 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45    where = SQLITE
113e0 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44  _AUTOLOGGING_STD
113f0 45 52 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ERR;.    } else 
11400 69 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70  if( !strncasecmp
11410 28 22 73 79 73 6c 6f 67 22 2c 20 65 6e 76 74 72  ("syslog", envtr
11420 61 63 65 2c 20 36 29 20 29 7b 0a 20 20 20 20 20  ace, 6) ){.     
11430 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45 5f   where = SQLITE_
11440 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c  AUTOLOGGING_SYSL
11450 4f 47 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OG;.    }.    if
11460 28 20 77 68 65 72 65 3d 3d 53 51 4c 49 54 45 5f  ( where==SQLITE_
11470 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44 45  AUTOLOGGING_STDE
11480 52 52 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  RR ){.      sqli
11490 74 65 33 5f 74 72 61 63 65 28 64 62 2c 20 5f 73  te3_trace(db, _s
114a0 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65  qlite_auto_trace
114b0 2c 20 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , db);.    }else
114c0 20 69 66 28 20 77 68 65 72 65 3d 3d 53 51 4c 49   if( where==SQLI
114d0 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
114e0 59 53 4c 4f 47 20 29 7b 0a 20 20 20 20 20 20 5f  YSLOG ){.      _
114f0 6f 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28 29 3b 0a  open_asl_log();.
11500 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
11510 61 63 65 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f  ace(db, _sqlite_
11520 61 75 74 6f 5f 74 72 61 63 65 5f 73 79 73 6c 6f  auto_trace_syslo
11530 67 2c 20 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  g, db);.    }.  
11540 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
11550 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
11560 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  oes the work of 
11570 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61  opening a databa
11580 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a  se on behalf of.
11590 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
115a0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70  ) and sqlite3_op
115b0 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74 61  en16(). The data
115c0 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a  base filename "z
115d0 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69  Filename"  .** i
115e0 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e  s UTF-8 encoded.
115f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
11600 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63  penDatabase(.  c
11610 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
11620 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73  name, /* Databas
11630 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38  e filename UTF-8
11640 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71   encoded */.  sq
11650 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20  lite3 **ppDb,   
11660 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
11670 75 72 6e 65 64 20 64 61 74 61 62 61 73 65 20 68  urned database h
11680 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67  andle */.  unsig
11690 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  ned int flags,  
116a0 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c    /* Operational
116b0 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   flags */.  cons
116c0 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20  t char *zVfs    
116d0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
116e0 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a  e VFS to use */.
116f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
11700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11710 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c       /* Store al
11720 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68  located handle h
11730 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ere */.  int rc;
11740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11750 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
11760 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
11770 20 69 73 54 68 72 65 61 64 73 61 66 65 3b 20 20   isThreadsafe;  
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11790 54 72 75 65 20 66 6f 72 20 74 68 72 65 61 64 73  True for threads
117a0 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  afe connections 
117b0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e  */.  char *zOpen
117c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
117d0 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
117e0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   argument to pas
117f0 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29  s to BtreeOpen()
11800 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72   */.  char *zErr
11810 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Msg = 0;        
11820 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d        /* Error m
11830 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69  essage from sqli
11840 74 65 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f  te3ParseUri() */
11850 0a 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23  ..  *ppDb = 0;.#
11860 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11870 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63  IT_AUTOINIT.  rc
11880 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69   = sqlite3_initi
11890 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72  alize();.  if( r
118a0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  c ) return rc;.#
118b0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79  endif..  /* Only
118c0 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20   allow sensible 
118d0 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
118e0 62 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67  bits in the flag
118f0 73 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20  s argument.  .  
11900 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f  ** Throw an erro
11910 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e  r if any non-sen
11920 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69  se combination i
11930 73 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20  s used.  If we. 
11940 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b   ** do not block
11950 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61   illegal combina
11960 74 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63  tions here, it c
11970 6f 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a  ould trigger.  *
11980 2a 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  * assert() state
11990 6d 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20  ments in deeper 
119a0 6c 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c  layers.  Sensibl
119b0 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20  e combinations. 
119c0 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20   ** are:.  **.  
119d0 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f  **  1:  SQLITE_O
119e0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a  PEN_READONLY.  *
119f0 2a 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  2:  SQLITE_OP
11a00 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a  EN_READWRITE.  *
11a10 2a 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  6:  SQLITE_OP
11a20 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
11a30 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
11a40 45 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  E.  */.  assert(
11a50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
11a60 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29  DONLY  == 0x01 )
11a70 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
11a80 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
11a90 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61  E == 0x02 );.  a
11aa0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50  ssert( SQLITE_OP
11ab0 45 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20  EN_CREATE    == 
11ac0 30 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61  0x04 );.  testca
11ad0 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37  se( (1<<(flags&7
11ae0 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52  ))==0x02 ); /* R
11af0 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73  EADONLY */.  tes
11b00 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67  tcase( (1<<(flag
11b10 73 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f  s&7))==0x04 ); /
11b20 2a 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20  * READWRITE */. 
11b30 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28   testcase( (1<<(
11b40 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20  flags&7))==0x40 
11b50 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20  ); /* READWRITE 
11b60 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66  | CREATE */.  if
11b70 28 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  ( ((1<<(flags&7)
11b80 29 20 26 20 30 78 34 36 29 3d 3d 30 20 29 20 72  ) & 0x46)==0 ) r
11b90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
11ba0 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 69 66 28  USE_BKPT;..  if(
11bb0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
11bc0 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d  nfig.bCoreMutex=
11bd0 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  =0 ){.    isThre
11be0 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65  adsafe = 0;.  }e
11bf0 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
11c00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
11c10 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72  TEX ){.    isThr
11c20 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d  eadsafe = 0;.  }
11c30 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
11c40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
11c50 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73  LMUTEX ){.    is
11c60 54 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a  Threadsafe = 1;.
11c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54    }else{.    isT
11c80 68 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69  hreadsafe = sqli
11c90 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
11ca0 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a  bFullMutex;.  }.
11cb0 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
11cc0 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
11cd0 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c  ECACHE ){.    fl
11ce0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
11cf0 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b  PEN_SHAREDCACHE;
11d00 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
11d10 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
11d20 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
11d30 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  led ){.    flags
11d40 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
11d50 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d  SHAREDCACHE;.  }
11d60 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61  ..  /* Remove ha
11d70 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20  rmful bits from 
11d80 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
11d90 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ter.  **.  ** Th
11da0 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  e SQLITE_OPEN_NO
11db0 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45  MUTEX and SQLITE
11dc0 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
11dd0 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20  flags were.  ** 
11de0 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68  dealt with in th
11df0 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20  e previous code 
11e00 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20  block.  Besides 
11e10 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a  these, the only.
11e20 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74    ** valid input
11e30 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   flags for sqlit
11e40 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65  e3_open_v2() are
11e50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
11e60 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49  DONLY,.  ** SQLI
11e70 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
11e80 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  E, SQLITE_OPEN_C
11e90 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50  REATE, SQLITE_OP
11ea0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a  EN_SHAREDCACHE,.
11eb0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e    ** SQLITE_OPEN
11ec0 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c 20 61  _PRIVATECACHE, a
11ed0 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64  nd some reserved
11ee0 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79   bits.  Silently
11ef0 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61   mask.  ** off a
11f00 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a  ll other flags..
11f10 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20    */.  flags &= 
11f20 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ~( SQLITE_OPEN_
11f30 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
11f50 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
11f60 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
11f70 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
11f80 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20  N_MAIN_DB |.    
11f90 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
11fa0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c  E_OPEN_TEMP_DB |
11fb0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11fc0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41   SQLITE_OPEN_TRA
11fd0 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20  NSIENT_DB | .   
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
11ff0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
12000 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
12010 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
12020 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
12030 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
12040 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55    SQLITE_OPEN_SU
12050 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  BJOURNAL | .    
12060 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
12070 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
12080 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20  URNAL |.        
12090 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
120a0 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20  EN_NOMUTEX |.   
120b0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
120c0 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
120d0 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X |.            
120e0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57     SQLITE_OPEN_W
120f0 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  AL.             
12100 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
12110 65 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74  e the sqlite dat
12120 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  a structure */. 
12130 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c   db = sqlite3Mal
12140 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
12150 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66  sqlite3) );.  if
12160 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f  ( db==0 ) goto o
12170 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28  pendb_out;.  if(
12180 20 69 73 54 68 72 65 61 64 73 61 66 65 20 29 7b   isThreadsafe ){
12190 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d  .    db->mutex =
121a0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
121b0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
121c0 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20  RECURSIVE);.    
121d0 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30  if( db->mutex==0
121e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
121f0 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20  3_free(db);.    
12200 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20    db = 0;.      
12210 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
12220 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
12230 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
12240 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
12250 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66  b->errMask = 0xf
12260 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32  f;.  db->nDb = 2
12270 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ;.  db->magic = 
12280 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
12290 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  Y;.  db->aDb = d
122a0 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20  b->aDbStatic;.. 
122b0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
122c0 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a  db->aLimit)==siz
122d0 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20  eof(aHardLimit) 
122e0 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e  );.  memcpy(db->
122f0 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d  aLimit, aHardLim
12300 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61  it, sizeof(db->a
12310 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61  Limit));.  db->a
12320 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
12330 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63   db->nextAutovac
12340 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 6e 65 78   = -1;.  db->nex
12350 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20  tPagesize = 0;. 
12360 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
12370 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
12380 65 73 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f  es | SQLITE_Auto
12390 49 6e 64 65 78 20 7c 20 53 51 4c 49 54 45 5f 45  Index | SQLITE_E
123a0 6e 61 62 6c 65 54 72 69 67 67 65 72 0a 23 69 66  nableTrigger.#if
123b0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
123c0 43 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a 20 20  CKPTFULLFSYNC.  
123d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
123e0 20 53 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c   SQLITE_CkptFull
123f0 46 53 79 6e 63 0a 23 65 6e 64 69 66 0a 23 69 66  FSync.#endif.#if
12400 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
12410 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20  FILE_FORMAT<4.  
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
12430 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69   SQLITE_LegacyFi
12440 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66  leFmt.#endif.#if
12450 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
12460 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
12470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12480 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45    | SQLITE_LoadE
12490 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a  xtension.#endif.
124a0 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
124b0 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49  LT_RECURSIVE_TRI
124c0 47 47 45 52 53 0a 20 20 20 20 20 20 20 20 20 20  GGERS.          
124d0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
124e0 52 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64  RecTriggers.#end
124f0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
12500 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f  QLITE_DEFAULT_FO
12510 52 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53  REIGN_KEYS) && S
12520 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f  QLITE_DEFAULT_FO
12530 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20  REIGN_KEYS.     
12540 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
12550 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
12560 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a  .#endif.      ;.
12570 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
12580 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
12590 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
125a0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
125b0 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68  LE.  sqlite3Hash
125c0 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  Init(&db->aModul
125d0 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
125e0 20 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74   Add the default
125f0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
12600 6e 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41  nce BINARY. BINA
12610 52 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74  RY works for bot
12620 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64  h UTF-8.  ** and
12630 20 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20   UTF-16, so add 
12640 61 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61  a version for ea
12650 63 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20  ch to avoid any 
12660 75 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a  unnecessary.  **
12670 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68   conversions. Th
12680 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61  e only error tha
12690 74 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65  t can occur here
126a0 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   is a malloc() f
126b0 61 69 6c 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63  ailure..  */.  c
126c0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
126d0 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c  b, "BINARY", SQL
126e0 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e  ITE_UTF8, 0, bin
126f0 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
12700 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
12710 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51  db, "BINARY", SQ
12720 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 30 2c  LITE_UTF16BE, 0,
12730 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
12740 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
12750 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22  ion(db, "BINARY"
12760 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
12770 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
12780 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
12790 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52  llation(db, "RTR
127a0 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  IM", SQLITE_UTF8
127b0 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43  , (void*)1, binC
127c0 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69  ollFunc, 0);.  i
127d0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
127e0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
127f0 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
12800 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20    db->pDfltColl 
12810 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
12820 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f  lSeq(db, SQLITE_
12830 55 54 46 38 2c 20 22 42 49 4e 41 52 59 22 2c 20  UTF8, "BINARY", 
12840 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  0);.  assert( db
12850 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29  ->pDfltColl!=0 )
12860 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64  ;..  /* Also add
12870 20 61 20 55 54 46 2d 38 20 63 61 73 65 2d 69 6e   a UTF-8 case-in
12880 73 65 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61 74  sensitive collat
12890 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f  ion sequence. */
128a0 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
128b0 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c  on(db, "NOCASE",
128c0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
128d0 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67   nocaseCollating
128e0 46 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  Func, 0);..  /* 
128f0 50 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61  Parse the filena
12900 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e  me/URI argument.
12910 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c   */.  db->openFl
12920 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72  ags = flags;.  r
12930 63 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  c = sqlite3Parse
12940 55 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e  Uri(zVfs, zFilen
12950 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62  ame, &flags, &db
12960 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20  ->pVfs, &zOpen, 
12970 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
12980 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12990 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
129a0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d  LITE_NOMEM ) db-
129b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
129c0 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  1;.    sqlite3Er
129d0 72 6f 72 28 64 62 2c 20 72 63 2c 20 7a 45 72 72  ror(db, rc, zErr
129e0 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20  Msg ? "%s" : 0, 
129f0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71  zErrMsg);.    sq
12a00 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
12a10 73 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  sg);.    goto op
12a20 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
12a30 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63   /* Open the bac
12a40 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20 64 72  kend database dr
12a50 69 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73  iver */.  rc = s
12a60 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
12a70 64 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c  db->pVfs, zOpen,
12a80 20 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d   db, &db->aDb[0]
12a90 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20  .pBt, 0,.       
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ab0 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f   flags | SQLITE_
12ac0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20  OPEN_MAIN_DB);. 
12ad0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12ae0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
12af0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  ==SQLITE_IOERR_N
12b00 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  OMEM ){.      rc
12b10 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
12b20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
12b30 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
12b40 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65  0);.    goto ope
12b50 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64  ndb_out;.  }.  d
12b60 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d  b->aDb[0].pSchem
12b70 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
12b80 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62  aGet(db, db->aDb
12b90 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e  [0].pBt);.  db->
12ba0 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[1].pSchema =
12bb0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
12bc0 74 28 64 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a  t(db, 0);...  /*
12bd0 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66   The default saf
12be0 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68  ety_level for th
12bf0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
12c00 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74  is 'full'; for t
12c10 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74  he temp.  ** dat
12c20 61 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e  abase it is 'NON
12c30 45 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73  E'. This matches
12c40 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
12c50 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a   defaults.  .  *
12c60 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a  /.  db->aDb[0].z
12c70 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
12c80 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65   db->aDb[0].safe
12c90 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20  ty_level = 3;.  
12ca0 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65  db->aDb[1].zName
12cb0 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d   = "temp";.  db-
12cc0 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[1].safety_l
12cd0 65 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d  evel = 1;..  db-
12ce0 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
12cf0 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66  MAGIC_OPEN;.  if
12d00 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
12d10 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f  ed ){.    goto o
12d20 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pendb_out;.  }..
12d30 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
12d40 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74  l built-in funct
12d50 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74  ions, but do not
12d60 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
12d70 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
12d80 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54  se schema yet. T
12d90 68 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75  his is delayed u
12da0 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74  ntil the first t
12db0 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ime the database
12dc0 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65  .  ** is accesse
12dd0 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
12de0 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
12df0 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
12e00 74 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74  te3RegisterBuilt
12e10 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b  inFunctions(db);
12e20 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f  ..  /* Load auto
12e30 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73  matic extensions
12e40 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68   - extensions th
12e50 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67  at have been reg
12e60 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69  istered.  ** usi
12e70 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61  ng the sqlite3_a
12e80 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69  utomatic_extensi
12e90 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20  on() API..  */. 
12ea0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
12eb0 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28  rcode(db);.  if(
12ec0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12ed0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74  {.    sqlite3Aut
12ee0 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28  oLoadExtensions(
12ef0 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  db);.    rc = sq
12f00 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
12f10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12f20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12f30 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
12f40 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  t;.    }.  }..#i
12f50 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
12f60 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64  LE_FTS1.  if( !d
12f70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12f80 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ){.    extern in
12f90 74 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69  t sqlite3Fts1Ini
12fa0 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  t(sqlite3*);.   
12fb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
12fc0 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  1Init(db);.  }.#
12fd0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
12fe0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32  LITE_ENABLE_FTS2
12ff0 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
13000 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
13010 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13020 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
13030 74 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69  te3Fts2Init(sqli
13040 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  te3*);.    rc = 
13050 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28  sqlite3Fts2Init(
13060 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
13070 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
13080 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 69 66 28  NABLE_FTS3.  if(
13090 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
130a0 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
130b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
130c0 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28  sqlite3Fts3Init(
130d0 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
130e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
130f0 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20  NABLE_ICU.  if( 
13100 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
13110 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
13120 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
13130 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62  qlite3IcuInit(db
13140 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
13150 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
13160 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20  BLE_RTREE.  if( 
13170 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
13180 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
13190 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  OK){.    rc = sq
131a0 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64  lite3RtreeInit(d
131b0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
131c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
131d0 62 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a  b, rc, 0);..  /*
131e0 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   -DSQLITE_DEFAUL
131f0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31  T_LOCKING_MODE=1
13200 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45   makes EXCLUSIVE
13210 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
13220 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
13230 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   -DSQLITE_DEFAUL
13240 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30  T_LOCKING_MODE=0
13250 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65   make NORMAL the
13260 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
13270 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69  .  ** mode.  Doi
13280 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c  ng nothing at al
13290 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52  l also makes NOR
132a0 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e  MAL the default.
132b0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
132c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
132d0 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64  ING_MODE.  db->d
132e0 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51  fltLockMode = SQ
132f0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
13300 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c  KING_MODE;.  sql
13310 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
13320 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65  Mode(sqlite3Btre
13330 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30  ePager(db->aDb[0
13340 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20  ].pBt),.        
13350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13360 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
13370 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a  _LOCKING_MODE);.
13380 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 61  #endif..  /* Ena
13390 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64  ble the lookasid
133a0 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74  e-malloc subsyst
133b0 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f  em */.  setupLoo
133c0 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71  kaside(db, 0, sq
133d0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
133e0 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20  g.szLookaside,. 
133f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13400 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
13410 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b  obalConfig.nLook
13420 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74  aside);..  sqlit
13430 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
13440 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45  point(db, SQLITE
13450 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54  _DEFAULT_WAL_AUT
13460 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f  OCHECKPOINT);..o
13470 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 73 71 6c  pendb_out:.  sql
13480 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29  ite3_free(zOpen)
13490 3b 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20  ;.  if( db ){.  
134a0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75    assert( db->mu
134b0 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65  tex!=0 || isThre
134c0 61 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c  adsafe==0 || sql
134d0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
134e0 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29  .bFullMutex==0 )
134f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
13500 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
13510 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  tex);.  }.  rc =
13520 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
13530 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (db);.  assert( 
13540 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  db!=0 || rc==SQL
13550 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69  ITE_NOMEM );.  i
13560 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
13570 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MEM ){.    sqlit
13580 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
13590 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73    db = 0;.  }els
135a0 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
135b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  _OK ){.    db->m
135c0 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
135d0 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 23 69  GIC_SICK;.  }.#i
135e0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
135f0 45 5f 5f 29 20 26 26 20 45 4e 41 42 4c 45 5f 46  E__) && ENABLE_F
13600 4f 52 43 45 5f 57 41 4c 0a 20 20 69 66 28 20 64  ORCE_WAL.  if( d
13610 62 20 26 26 20 21 72 63 20 29 7b 0a 20 20 20 20  b && !rc ){.    
13620 69 66 20 28 28 30 20 3d 3d 20 61 63 63 65 73 73  if ((0 == access
13630 28 22 2f 76 61 72 2f 64 62 2f 65 6e 61 62 6c 65  ("/var/db/enable
13640 46 6f 72 63 65 57 41 4c 22 2c 20 52 5f 4f 4b 29  ForceWAL", R_OK)
13650 29 29 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  )) {.#ifdef SQLI
13660 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 66  TE_DEBUG.      f
13670 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
13680 53 51 4c 69 74 65 20 57 41 4c 20 6a 6f 75 72 6e  SQLite WAL journ
13690 61 6c 5f 6d 6f 64 65 20 45 4e 41 42 4c 45 44 20  al_mode ENABLED 
136a0 62 79 20 64 65 66 61 75 6c 74 2e 5c 6e 22 29 3b  by default.\n");
136b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 0a 20  .#endif.      . 
136c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65       sqlite3_exe
136d0 63 28 64 62 2c 20 22 70 72 61 67 6d 61 20 6a 6f  c(db, "pragma jo
136e0 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 2c  urnal_mode=wal",
136f0 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   NULL, NULL, NUL
13700 4c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  L);.#ifdef SQLIT
13710 45 5f 44 45 42 55 47 0a 2f 2f 20 20 20 20 7d 20  E_DEBUG.//    } 
13720 65 6c 73 65 20 7b 0a 2f 2f 20 20 20 20 20 20 66  else {.//      f
13730 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
13740 53 51 4c 69 74 65 20 57 41 4c 20 6a 6f 75 72 6e  SQLite WAL journ
13750 61 6c 5f 6d 6f 64 65 20 4e 4f 54 20 45 4e 41 42  al_mode NOT ENAB
13760 4c 45 44 20 62 79 20 64 65 66 61 75 6c 74 2e 5c  LED by default.\
13770 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  n");.#endif.    
13780 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  }.  }.#endif.#if
13790 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
137a0 45 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46  ENABLE_AUTO_PROF
137b0 49 4c 45 29 0a 20 20 69 66 28 20 64 62 20 26 26  ILE).  if( db &&
137c0 20 21 72 63 20 29 7b 0a 20 20 20 20 65 6e 61 62   !rc ){.    enab
137d0 6c 65 41 75 74 6f 4c 6f 67 67 69 6e 67 28 64 62  leAutoLogging(db
137e0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
137f0 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64  *ppDb = db;.#ifd
13800 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
13810 5f 53 51 4c 52 52 0a 20 20 53 52 52 65 63 4f 70  _SQLRR.  SRRecOp
13820 65 6e 28 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65  en(db, zFilename
13830 2c 20 66 6c 61 67 73 29 3b 0a 23 65 6e 64 69 66  , flags);.#endif
13840 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
13850 33 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b  3ApiExit(0, rc);
13860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
13870 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61   new database ha
13880 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
13890 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e  ite3_open(.  con
138a0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
138b0 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  me, .  sqlite3 *
138c0 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75  *ppDb .){.  retu
138d0 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  rn openDatabase(
138e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c  zFilename, ppDb,
138f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13900 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
13910 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
13920 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
13930 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  E, 0);.}.int sql
13940 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20  ite3_open_v2(.  
13950 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
13960 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62  name,   /* Datab
13970 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54  ase filename (UT
13980 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  F-8) */.  sqlite
13990 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20  3 **ppDb,       
139a0 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65    /* OUT: SQLite
139b0 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20   db handle */.  
139c0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
139d0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
139e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
139f0 20 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a   *zVfs        /*
13a00 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64   Name of VFS mod
13a10 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b  ule to use */.){
13a20 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61  .  return openDa
13a30 74 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c  tabase(filename,
13a40 20 70 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64   ppDb, (unsigned
13a50 20 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73   int)flags, zVfs
13a60 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
13a70 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
13a80 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
13a90 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
13aa0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13ab0 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74  _open16(.  const
13ac0 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65   void *zFilename
13ad0 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  , .  sqlite3 **p
13ae0 70 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  pDb.){.  char co
13af0 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b  nst *zFilename8;
13b00 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
13b10 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38  encoded in UTF-8
13b20 20 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d   instead of UTF-
13b30 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  16 */.  sqlite3_
13b40 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69  value *pVal;.  i
13b50 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
13b60 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20  ( zFilename );. 
13b70 20 61 73 73 65 72 74 28 20 70 70 44 62 20 29 3b   assert( ppDb );
13b80 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
13b90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13ba0 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
13bb0 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
13bc0 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
13bd0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
13be0 6e 64 69 66 0a 20 20 70 56 61 6c 20 3d 20 73 71  ndif.  pVal = sq
13bf0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
13c00 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
13c10 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
13c20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49   zFilename, SQLI
13c30 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20  TE_UTF16NATIVE, 
13c40 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
13c50 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73    zFilename8 = s
13c60 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
13c70 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46  pVal, SQLITE_UTF
13c80 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  8);.  if( zFilen
13c90 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  ame8 ){.    rc =
13ca0 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46   openDatabase(zF
13cb0 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a  ilename8, ppDb,.
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cd0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
13ce0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
13cf0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
13d00 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
13d10 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53  ( *ppDb || rc==S
13d20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
13d30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13d40 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72  E_OK && !DbHasPr
13d50 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c  operty(*ppDb, 0,
13d60 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
13d70 29 20 29 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a  ) ){.      ENC(*
13d80 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55  ppDb) = SQLITE_U
13d90 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20  TF16NATIVE;.    
13da0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
13db0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
13dc0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
13dd0 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
13de0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
13df0 33 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b  3ApiExit(0, rc);
13e00 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
13e10 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
13e20 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
13e30 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
13e40 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
13e50 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
13e60 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
13e70 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
13e80 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
13e90 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
13ea0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
13eb0 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69   int enc, .  voi
13ec0 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
13ed0 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
13ee0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
13ef0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
13f00 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
13f10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
13f20 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
13f30 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
13f40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
13f50 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
13f60 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ation(db, zName,
13f70 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20   (u8)enc, pCtx, 
13f80 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20  xCompare, 0);.  
13f90 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
13fa0 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
13fb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
13fc0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
13fd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13fe0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
13ff0 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
14000 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
14010 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
14020 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
14030 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
14040 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
14050 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
14060 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
14070 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
14080 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
14090 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
140a0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
140b0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c  nt,const void*),
140c0 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76  .  void(*xDel)(v
140d0 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  oid*).){.  int r
140e0 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  c;.  sqlite3_mut
140f0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
14100 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
14110 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14120 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74   );.  rc = creat
14130 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
14140 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70  Name, (u8)enc, p
14150 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78  Ctx, xCompare, x
14160 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Del);.  rc = sql
14170 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
14180 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
14190 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
141a0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
141b0 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
141c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
141d0 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
141e0 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
141f0 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
14200 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
14210 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
14220 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
14230 61 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74  ation16(.  sqlit
14240 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
14250 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20   void *zName,.  
14260 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
14270 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
14280 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
14290 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
142a0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  nt,const void*).
142b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
142c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20  LITE_OK;.  char 
142d0 2a 7a 4e 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74  *zName8;.  sqlit
142e0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
142f0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
14300 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
14310 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d  Failed );.  zNam
14320 65 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31  e8 = sqlite3Utf1
14330 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  6to8(db, zName, 
14340 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  -1, SQLITE_UTF16
14350 4e 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a  NATIVE);.  if( z
14360 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20  Name8 ){.    rc 
14370 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  = createCollatio
14380 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75  n(db, zName8, (u
14390 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  8)enc, pCtx, xCo
143a0 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73  mpare, 0);.    s
143b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
143c0 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20   zName8);.  }.  
143d0 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
143e0 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
143f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14400 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
14410 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
14420 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
14430 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
14440 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
14450 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
14460 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
14470 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
14480 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
14490 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
144a0 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
144b0 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
144c0 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
144d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
144e0 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28  ollation_needed(
144f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
14500 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65  .  void *pCollNe
14510 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64  ededArg, .  void
14520 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76  (*xCollNeeded)(v
14530 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
14540 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74  t eTextRep,const
14550 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c   char*).){.  sql
14560 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14570 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
14580 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d  b->xCollNeeded =
14590 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20   xCollNeeded;.  
145a0 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
145b0 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f  6 = 0;.  db->pCo
145c0 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
145d0 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
145e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
145f0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
14600 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14610 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
14620 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
14630 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
14640 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
14650 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c  ence factory cal
14660 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64  lback with the d
14670 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
14680 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e  * db. Replace an
14690 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  y previously ins
146a0 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  talled collation
146b0 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
146c0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
146d0 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
146e0 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20  ed16(.  sqlite3 
146f0 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
14700 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
14710 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
14720 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69  ed16)(void*,sqli
14730 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
14740 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  p,const void*).)
14750 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
14760 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
14770 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  x);.  db->xCollN
14780 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d  eeded = 0;.  db-
14790 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
147a0 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a   xCollNeeded16;.
147b0 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
147c0 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
147d0 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
147e0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
147f0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
14800 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
14810 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14820 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23  OMIT_UTF16 */..#
14830 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14840 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
14850 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
14860 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63  n is now an anac
14870 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64  hronism. It used
14880 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72   to be used to r
14890 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a  ecover from a.**
148a0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
148b0 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f  e, but SQLite no
148c0 77 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f  w does this auto
148d0 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e  matically..*/.in
148e0 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c  t sqlite3_global
148f0 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a  _recover(void){.
14900 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14910 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
14920 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20  .** Test to see 
14930 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
14940 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
14950 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74  ection is in aut
14960 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e  ocommit.** mode.
14970 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
14980 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45   it is and FALSE
14990 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f   if not.  Autoco
149a0 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a  mmit mode is on.
149b0 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ** by default.  
149c0 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69  Autocommit is di
149d0 73 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49  sabled by a BEGI
149e0 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  N statement and 
149f0 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20  reenabled.** by 
14a00 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20  the next COMMIT 
14a10 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a  or ROLLBACK..**.
14a20 2a 2a 2a 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20  ******* THIS IS 
14a30 41 4e 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20  AN EXPERIMENTAL 
14a40 41 50 49 20 41 4e 44 20 49 53 20 53 55 42 4a 45  API AND IS SUBJE
14a50 43 54 20 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a  CT TO CHANGE ***
14a60 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ***.*/.int sqlit
14a70 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
14a80 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
14a90 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74    return db->aut
14aa0 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  oCommit;.}../*.*
14ab0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
14ac0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75 62  routines are sub
14ad0 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73  titutes for cons
14ae0 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52  tants SQLITE_COR
14af0 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  RUPT,.** SQLITE_
14b00 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43  MISUSE, SQLITE_C
14b10 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f  ANTOPEN, SQLITE_
14b20 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62  IOERR and possib
14b30 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a  ly other error.*
14b40 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68  * constants.  Th
14b50 65 79 20 73 65 72 76 65 72 20 74 77 6f 20 70 75  ey server two pu
14b60 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  rposes:.**.**   
14b70 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20 63  1.  Serve as a c
14b80 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
14b90 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
14ba0 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67 65  int in a debugge
14bb0 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65  r.**       to de
14bc0 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f  tect when versio
14bd0 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  n error conditio
14be0 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ns occurs..**.**
14bf0 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71     2.  Invoke sq
14c00 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70  lite3_log() to p
14c10 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72 63  rovide the sourc
14c20 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20  e code location 
14c30 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61  where.**       a
14c40 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
14c50 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74   is first detect
14c60 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
14c70 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69  e3CorruptError(i
14c80 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
14c90 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
14ca0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
14cb0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
14cc0 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52  _log(SQLITE_CORR
14cd0 55 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  UPT,.           
14ce0 20 20 20 22 64 61 74 61 62 61 73 65 20 63 6f 72     "database cor
14cf0 72 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20  ruption at line 
14d00 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a  %d of [%.10s]",.
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
14d20 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33  neno, 20+sqlite3
14d30 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20  _sourceid());.  
14d40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
14d50 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c  RRUPT;.}.int sql
14d60 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28  ite3MisuseError(
14d70 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
14d80 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
14d90 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
14da0 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  g!=0 );.  sqlite
14db0 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53  3_log(SQLITE_MIS
14dc0 55 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  USE, .          
14dd0 20 20 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c      "misuse at l
14de0 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
14df0 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
14e00 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
14e10 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
14e20 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14e30 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20  E_MISUSE;.}.int 
14e40 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45  sqlite3CantopenE
14e50 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
14e60 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
14e70 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
14e80 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
14e90 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
14ea0 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20  E_CANTOPEN, .   
14eb0 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
14ec0 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20  ot open file at 
14ed0 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
14ee0 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
14ef0 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
14f00 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
14f10 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
14f20 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a  TE_CANTOPEN;.}..
14f30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14f40 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
14f50 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
14f60 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74  convenience rout
14f70 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73  ine that makes s
14f80 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72  ure that all thr
14f90 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  ead-specific.** 
14fa0 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68  data for this th
14fb0 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65  read has been de
14fc0 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
14fd0 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65   SQLite no longe
14fe0 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70  r uses thread-sp
14ff0 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74  ecific data so t
15000 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
15010 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20  ow a.** no-op.  
15020 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66  It is retained f
15030 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f  or historical co
15040 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a  mpatibility..*/.
15050 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72  void sqlite3_thr
15060 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64  ead_cleanup(void
15070 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ){.}.#endif../*.
15080 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69  ** Return meta i
15090 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
150a0 20 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75   a specific colu
150b0 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  mn of a database
150c0 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63   table..** See c
150d0 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65  omment in sqlite
150e0 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e  3.h (sqlite.h.in
150f0 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
15100 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
15110 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
15120 54 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74  TADATA.int sqlit
15130 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
15140 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69  metadata(.  sqli
15150 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
15160 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
15170 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a  ction handle */.
15180 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
15190 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  bName,        /*
151a0 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f   Database name o
151b0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  r NULL */.  cons
151c0 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61  t char *zTableNa
151d0 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  me,     /* Table
151e0 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   name */.  const
151f0 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61   char *zColumnNa
15200 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  me,    /* Column
15210 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20   name */.  char 
15220 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79  const **pzDataTy
15230 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54  pe,    /* OUTPUT
15240 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20  : Declared data 
15250 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  type */.  char c
15260 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71  onst **pzCollSeq
15270 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  ,     /* OUTPUT:
15280 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
15290 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nce name */.  in
152a0 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20  t *pNotNull,    
152b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
152c0 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54  PUT: True if NOT
152d0 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
152e0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74   exists */.  int
152f0 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20   *pPrimaryKey,  
15300 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
15310 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
15320 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f  mn part of PK */
15330 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63  .  int *pAutoinc
15340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15350 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
15360 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f  f column is auto
15370 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b  -increment */.){
15380 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
15390 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
153a0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
153b0 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  0;.  Column *pCo
153c0 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  l = 0;.  int iCo
153d0 6c 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  l;..  char const
153e0 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b   *zDataType = 0;
153f0 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
15400 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69  CollSeq = 0;.  i
15410 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a  nt notnull = 0;.
15420 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79    int primarykey
15430 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f   = 0;.  int auto
15440 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45  inc = 0;..  /* E
15450 6e 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  nsure the databa
15460 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65  se schema has be
15470 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73  en loaded */.  s
15480 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
15490 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
154a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
154b0 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20  erAll(db);.  rc 
154c0 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62  = sqlite3Init(db
154d0 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
154e0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
154f0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   ){.    goto err
15500 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
15510 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  * Locate the tab
15520 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a  le in question *
15530 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  /.  pTab = sqlit
15540 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
15550 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e  zTableName, zDbN
15560 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61  ame);.  if( !pTa
15570 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  b || pTab->pSele
15580 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d  ct ){.    pTab =
15590 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   0;.    goto err
155a0 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
155b0 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d  * Find the colum
155c0 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f  n for which info
155d0 20 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f   is requested */
155e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73  .  if( sqlite3Is
155f0 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d  Rowid(zColumnNam
15600 65 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  e) ){.    iCol =
15610 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
15620 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
15630 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  .      pCol = &p
15640 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
15650 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
15660 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
15670 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
15680 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
15690 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
156a0 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  ol[iCol];.      
156b0 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
156c0 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
156d0 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  e, zColumnName) 
156e0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
156f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15700 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54      if( iCol==pT
15710 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
15720 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
15730 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
15740 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
15750 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
15760 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65  block stores the
15770 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
15780 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  n that will be r
15790 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20  eturned.  ** to 
157a0 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f  the caller in lo
157b0 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44  cal variables zD
157c0 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65  ataType, zCollSe
157d0 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d  q, notnull, prim
157e0 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20  arykey.  ** and 
157f0 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73  autoinc. At this
15800 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65   point there are
15810 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69   two possibiliti
15820 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  es:.  ** .  **  
15830 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66     1. The specif
15840 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ied column name 
15850 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64  was rowid", "oid
15860 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a  " or "_rowid_" .
15870 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20    **        and 
15880 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c  there is no expl
15890 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
158a0 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a  IPK column. .  *
158b0 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68  *.  **     2. Th
158c0 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  e table is not a
158d0 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f   view and the co
158e0 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69  lumn name identi
158f0 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20  fied an .  **   
15900 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20       explicitly 
15910 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e  declared column.
15920 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72   Copy meta infor
15930 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f  mation from *pCo
15940 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70  l..  */ .  if( p
15950 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61  Col ){.    zData
15960 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  Type = pCol->zTy
15970 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71  pe;.    zCollSeq
15980 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a   = pCol->zColl;.
15990 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43      notnull = pC
159a0 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a  ol->notNull!=0;.
159b0 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20      primarykey  
159c0 3d 20 70 43 6f 6c 2d 3e 69 73 50 72 69 6d 4b 65  = pCol->isPrimKe
159d0 79 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e  y!=0;.    autoin
159e0 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d  c = pTab->iPKey=
159f0 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e  =iCol && (pTab->
15a00 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
15a10 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b  toincrement)!=0;
15a20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44  .  }else{.    zD
15a30 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47  ataType = "INTEG
15a40 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  ER";.    primary
15a50 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  key = 1;.  }.  i
15a60 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a  f( !zCollSeq ){.
15a70 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22      zCollSeq = "
15a80 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72  BINARY";.  }..er
15a90 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ror_out:.  sqlit
15aa0 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
15ab0 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68  db);..  /* Wheth
15ac0 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  er the function 
15ad0 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f  call succeeded o
15ae0 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68  r failed, set th
15af0 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  e output paramet
15b00 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74  ers.  ** to what
15b10 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c  ever their local
15b20 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f   counterparts co
15b30 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72  ntain. If an err
15b40 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20  or did occur,.  
15b50 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68 65 20  ** this has the 
15b60 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e  effect of zeroin
15b70 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72  g all output par
15b80 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20  ameters..  */.  
15b90 69 66 28 20 70 7a 44 61 74 61 54 79 70 65 20 29  if( pzDataType )
15ba0 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a   *pzDataType = z
15bb0 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20  DataType;.  if( 
15bc0 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43  pzCollSeq ) *pzC
15bd0 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65  ollSeq = zCollSe
15be0 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c  q;.  if( pNotNul
15bf0 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20  l ) *pNotNull = 
15c00 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70  notnull;.  if( p
15c10 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50  PrimaryKey ) *pP
15c20 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d  rimaryKey = prim
15c30 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41  arykey;.  if( pA
15c40 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69  utoinc ) *pAutoi
15c50 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20  nc = autoinc;.. 
15c60 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
15c70 72 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  rc && !pTab ){. 
15c80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15c90 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  (db, zErrMsg);. 
15ca0 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c     zErrMsg = sql
15cb0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
15cc0 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63  "no such table c
15cd0 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a  olumn: %s.%s", z
15ce0 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20  TableName,.     
15cf0 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b     zColumnName);
15d00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15d10 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71  _ERROR;.  }.  sq
15d20 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
15d30 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22  c, (zErrMsg?"%s"
15d40 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  :0), zErrMsg);. 
15d50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
15d60 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72  b, zErrMsg);.  r
15d70 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
15d80 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
15d90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
15da0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
15db0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
15dc0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  dif../*.** Sleep
15dd0 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
15de0 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
15df0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
15e00 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  slept..*/.int sq
15e10 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20  lite3_sleep(int 
15e20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ms){.  sqlite3_v
15e30 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20  fs *pVfs;.  int 
15e40 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c  rc;.  pVfs = sql
15e50 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
15e60 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20  ;.  if( pVfs==0 
15e70 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
15e80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
15e90 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65  works in millise
15ea0 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75  conds, but the u
15eb0 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65  nderlying OsSlee
15ec0 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73  p() .  ** API us
15ed0 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e  es microseconds.
15ee0 20 48 65 6e 63 65 20 74 68 65 20 31 30 30 30 27   Hence the 1000'
15ef0 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28  s..  */.  rc = (
15f00 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70  sqlite3OsSleep(p
15f10 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30  Vfs, 1000*ms)/10
15f20 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  00);.  return rc
15f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ;.}../*.** Enabl
15f40 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
15f50 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74   extended result
15f60 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   codes..*/.int s
15f70 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
15f80 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c  result_codes(sql
15f90 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e  ite3 *db, int on
15fa0 6f 66 66 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  off){.  sqlite3_
15fb0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
15fc0 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
15fd0 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20  rMask = onoff ? 
15fe0 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66  0xffffffff : 0xf
15ff0 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  f;.  sqlite3_mut
16000 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
16010 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
16020 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16030 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69  * Invoke the xFi
16040 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  leControl method
16050 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
16060 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
16070 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  t sqlite3_file_c
16080 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a  ontrol(sqlite3 *
16090 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
160a0 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c  zDbName, int op,
160b0 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
160c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
160d0 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a  ERROR;.  Btree *
160e0 70 42 74 72 65 65 3b 0a 0a 20 20 73 71 6c 69 74  pBtree;..  sqlit
160f0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
16100 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74  b->mutex);.  pBt
16110 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  ree = sqlite3DbN
16120 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
16130 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  DbName);.  if( p
16140 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67  Btree ){.    Pag
16150 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
16160 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
16170 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
16180 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
16190 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71  .    pPager = sq
161a0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
161b0 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73  pBtree);.    ass
161c0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
161d0 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74  ;.    fd = sqlit
161e0 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
161f0 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
16200 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66   fd!=0 );.    if
16210 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e  ( op==SQLITE_FCN
16220 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20  TL_FILE_POINTER 
16230 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74  ){.      *(sqlit
16240 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d  e3_file**)pArg =
16250 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   fd;.      rc = 
16260 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
16270 65 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65  else if( fd->pMe
16280 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72  thods ){.      r
16290 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
162a0 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c  eControl(fd, op,
162b0 20 70 41 72 67 29 3b 0a 23 69 66 6e 64 65 66 20   pArg);.#ifndef 
162c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
162d0 20 20 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53        if( (rc==S
162e0 51 4c 49 54 45 5f 4f 4b 29 26 26 28 6f 70 3d 3d  QLITE_OK)&&(op==
162f0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53  SQLITE_FCNTL_LAS
16300 54 5f 45 52 52 4e 4f 29 26 26 28 2a 28 69 6e 74  T_ERRNO)&&(*(int
16310 20 2a 29 70 41 72 67 3d 3d 30 29 20 29 7b 0a 20   *)pArg==0) ){. 
16320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
16330 69 6c 65 20 2a 70 57 61 6c 46 64 20 3d 20 73 71  ile *pWalFd = sq
16340 6c 69 74 65 33 50 61 67 65 72 57 61 6c 46 69 6c  lite3PagerWalFil
16350 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
16360 20 20 20 69 66 28 20 70 57 61 6c 46 64 26 26 28     if( pWalFd&&(
16370 70 57 61 6c 46 64 2d 3e 70 4d 65 74 68 6f 64 73  pWalFd->pMethods
16380 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
16390 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
163a0 65 43 6f 6e 74 72 6f 6c 28 70 57 61 6c 46 64 2c  eControl(pWalFd,
163b0 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20   op, pArg);.    
163c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
163d0 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
163e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
163f0 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20  E_NOTFOUND;.    
16400 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
16410 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
16420 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
16430 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a  ror(db, rc, 0);.
16440 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16450 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
16460 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16470 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ../*.** Interfac
16480 65 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67  e to the testing
16490 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73   logic..*/.int s
164a0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
164b0 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  rol(int op, ...)
164c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
164d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
164e0 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54  MIT_BUILTIN_TEST
164f0 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
16500 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70   va_start(ap, op
16510 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  );.  switch( op 
16520 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  ){..    /*.    *
16530 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
16540 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
16550 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  PRNG..    */.   
16560 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
16570 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a  TCTRL_PRNG_SAVE:
16580 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
16590 50 72 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b  PrngSaveState();
165a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
165b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
165c0 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 73  ** Restore the s
165d0 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47  tate of the PRNG
165e0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61   to the last sta
165f0 74 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20  te saved using. 
16600 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e     ** PRNG_SAVE.
16610 20 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68    If PRNG_SAVE h
16620 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20  as never before 
16630 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65  been called, the
16640 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65  n.    ** this ve
16650 72 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e  rb acts like PRN
16660 47 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a  G_RESET..    */.
16670 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
16680 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
16690 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73  STORE: {.      s
166a0 71 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72  qlite3PrngRestor
166b0 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  eState();.      
166c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
166d0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65    /*.    ** Rese
166e0 74 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20  t the PRNG back 
166f0 74 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c  to its uninitial
16700 69 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68 65  ized state.  The
16710 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a   next call.    *
16720 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e  * to sqlite3_ran
16730 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72  domness() will r
16740 65 73 65 65 64 20 74 68 65 20 50 52 4e 47 20 75  eseed the PRNG u
16750 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61  sing a single ca
16760 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  ll.    ** to the
16770 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74   xRandomness met
16780 68 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61 75  hod of the defau
16790 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20  lt VFS..    */. 
167a0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
167b0 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
167c0 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ET: {.      sqli
167d0 74 65 33 50 72 6e 67 52 65 73 65 74 53 74 61 74  te3PrngResetStat
167e0 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
167f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
16800 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
16810 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54  test_control(BIT
16820 56 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20  VEC_TEST, size, 
16830 70 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a  program).    **.
16840 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73      ** Run a tes
16850 74 20 61 67 61 69 6e 73 74 20 61 20 42 69 74 76  t against a Bitv
16860 65 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a  ec object of siz
16870 65 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20  e.  The program 
16880 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20  argument.    ** 
16890 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69  is an array of i
168a0 6e 74 65 67 65 72 73 20 74 68 61 74 20 64 65 66  ntegers that def
168b0 69 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20 20  ines the test.  
168c0 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20  Return -1 on a. 
168d0 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c     ** memory all
168e0 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30  ocation error, 0
168f0 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20   on success, or 
16900 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20  non-zero for an 
16910 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65  error..    ** Se
16920 65 20 74 68 65 20 73 71 6c 69 74 65 33 42 69 74  e the sqlite3Bit
16930 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29  vecBuiltinTest()
16940 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
16950 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
16960 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
16970 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54  ITE_TESTCTRL_BIT
16980 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20  VEC_TEST: {.    
16990 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72    int sz = va_ar
169a0 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
169b0 20 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76    int *aProg = v
169c0 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b  a_arg(ap, int*);
169d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
169e0 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e  te3BitvecBuiltin
169f0 54 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b  Test(sz, aProg);
16a00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16a10 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
16a20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
16a30 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f  _control(BENIGN_
16a40 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42  MALLOC_HOOKS, xB
16a50 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20  egin, xEnd).    
16a60 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74  **.    ** Regist
16a70 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c  er hooks to call
16a80 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69   to indicate whi
16a90 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  ch malloc() fail
16aa0 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65  ures .    ** are
16ab0 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a   benign..    */.
16ac0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
16ad0 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f  TESTCTRL_BENIGN_
16ae0 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a  MALLOC_HOOKS: {.
16af0 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
16b00 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69  id (*void_functi
16b10 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20  on)(void);.     
16b20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78   void_function x
16b30 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20  BenignBegin;.   
16b40 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e     void_function
16b50 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20   xBenignEnd;.   
16b60 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20     xBenignBegin 
16b70 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
16b80 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20  d_function);.   
16b90 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20     xBenignEnd = 
16ba0 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f  va_arg(ap, void_
16bb0 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  function);.     
16bc0 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61   sqlite3BenignMa
16bd0 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67  llocHooks(xBenig
16be0 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45  nBegin, xBenignE
16bf0 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nd);.      break
16c00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
16c10 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
16c20 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
16c30 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e  ITE_TESTCTRL_PEN
16c40 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67  DING_BYTE, unsig
16c50 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  ned int X).    *
16c60 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
16c70 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f   PENDING byte to
16c80 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
16c90 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58  e argument, if X
16ca0 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20  >0..    ** Make 
16cb0 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d  no changes if X=
16cc0 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  =0.  Return the 
16cd0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e  value of the pen
16ce0 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a  ding byte.    **
16cf0 20 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20   as it existing 
16d00 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
16d10 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ine was called..
16d20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d      **.    ** IM
16d30 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69  PORTANT:  Changi
16d40 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  ng the PENDING b
16d50 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30  yte from 0x40000
16d60 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20  000 results in. 
16d70 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61     ** an incompa
16d80 74 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66  tible database f
16d90 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61  ile format.  Cha
16da0 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e  nging the PENDIN
16db0 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68  G byte.    ** wh
16dc0 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65  ile any database
16dd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
16de0 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75  pen results in u
16df0 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20  ndefined and.   
16e00 20 2a 2a 20 64 69 6c 65 74 65 72 69 6f 75 73 20   ** dileterious 
16e10 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f  behavior..    */
16e20 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
16e30 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
16e40 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20  G_BYTE: {.      
16e50 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rc = PENDING_BYT
16e60 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  E;.#ifndef SQLIT
16e70 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20  E_OMIT_WSD.     
16e80 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67   {.        unsig
16e90 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d  ned int newVal =
16ea0 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69   va_arg(ap, unsi
16eb0 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20  gned int);.     
16ec0 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20     if( newVal ) 
16ed0 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79  sqlite3PendingBy
16ee0 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20  te = newVal;.   
16ef0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
16f00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
16f10 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
16f20 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
16f30 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
16f40 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20  TRL_ASSERT, int 
16f50 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
16f60 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f   This action pro
16f70 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65  vides a run-time
16f80 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   test to see whe
16f90 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20  ther or not.    
16fa0 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20  ** assert() was 
16fb0 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
16fc0 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69  le-time.  If X i
16fd0 73 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72  s true and asser
16fe0 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e  t().    ** is en
16ff0 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
17000 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
17010 74 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74  true.  If X is t
17020 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  rue and.    ** a
17030 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
17040 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
17050 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
17060 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20  ro.  If X is.   
17070 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73   ** false and as
17080 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65  sert() is enable
17090 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65  d, then the asse
170a0 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20  rtion fires and 
170b0 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
170c0 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58  ss aborts.  If X
170d0 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73   is false and as
170e0 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
170f0 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ed, then the.   
17100 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
17110 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   is zero..    */
17120 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
17130 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
17140 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69  : {.      volati
17150 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20  le int x = 0;.  
17160 20 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d      assert( (x =
17170 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29   va_arg(ap,int))
17180 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  !=0 );.      rc 
17190 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = x;.      break
171a0 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
171b0 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
171c0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
171d0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
171e0 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20  WAYS, int X).   
171f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
17200 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
17210 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
17220 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41  to see how the A
17230 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a  LWAYS and.    **
17240 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65   NEVER macros we
17250 72 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f  re defined at co
17260 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20  mpile-time..    
17270 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
17280 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c  turn value is AL
17290 57 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a  WAYS(X).  .    *
172a0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  *.    ** The rec
172b0 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73  ommended test is
172c0 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72   X==2.  If the r
172d0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32  eturn value is 2
172e0 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20  , that means.   
172f0 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64   ** ALWAYS() and
17300 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74   NEVER() are bot
17310 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  h no-op pass-thr
17320 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69  ough macros, whi
17330 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ch is the.    **
17340 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
17350 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
17360 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65   value is 1, the
17370 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69  n ALWAYS() is ei
17380 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64  ther.    ** hard
17390 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f  -coded to true o
173a0 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74  r else it assert
173b0 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e  s if its argumen
173c0 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  t is false..    
173d0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68  ** The first beh
173e0 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65  avior (hard-code
173f0 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68  d to true) is th
17400 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
17410 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
17420 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
17430 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64  at assert() is d
17440 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  isabled and the 
17450 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65  second.    ** be
17460 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69  havior (assert i
17470 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
17480 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61  o ALWAYS() is fa
17490 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65  lse) is the case
174a0 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
174b0 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
174c0 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
174d0 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
174e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
174f0 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  The run-time tes
17500 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68  t procedure migh
17510 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67  t look something
17520 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
17530 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28  **.    **    if(
17540 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
17550 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
17560 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29  TCTRL_ALWAYS, 2)
17570 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20  ==2 ){.    **   
17580 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61     // ALWAYS() a
17590 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e  nd NEVER() are n
175a0 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67  o-op pass-throug
175b0 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20  h macros.    ** 
175c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
175d0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
175e0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
175f0 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a  L_ASSERT, 1) ){.
17600 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
17610 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73  LWAYS(x) asserts
17620 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e   that x is true.
17630 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74   NEVER(x) assert
17640 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  s x is false..  
17650 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    **    }else{. 
17660 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
17670 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e  WAYS(x) is a con
17680 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28  stant 1.  NEVER(
17690 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
176a0 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a   0..    **    }.
176b0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
176c0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
176d0 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20  ALWAYS: {.      
176e0 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
176f0 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  p,int);.      rc
17700 20 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20   = ALWAYS(x);.  
17710 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17720 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
17730 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
17740 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
17750 52 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33  RESERVE, sqlite3
17760 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20   *db, int N).   
17770 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74   **.    ** Set t
17780 68 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65  he nReserve size
17790 20 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61   to N for the ma
177a0 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74  in database on t
177b0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
177c0 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ** connection db
177d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
177e0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
177f0 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20  L_RESERVE: {.   
17800 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
17810 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
17820 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  te3*);.      int
17830 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69   x = va_arg(ap,i
17840 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
17850 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
17860 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
17870 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
17880 50 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62  PageSize(db->aDb
17890 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30  [0].pBt, 0, x, 0
178a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
178b0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
178c0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62  >mutex);.      b
178d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
178e0 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   /*  sqlite3_tes
178f0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
17900 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
17910 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33  ZATIONS, sqlite3
17920 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20   *db, int N).   
17930 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c   **.    ** Enabl
17940 65 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72  e or disable var
17950 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ious optimizatio
17960 6e 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  ns for testing p
17970 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20  urposes.  The . 
17980 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e     ** argument N
17990 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
179a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74   optimizations t
179b0 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20  o be disabled.  
179c0 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a  For normal.    *
179d0 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68  * operation N sh
179e0 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
179f0 69 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74  idea is that a t
17a00 65 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b  est program (lik
17a10 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c  e the.    ** SQL
17a20 20 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53   Logic Test or S
17a30 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20  LT test module) 
17a40 63 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65  can run the same
17a50 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69   SQL multiple ti
17a60 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  mes.    ** with 
17a70 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61  various optimiza
17a80 74 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74  tions disabled t
17a90 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
17aa0 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20  e same answer.  
17ab0 20 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64    ** is obtained
17ac0 20 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a   in every case..
17ad0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
17ae0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
17af0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b  OPTIMIZATIONS: {
17b00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
17b10 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
17b20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
17b30 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28   int x = va_arg(
17b40 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 64  ap,int);.      d
17b50 62 2d 3e 66 6c 61 67 73 20 3d 20 28 78 20 26 20  b->flags = (x & 
17b60 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29 20  SQLITE_OptMask) 
17b70 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 7e  | (db->flags & ~
17b80 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29 3b  SQLITE_OptMask);
17b90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17ba0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
17bb0 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20  TE_N_KEYWORD.   
17bc0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
17bd0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
17be0 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f  TESTCTRL_ISKEYWO
17bf0 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  RD, const char *
17c00 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20  zWord).    **.  
17c10 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73    ** If zWord is
17c20 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67   a keyword recog
17c30 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61 72  nized by the par
17c40 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ser, then return
17c50 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62   the.    ** numb
17c60 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20  er of keywords. 
17c70 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20   Or if zWord is 
17c80 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72  not a keyword, r
17c90 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20  eturn 0..    ** 
17ca0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73  .    ** This tes
17cb0 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c  t feature is onl
17cc0 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  y available in t
17cd0 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20  he amalgamation 
17ce0 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65  since.    ** the
17cf0 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
17d00 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64  D macro is not d
17d10 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66  efined in this f
17d20 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20  ile if SQLite.  
17d30 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73    ** is built us
17d40 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f 75  ing separate sou
17d50 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a  rce files..    *
17d60 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
17d70 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59  E_TESTCTRL_ISKEY
17d80 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f  WORD: {.      co
17d90 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20  nst char *zWord 
17da0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e  = va_arg(ap, con
17db0 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
17dc0 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
17dd0 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b  Strlen30(zWord);
17de0 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c  .      rc = (sql
17df0 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28  ite3KeywordCode(
17e00 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d  (u8*)zWord, n)!=
17e10 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f  TK_ID) ? SQLITE_
17e20 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20  N_KEYWORD : 0;. 
17e30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17e40 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f  }.#endif ..    /
17e50 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
17e60 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
17e70 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41  STCTRL_SCRATCHMA
17e80 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c  LLOC, sz, &pNew,
17e90 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a   pFree);.    **.
17ea0 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72 65      ** Pass pFre
17eb0 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53 63  e into sqlite3Sc
17ec0 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20 20  ratchFree(). .  
17ed0 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68 65    ** If sz>0 the
17ee0 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63 72  n allocate a scr
17ef0 61 74 63 68 20 62 75 66 66 65 72 20 69 6e 74 6f  atch buffer into
17f00 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a   pNew.  .    */.
17f10 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
17f20 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48  TESTCTRL_SCRATCH
17f30 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
17f40 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70  void *pFree, **p
17f50 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20  pNew;.      int 
17f60 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 76  sz;.      sz = v
17f70 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
17f80 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76 61        ppNew = va
17f90 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29  _arg(ap, void**)
17fa0 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d 20  ;.      pFree = 
17fb0 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
17fc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 20  );.      if( sz 
17fd0 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69 74  ) *ppNew = sqlit
17fe0 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28  e3ScratchMalloc(
17ff0 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sz);.      sqlit
18000 65 33 53 63 72 61 74 63 68 46 72 65 65 28 70 46  e3ScratchFree(pF
18010 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ree);.      brea
18020 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
18030 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
18040 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
18050 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
18060 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f  E_FAULT, int ono
18070 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ff);.    **.    
18080 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
18090 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72  onoff is non-zer
180a0 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65  o, configure the
180b0 20 77 72 61 70 70 65 72 73 20 73 6f 20 74 68 61   wrappers so tha
180c0 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62  t all.    ** sub
180d0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
180e0 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e 64   localtime() and
180f0 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e 20   variants fail. 
18100 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f  If onoff is zero
18110 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68  ,.    ** undo th
18120 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20  is setting..    
18130 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
18140 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
18150 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20  LTIME_FAULT: {. 
18160 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
18170 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74  alConfig.bLocalt
18180 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72  imeFault = va_ar
18190 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
181a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
181b0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
181c0 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
181d0 58 50 4c 41 49 4e 29 0a 20 20 20 20 2f 2a 20 20  XPLAIN).    /*  
181e0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
181f0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
18200 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54  TCTRL_EXPLAIN_ST
18210 4d 54 2c 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  MT,.    **      
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18230 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c    sqlite3_stmt*,
18240 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20  const char**);. 
18250 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
18260 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
18270 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
18280 5f 45 58 50 4c 41 49 4e 2c 20 65 61 63 68 20 73  _EXPLAIN, each s
18290 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 6f 6c 64  qlite3_stmt hold
182a0 73 0a 20 20 20 20 2a 2a 20 61 20 73 74 72 69 6e  s.    ** a strin
182b0 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
182c0 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 70   the optimized p
182d0 61 72 73 65 20 74 72 65 65 2e 20 20 54 68 69 73  arse tree.  This
182e0 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 0a 20 20   test-control.  
182f0 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70    ** returns a p
18300 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 73  ointer to that s
18310 74 72 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  tring..    */.  
18320 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
18330 53 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53  STCTRL_EXPLAIN_S
18340 54 4d 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TMT: {.      sql
18350 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
18360 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
18370 6c 69 74 65 33 5f 73 74 6d 74 2a 29 3b 0a 20 20  lite3_stmt*);.  
18380 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
18390 2a 70 7a 52 65 74 20 3d 20 76 61 5f 61 72 67 28  *pzRet = va_arg(
183a0 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2a  ap, const char**
183b0 29 3b 0a 20 20 20 20 20 20 2a 70 7a 52 65 74 20  );.      *pzRet 
183c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
183d0 6c 61 6e 61 74 69 6f 6e 28 28 56 64 62 65 2a 29  lanation((Vdbe*)
183e0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 62 72  pStmt);.      br
183f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
18400 66 0a 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28  f..  }.  va_end(
18410 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ap);.#endif /* S
18420 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54  QLITE_OMIT_BUILT
18430 49 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74  IN_TEST */.  ret
18440 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18450 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69   This is a utili
18460 74 79 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66  ty routine, usef
18470 75 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d  ul to VFS implem
18480 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20  entations, that 
18490 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65  checks.** to see
184a0 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66   if a database f
184b0 69 6c 65 20 77 61 73 20 61 20 55 52 49 20 74 68  ile was a URI th
184c0 61 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73  at contained a s
184d0 70 65 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a  pecific query .*
184e0 2a 20 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64  * parameter, and
184f0 20 69 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74   if so obtains t
18500 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
18510 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
18520 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
18530 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
18540 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f   the filename po
18550 69 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e 74  inter passed int
18560 6f 20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a  o the xOpen().**
18570 20 6d 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53   method of a VFS
18580 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
18590 20 20 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67    The zParam arg
185a0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
185b0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72  e of the.** quer
185c0 79 20 70 61 72 61 6d 65 74 65 72 20 77 65 20 73  y parameter we s
185d0 65 65 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69  eek.  This routi
185e0 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  ne returns the v
185f0 61 6c 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72  alue of the zPar
18600 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  am.** parameter 
18610 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20 49  if it exists.  I
18620 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
18630 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
18640 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
18650 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70  returns a NULL p
18660 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74  ointer..*/.const
18670 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75   char *sqlite3_u
18680 72 69 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e  ri_parameter(con
18690 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
186a0 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
186b0 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a  zParam){.  if( z
186c0 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 72 65  Filename==0 ) re
186d0 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e  turn 0;.  zFilen
186e0 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  ame += sqlite3St
186f0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
18700 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  ) + 1;.  while( 
18710 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
18720 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63      int x = strc
18730 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  mp(zFilename, zP
18740 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65  aram);.    zFile
18750 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
18760 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
18770 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20  e) + 1;.    if( 
18780 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46  x==0 ) return zF
18790 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69  ilename;.    zFi
187a0 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65  lename += sqlite
187b0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
187c0 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20  ame) + 1;.  }.  
187d0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
187e0 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c  ** Return a bool
187f0 65 61 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20  ean value for a 
18800 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
18810 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
18820 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73  uri_boolean(cons
18830 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
18840 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
18850 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74  Param, int bDflt
18860 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
18870 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  *z = sqlite3_uri
18880 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65  _parameter(zFile
18890 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20  name, zParam);. 
188a0 20 62 44 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d   bDflt = bDflt!=
188b0 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f 20  0;.  return z ? 
188c0 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61  sqlite3GetBoolea
188d0 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62 44  n(z, bDflt) : bD
188e0 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  flt;.}../*.** Re
188f0 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20 69 6e  turn a 64-bit in
18900 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20  teger value for 
18910 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  a query paramete
18920 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e  r..*/.sqlite3_in
18930 74 36 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  t64 sqlite3_uri_
18940 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74 20 63  int64(.  const c
18950 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
18960 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61     /* Filename a
18970 73 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65  s passed to xOpe
18980 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
18990 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20  r *zParam,      
189a0 20 2f 2a 20 55 52 49 20 70 61 72 61 6d 65 74 65   /* URI paramete
189b0 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71  r sought */.  sq
189c0 6c 69 74 65 33 5f 69 6e 74 36 34 20 62 44 66 6c  lite3_int64 bDfl
189d0 74 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72  t       /* retur
189e0 6e 20 69 66 20 70 61 72 61 6d 65 74 65 72 20 69  n if parameter i
189f0 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a  s missing */.){.
18a00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
18a10 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  = sqlite3_uri_pa
18a20 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d  rameter(zFilenam
18a30 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71  e, zParam);.  sq
18a40 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20  lite3_int64 v;. 
18a50 20 69 66 28 20 7a 20 26 26 20 73 71 6c 69 74 65   if( z && sqlite
18a60 33 41 74 6f 69 36 34 28 7a 2c 20 26 76 2c 20 73  3Atoi64(z, &v, s
18a70 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
18a80 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3d  ), SQLITE_UTF8)=
18a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18aa0 20 20 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d    bDflt = v;.  }
18ab0 0a 20 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b  .  return bDflt;
18ac0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
18ad0 20 74 68 65 20 42 74 72 65 65 20 70 6f 69 6e 74   the Btree point
18ae0 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  er identified by
18af0 20 7a 44 62 4e 61 6d 65 2e 20 20 52 65 74 75 72   zDbName.  Retur
18b00 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
18b10 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73  und..*/.Btree *s
18b20 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
18b30 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ree(sqlite3 *db,
18b40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
18b50 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
18b60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
18b70 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
18b80 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
18b90 42 74 0a 20 20 20 20 20 26 26 20 28 7a 44 62 4e  Bt.     && (zDbN
18ba0 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ame==0 || sqlite
18bb0 33 53 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d 65  3StrICmp(zDbName
18bc0 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61  , db->aDb[i].zNa
18bd0 6d 65 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20  me)==0).    ){. 
18be0 20 20 20 20 20 72 65 74 75 72 6e 20 64 62 2d 3e       return db->
18bf0 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
18c00 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
18c10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18c20 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f  n the filename o
18c30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
18c40 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
18c50 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
18c60 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73  nection..*/.cons
18c70 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
18c80 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69  db_filename(sqli
18c90 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
18ca0 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20  har *zDbName){. 
18cb0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 73 71   Btree *pBt = sq
18cc0 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72  lite3DbNameToBtr
18cd0 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b  ee(db, zDbName);
18ce0 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20  .  return pBt ? 
18cf0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
18d00 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20 30  ilename(pBt) : 0
18d10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18d20 6e 20 31 20 69 66 20 64 61 74 61 62 61 73 65 20  n 1 if database 
18d30 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  is read-only or 
18d40 30 20 69 66 20 72 65 61 64 2f 77 72 69 74 65 2e  0 if read/write.
18d50 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a    Return -1 if.*
18d60 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61  * no such databa
18d70 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e  se exists..*/.in
18d80 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61  t sqlite3_db_rea
18d90 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a 64  donly(sqlite3 *d
18da0 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
18db0 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65  DbName){.  Btree
18dc0 20 2a 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44   *pBt = sqlite3D
18dd0 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
18de0 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74   zDbName);.  ret
18df0 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65  urn pBt ? sqlite
18e00 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
18e10 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
18e20 65 72 28 70 42 74 29 29 20 3a 20 2d 31 3b 0a 7d  er(pBt)) : -1;.}
18e30 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e  ..#if (SQLITE_EN
18e40 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30  ABLE_APPLE_SPI>0
18e50 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  ) && defined(__A
18e60 50 50 4c 45 5f 5f 29 0a 0a 23 69 6e 63 6c 75 64  PPLE__)..#includ
18e70 65 20 22 73 71 6c 69 74 65 33 5f 70 72 69 76 61  e "sqlite3_priva
18e80 74 65 2e 68 22 0a 0a 2f 2a 20 0a 2a 2a 20 54 65  te.h"../* .** Te
18e90 73 74 69 6e 67 20 61 20 66 69 6c 65 20 70 61 74  sting a file pat
18ea0 68 20 66 6f 72 20 73 71 6c 69 74 65 20 6c 6f 63  h for sqlite loc
18eb0 6b 73 20 68 65 6c 64 20 62 79 20 61 20 70 72 6f  ks held by a pro
18ec0 63 65 73 73 20 49 44 2e 20 0a 2a 2a 20 52 65 74  cess ID. .** Ret
18ed0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  urns SQLITE_LOCK
18ee0 53 54 41 54 45 5f 4f 4e 20 69 66 20 6c 6f 63 6b  STATE_ON if lock
18ef0 73 20 61 72 65 20 70 72 65 73 65 6e 74 20 6f 6e  s are present on
18f00 20 70 61 74 68 0a 2a 2a 20 74 68 61 74 20 77 6f   path.** that wo
18f10 75 6c 64 20 70 72 65 76 65 6e 74 20 77 72 69 74  uld prevent writ
18f20 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
18f30 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 5f 73 71 6c  ase..*/.int _sql
18f40 69 74 65 33 5f 6c 6f 63 6b 73 74 61 74 65 28 63  ite3_lockstate(c
18f50 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
18f60 20 70 69 64 5f 74 20 70 69 64 29 7b 0a 20 20 73   pid_t pid){.  s
18f70 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 4e 55 4c  qlite3 *db = NUL
18f80 4c 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69  L;.  .  if( sqli
18f90 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70 61 74 68  te3_open_v2(path
18fa0 2c 20 26 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50  , &db, SQLITE_OP
18fb0 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 4e 55 4c  EN_READONLY, NUL
18fc0 4c 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  L) == SQLITE_OK 
18fd0 29 7b 0a 20 20 20 20 4c 6f 63 6b 73 74 61 74 65  ){.    Lockstate
18fe0 50 49 44 20 6c 6f 63 6b 73 74 61 74 65 20 3d 20  PID lockstate = 
18ff0 7b 70 69 64 2c 20 2d 31 7d 3b 0a 20 20 20 20 73  {pid, -1};.    s
19000 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
19010 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  rol(db, NULL, SQ
19020 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
19030 54 41 54 45 5f 50 49 44 2c 20 26 6c 6f 63 6b 73  TATE_PID, &locks
19040 74 61 74 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  tate);.    sqlit
19050 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
19060 20 20 69 6e 74 20 73 74 61 74 65 20 3d 20 6c 6f    int state = lo
19070 63 6b 73 74 61 74 65 2e 73 74 61 74 65 3b 0a 20  ckstate.state;. 
19080 20 20 20 72 65 74 75 72 6e 20 73 74 61 74 65 3b     return state;
19090 0a 20 20 7d 0a 20 20 69 66 28 20 4e 55 4c 4c 21  .  }.  if( NULL!
190a0 3d 64 62 20 29 7b 20 0a 20 20 20 20 73 71 6c 69  =db ){ .    sqli
190b0 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 20 2f  te3_close(db); /
190c0 2a 20 6e 65 65 64 20 74 6f 20 63 6c 6f 73 65 20  * need to close 
190d0 65 76 65 6e 20 69 66 20 6f 70 65 6e 20 72 65 74  even if open ret
190e0 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f  urns an error */
190f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
19100 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 45  LITE_LOCKSTATE_E
19110 52 52 4f 52 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  RROR;.}..#endif 
19120 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
19130 5f 41 50 50 4c 45 5f 53 50 49 20 2a 2f 0a        _APPLE_SPI */.