/ Hex Artifact Content
Login

Artifact 69330c9f9e815bb0313ea0661aeedf3cbeda4651:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
0290: 51 4c 52 52 0a 23 20 69 6e 63 6c 75 64 65 20 22  QLRR.# include "
02a0: 73 71 6c 72 72 2e 68 22 0a 23 65 6e 64 69 66 20  sqlrr.h".#endif 
02b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
02c0: 4e 41 42 4c 45 5f 46 54 53 33 0a 23 20 69 6e 63  NABLE_FTS3.# inc
02d0: 6c 75 64 65 20 22 66 74 73 33 2e 68 22 0a 23 65  lude "fts3.h".#e
02e0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
02f0: 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a  TE_ENABLE_RTREE.
0300: 23 20 69 6e 63 6c 75 64 65 20 22 72 74 72 65 65  # include "rtree
0310: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0320: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0330: 49 43 55 0a 23 20 69 6e 63 6c 75 64 65 20 22 73  ICU.# include "s
0340: 71 6c 69 74 65 69 63 75 2e 68 22 0a 23 65 6e 64  qliteicu.h".#end
0350: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
0360: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a  TE_AMALGAMATION.
0370: 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  /* IMPLEMENTATIO
0380: 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36 2d 34 35  N-OF: R-46656-45
0390: 31 35 36 20 54 68 65 20 73 71 6c 69 74 65 33 5f  156 The sqlite3_
03a0: 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67  version[] string
03b0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 63 6f 6e   constant.** con
03c0: 74 61 69 6e 73 20 74 68 65 20 74 65 78 74 20 6f  tains the text o
03d0: 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  f SQLITE_VERSION
03e0: 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73   macro. .*/.cons
03f0: 74 20 63 68 61 72 20 73 71 6c 69 74 65 33 5f 76  t char sqlite3_v
0400: 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c 49 54  ersion[] = SQLIT
0410: 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e 64 69  E_VERSION;.#endi
0420: 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  f../* IMPLEMENTA
0430: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33 35 33 36  TION-OF: R-53536
0440: 2d 34 32 35 37 35 20 54 68 65 20 73 71 6c 69 74  -42575 The sqlit
0450: 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 20  e3_libversion() 
0460: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
0470: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
0480: 20 74 68 65 20 74 6f 20 74 68 65 20 73 71 6c 69   the to the sqli
0490: 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74  te3_version[] st
04a0: 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e 20 0a  ring constant. .
04b0: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
04c0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
04d0: 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  n(void){ return 
04e0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 3b  sqlite3_version;
04f0: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0500: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 36 33 31 32  ATION-OF: R-6312
0510: 34 2d 33 39 33 30 30 20 54 68 65 20 73 71 6c 69  4-39300 The sqli
0520: 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 20 66  te3_sourceid() f
0530: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
0540: 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
0550: 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e  a string constan
0560: 74 20 77 68 6f 73 65 20 76 61 6c 75 65 20 69 73  t whose value is
0570: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
0580: 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f 55 52 43  .** SQLITE_SOURC
0590: 45 5f 49 44 20 43 20 70 72 65 70 72 6f 63 65 73  E_ID C preproces
05a0: 73 6f 72 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63  sor macro. .*/.c
05b0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
05c0: 65 33 5f 73 6f 75 72 63 65 69 64 28 76 6f 69 64  e3_sourceid(void
05d0: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
05e0: 5f 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a 0a 2f  _SOURCE_ID; }../
05f0: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0600: 2d 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36 33 35  -OF: R-35210-635
0610: 30 38 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c  08 The sqlite3_l
0620: 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72  ibversion_number
0630: 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72  () function.** r
0640: 65 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65  eturns an intege
0650: 72 20 65 71 75 61 6c 20 74 6f 20 53 51 4c 49 54  r equal to SQLIT
0660: 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
0670: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0680: 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
0690: 65 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e  er(void){ return
06a0: 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
06b0: 4e 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 20 49 4d  NUMBER; }../* IM
06c0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
06d0: 20 52 2d 32 30 37 39 30 2d 31 34 30 32 35 20 54   R-20790-14025 T
06e0: 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  he sqlite3_threa
06f0: 64 73 61 66 65 28 29 20 66 75 6e 63 74 69 6f 6e  dsafe() function
0700: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f   returns.** zero
0710: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
0720: 53 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69  SQLite was compi
0730: 6c 65 64 20 77 69 74 68 20 6d 75 74 65 78 69 6e  led with mutexin
0740: 67 20 63 6f 64 65 20 6f 6d 69 74 74 65 64 20 64  g code omitted d
0750: 75 65 20 74 6f 0a 2a 2a 20 74 68 65 20 53 51 4c  ue to.** the SQL
0760: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 63  ITE_THREADSAFE c
0770: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
0780: 6f 6e 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20  on being set to 
0790: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
07a0: 33 5f 74 68 72 65 61 64 73 61 66 65 28 76 6f 69  3_threadsafe(voi
07b0: 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d){ return SQLIT
07c0: 45 5f 54 48 52 45 41 44 53 41 46 45 3b 20 7d 0a  E_THREADSAFE; }.
07d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
07e0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
07f0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
0800: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
0810: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E)./*.** If the 
0820: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
0830: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  on pointer is no
0840: 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a 2a  t NULL and if.**
0850: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
0860: 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62 6c 65  OTRACE is enable
0870: 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67 65 73  d, then messages
0880: 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 49   describing.** I
0890: 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20 77 72  /O active are wr
08a0: 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68 69 73  itten using this
08b0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73   function.  Thes
08c0: 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61 72  e messages.** ar
08d0: 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 64  e intended for d
08e0: 65 62 75 67 67 69 6e 67 20 61 63 74 69 76 69 74  ebugging activit
08f0: 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  y only..*/.void 
0900: 28 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65  (*sqlite3IoTrace
0910: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e  )(const char*, .
0920: 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ..) = 0;.#endif.
0930: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f  ./*.** If the fo
0940: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
0950: 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74  ariable points t
0960: 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 68  o a string which
0970: 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20   is the.** name 
0980: 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  of a directory, 
0990: 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63 74  then that direct
09a0: 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ory will be used
09b0: 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d   to store.** tem
09c0: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a  porary files..**
09d0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
09e0: 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74   "PRAGMA temp_st
09f0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53  ore_directory" S
0a00: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63  QL command..*/.c
0a10: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 74 65 6d  har *sqlite3_tem
0a20: 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  p_directory = 0;
0a30: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
0a40: 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a  ze SQLite.  .**.
0a50: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0a60: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74  must be called t
0a70: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
0a80: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0a90: 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20  on,.** VFS, and 
0aa0: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73  mutex subsystems
0ab0: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
0ac0: 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b  any serious work
0ad0: 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e   with.** SQLite.
0ae0: 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73    But as long as
0af0: 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70   you do not comp
0b00: 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ile with SQLITE_
0b10: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a  OMIT_AUTOINIT.**
0b20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
0b30: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74  ll be called aut
0b40: 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65  omatically by ke
0b50: 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20  y routines such 
0b60: 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70  as.** sqlite3_op
0b70: 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  en().  .**.** Th
0b80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
0b90: 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20  no-op except on 
0ba0: 69 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63  its very first c
0bb0: 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63  all for the proc
0bc0: 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74  ess,.** or for t
0bd0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66  he first call af
0be0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
0bf0: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a  lite3_shutdown..
0c00: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
0c10: 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74  thread to call t
0c20: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
0c30: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
0c40: 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65  ion to.** comple
0c50: 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71  tion.  If subseq
0c60: 75 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c  uent threads cal
0c70: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  l this routine b
0c80: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a  efore the first.
0c90: 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69  ** thread has fi
0ca0: 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69  nished the initi
0cb0: 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73  alization proces
0cc0: 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73  s, then the subs
0cd0: 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64  equent.** thread
0ce0: 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74  s must block unt
0cf0: 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72  il the first thr
0d00: 65 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74  ead finishes wit
0d10: 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  h the initializa
0d20: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
0d30: 66 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67  first thread mig
0d40: 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ht call this rou
0d50: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
0d60: 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20  .  Recursive.** 
0d70: 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f  calls to this ro
0d80: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
0d90: 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73   block, of cours
0da0: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  e.  Otherwise th
0db0: 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74  e.** initializat
0dc0: 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c  ion process woul
0dd0: 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65  d never complete
0de0: 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65  ..**.** Let X be
0df0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61   the first threa
0e00: 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20  d to enter this 
0e10: 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20  routine.  Let Y 
0e20: 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  be some other.**
0e30: 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77   thread.  Then w
0e40: 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c  hile the initial
0e50: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
0e60: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58  his routine by X
0e70: 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74   is.** incomplet
0e80: 65 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65  e, it is require
0e90: 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  d that:.**.**   
0ea0: 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69   *  Calls to thi
0eb0: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59  s routine from Y
0ec0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0ed0: 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74  l the outer-most
0ee0: 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62  .**       call b
0ef0: 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a  y X completes..*
0f00: 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72  *.**    *  Recur
0f10: 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68  sive calls to th
0f20: 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  is routine from 
0f30: 74 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20  thread X return 
0f40: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
0f50: 20 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f       without blo
0f60: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
0f70: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
0f80: 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f  (void){.  MUTEX_
0f90: 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
0fa0: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
0fb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
0fc0: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
0fd0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1000: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1010: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1020: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1030: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1040: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
1050: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1060: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1070: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
1080: 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20  .  /* If SQLite 
1090: 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c  is already compl
10a0: 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65  etely initialize
10b0: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  d, then this cal
10c0: 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65  l.  ** to sqlite
10d0: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73  3_initialize() s
10e0: 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70  hould be a no-op
10f0: 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69 74 69  .  But the initi
1100: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d  alization.  ** m
1110: 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e  ust be complete.
1120: 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74    So isInit must
1130: 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69   not be set unti
1140: 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20  l the very end. 
1150: 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74   ** of this rout
1160: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ine..  */.  if( 
1170: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1180: 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74  fig.isInit ) ret
1190: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
11a0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
11b0: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
11c0: 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  em is initialize
11d0: 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  d.  If unable to
11e0: 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a   .  ** initializ
11f0: 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73  e the mutex subs
1200: 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61  ystem, return ea
1210: 72 6c 79 20 77 69 74 68 20 74 68 65 20 65 72 72  rly with the err
1220: 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  or..  ** If the 
1230: 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63  system is so sic
1240: 6b 20 74 68 61 74 20 77 65 20 61 72 65 20 75 6e  k that we are un
1250: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
1260: 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74   a mutex,.  ** t
1270: 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68  here is not much
1280: 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67   SQLite is going
1290: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64   to be able to d
12a0: 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  o..  **.  ** The
12b0: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
12c0: 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72 65 20   must take care 
12d0: 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69  of serializing i
12e0: 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74  ts own.  ** init
12f0: 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f  ialization..  */
1300: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d  .  rc = sqlite3M
1310: 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66  utexInit();.  if
1320: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1330: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
1340: 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20  ze the malloc() 
1350: 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72  system and the r
1360: 65 63 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75  ecursive pInitMu
1370: 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20  tex mutex..  ** 
1380: 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69  This operation i
1390: 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 74  s protected by t
13a0: 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52  he STATIC_MASTER
13b0: 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68   mutex.  Note th
13c0: 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c  at.  ** MutexAll
13d0: 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66  oc() is called f
13e0: 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75 74 65  or a static mute
13f0: 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69  x prior to initi
1400: 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a  alizing the.  **
1410: 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65   malloc subsyste
1420: 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73  m - this implies
1430: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
1440: 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63  tion of a static
1450: 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74  .  ** mutex must
1460: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73 75 70   not require sup
1470: 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61  port from the ma
1480: 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a  lloc subsystem..
1490: 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47    */.  MUTEX_LOG
14a0: 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
14b0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
14c0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
14d0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
14e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
14f0: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
1500: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1510: 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74  nfig.isMutexInit
1520: 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c   = 1;.  if( !sql
1530: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1540: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
1550: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1560: 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20  3MallocInit();. 
1570: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1580: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1590: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15a0: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d  g.isMallocInit =
15b0: 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c   1;.    if( !sql
15c0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
15d0: 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20  .pInitMutex ){. 
15e0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
15f0: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
1600: 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20  tex =.          
1610: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
1620: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1630: 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20  RECURSIVE);.    
1640: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1650: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
1660: 75 74 65 78 20 26 26 20 21 73 71 6c 69 74 65 33  utex && !sqlite3
1670: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1680: 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  itMutex ){.     
1690: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
16a0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
16b0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
16c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16d0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
16e0: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
16f0: 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  utex++;.  }.  sq
1700: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1710: 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f  e(pMaster);..  /
1720: 2a 20 49 66 20 72 63 20 69 73 20 6e 6f 74 20 53  * If rc is not S
1730: 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74 68 69 73  QLITE_OK at this
1740: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69 74   point, then eit
1750: 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a 20  her the malloc. 
1760: 20 2a 2a 20 73 75 62 73 79 73 74 65 6d 20 63 6f   ** subsystem co
1770: 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 69 74 69  uld not be initi
1780: 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20 73 79  alized or the sy
1790: 73 74 65 6d 20 66 61 69 6c 65 64 20 74 6f 20 61  stem failed to a
17a0: 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65  llocate.  ** the
17b0: 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65   pInitMutex mute
17c0: 78 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  x. Return an err
17d0: 6f 72 20 69 6e 20 65 69 74 68 65 72 20 63 61 73  or in either cas
17e0: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  e.  */.  if( rc!
17f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1800: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1810: 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 72 65  ..  /* Do the re
1820: 73 74 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  st of the initia
1830: 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20 74  lization under t
1840: 68 65 20 72 65 63 75 72 73 69 76 65 20 6d 75 74  he recursive mut
1850: 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ex so.  ** that 
1860: 77 65 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  we will be able 
1870: 74 6f 20 68 61 6e 64 6c 65 20 72 65 63 75 72 73  to handle recurs
1880: 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a 20  ive calls into. 
1890: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74   ** sqlite3_init
18a0: 69 61 6c 69 7a 65 28 29 2e 20 20 54 68 65 20 72  ialize().  The r
18b0: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6e  ecursive calls n
18c0: 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68 72  ormally come thr
18d0: 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74 65  ough.  ** sqlite
18e0: 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 68 65 6e  3_os_init() when
18f0: 20 69 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69   it invokes sqli
1900: 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
1910: 28 29 2c 20 62 75 74 20 6f 74 68 65 72 0a 20 20  (), but other.  
1920: 2a 2a 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  ** recursive cal
1930: 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  ls might also be
1940: 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a 0a   possible..  **.
1950: 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
1960: 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30 2d  ION-OF: R-00140-
1970: 33 37 34 34 35 20 53 51 4c 69 74 65 20 61 75 74  37445 SQLite aut
1980: 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 72 69 61  omatically seria
1990: 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a 2a  lizes calls.  **
19a0: 20 74 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65   to the xInit me
19b0: 74 68 6f 64 2c 20 73 6f 20 74 68 65 20 78 49 6e  thod, so the xIn
19c0: 69 74 20 6d 65 74 68 6f 64 20 6e 65 65 64 20 6e  it method need n
19d0: 6f 74 20 62 65 20 74 68 72 65 61 64 73 61 66 65  ot be threadsafe
19e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
19f0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78 20  following mutex 
1a00: 69 73 20 77 68 61 74 20 73 65 72 69 61 6c 69 7a  is what serializ
1a10: 65 73 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  es access to the
1a20: 20 61 70 70 64 65 66 20 70 63 61 63 68 65 20 78   appdef pcache x
1a30: 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f 64  Init.  ** method
1a40: 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
1a50: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e 78  pcache_methods.x
1a60: 49 6e 69 74 28 29 20 61 6c 6c 20 69 73 20 65 6d  Init() all is em
1a70: 62 65 64 64 65 64 20 69 6e 20 74 68 65 0a 20 20  bedded in the.  
1a80: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
1a90: 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69  e3PcacheInitiali
1aa0: 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ze()..  */.  sql
1ab0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1ac0: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
1ad0: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29  nfig.pInitMutex)
1ae0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ;.  if( sqlite3G
1af0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
1b00: 69 74 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  it==0 && sqlite3
1b10: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
1b20: 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20  rogress==0 ){.  
1b30: 20 20 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70    FuncDefHash *p
1b40: 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46  Hash = &GLOBAL(F
1b50: 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69  uncDefHash, sqli
1b60: 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  te3GlobalFunctio
1b70: 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ns);.    sqlite3
1b80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
1b90: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20  rogress = 1;.   
1ba0: 20 6d 65 6d 73 65 74 28 70 48 61 73 68 2c 20 30   memset(pHash, 0
1bb0: 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  , sizeof(sqlite3
1bc0: 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29  GlobalFunctions)
1bd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1be0: 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e 63  gisterGlobalFunc
1bf0: 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28  tions();.    if(
1c00: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1c10: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
1c20: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
1c30: 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1c40: 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  Initialize();.  
1c50: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1c60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c70: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1c80: 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49  Config.isPCacheI
1c90: 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  nit = 1;.      r
1ca0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69  c = sqlite3OsIni
1cb0: 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  t();.    }.    i
1cc0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cd0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ce0: 33 50 43 61 63 68 65 42 75 66 66 65 72 53 65 74  3PCacheBufferSet
1cf0: 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  up( sqlite3Globa
1d00: 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20 0a  lConfig.pPage, .
1d10: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d20: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
1d30: 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47 6c 6f  Page, sqlite3Glo
1d40: 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 29  balConfig.nPage)
1d50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
1d60: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
1d70: 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  it = 1;.    }.  
1d80: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1d90: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
1da0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
1db0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1dc0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1dd0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
1de0: 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75  ..  /* Go back u
1df0: 6e 64 65 72 20 74 68 65 20 73 74 61 74 69 63 20  nder the static 
1e00: 6d 75 74 65 78 20 61 6e 64 20 63 6c 65 61 6e 20  mutex and clean 
1e10: 75 70 20 74 68 65 20 72 65 63 75 72 73 69 76 65  up the recursive
1e20: 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70  .  ** mutex to p
1e30: 72 65 76 65 6e 74 20 61 20 72 65 73 6f 75 72 63  revent a resourc
1e40: 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73  e leak..  */.  s
1e50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1e60: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1e70: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1e80: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
1e90: 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  --;.  if( sqlite
1ea0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1eb0: 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29  efInitMutex<=0 )
1ec0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
1ed0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1ee0: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3d  g.nRefInitMutex=
1ef0: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
1f00: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73 71 6c  3_mutex_free(sql
1f10: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1f20: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20  .pInitMutex);.  
1f30: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1f40: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1f50: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
1f60: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1f70: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
1f80: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
1f90: 20 6a 75 73 74 20 61 20 73 61 6e 69 74 79 20 63   just a sanity c
1fa0: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
1fb0: 65 20 53 51 4c 69 74 65 20 68 61 73 0a 20 20 2a  e SQLite has.  *
1fc0: 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20  * been compiled 
1fd0: 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 74 20 69  correctly.  It i
1fe0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72  s important to r
1ff0: 75 6e 20 74 68 69 73 20 63 6f 64 65 2c 20 62 75  un this code, bu
2000: 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  t.  ** we don't 
2010: 77 61 6e 74 20 74 6f 20 72 75 6e 20 69 74 20 74  want to run it t
2020: 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61  oo often and soa
2030: 6b 20 75 70 20 43 50 55 20 63 79 63 6c 65 73 20  k up CPU cycles 
2040: 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73  for no.  ** reas
2050: 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75 6e 20 69  on.  So we run i
2060: 74 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 69 6e  t once during in
2070: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
2080: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
2090: 47 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  G.#ifndef SQLITE
20a0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
20b0: 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69 73 20 73  OINT.  /* This s
20c0: 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73  ection of code's
20d0: 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74 22 20 69   only "output" i
20e0: 73 20 76 69 61 20 61 73 73 65 72 74 28 29 20 73  s via assert() s
20f0: 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  tatements. */.  
2100: 69 66 20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  if ( rc==SQLITE_
2110: 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34 20 78 20  OK ){.    u64 x 
2120: 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 36 33 29  = (((u64)1)<<63)
2130: 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79  -1;.    double y
2140: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69 7a  ;.    assert(siz
2150: 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20 20 20 20  eof(x)==8);.    
2160: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
2170: 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b 0a 20 20  ==sizeof(y));.  
2180: 20 20 6d 65 6d 63 70 79 28 26 79 2c 20 26 78 2c    memcpy(&y, &x,
2190: 20 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   8);.    assert(
21a0: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 79 29   sqlite3IsNaN(y)
21b0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   );.  }.#endif.#
21c0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 65  endif..  /* Do e
21d0: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
21e0: 69 6f 6e 20 73 74 65 70 73 20 72 65 71 75 65 73  ion steps reques
21f0: 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ted by the SQLIT
2200: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 2a  E_EXTRA_INIT.  *
2210: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  * compile-time o
2220: 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  ption..  */.#ifd
2230: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
2240: 49 4e 49 54 0a 20 20 69 66 28 20 72 63 3d 3d 53  INIT.  if( rc==S
2250: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69  QLITE_OK && sqli
2260: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2270: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e  isInit ){.    in
2280: 74 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  t SQLITE_EXTRA_I
2290: 4e 49 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  NIT(const char*)
22a0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
22b0: 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b  E_EXTRA_INIT(0);
22c0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
22d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22e0: 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65  ** Undo the effe
22f0: 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  cts of sqlite3_i
2300: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75  nitialize().  Mu
2310: 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  st not be called
2320: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20   while.** there 
2330: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
2340: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2350: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
2360: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a  llocations or.**
2370: 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20   while any part 
2380: 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68  of SQLite is oth
2390: 65 72 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e  erwise in use in
23a0: 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68   any thread.  Th
23b0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
23c0: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e   not threadsafe.
23d0: 20 20 42 75 74 20 69 74 20 69 73 20 73 61 66 65    But it is safe
23e0: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20   to invoke this 
23f0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68  routine.** on wh
2400: 65 6e 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72  en SQLite is alr
2410: 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20  eady shut down. 
2420: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c   If SQLite is al
2430: 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a  ready shut down.
2440: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
2450: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c  tine is invoked,
2460: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
2470: 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
2480: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
2490: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
24a0: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 73 71 6c  void){.  if( sql
24b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
24c0: 2e 69 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65  .isInit ){.#ifde
24d0: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53  f SQLITE_EXTRA_S
24e0: 48 55 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64  HUTDOWN.    void
24f0: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48   SQLITE_EXTRA_SH
2500: 55 54 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20  UTDOWN(void);.  
2510: 20 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53    SQLITE_EXTRA_S
2520: 48 55 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69  HUTDOWN();.#endi
2530: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73  f.    sqlite3_os
2540: 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69  _end();.    sqli
2550: 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65  te3_reset_auto_e
2560: 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20  xtension();.    
2570: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2580: 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  fig.isInit = 0;.
2590: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
25a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
25b0: 50 43 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20  PCacheInit ){.  
25c0: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
25d0: 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73  hutdown();.    s
25e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
25f0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
2600: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
2610: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2620: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
2630: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61  ){.    sqlite3Ma
2640: 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73  llocEnd();.    s
2650: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2660: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
2670: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
2680: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2690: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 29  ig.isMutexInit )
26a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74  {.    sqlite3Mut
26b0: 65 78 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  exEnd();.    sql
26c0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
26d0: 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d 20 30  .isMutexInit = 0
26e0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
26f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2700: 0a 2a 2a 20 54 68 69 73 20 41 50 49 20 61 6c 6c  .** This API all
2710: 6f 77 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  ows applications
2720: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 67   to modify the g
2730: 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  lobal configurat
2740: 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 53 51  ion of.** the SQ
2750: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 61 74 20  Lite library at 
2760: 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  run-time..**.** 
2770: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
2780: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
2790: 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
27a0: 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
27b0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
27c0: 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f  nections or memo
27d0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20  ry allocations. 
27e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
27f0: 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 61   not.** threadsa
2800: 66 65 2e 20 20 46 61 69 6c 75 72 65 20 74 6f 20  fe.  Failure to 
2810: 68 65 65 64 20 74 68 65 73 65 20 77 61 72 6e 69  heed these warni
2820: 6e 67 73 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  ngs can lead to 
2830: 75 6e 70 72 65 64 69 63 74 61 62 6c 65 0a 2a 2a  unpredictable.**
2840: 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e   behavior..*/.in
2850: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  t sqlite3_config
2860: 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20  (int op, ...){. 
2870: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
2880: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2890: 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33  K;..  /* sqlite3
28a0: 5f 63 6f 6e 66 69 67 28 29 20 73 68 61 6c 6c 20  _config() shall 
28b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
28c0: 53 55 53 45 20 69 66 20 69 74 20 69 73 20 69 6e  SUSE if it is in
28d0: 76 6f 6b 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a  voked while.  **
28e0: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
28f0: 61 72 79 20 69 73 20 69 6e 20 75 73 65 2e 20 2a  ary is in use. *
2900: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  /.  if( sqlite3G
2910: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
2920: 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  it ) return SQLI
2930: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
2940: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
2950: 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op);.  switch( o
2960: 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4d 75 74  p ){..    /* Mut
2970: 65 78 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ex configuration
2980: 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 6f 6e 6c   options are onl
2990: 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  y available in a
29a0: 20 74 68 72 65 61 64 73 61 66 65 0a 20 20 20 20   threadsafe.    
29b0: 2a 2a 20 63 6f 6d 70 69 6c 65 2e 20 0a 20 20 20  ** compile. .   
29c0: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
29d0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
29e0: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
29f0: 45 41 44 53 41 46 45 3e 30 0a 20 20 20 20 63 61  EADSAFE>0.    ca
2a00: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
2a10: 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b  _SINGLETHREAD: {
2a20: 0a 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c  .      /* Disabl
2a30: 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a  e all mutexing *
2a40: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
2a50: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
2a60: 65 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20  eMutex = 0;.    
2a70: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2a80: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
2a90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
2aa0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
2ab0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
2ac0: 4d 55 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a 20  MULTITHREAD: {. 
2ad0: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
2ae0: 6d 75 74 65 78 69 6e 67 20 6f 66 20 64 61 74 61  mutexing of data
2af0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
2b00: 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61   */.      /* Ena
2b10: 62 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20  ble mutexing of 
2b20: 63 6f 72 65 20 64 61 74 61 20 73 74 72 75 63 74  core data struct
2b30: 75 72 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 71  ures */.      sq
2b40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2b50: 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31  g.bCoreMutex = 1
2b60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
2b70: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
2b80: 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20  lMutex = 0;.    
2b90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2ba0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2bb0: 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49 5a 45 44  ONFIG_SERIALIZED
2bc0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61  : {.      /* Ena
2bd0: 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e 67  ble all mutexing
2be0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2bf0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
2c00: 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20  oreMutex = 1;.  
2c10: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2c20: 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
2c30: 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  ex = 1;.      br
2c40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
2c50: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
2c60: 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20  G_MUTEX: {.     
2c70: 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61   /* Specify an a
2c80: 6c 74 65 72 6e 61 74 69 76 65 20 6d 75 74 65 78  lternative mutex
2c90: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2ca0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2cb0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74  GlobalConfig.mut
2cc0: 65 78 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c  ex = *va_arg(ap,
2cd0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d   sqlite3_mutex_m
2ce0: 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20  ethods*);.      
2cf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2d00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2d10: 46 49 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a  FIG_GETMUTEX: {.
2d20: 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76        /* Retriev
2d30: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 75  e the current mu
2d40: 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tex implementati
2d50: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f  on */.      *va_
2d60: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
2d70: 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20  mutex_methods*) 
2d80: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
2d90: 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20  onfig.mutex;.   
2da0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2db0: 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20 63 61 73  #endif...    cas
2dc0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
2dd0: 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
2de0: 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c  /* Specify an al
2df0: 74 65 72 6e 61 74 69 76 65 20 6d 61 6c 6c 6f 63  ternative malloc
2e00: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2e10: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2e20: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
2e30: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
2e40: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
2e50: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
2e60: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2e70: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
2e80: 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  TMALLOC: {.     
2e90: 20 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65   /* Retrieve the
2ea0: 20 63 75 72 72 65 6e 74 20 6d 61 6c 6c 6f 63 28   current malloc(
2eb0: 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  ) implementation
2ec0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
2ed0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2ee0: 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29  g.m.xMalloc==0 )
2ef0: 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65   sqlite3MemSetDe
2f00: 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 2a  fault();.      *
2f10: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
2f20: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29  e3_mem_methods*)
2f30: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
2f40: 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20 20 20  Config.m;.      
2f50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2f60: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2f70: 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a 20 7b  FIG_MEMSTATUS: {
2f80: 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65  .      /* Enable
2f90: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
2fa0: 6d 61 6c 6c 6f 63 20 73 74 61 74 75 73 20 63 6f  malloc status co
2fb0: 6c 6c 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  llection */.    
2fc0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2fd0: 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d  onfig.bMemstat =
2fe0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
2ff0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3000: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3010: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41  LITE_CONFIG_SCRA
3020: 54 43 48 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  TCH: {.      /* 
3030: 44 65 73 69 67 6e 61 74 65 20 61 20 62 75 66 66  Designate a buff
3040: 65 72 20 66 6f 72 20 73 63 72 61 74 63 68 20 6d  er for scratch m
3050: 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20  emory space */. 
3060: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3070: 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63  alConfig.pScratc
3080: 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  h = va_arg(ap, v
3090: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  oid*);.      sql
30a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
30b0: 2e 73 7a 53 63 72 61 74 63 68 20 3d 20 76 61 5f  .szScratch = va_
30c0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
30d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
30e0: 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68  lConfig.nScratch
30f0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3100: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
3110: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3120: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41  SQLITE_CONFIG_PA
3130: 47 45 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20  GECACHE: {.     
3140: 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20   /* Designate a 
3150: 62 75 66 66 65 72 20 66 6f 72 20 70 61 67 65 20  buffer for page 
3160: 63 61 63 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  cache memory spa
3170: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
3180: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3190: 70 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  pPage = va_arg(a
31a0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
31b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
31c0: 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61  nfig.szPage = va
31d0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
31e0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
31f0: 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d  alConfig.nPage =
3200: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
3210: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3220: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53     }..    case S
3230: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41  QLITE_CONFIG_PCA
3240: 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  CHE: {.      /* 
3250: 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62  no-op */.      b
3260: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3270: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3280: 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20 7b 0a  IG_GETPCACHE: {.
3290: 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 6e 20        /* now an 
32a0: 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72  error */.      r
32b0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
32c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
32d0: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53     }..    case S
32e0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41  QLITE_CONFIG_PCA
32f0: 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CHE2: {.      /*
3300: 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65   Specify an alte
3310: 72 6e 61 74 69 76 65 20 70 61 67 65 20 63 61 63  rnative page cac
3320: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
3330: 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  n */.      sqlit
3340: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
3350: 63 61 63 68 65 32 20 3d 20 2a 76 61 5f 61 72 67  cache2 = *va_arg
3360: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61  (ap, sqlite3_pca
3370: 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 3b 0a  che_methods2*);.
3380: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3390: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
33a0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
33b0: 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 69 66  CHE2: {.      if
33c0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
33d0: 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 2e 78 49  onfig.pcache2.xI
33e0: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
33f0: 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 53    sqlite3PCacheS
3400: 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20  etDefault();.   
3410: 20 20 20 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61     }.      *va_a
3420: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70  rg(ap, sqlite3_p
3430: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29  cache_methods2*)
3440: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
3450: 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 3b 0a  Config.pcache2;.
3460: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3470: 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28   }..#if defined(
3480: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
3490: 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69 6e 65  MSYS3) || define
34a0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
34b0: 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63 61 73  MEMSYS5).    cas
34c0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
34d0: 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  HEAP: {.      /*
34e0: 20 44 65 73 69 67 6e 61 74 65 20 61 20 62 75 66   Designate a buf
34f0: 66 65 72 20 66 6f 72 20 68 65 61 70 20 6d 65 6d  fer for heap mem
3500: 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ory space */.   
3510: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3520: 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 76  Config.pHeap = v
3530: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
3540: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
3550: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61  lobalConfig.nHea
3560: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  p = va_arg(ap, i
3570: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
3580: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3590: 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28 61 70  nReq = va_arg(ap
35a0: 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20 69  , int);..      i
35b0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
35c0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c 31 20 29  Config.mnReq<1 )
35d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
35e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
35f0: 52 65 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Req = 1;.      }
3600: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
3610: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
3620: 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b 0a 20 20  eq>(1<<12) ){.  
3630: 20 20 20 20 20 20 2f 2a 20 63 61 70 20 6d 69 6e        /* cap min
3640: 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 61 74   request size at
3650: 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20 20 20 20   2^12 */.       
3660: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3670: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 28 31 3c  nfig.mnReq = (1<
3680: 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  <12);.      }.. 
3690: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
36a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
36b0: 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ap==0 ){.       
36c0: 20 2f 2a 20 49 66 20 74 68 65 20 68 65 61 70 20   /* If the heap 
36d0: 70 6f 69 6e 74 65 72 20 69 73 20 4e 55 4c 4c 2c  pointer is NULL,
36e0: 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68   then restore th
36f0: 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65  e malloc impleme
3700: 6e 74 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  ntation.        
3710: 2a 2a 20 62 61 63 6b 20 74 6f 20 4e 55 4c 4c 20  ** back to NULL 
3720: 70 6f 69 6e 74 65 72 73 20 74 6f 6f 2e 20 20 54  pointers too.  T
3730: 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
3740: 68 65 20 6d 61 6c 6c 6f 63 20 74 6f 20 67 6f 0a  he malloc to go.
3750: 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20          ** back 
3760: 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74 20 69  to its default i
3770: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 68  mplementation wh
3780: 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  en sqlite3_initi
3790: 61 6c 69 7a 65 28 29 20 69 73 0a 20 20 20 20 20  alize() is.     
37a0: 20 20 20 2a 2a 20 72 75 6e 2e 0a 20 20 20 20 20     ** run..     
37b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65     */.        me
37c0: 6d 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f  mset(&sqlite3Glo
37d0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20  balConfig.m, 0, 
37e0: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c  sizeof(sqlite3Gl
37f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a  obalConfig.m));.
3800: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3810: 20 20 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70       /* The heap
3820: 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20   pointer is not 
3830: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e 73 74 61  NULL, then insta
3840: 6c 6c 20 6f 6e 65 20 6f 66 20 74 68 65 0a 20 20  ll one of the.  
3850: 20 20 20 20 20 20 2a 2a 20 6d 65 6d 35 2e 63 2f        ** mem5.c/
3860: 6d 65 6d 33 2e 63 20 6d 65 74 68 6f 64 73 2e 20  mem3.c methods. 
3870: 49 66 20 6e 65 69 74 68 65 72 20 45 4e 41 42 4c  If neither ENABL
3880: 45 5f 4d 45 4d 53 59 53 33 20 6e 6f 72 0a 20 20  E_MEMSYS3 nor.  
3890: 20 20 20 20 20 20 2a 2a 20 45 4e 41 42 4c 45 5f        ** ENABLE_
38a0: 4d 45 4d 53 59 53 35 20 69 73 20 64 65 66 69 6e  MEMSYS5 is defin
38b0: 65 64 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  ed, return an er
38c0: 72 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ror..        */.
38d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
38e0: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20  ABLE_MEMSYS3.   
38f0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3900: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
3910: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
3920: 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  s3();.#endif.#if
3930: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3940: 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20  E_MEMSYS5.      
3950: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3960: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
3970: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28  e3MemGetMemsys5(
3980: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
3990: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
39a0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
39b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
39c0: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
39d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
39e0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
39f0: 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28  kaside = va_arg(
3a00: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
3a10: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3a20: 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  fig.nLookaside =
3a30: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
3a40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3a50: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a     }.    .    /*
3a60: 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   Record a pointe
3a70: 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20  r to the logger 
3a80: 66 75 6e 63 63 74 69 6f 6e 20 61 6e 64 20 69 74  funcction and it
3a90: 73 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  s first argument
3aa0: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66  ..    ** The def
3ab0: 61 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c  ault is NULL.  L
3ac0: 6f 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c  ogging is disabl
3ad0: 65 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  ed if the functi
3ae0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20  on pointer is.  
3af0: 20 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a    ** NULL..    *
3b00: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
3b10: 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a  E_CONFIG_LOG: {.
3b20: 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73        /* MSVC is
3b30: 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c   picky about pul
3b40: 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66  ling func ptrs f
3b50: 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20  rom va lists..  
3b60: 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75      ** http://su
3b70: 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e  pport.microsoft.
3b80: 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20  com/kb/47961.   
3b90: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f     ** sqlite3Glo
3ba0: 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d  balConfig.xLog =
3bb0: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
3bc0: 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  (*)(void*,int,co
3bd0: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20  nst char*));.   
3be0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65     */.      type
3bf0: 64 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e  def void(*LOGFUN
3c00: 43 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  C_t)(void*,int,c
3c10: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
3c20: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3c30: 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61  Config.xLog = va
3c40: 5f 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43  _arg(ap, LOGFUNC
3c50: 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  _t);.      sqlit
3c60: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
3c70: 4c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28  LogArg = va_arg(
3c80: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
3c90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
3ca0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3cb0: 43 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20  CONFIG_URI: {.  
3cc0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3cd0: 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69  lConfig.bOpenUri
3ce0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3cf0: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
3d00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61  .    }..    defa
3d10: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  ult: {.      rc 
3d20: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
3d30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3d40: 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28   }.  }.  va_end(
3d50: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ap);.  return rc
3d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
3d70: 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  p the lookaside 
3d80: 62 75 66 66 65 72 73 20 66 6f 72 20 61 20 64 61  buffers for a da
3d90: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
3da0: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  n..** Return SQL
3db0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
3dc0: 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61  s.  .** If looka
3dd0: 73 69 64 65 20 69 73 20 61 6c 72 65 61 64 79 20  side is already 
3de0: 61 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53  active, return S
3df0: 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a  QLITE_BUSY..**.*
3e00: 2a 20 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74  * The sz paramet
3e10: 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  er is the number
3e20: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 65 61 63   of bytes in eac
3e30: 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  h lookaside slot
3e40: 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72  ..** The cnt par
3e50: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75  ameter is the nu
3e60: 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20  mber of slots.  
3e70: 49 66 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c  If pStart is NUL
3e80: 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66  L the.** space f
3e90: 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  or the lookaside
3ea0: 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69   memory is obtai
3eb0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
3ec0: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66  _malloc()..** If
3ed0: 20 70 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e   pStart is not N
3ee0: 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73  ULL then it is s
3ef0: 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d  z*cnt bytes of m
3f00: 65 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72  emory to use for
3f10: 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64  .** the lookasid
3f20: 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
3f30: 74 69 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f  tic int setupLoo
3f40: 6b 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a  kaside(sqlite3 *
3f50: 64 62 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  db, void *pBuf, 
3f60: 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29  int sz, int cnt)
3f70: 7b 0a 20 20 76 6f 69 64 20 2a 70 53 74 61 72 74  {.  void *pStart
3f80: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  ;.  if( db->look
3f90: 61 73 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20 20  aside.nOut ){.  
3fa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3fb0: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46  BUSY;.  }.  /* F
3fc0: 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ree any existing
3fd0: 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65   lookaside buffe
3fe0: 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64 6c  r for this handl
3ff0: 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6c  e before.  ** al
4000: 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f  locating a new o
4010: 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 68  ne so we don't h
4020: 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61 63  ave to have spac
4030: 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74 68  e for .  ** both
4040: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
4050: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  e..  */.  if( db
4060: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
4070: 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  loced ){.    sql
4080: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f  ite3_free(db->lo
4090: 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b  okaside.pStart);
40a0: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 69  .  }.  /* The si
40b0: 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69 64  ze of a lookasid
40c0: 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f 55  e slot after ROU
40d0: 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74 6f  NDDOWN8 needs to
40e0: 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a 20   be larger.  ** 
40f0: 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  than a pointer t
4100: 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20 2a  o be useful..  *
4110: 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f  /.  sz = ROUNDDO
4120: 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d 50  WN8(sz);  /* IMP
4130: 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32 20  : R-33038-09382 
4140: 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69 6e  */.  if( sz<=(in
4150: 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69  t)sizeof(Lookasi
4160: 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d 20  deSlot*) ) sz = 
4170: 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20 29  0;.  if( cnt<0 )
4180: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20   cnt = 0;.  if( 
4190: 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30 20  sz==0 || cnt==0 
41a0: 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20  ){.    sz = 0;. 
41b0: 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20     pStart = 0;. 
41c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66 3d   }else if( pBuf=
41d0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
41e0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
41f0: 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72 74  oc();.    pStart
4200: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
4210: 28 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a 20  ( sz*cnt );  /* 
4220: 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35 37  IMP: R-61949-357
4230: 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  27 */.    sqlite
4240: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
4250: 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  ();.    if( pSta
4260: 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69 74  rt ) cnt = sqlit
4270: 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53 74  e3MallocSize(pSt
4280: 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65  art)/sz;.  }else
4290: 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  {.    pStart = p
42a0: 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c  Buf;.  }.  db->l
42b0: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
42c0: 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e  = pStart;.  db->
42d0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20  lookaside.pFree 
42e0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  = 0;.  db->looka
42f0: 73 69 64 65 2e 73 7a 20 3d 20 28 75 31 36 29 73  side.sz = (u16)s
4300: 7a 3b 0a 20 20 69 66 28 20 70 53 74 61 72 74 20  z;.  if( pStart 
4310: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
4320: 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20    LookasideSlot 
4330: 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  *p;.    assert( 
4340: 73 7a 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f 66  sz > (int)sizeof
4350: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
4360: 20 29 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f 6f   );.    p = (Loo
4370: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70 53 74 61  kasideSlot*)pSta
4380: 72 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e  rt;.    for(i=cn
4390: 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  t-1; i>=0; i--){
43a0: 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  .      p->pNext 
43b0: 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  = db->lookaside.
43c0: 70 46 72 65 65 3b 0a 20 20 20 20 20 20 64 62 2d  pFree;.      db-
43d0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65  >lookaside.pFree
43e0: 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 3d 20   = p;.      p = 
43f0: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
4400: 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20  &((u8*)p)[sz];. 
4410: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f     }.    db->loo
4420: 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 70 3b  kaside.pEnd = p;
4430: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
4440: 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 31 3b  de.bEnabled = 1;
4450: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
4460: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 70  de.bMalloced = p
4470: 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d  Buf==0 ?1:0;.  }
4480: 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f  else{.    db->lo
4490: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 30  okaside.pEnd = 0
44a0: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
44b0: 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30  ide.bEnabled = 0
44c0: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
44d0: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20  ide.bMalloced = 
44e0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
44f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4500: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
4510: 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  utex associated 
4520: 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20  with a database 
4530: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
4540: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 73 71  qlite3_mutex *sq
4550: 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 73  lite3_db_mutex(s
4560: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
4570: 65 74 75 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b  eturn db->mutex;
4580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75  .}../*.** Free u
4590: 70 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  p as much memory
45a0: 20 61 73 20 77 65 20 63 61 6e 20 66 72 6f 6d 20   as we can from 
45b0: 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61  the given databa
45c0: 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
45d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
45e0: 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  _db_release_memo
45f0: 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ry(sqlite3 *db){
4600: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
4610: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
4620: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
4630: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
4640: 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d  ll(db);.  for(i=
4650: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
4660: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
4670: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
4680: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
4690: 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20   ){.      Pager 
46a0: 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  *pPager = sqlite
46b0: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
46c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
46d0: 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67 65  agerShrink(pPage
46e0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
46f0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
4700: 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69  eAll(db);.  sqli
4710: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
4720: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
4730: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4740: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
4750: 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20  ration settings 
4760: 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61  for an individua
4770: 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  l database conne
4780: 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ction.*/.int sql
4790: 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73  ite3_db_config(s
47a0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
47b0: 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  op, ...){.  va_l
47c0: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63  ist ap;.  int rc
47d0: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
47e0: 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20   op);.  switch( 
47f0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
4800: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c  QLITE_DBCONFIG_L
4810: 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20  OOKASIDE: {.    
4820: 20 20 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76    void *pBuf = v
4830: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4840: 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33  ; /* IMP: R-2683
4850: 35 2d 31 30 39 36 34 20 2a 2f 0a 20 20 20 20 20  5-10964 */.     
4860: 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67   int sz = va_arg
4870: 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20  (ap, int);      
4880: 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37 31   /* IMP: R-47871
4890: 2d 32 35 39 39 34 20 2a 2f 0a 20 20 20 20 20 20  -25994 */.      
48a0: 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67  int cnt = va_arg
48b0: 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20  (ap, int);      
48c0: 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d  /* IMP: R-04460-
48d0: 35 33 33 38 36 20 2a 2f 0a 20 20 20 20 20 20 72  53386 */.      r
48e0: 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69  c = setupLookasi
48f0: 64 65 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c  de(db, pBuf, sz,
4900: 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   cnt);.      bre
4910: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
4920: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
4930: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
4940: 63 74 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ct {.        int
4950: 20 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65   op;      /* The
4960: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   opcode */.     
4970: 20 20 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20     u32 mask;    
4980: 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 62  /* Mask of the b
4990: 69 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c  it in sqlite3.fl
49a0: 61 67 73 20 74 6f 20 73 65 74 2f 63 6c 65 61 72  ags to set/clear
49b0: 20 2a 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c 61   */.      } aFla
49c0: 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  gOp[] = {.      
49d0: 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e    { SQLITE_DBCON
49e0: 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c  FIG_ENABLE_FKEY,
49f0: 20 20 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69      SQLITE_Forei
4a00: 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20  gnKeys    },.   
4a10: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
4a20: 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52  CONFIG_ENABLE_TR
4a30: 49 47 47 45 52 2c 20 53 51 4c 49 54 45 5f 45 6e  IGGER, SQLITE_En
4a40: 61 62 6c 65 54 72 69 67 67 65 72 20 20 7d 2c 0a  ableTrigger  },.
4a50: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 75        };.      u
4a60: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
4a70: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4a80: 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20  _ERROR; /* IMP: 
4a90: 52 2d 34 32 37 39 30 2d 32 33 33 37 32 20 2a 2f  R-42790-23372 */
4aa0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4ab0: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 6c 61  i<ArraySize(aFla
4ac0: 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  gOp); i++){.    
4ad0: 20 20 20 20 69 66 28 20 61 46 6c 61 67 4f 70 5b      if( aFlagOp[
4ae0: 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20  i].op==op ){.   
4af0: 20 20 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66         int onoff
4b00: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4b10: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  t);.          in
4b20: 74 20 2a 70 52 65 73 20 3d 20 76 61 5f 61 72 67  t *pRes = va_arg
4b30: 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20  (ap, int*);.    
4b40: 20 20 20 20 20 20 69 6e 74 20 6f 6c 64 46 6c 61        int oldFla
4b50: 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
4b60: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e            if( on
4b70: 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  off>0 ){.       
4b80: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
4b90: 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73  = aFlagOp[i].mas
4ba0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  k;.          }el
4bb0: 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20  se if( onoff==0 
4bc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ){.            d
4bd0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46 6c  b->flags &= ~aFl
4be0: 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20  agOp[i].mask;.  
4bf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4c00: 20 20 20 20 69 66 28 20 6f 6c 64 46 6c 61 67 73      if( oldFlags
4c10: 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20  !=db->flags ){. 
4c20: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
4c30: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
4c40: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
4c50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4c60: 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29        if( pRes )
4c70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
4c80: 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  Res = (db->flags
4c90: 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61   & aFlagOp[i].ma
4ca0: 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20  sk)!=0;.        
4cb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
4cc0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4cd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4ce0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4cf0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4d00: 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64    }.  }.  va_end
4d10: 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (ap);.  return r
4d20: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
4d30: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
4d40: 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d  buffer z[0..n-1]
4d50: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70   contains all sp
4d60: 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aces..*/.static 
4d70: 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f  int allSpaces(co
4d80: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
4d90: 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e   n){.  while( n>
4da0: 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27  0 && z[n-1]==' '
4db0: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74   ){ n--; }.  ret
4dc0: 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  urn n==0;.}../*.
4dd0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 64  ** This is the d
4de0: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
4df0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
4e00: 22 42 49 4e 41 52 59 22 20 77 68 69 63 68 20 69  "BINARY" which i
4e10: 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69  s always.** avai
4e20: 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lable..**.** If 
4e30: 74 68 65 20 70 61 64 46 6c 61 67 20 61 72 67 75  the padFlag argu
4e40: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
4e50: 20 74 68 65 6e 20 73 70 61 63 65 20 70 61 64 64   then space padd
4e60: 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a  ing at the end.*
4e70: 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20  * of strings is 
4e80: 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69  ignored.  This i
4e90: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54  mplements the RT
4ea0: 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a  RIM collation..*
4eb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e  /.static int bin
4ec0: 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64  CollFunc(.  void
4ed0: 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74   *padFlag,.  int
4ee0: 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
4ef0: 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74  id *pKey1,.  int
4f00: 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f   nKey2, const vo
4f10: 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69  id *pKey2.){.  i
4f20: 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20  nt rc, n;.  n = 
4f30: 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b  nKey1<nKey2 ? nK
4f40: 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 72  ey1 : nKey2;.  r
4f50: 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31  c = memcmp(pKey1
4f60: 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69  , pKey2, n);.  i
4f70: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
4f80: 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20  if( padFlag.    
4f90: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
4fa0: 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20  char*)pKey1)+n, 
4fb0: 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26  nKey1-n).     &&
4fc0: 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61   allSpaces(((cha
4fd0: 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65  r*)pKey2)+n, nKe
4fe0: 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  y2-n).    ){.   
4ff0: 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 20 75     /* Leave rc u
5000: 6e 63 68 61 6e 67 65 64 20 61 74 20 30 20 2a 2f  nchanged at 0 */
5010: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5020: 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e    rc = nKey1 - n
5030: 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Key2;.    }.  }.
5040: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5050: 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75  /*.** Another bu
5060: 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67  ilt-in collating
5070: 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53   sequence: NOCAS
5080: 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  E. .**.** This c
5090: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
50a0: 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  e is intended to
50b0: 20 62 65 20 75 73 65 64 20 66 6f 72 20 22 63 61   be used for "ca
50c0: 73 65 20 69 6e 64 65 70 65 6e 64 61 6e 74 0a 2a  se independant.*
50d0: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53  * comparison". S
50e0: 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67  QLite's knowledg
50f0: 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c  e of upper and l
5100: 6f 77 65 72 20 63 61 73 65 20 65 71 75 69 76 61  ower case equiva
5110: 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73  lents.** extends
5120: 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20   only to the 26 
5130: 63 68 61 72 61 63 74 65 72 73 20 75 73 65 64 20  characters used 
5140: 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c  in the English l
5150: 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41  anguage..**.** A
5160: 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65  t the moment the
5170: 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46  re is only a UTF
5180: 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  -8 implementatio
5190: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
51a0: 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67   nocaseCollating
51b0: 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  Func(.  void *No
51c0: 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65  tUsed,.  int nKe
51d0: 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
51e0: 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65  pKey1,.  int nKe
51f0: 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y2, const void *
5200: 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72  pKey2.){.  int r
5210: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43   = sqlite3StrNIC
5220: 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74  mp(.      (const
5230: 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28   char *)pKey1, (
5240: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
5250: 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32  y2, (nKey1<nKey2
5260: 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a  )?nKey1:nKey2);.
5270: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
5280: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69  ER(NotUsed);.  i
5290: 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72  f( 0==r ){.    r
52a0: 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a   = nKey1-nKey2;.
52b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
52c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
52d0: 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 68 65  the ROWID of the
52e0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73   most recent ins
52f0: 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e  ert.*/.sqlite_in
5300: 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  t64 sqlite3_last
5310: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71  _insert_rowid(sq
5320: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
5330: 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77  turn db->lastRow
5340: 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  id;.}../*.** Ret
5350: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
5360: 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65  f changes in the
5370: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
5380: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65  l to sqlite3_exe
5390: 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  c()..*/.int sqli
53a0: 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  te3_changes(sqli
53b0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
53c0: 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a  rn db->nChange;.
53d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
53e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
53f0: 61 6e 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  anges since the 
5400: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
5410: 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69  was opened..*/.i
5420: 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  nt sqlite3_total
5430: 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  _changes(sqlite3
5440: 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20   *db){.  return 
5450: 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
5460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
5470: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
5480: 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ints. This funct
5490: 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  ion only manipul
54a0: 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74  ates fields of t
54b0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
54c0: 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74  andle object, it
54d0: 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20   does not close 
54e0: 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
54f0: 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a  hat may be open.
5500: 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72 65 65  ** at the b-tree
5510: 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f  /pager level..*/
5520: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f  .void sqlite3Clo
5530: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c  seSavepoints(sql
5540: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69  ite3 *db){.  whi
5550: 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  le( db->pSavepoi
5560: 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f  nt ){.    Savepo
5570: 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e  int *pTmp = db->
5580: 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  pSavepoint;.    
5590: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
55a0: 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   pTmp->pNext;.  
55b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
55c0: 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20  db, pTmp);.  }. 
55d0: 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20   db->nSavepoint 
55e0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74  = 0;.  db->nStat
55f0: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  ement = 0;.  db-
5600: 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
5610: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  vepoint = 0;.}..
5620: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
5630: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
5640: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
5650: 77 69 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20  with FuncDef p, 
5660: 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a  if any. Except,.
5670: 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ** if this is no
5680: 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20  t the last copy 
5690: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c  of the function,
56a0: 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69   do not invoke i
56b0: 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63  t. Multiple.** c
56c0: 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  opies of a singl
56d0: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63  e function are c
56e0: 72 65 61 74 65 64 20 77 68 65 6e 20 63 72 65 61  reated when crea
56f0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  te_function() is
5700: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20   called.** with 
5710: 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68  SQLITE_ANY as th
5720: 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  e encoding..*/.s
5730: 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74  tatic void funct
5740: 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74  ionDestroy(sqlit
5750: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
5760: 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72  *p){.  FuncDestr
5770: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
5780: 6f 72 20 3d 20 70 2d 3e 70 44 65 73 74 72 75 63  or = p->pDestruc
5790: 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74  tor;.  if( pDest
57a0: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44  ructor ){.    pD
57b0: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d  estructor->nRef-
57c0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65 73 74  -;.    if( pDest
57d0: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20  ructor->nRef==0 
57e0: 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74 72 75  ){.      pDestru
57f0: 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79 28 70  ctor->xDestroy(p
5800: 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55 73 65  Destructor->pUse
5810: 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71  rData);.      sq
5820: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5830: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
5840: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
5850: 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69   Close an existi
5860: 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ng SQLite databa
5870: 73 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  se.*/.int sqlite
5880: 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20  3_close(sqlite3 
5890: 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  *db){.  HashElem
58a0: 20 2a 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   *i;            
58b0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
58c0: 74 61 62 6c 65 20 69 74 65 72 61 74 6f 72 20 2a  table iterator *
58d0: 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 69 66  /.  int j;..  if
58e0: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
58f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
5900: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
5910: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
5920: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
5930: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
5940: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
5950: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
5960: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
5970: 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 65  ..  /* Force xDe
5980: 73 74 72 6f 79 20 63 61 6c 6c 73 20 6f 6e 20 61  stroy calls on a
5990: 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ll virtual table
59a0: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 65  s */.  sqlite3Re
59b0: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
59c0: 61 28 64 62 2c 20 2d 31 29 3b 0a 0a 20 20 2f 2a  a(db, -1);..  /*
59d0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
59e0: 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 20 52  n is open, the R
59f0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
5a00: 6d 61 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a  ma() call above.
5a10: 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61    ** will not ha
5a20: 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20 78 44  ve called the xD
5a30: 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68  isconnect() meth
5a40: 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74 75 61  od on any virtua
5a50: 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e  l.  ** tables in
5a60: 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73   the db->aVTrans
5a70: 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66 6f  [] array. The fo
5a80: 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 56  llowing sqlite3V
5a90: 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20  tabRollback().  
5aa0: 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20  ** call will do 
5ab0: 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f 20 64  so. We need to d
5ac0: 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 74 68  o this before th
5ad0: 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63 74 69  e check for acti
5ae0: 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  ve.  ** SQL stat
5af0: 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73  ements below, as
5b00: 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69 6d 70   the v-table imp
5b10: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
5b20: 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20  be storing.  ** 
5b30: 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20 73 74  some prepared st
5b40: 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61  atements interna
5b50: 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  lly..  */.  sqli
5b60: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
5b70: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  db);..  /* If th
5b80: 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73  ere are any outs
5b90: 74 61 6e 64 69 6e 67 20 56 4d 73 2c 20 72 65 74  tanding VMs, ret
5ba0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
5bb0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 56   */.  if( db->pV
5bc0: 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dbe ){.    sqlit
5bd0: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
5be0: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
5bf0: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f    "unable to clo
5c00: 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61  se due to unfina
5c10: 6c 69 73 65 64 20 73 74 61 74 65 6d 65 6e 74 73  lised statements
5c20: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ");.    sqlite3_
5c30: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
5c40: 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75  mutex);.    retu
5c50: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
5c60: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
5c70: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
5c80: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 3b 0a  SickOrOk(db) );.
5c90: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62  .  for(j=0; j<db
5ca0: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nDb; j++){.   
5cb0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
5cc0: 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20  ->aDb[j].pBt;.  
5cd0: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
5ce0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61 63  ite3BtreeIsInBac
5cf0: 6b 75 70 28 70 42 74 29 20 29 7b 0a 20 20 20 20  kup(pBt) ){.    
5d00: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
5d10: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
5d20: 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 61 62  .          "unab
5d30: 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20  le to close due 
5d40: 74 6f 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61  to unfinished ba
5d50: 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e 22 29  ckup operation")
5d60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5d70: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
5d80: 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 72 65  mutex);.      re
5d90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
5da0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
5db0: 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74  * Free any outst
5dc0: 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74  anding Savepoint
5dd0: 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a   structures. */.
5de0: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
5df0: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20  vepoints(db);.. 
5e00: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e   for(j=0; j<db->
5e10: 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73  nDb; j++){.    s
5e20: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
5e30: 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20  &db->aDb[j];.   
5e40: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b   if( pDb->pBt ){
5e50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
5e60: 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42  reeClose(pDb->pB
5e70: 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70  t);.      pDb->p
5e80: 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  Bt = 0;.      if
5e90: 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ( j!=1 ){.      
5ea0: 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d    pDb->pSchema =
5eb0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
5ec0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
5ed0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
5ee0: 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 0a 20 20 2f  ma(db, -1);..  /
5ef0: 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20  * Tell the code 
5f00: 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74  in notify.c that
5f10: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
5f20: 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20  no longer holds 
5f30: 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61  any.  ** locks a
5f40: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  nd does not requ
5f50: 69 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 20  ire any further 
5f60: 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
5f70: 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
5f80: 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
5f90: 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20  nClosed(db);..  
5fa0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c  assert( db->nDb<
5fb0: 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
5fc0: 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62  db->aDb==db->aDb
5fd0: 53 74 61 74 69 63 20 29 3b 0a 20 20 66 6f 72 28  Static );.  for(
5fe0: 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65  j=0; j<ArraySize
5ff0: 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a  (db->aFunc.a); j
6000: 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  ++){.    FuncDef
6010: 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c   *pNext, *pHash,
6020: 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64   *p;.    for(p=d
6030: 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70  b->aFunc.a[j]; p
6040: 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20 20  ; p=pHash){.    
6050: 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61    pHash = p->pHa
6060: 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  sh;.      while(
6070: 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 75   p ){.        fu
6080: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
6090: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , p);.        pN
60a0: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
60b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
60c0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
60d0: 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b        p = pNext;
60e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
60f0: 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74   }.  for(i=sqlit
6100: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
6110: 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d  aCollSeq); i; i=
6120: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
6130: 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  )){.    CollSeq 
6140: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
6150: 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  q *)sqliteHashDa
6160: 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e  ta(i);.    /* In
6170: 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63  voke any destruc
6180: 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20  tors registered 
6190: 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  for collation se
61a0: 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61  quence user data
61b0: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30  . */.    for(j=0
61c0: 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
61d0: 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e     if( pColl[j].
61e0: 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
61f0: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43  pColl[j].xDel(pC
6200: 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20  oll[j].pUser);. 
6210: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6220: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6230: 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, pColl);.  }. 
6240: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
6250: 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  r(&db->aCollSeq)
6260: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
6270: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6280: 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  LE.  for(i=sqlit
6290: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
62a0: 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73  aModule); i; i=s
62b0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
62c0: 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  ){.    Module *p
62d0: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29  Mod = (Module *)
62e0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
62f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d  );.    if( pMod-
6300: 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >xDestroy ){.   
6310: 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f     pMod->xDestro
6320: 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20  y(pMod->pAux);. 
6330: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6340: 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29  DbFree(db, pMod)
6350: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
6360: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d  ashClear(&db->aM
6370: 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
6380: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
6390: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  b, SQLITE_OK, 0)
63a0: 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73  ; /* Deallocates
63b0: 20 61 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f   any cached erro
63c0: 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20  r strings. */.  
63d0: 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a  if( db->pErr ){.
63e0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
63f0: 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a  Free(db->pErr);.
6400: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f    }.  sqlite3Clo
6410: 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  seExtensions(db)
6420: 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  ;..  db->magic =
6430: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52   SQLITE_MAGIC_ER
6440: 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74  ROR;..  /* The t
6450: 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63 68  emp-database sch
6460: 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ema is allocated
6470: 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f   differently fro
6480: 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68 65  m the other sche
6490: 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20  ma.  ** objects 
64a0: 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c  (using sqliteMal
64b0: 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c 20  loc() directly, 
64c0: 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74  instead of sqlit
64d0: 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29 29  e3BtreeSchema())
64e0: 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65  ..  ** So it nee
64f0: 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 68  ds to be freed h
6500: 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e  ere. Todo: Why n
6510: 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70  ot roll the temp
6520: 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a   schema into.  *
6530: 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69 74  * the same sqlit
6540: 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68 65  eMalloc() as the
6550: 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63 61   one that alloca
6560: 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  tes the database
6570: 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65   .  ** structure
6580: 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ?.  */.  sqlite3
6590: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
65a0: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a  Db[1].pSchema);.
65b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
65c0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
65d0: 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ;.  db->magic = 
65e0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
65f0: 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  SED;.  sqlite3_m
6600: 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75  utex_free(db->mu
6610: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
6620: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
6630: 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61 69  ut==0 );  /* Fai
6640: 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69 64  ls on a lookasid
6650: 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f  e memory leak */
6660: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
6670: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
6680: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
6690: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
66a0: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 23 69  .pStart);.  }.#i
66b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
66c0: 4c 45 5f 53 51 4c 52 52 0a 20 20 53 52 52 65 63  LE_SQLRR.  SRRec
66d0: 43 6c 6f 73 65 28 64 62 29 3b 0a 23 65 6e 64 69  Close(db);.#endi
66e0: 66 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 66  f.  .  sqlite3_f
66f0: 72 65 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72  ree(db);.  retur
6700: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6710: 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
6720: 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ll database file
6730: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
6740: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71  e3RollbackAll(sq
6750: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
6760: 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61  t i;.  int inTra
6770: 6e 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ns = 0;.  assert
6780: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6790: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
67a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
67b0: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
67c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
67d0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
67e0: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
67f0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  pBt ){.      if(
6800: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
6810: 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 69  nTrans(db->aDb[i
6820: 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  ].pBt) ){.      
6830: 20 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20    inTrans = 1;. 
6840: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
6850: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
6860: 6b 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  k(db->aDb[i].pBt
6870: 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  );.      db->aDb
6880: 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 3d 20 30 3b  [i].inTrans = 0;
6890: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
68a0: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
68b0: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  (db);.  sqlite3E
68c0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
68d0: 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  ;..  if( db->fla
68e0: 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  gs&SQLITE_Intern
68f0: 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73  Changes ){.    s
6900: 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
6910: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
6920: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  b);.    sqlite3R
6930: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
6940: 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 20 20 7d 0a  ma(db, -1);.  }.
6950: 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72 72  .  /* Any deferr
6960: 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  ed constraint vi
6970: 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f  olations have no
6980: 77 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  w been resolved.
6990: 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72   */.  db->nDefer
69a0: 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 0a 20 20  redCons = 0;..  
69b0: 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65  /* If one has be
69c0: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69  en configured, i
69d0: 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61  nvoke the rollba
69e0: 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b  ck-hook callback
69f0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52   */.  if( db->xR
6a00: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
6a10: 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21  && (inTrans || !
6a20: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20  db->autoCommit) 
6a30: 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c  ){.    db->xRoll
6a40: 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d  backCallback(db-
6a50: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a  >pRollbackArg);.
6a60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
6a70: 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72  urn a static str
6a80: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
6a90: 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65  es the kind of e
6aa0: 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  rror specified i
6ab0: 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  n the.** argumen
6ac0: 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  t..*/.const char
6ad0: 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72 28   *sqlite3ErrStr(
6ae0: 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74 69  int rc){.  stati
6af0: 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f  c const char* co
6b00: 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20  nst aMsg[] = {. 
6b10: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20     /* SQLITE_OK 
6b20: 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74           */ "not
6b30: 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20 20   an error",.    
6b40: 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  /* SQLITE_ERROR 
6b50: 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f        */ "SQL lo
6b60: 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73  gic error or mis
6b70: 73 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a  sing database",.
6b80: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e      /* SQLITE_IN
6b90: 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a  TERNAL    */ 0,.
6ba0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45      /* SQLITE_PE
6bb0: 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61 63  RM        */ "ac
6bc0: 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20  cess permission 
6bd0: 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20  denied",.    /* 
6be0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20 20  SQLITE_ABORT    
6bf0: 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b 20     */ "callback 
6c00: 72 65 71 75 65 73 74 65 64 20 71 75 65 72 79 20  requested query 
6c10: 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20 53  abort",.    /* S
6c20: 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20 20  QLITE_BUSY      
6c30: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 69    */ "database i
6c40: 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f  s locked",.    /
6c50: 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  * SQLITE_LOCKED 
6c60: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
6c70: 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65  e table is locke
6c80: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
6c90: 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f  E_NOMEM       */
6ca0: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
6cb0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6cc0: 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22  READONLY    */ "
6cd0: 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
6ce0: 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61   a readonly data
6cf0: 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  base",.    /* SQ
6d00: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 20  LITE_INTERRUPT  
6d10: 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65 64   */ "interrupted
6d20: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6d30: 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f 20  _IOERR       */ 
6d40: 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22  "disk I/O error"
6d50: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6d60: 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20 22  CORRUPT     */ "
6d70: 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d  database disk im
6d80: 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  age is malformed
6d90: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6da0: 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20  _NOTFOUND    */ 
6db0: 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69  "unknown operati
6dc0: 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  on",.    /* SQLI
6dd0: 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 2a  TE_FULL        *
6de0: 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72 20 64  / "database or d
6df0: 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20  isk is full",.  
6e00: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54    /* SQLITE_CANT
6e10: 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62  OPEN    */ "unab
6e20: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
6e30: 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f  ase file",.    /
6e40: 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  * SQLITE_PROTOCO
6e50: 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67  L    */ "locking
6e60: 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20   protocol",.    
6e70: 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 20  /* SQLITE_EMPTY 
6e80: 20 20 20 20 20 20 2a 2f 20 22 74 61 62 6c 65 20        */ "table 
6e90: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
6ea0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6eb0: 5f 53 43 48 45 4d 41 20 20 20 20 20 20 2a 2f 20  _SCHEMA      */ 
6ec0: 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61  "database schema
6ed0: 20 68 61 73 20 63 68 61 6e 67 65 64 22 2c 0a 20   has changed",. 
6ee0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f     /* SQLITE_TOO
6ef0: 42 49 47 20 20 20 20 20 20 2a 2f 20 22 73 74 72  BIG      */ "str
6f00: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20  ing or blob too 
6f10: 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  big",.    /* SQL
6f20: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20  ITE_CONSTRAINT  
6f30: 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66  */ "constraint f
6f40: 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ailed",.    /* S
6f50: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 20  QLITE_MISMATCH  
6f60: 20 20 2a 2f 20 22 64 61 74 61 74 79 70 65 20 6d    */ "datatype m
6f70: 69 73 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a  ismatch",.    /*
6f80: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 20   SQLITE_MISUSE  
6f90: 20 20 20 20 2a 2f 20 22 6c 69 62 72 61 72 79 20      */ "library 
6fa0: 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f  routine called o
6fb0: 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65 22 2c  ut of sequence",
6fc0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
6fd0: 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22 6c  OLFS       */ "l
6fe0: 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72  arge file suppor
6ff0: 74 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c 0a  t is disabled",.
7000: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55      /* SQLITE_AU
7010: 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75  TH        */ "au
7020: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69  thorization deni
7030: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
7040: 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a  TE_FORMAT      *
7050: 2f 20 22 61 75 78 69 6c 69 61 72 79 20 64 61 74  / "auxiliary dat
7060: 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72 72  abase format err
7070: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
7080: 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a  TE_RANGE       *
7090: 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75 6d  / "bind or colum
70a0: 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72  n index out of r
70b0: 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  ange",.    /* SQ
70c0: 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20  LITE_NOTADB     
70d0: 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 65 6e 63   */ "file is enc
70e0: 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f 74  rypted or is not
70f0: 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20   a database",.  
7100: 7d 3b 0a 20 20 72 63 20 26 3d 20 30 78 66 66 3b  };.  rc &= 0xff;
7110: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 72 63  .  if( ALWAYS(rc
7120: 3e 3d 30 29 20 26 26 20 72 63 3c 28 69 6e 74 29  >=0) && rc<(int)
7130: 28 73 69 7a 65 6f 66 28 61 4d 73 67 29 2f 73 69  (sizeof(aMsg)/si
7140: 7a 65 6f 66 28 61 4d 73 67 5b 30 5d 29 29 20 26  zeof(aMsg[0])) &
7150: 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b  & aMsg[rc]!=0 ){
7160: 0a 20 20 20 20 72 65 74 75 72 6e 20 61 4d 73 67  .    return aMsg
7170: 5b 72 63 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  [rc];.  }else{. 
7180: 20 20 20 72 65 74 75 72 6e 20 22 75 6e 6b 6e 6f     return "unkno
7190: 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 7d 0a 7d  wn error";.  }.}
71a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
71b0: 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
71c0: 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  a busy callback 
71d0: 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20  that sleeps and 
71e0: 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75  tries.** again u
71f0: 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76  ntil a timeout v
7200: 61 6c 75 65 20 69 73 20 72 65 61 63 68 65 64 2e  alue is reached.
7210: 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61    The timeout va
7220: 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74  lue is.** an int
7230: 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d  eger number of m
7240: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73  illiseconds pass
7250: 65 64 20 69 6e 20 61 73 20 74 68 65 20 66 69 72  ed in as the fir
7260: 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  st.** argument..
7270: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
7280: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
7290: 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a  allback(. void *
72a0: 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ptr,            
72b0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
72c0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e  onnection */. in
72d0: 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20  t count         
72e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
72f0: 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20   of times table 
7300: 68 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f  has been busy */
7310: 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .){.#if SQLITE_O
7320: 53 5f 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e 65  S_WIN || (define
7330: 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26  d(HAVE_USLEEP) &
7340: 26 20 48 41 56 45 5f 55 53 4c 45 45 50 29 0a 20  & HAVE_USLEEP). 
7350: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
7360: 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20   delays[] =.    
7370: 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20   { 1, 2, 5, 10, 
7380: 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20  15, 20, 25, 25, 
7390: 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31   25,  50,  50, 1
73a0: 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  00 };.  static c
73b0: 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d  onst u8 totals[]
73c0: 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20   =.     { 0, 1, 
73d0: 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35  3,  8, 18, 33, 5
73e0: 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c  3, 78, 103, 128,
73f0: 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64   178, 228 };.# d
7400: 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41 72 72  efine NDELAY Arr
7410: 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29 0a 20  aySize(delays). 
7420: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
7430: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
7440: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64   int timeout = d
7450: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a  b->busyTimeout;.
7460: 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69    int delay, pri
7470: 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  or;..  assert( c
7480: 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ount>=0 );.  if(
7490: 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20   count < NDELAY 
74a0: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64  ){.    delay = d
74b0: 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  elays[count];.  
74c0: 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73    prior = totals
74d0: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65  [count];.  }else
74e0: 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65  {.    delay = de
74f0: 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a  lays[NDELAY-1];.
7500: 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61      prior = tota
7510: 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64  ls[NDELAY-1] + d
7520: 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45  elay*(count-(NDE
7530: 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69  LAY-1));.  }.  i
7540: 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79  f( prior + delay
7550: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
7560: 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75    delay = timeou
7570: 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69  t - prior;.    i
7580: 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65  f( delay<=0 ) re
7590: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
75a0: 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d  lite3OsSleep(db-
75b0: 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30  >pVfs, delay*100
75c0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  0);.  return 1;.
75d0: 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20  #else.  sqlite3 
75e0: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
75f0: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
7600: 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20  out = ((sqlite3 
7610: 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65  *)ptr)->busyTime
7620: 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e  out;.  if( (coun
7630: 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65  t+1)*1000 > time
7640: 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  out ){.    retur
7650: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
7660: 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56  e3OsSleep(db->pV
7670: 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20  fs, 1000000);.  
7680: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
7690: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
76a0: 20 74 68 65 20 67 69 76 65 6e 20 62 75 73 79 20   the given busy 
76b0: 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  handler..**.** T
76c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
76d0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70  alled when an op
76e0: 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77  eration failed w
76f0: 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49  ith a lock..** I
7700: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  f this routine r
7710: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
7720: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74   the lock is ret
7730: 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20  ried.  If it.** 
7740: 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f  returns 0, the o
7750: 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20  peration aborts 
7760: 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42  with an SQLITE_B
7770: 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e  USY error..*/.in
7780: 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  t sqlite3InvokeB
7790: 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48  usyHandler(BusyH
77a0: 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e  andler *p){.  in
77b0: 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45 56 45  t rc;.  if( NEVE
77c0: 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46  R(p==0) || p->xF
77d0: 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75  unc==0 || p->nBu
77e0: 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b  sy<0 ) return 0;
77f0: 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63  .  rc = p->xFunc
7800: 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75  (p->pArg, p->nBu
7810: 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  sy);.  if( rc==0
7820: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79   ){.    p->nBusy
7830: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
7840: 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a      p->nBusy++;.
7850: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7860: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
7870: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
7880: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66   busy callback f
7890: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
78a0: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
78b0: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
78c0: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
78d0: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
78e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
78f0: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20  busy_handler(.  
7900: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69  sqlite3 *db,.  i
7910: 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64  nt (*xBusy)(void
7920: 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  *,int),.  void *
7930: 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65  pArg.){.  sqlite
7940: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
7950: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
7960: 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e  busyHandler.xFun
7970: 63 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d  c = xBusy;.  db-
7980: 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72  >busyHandler.pAr
7990: 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e  g = pArg;.  db->
79a0: 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73  busyHandler.nBus
79b0: 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  y = 0;.  sqlite3
79c0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
79d0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
79e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
79f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7a00: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
7a10: 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LBACK./*.** This
7a20: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
7a30: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
7a40: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
7a50: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
7a60: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
7a70: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
7a80: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
7a90: 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65  ment. The progre
7aa0: 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c  ss callback will
7ab0: 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65  .** be invoked e
7ac0: 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65  very nOps opcode
7ad0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
7ae0: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
7af0: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
7b00: 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c  db, .  int nOps,
7b10: 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65  .  int (*xProgre
7b20: 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76  ss)(void*), .  v
7b30: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73  oid *pArg.){.  s
7b40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
7b50: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
7b60: 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20   if( nOps>0 ){. 
7b70: 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73     db->xProgress
7b80: 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20   = xProgress;.  
7b90: 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f    db->nProgressO
7ba0: 70 73 20 3d 20 6e 4f 70 73 3b 0a 20 20 20 20 64  ps = nOps;.    d
7bb0: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
7bc0: 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b  = pArg;.  }else{
7bd0: 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65  .    db->xProgre
7be0: 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ss = 0;.    db->
7bf0: 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30  nProgressOps = 0
7c00: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
7c10: 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a  essArg = 0;.  }.
7c20: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7c30: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
7c40: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
7c50: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7c60: 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75  installs a defau
7c70: 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  lt busy handler 
7c80: 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20 74  that waits for t
7c90: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
7ca0: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
7cb0: 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65  econds before re
7cc0: 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e  turning 0..*/.in
7cd0: 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  t sqlite3_busy_t
7ce0: 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a  imeout(sqlite3 *
7cf0: 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20 69  db, int ms){.  i
7d00: 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 64  f( ms>0 ){.    d
7d10: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d  b->busyTimeout =
7d20: 20 6d 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ms;.    sqlite3
7d30: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
7d40: 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42  , sqliteDefaultB
7d50: 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  usyCallback, (vo
7d60: 69 64 2a 29 64 62 29 3b 0a 20 20 7d 65 6c 73 65  id*)db);.  }else
7d70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  {.    sqlite3_bu
7d80: 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30  sy_handler(db, 0
7d90: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
7da0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7db0: 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79  ./*.** Cause any
7dc0: 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69   pending operati
7dd0: 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74  on to stop at it
7de0: 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72  s earliest oppor
7df0: 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20  tunity..*/.void 
7e00: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
7e10: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
7e20: 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72    db->u1.isInter
7e30: 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a  rupted = 1;.}...
7e40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
7e50: 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74  ion is exactly t
7e60: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
7e70: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7e80: 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20  on(), except.** 
7e90: 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69 67  that it is desig
7ea0: 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ned to be called
7eb0: 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64   by internal cod
7ec0: 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  e. The differenc
7ed0: 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20  e is.** that if 
7ee0: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  a malloc() fails
7ef0: 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61   in sqlite3_crea
7f00: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61  te_function(), a
7f10: 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  n error code.** 
7f20: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
7f30: 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  the mallocFailed
7f40: 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a   flag cleared. .
7f50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72  */.int sqlite3Cr
7f60: 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  eateFunc(.  sqli
7f70: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
7f80: 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e   char *zFunction
7f90: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
7fa0: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
7fb0: 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a  oid *pUserData,.
7fc0: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
7fd0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
7fe0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
7ff0: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
8000: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
8010: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
8020: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
8030: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
8040: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
8050: 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75  *),.  FuncDestru
8060: 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f  ctor *pDestructo
8070: 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  r.){.  FuncDef *
8080: 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  p;.  int nName;.
8090: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
80a0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
80b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
80c0: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  ( zFunctionName=
80d0: 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75  =0 ||.      (xFu
80e0: 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c  nc && (xFinal ||
80f0: 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20   xStep)) || .   
8100: 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 78     (!xFunc && (x
8110: 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29  Final && !xStep)
8120: 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75  ) ||.      (!xFu
8130: 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26  nc && (!xFinal &
8140: 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20  & xStep)) ||.   
8150: 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e     (nArg<-1 || n
8160: 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46  Arg>SQLITE_MAX_F
8170: 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a  UNCTION_ARG) ||.
8180: 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d        (255<(nNam
8190: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
81a0: 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  n30( zFunctionNa
81b0: 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74  me))) ){.    ret
81c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
81d0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 0a 23  E_BKPT;.  }.  .#
81e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
81f0: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66  IT_UTF16.  /* If
8200: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
8210: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
8220: 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
8230: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
8240: 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
8250: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
8260: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
8270: 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
8280: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
8290: 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
82a0: 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
82b0: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
82c0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54  **.  ** If SQLIT
82d0: 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69  E_ANY is specifi
82e0: 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65  ed, add three ve
82f0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75  rsions of the fu
8300: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74  nction.  ** to t
8310: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20  he hash table.. 
8320: 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53   */.  if( enc==S
8330: 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20  QLITE_UTF16 ){. 
8340: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
8350: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
8360: 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51  else if( enc==SQ
8370: 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20  LITE_ANY ){.    
8380: 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  int rc;.    rc =
8390: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
83a0: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
83b0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
83c0: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
83d0: 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75    pUserData, xFu
83e0: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
83f0: 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b  l, pDestructor);
8400: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
8410: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8420: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
8430: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
8440: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  tionName, nArg, 
8450: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 0a  SQLITE_UTF16LE,.
8460: 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44            pUserD
8470: 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  ata, xFunc, xSte
8480: 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74  p, xFinal, pDest
8490: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  ructor);.    }. 
84a0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
84b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
84c0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
84d0: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
84e0: 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c  UTF16BE;.  }.#el
84f0: 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  se.  enc = SQLIT
8500: 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20  E_UTF8;.#endif. 
8510: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
8520: 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63  an existing func
8530: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76  tion is being ov
8540: 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65  erridden or dele
8550: 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a  ted. If so,.  **
8560: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
8570: 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20  ctive VMs, then 
8580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
8590: 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f  SY. If a functio
85a0: 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  n.  ** is being 
85b0: 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74  overridden/delet
85c0: 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65  ed but there are
85d0: 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
85e0: 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f  allow the.  ** o
85f0: 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74  peration to cont
8600: 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64  inue but invalid
8610: 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69  ate all precompi
8620: 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
8630: 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74    */.  p = sqlit
8640: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
8650: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
8660: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  , nName, nArg, (
8670: 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66  u8)enc, 0);.  if
8680: 28 20 70 20 26 26 20 70 2d 3e 69 50 72 65 66 45  ( p && p->iPrefE
8690: 6e 63 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41  nc==enc && p->nA
86a0: 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20  rg==nArg ){.    
86b0: 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  if( db->activeVd
86c0: 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  beCnt ){.      s
86d0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
86e0: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
86f0: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
8700: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75   delete/modify u
8710: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65  ser-function due
8720: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
8730: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61  ments");.      a
8740: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
8750: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
8760: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8770: 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
8780: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
8790: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
87a0: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
87b0: 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  }.  }..  p = sql
87c0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
87d0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
87e0: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
87f0: 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20   (u8)enc, 1);.  
8800: 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e  assert(p || db->
8810: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20  mallocFailed);. 
8820: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
8830: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
8840: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
8850: 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   an older versio
8860: 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  n of the functio
8870: 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75  n with a configu
8880: 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69  red destructor i
8890: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70  s.  ** being rep
88a0: 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65  laced invoke the
88b0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
88c0: 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tion here. */.  
88d0: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
88e0: 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70  db, p);..  if( p
88f0: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
8900: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
8910: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Ref++;.  }.  p->
8920: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44  pDestructor = pD
8930: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e  estructor;.  p->
8940: 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 2d 3e  flags = 0;.  p->
8950: 78 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20  xFunc = xFunc;. 
8960: 20 70 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65   p->xStep = xSte
8970: 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a  p;.  p->xFinaliz
8980: 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d  e = xFinal;.  p-
8990: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 55 73  >pUserData = pUs
89a0: 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72  erData;.  p->nAr
89b0: 67 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20  g = (u16)nArg;. 
89c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
89d0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
89e0: 74 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63  te new user func
89f0: 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tions..*/.int sq
8a00: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
8a10: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
8a20: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
8a30: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
8a40: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
8a50: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
8a60: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
8a70: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
8a80: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
8a90: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
8aa0: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
8ab0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
8ac0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
8ad0: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
8ae0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a  lite3_context*).
8af0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
8b00: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8b10: 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63  ion_v2(db, zFunc
8b20: 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20  , nArg, enc, p, 
8b30: 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20  xFunc, xStep,.  
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 20 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a    xFinal, 0);.}.
8b70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
8b80: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
8b90: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
8ba0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
8bb0: 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  unc,.  int nArg,
8bc0: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
8bd0: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
8be0: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
8bf0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
8c00: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
8c10: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
8c20: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
8c30: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
8c40: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
8c50: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
8c60: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69  context*),.  voi
8c70: 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f  d (*xDestroy)(vo
8c80: 69 64 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  id *).){.  int r
8c90: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
8ca0: 3b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  ;.  FuncDestruct
8cb0: 6f 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20  or *pArg = 0;.  
8cc0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
8cd0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
8ce0: 20 20 69 66 28 20 78 44 65 73 74 72 6f 79 20 29    if( xDestroy )
8cf0: 7b 0a 20 20 20 20 70 41 72 67 20 3d 20 28 46 75  {.    pArg = (Fu
8d00: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73  ncDestructor *)s
8d10: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
8d20: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75  ro(db, sizeof(Fu
8d30: 6e 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a  ncDestructor));.
8d40: 20 20 20 20 69 66 28 20 21 70 41 72 67 20 29 7b      if( !pArg ){
8d50: 0a 20 20 20 20 20 20 78 44 65 73 74 72 6f 79 28  .      xDestroy(
8d60: 70 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f  p);.      goto o
8d70: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41  ut;.    }.    pA
8d80: 72 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78  rg->xDestroy = x
8d90: 44 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72  Destroy;.    pAr
8da0: 67 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70  g->pUserData = p
8db0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
8dc0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
8dd0: 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20  b, zFunc, nArg, 
8de0: 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78  enc, p, xFunc, x
8df0: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41  Step, xFinal, pA
8e00: 72 67 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20  rg);.  if( pArg 
8e10: 26 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30  && pArg->nRef==0
8e20: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8e30: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
8e40: 0a 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29  .    xDestroy(p)
8e50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
8e60: 72 65 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20  ree(db, pArg);. 
8e70: 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d   }.. out:.  rc =
8e80: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
8e90: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
8ea0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
8eb0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
8ec0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
8ed0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
8ee0: 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33  TF16.int sqlite3
8ef0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
8f00: 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
8f10: 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b,.  const void 
8f20: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
8f30: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
8f40: 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f  t eTextRep,.  vo
8f50: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
8f60: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
8f70: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
8f80: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
8f90: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
8fa0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
8fb0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
8fc0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
8fd0: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
8fe0: 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74  ntext*).){.  int
8ff0: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75   rc;.  char *zFu
9000: 6e 63 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  nc8;.  sqlite3_m
9010: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
9020: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
9030: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
9040: 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d  ed );.  zFunc8 =
9050: 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38   sqlite3Utf16to8
9060: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
9070: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
9080: 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72  TF16NATIVE);.  r
9090: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
90a0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38  eFunc(db, zFunc8
90b0: 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70  , nArg, eTextRep
90c0: 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  , p, xFunc, xSte
90d0: 70 2c 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20  p, xFinal,0);.  
90e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
90f0: 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20  , zFunc8);.  rc 
9100: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
9110: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
9120: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
9130: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
9140: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
9150: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  f.../*.** Declar
9160: 65 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f  e that a functio
9170: 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c  n has been overl
9180: 6f 61 64 65 64 20 62 79 20 61 20 76 69 72 74 75  oaded by a virtu
9190: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
91a0: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
91b0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
91c0: 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62  s a regular glob
91d0: 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  al function, the
91e0: 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
91f0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
9200: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
9210: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
9220: 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20  hen create.** a 
9230: 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77  new one that alw
9240: 61 79 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e  ays throws a run
9250: 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a  -time error.  .*
9260: 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61  *.** When virtua
9270: 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20  l tables intend 
9280: 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76  to provide an ov
9290: 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f  erloaded functio
92a0: 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c  n, they.** shoul
92b0: 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  d call this rout
92c0: 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ine to make sure
92d0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63   the global func
92e0: 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20  tion exists..** 
92f0: 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f  A global functio
9300: 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20  n must exist in 
9310: 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72  order for name r
9320: 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72  esolution to wor
9330: 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a  k.** properly..*
9340: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76  /.int sqlite3_ov
9350: 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28  erload_function(
9360: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
9370: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
9380: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a  ame,.  int nArg.
9390: 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d  ){.  int nName =
93a0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
93b0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72  (zName);.  int r
93c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
93d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
93e0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
93f0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
9400: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
9410: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
9420: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
9430: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  0)==0 ){.    rc 
9440: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
9450: 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  unc(db, zName, n
9460: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
9470: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
9490: 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75  sqlite3InvalidFu
94a0: 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29  nction, 0, 0, 0)
94b0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
94c0: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
94d0: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
94e0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
94f0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
9500: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
9510: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
9520: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
9530: 61 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e  a trace function
9540: 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d  .  The pArg from
9550: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
9560: 72 65 67 69 73 74 65 72 65 64 20 74 72 61 63 65  registered trace
9570: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
9580: 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20    .**.** A NULL 
9590: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d  trace function m
95a0: 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61  eans that no tra
95b0: 63 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73  cing is executes
95c0: 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  .  A non-NULL.**
95d0: 20 74 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e   trace is a poin
95e0: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
95f0: 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65  n that is invoke
9600: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
9610: 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74  f each.** SQL st
9620: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
9630: 20 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28   *sqlite3_trace(
9640: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
9650: 64 20 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64  d (*xTrace)(void
9660: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20  *,const char*), 
9670: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76  void *pArg){.  v
9680: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c  oid *pOld;.  sql
9690: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
96a0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
96b0: 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65  Old = db->pTrace
96c0: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63  Arg;.  db->xTrac
96d0: 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62  e = xTrace;.  db
96e0: 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41  ->pTraceArg = pA
96f0: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
9700: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9710: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
9720: 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67  Old;.}./*.** Reg
9730: 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20  ister a profile 
9740: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  function.  The p
9750: 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65  Arg from the pre
9760: 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
9770: 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66  ed .** profile f
9780: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72  unction is retur
9790: 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e  ned.  .**.** A N
97a0: 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  ULL profile func
97b0: 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  tion means that 
97c0: 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20  no profiling is 
97d0: 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e  executes.  A non
97e0: 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65  -NULL.** profile
97f0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
9800: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   a function that
9810: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74   is invoked at t
9820: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
9830: 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61  .** each SQL sta
9840: 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72  tement that is r
9850: 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  un..*/.void *sql
9860: 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20  ite3_profile(.  
9870: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
9880: 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28  oid (*xProfile)(
9890: 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
98a0: 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29  *,sqlite_uint64)
98b0: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29  ,.  void *pArg.)
98c0: 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
98d0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
98e0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
98f0: 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
9900: 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62  ProfileArg;.  db
9910: 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72  ->xProfile = xPr
9920: 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72  ofile;.  db->pPr
9930: 6f 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b  ofileArg = pArg;
9940: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9950: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
9960: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
9970: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9980: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
9990: 2a 2f 0a 0a 2f 2a 2a 2a 20 45 58 50 45 52 49 4d  */../*** EXPERIM
99a0: 45 4e 54 41 4c 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  ENTAL ***.**.** 
99b0: 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63 74  Register a funct
99c0: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
99d0: 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
99e0: 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73 2e 0a 2a  tion comments..*
99f0: 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64  * If the invoked
9a00: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
9a10: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
9a20: 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f   the commit beco
9a30: 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63  mes a.** rollbac
9a40: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  k..*/.void *sqli
9a50: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
9a60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9a80: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
9a90: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
9aa0: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
9ab0: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
9ac0: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
9ad0: 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
9ae0: 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
9af0: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
9b00: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
9b10: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
9b20: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
9b30: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
9b40: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
9b50: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
9b60: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20  b->pCommitArg;. 
9b70: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
9b80: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
9b90: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ;.  db->pCommitA
9ba0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
9bb0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9bc0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
9bd0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f  eturn pOld;.}../
9be0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
9bf0: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
9c00: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
9c10: 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
9c20: 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
9c30: 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
9c40: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
9c50: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
9c60: 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74  d *sqlite3_updat
9c70: 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
9c80: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
9c90: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
9ca0: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
9cb0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
9cc0: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
9cd0: 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  oid*,int,char co
9ce0: 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74  nst *,char const
9cf0: 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29   *,sqlite_int64)
9d00: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9d20: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
9d30: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
9d40: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20    void *pRet;.  
9d50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
9d60: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
9d70: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70    pRet = db->pUp
9d80: 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  dateArg;.  db->x
9d90: 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
9da0: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
9db0: 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70  ->pUpdateArg = p
9dc0: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
9dd0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
9de0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
9df0: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
9e00: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
9e10: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
9e20: 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
9e30: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
9e40: 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68  ed.** back by th
9e50: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
9e60: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
9e70: 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63  *sqlite3_rollbac
9e80: 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  k_hook(.  sqlite
9e90: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
9ea0: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
9eb0: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
9ec0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
9ed0: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
9ee0: 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61  oid*), /* Callba
9ef0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
9f00: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
9f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
9f20: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
9f30: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
9f40: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
9f50: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
9f60: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
9f70: 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62  Ret = db->pRollb
9f80: 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52  ackArg;.  db->xR
9f90: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
9fa0: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
9fb0: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20  b->pRollbackArg 
9fc0: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
9fd0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
9fe0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
9ff0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
a000: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a010: 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  WAL./*.** The sq
a020: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
a030: 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
a040: 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ered by sqlite3_
a050: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
a060: 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20  nt()..** Invoke 
a070: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
a080: 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75  kpoint if the nu
a090: 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
a0a0: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a  n the log file.*
a0b0: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
a0c0: 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72  n sqlite3.pWalAr
a0d0: 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74  g cast to an int
a0e0: 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65 20  eger (the value 
a0f0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a  configured by.**
a100: 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
a110: 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20  int())..*/ .int 
a120: 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
a130: 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70  tHook(.  void *p
a140: 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  ClientData,     
a150: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20  /* Argument */. 
a160: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
a170: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
a180: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ction */.  const
a190: 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
a1a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f    /* Database */
a1b0: 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20  .  int nFrame   
a1c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a1d0: 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20  e of WAL */.){. 
a1e0: 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c   if( nFrame>=SQL
a1f0: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
a200: 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20  ClientData) ){. 
a210: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
a220: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
a230: 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63     sqlite3_wal_c
a240: 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44  heckpoint(db, zD
a250: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  b);.    sqlite3E
a260: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
a270: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
a280: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
a290: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
a2a0: 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
a2b0: 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c  Configure an sql
a2c0: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
a2d0: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f  callback to auto
a2e0: 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70  matically checkp
a2f0: 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61  oint.** a databa
a300: 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74  se after committ
a310: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
a320: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
a330: 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65  Frame or.** more
a340: 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
a350: 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67  og file. Passing
a360: 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74   zero or a negat
a370: 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68 65  ive value as the
a380: 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d  .** nFrame param
a390: 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61 75  eter disables au
a3a0: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
a3b0: 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a  nts entirely..**
a3c0: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
a3d0: 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 74   registered by t
a3e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70  his function rep
a3f0: 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74 69  laces any existi
a400: 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72  ng callback.** r
a410: 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 20  egistered using 
a420: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
a430: 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65  (). Likewise, re
a440: 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c  gistering a call
a450: 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71  back.** using sq
a460: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
a470: 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 75   disables the au
a480: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
a490: 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20  nt mechanism.** 
a4a0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68  configured by th
a4b0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
a4c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
a4d0: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73  autocheckpoint(s
a4e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
a4f0: 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20  nFrame){.#ifdef 
a500: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
a510: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
a520: 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44  ER(db);.  UNUSED
a530: 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d  _PARAMETER(nFram
a540: 65 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  e);.#else.  if( 
a550: 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20  nFrame>0 ){.    
a560: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
a570: 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44  (db, sqlite3WalD
a580: 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49  efaultHook, SQLI
a590: 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46  TE_INT_TO_PTR(nF
a5a0: 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  rame));.  }else{
a5b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
a5c0: 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b  _hook(db, 0, 0);
a5d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
a5e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a5f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
a600: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
a610: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
a620: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
a630: 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  on is written.**
a640: 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d   into the write-
a650: 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69  ahead-log by thi
a660: 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
a670: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
a680: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
a690: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6b0: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
a6c0: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
a6d0: 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
a6e0: 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f  t(*xCallback)(vo
a6f0: 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  id *, sqlite3*, 
a700: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
a710: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  ),.  void *pArg 
a720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a730: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
a740: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
a750: 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a   xCallback() */.
a760: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
a770: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69  E_OMIT_WAL.  voi
a780: 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
a790: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
a7a0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
a7b0: 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b  t = db->pWalArg;
a7c0: 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62  .  db->xWalCallb
a7d0: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
a7e0: 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d  .  db->pWalArg =
a7f0: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
a800: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
a810: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
a820: 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20  n pRet;.#else.  
a830: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
a840: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70  .}../*.** Checkp
a850: 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44  oint database zD
a860: 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
a870: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
a880: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
a890: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
a8a0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
a8b0: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  se handle */.  c
a8c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a8e0: 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68  * Name of attach
a8f0: 65 64 20 64 61 74 61 62 61 73 65 20 28 6f 72 20  ed database (or 
a900: 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65  NULL) */.  int e
a910: 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Mode,           
a920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
a930: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
a940: 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  * value */.  int
a950: 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20   *pnLog,        
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a970: 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c  OUT: Size of WAL
a980: 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a   log in frames *
a990: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20  /.  int *pnCkpt 
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9b0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61      /* OUT: Tota
a9c0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  l number of fram
a9d0: 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  es checkpointed 
a9e0: 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  */.){.#ifdef SQL
a9f0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72  ITE_OMIT_WAL.  r
aa00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
aa10: 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
aa40: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
aa50: 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41   iDb = SQLITE_MA
aa60: 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20  X_ATTACHED;  /* 
aa70: 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e  sqlite3.aDb[] in
aa80: 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65  dex of db to che
aa90: 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  ckpoint */..  /*
aaa0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
aab0: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
aac0: 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61   to -1 in case a
aad0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
aae0: 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29  */.  if( pnLog )
aaf0: 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20   *pnLog = -1;.  
ab00: 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e  if( pnCkpt ) *pn
ab10: 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73  Ckpt = -1;..  as
ab20: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
ab30: 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e 53 51 4c  CKPOINT_FULL>SQL
ab40: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
ab50: 41 53 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  ASSIVE );.  asse
ab60: 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
ab70: 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51 4c 49 54  POINT_FULL<SQLIT
ab80: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
ab90: 54 41 52 54 20 29 3b 0a 20 20 61 73 73 65 72 74  TART );.  assert
aba0: 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
abb0: 49 4e 54 5f 50 41 53 53 49 56 45 2b 32 3d 3d 53  INT_PASSIVE+2==S
abc0: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
abd0: 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20 69 66  _RESTART );.  if
abe0: 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43  ( eMode<SQLITE_C
abf0: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
ac00: 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54  E || eMode>SQLIT
ac10: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
ac20: 54 41 52 54 20 29 7b 0a 20 20 20 20 72 65 74 75  TART ){.    retu
ac30: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
ac40: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
ac50: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
ac60: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
ac70: 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a  Db && zDb[0] ){.
ac80: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
ac90: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
aca0: 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  zDb);.  }.  if( 
acb0: 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  iDb<0 ){.    rc 
acc0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
acd0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ace0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f  (db, SQLITE_ERRO
acf0: 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  R, "unknown data
ad00: 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b  base: %s", zDb);
ad10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
ad20: 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70   = sqlite3Checkp
ad30: 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65 4d  oint(db, iDb, eM
ad40: 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
ad50: 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pt);.    sqlite3
ad60: 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
ad70: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
ad80: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
ad90: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
ada0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
adb0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
adc0: 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
add0: 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
ade0: 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66  database zDb. If
adf0: 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72   zDb is NULL, or
ae00: 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a   if the buffer z
ae10: 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  Db points.** to 
ae20: 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d  contains a zero-
ae30: 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20 61  length string, a
ae40: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
ae50: 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63 68  bases are .** ch
ae60: 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69  eckpointed..*/.i
ae70: 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  nt sqlite3_wal_c
ae80: 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
ae90: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
aea0: 72 20 2a 7a 44 62 29 7b 0a 20 20 72 65 74 75 72  r *zDb){.  retur
aeb0: 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  n sqlite3_wal_ch
aec0: 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20  eckpoint_v2(db, 
aed0: 7a 44 62 2c 20 53 51 4c 49 54 45 5f 43 48 45 43  zDb, SQLITE_CHEC
aee0: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20  KPOINT_PASSIVE, 
aef0: 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  0, 0);.}..#ifnde
af00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
af10: 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68  L./*.** Run a ch
af20: 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61  eckpoint on data
af30: 62 61 73 65 20 69 44 62 2e 20 54 68 69 73 20 69  base iDb. This i
af40: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74  s a no-op if dat
af50: 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20  abase iDb is.** 
af60: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  not currently op
af70: 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a  en in WAL mode..
af80: 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
af90: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
afa0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
afb0: 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65  eing checkpointe
afc0: 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  d, this .** func
afd0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
afe0: 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61  ITE_LOCKED and a
aff0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e   checkpoint is n
b000: 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66  ot attempted. If
b010: 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63   .** an error oc
b020: 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69  curs while runni
b030: 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  ng the checkpoin
b040: 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  t, an SQLite err
b050: 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
b060: 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51  eturned (i.e. SQ
b070: 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68  LITE_IOERR). Oth
b080: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
b090: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  K..**.** The mut
b0a0: 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ex on database h
b0b0: 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20  andle db should 
b0c0: 62 65 20 68 65 6c 64 20 62 79 20 74 68 65 20 63  be held by the c
b0d0: 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78  aller. The mutex
b0e0: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
b0f0: 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 63  ith the specific
b100: 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68   b-tree being ch
b110: 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61  eckpointed is ta
b120: 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66  ken by.** this f
b130: 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68  unction while th
b140: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  e checkpoint is 
b150: 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  running..**.** I
b160: 66 20 69 44 62 20 69 73 20 70 61 73 73 65 64 20  f iDb is passed 
b170: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
b180: 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74  HED, then all at
b190: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
b1a0: 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69   are.** checkpoi
b1b0: 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  nted. If an erro
b1c0: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
b1d0: 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20   it is returned 
b1e0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a  immediately -.**
b1f0: 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   no attempt is m
b200: 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e  ade to checkpoin
b210: 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20  t any remaining 
b220: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a  databases..**.**
b230: 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
b240: 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   is one of SQLIT
b250: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
b260: 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45  SIVE, FULL or RE
b270: 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  START..*/.int sq
b280: 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
b290: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
b2a0: 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c   iDb, int eMode,
b2b0: 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74   int *pnLog, int
b2c0: 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74   *pnCkpt){.  int
b2d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b2f0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
b300: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
b310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b320: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
b330: 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74 61  ate through atta
b340: 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e  ched dbs */.  in
b350: 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20 20  t bBusy = 0;    
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b370: 20 54 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f   True if SQLITE_
b380: 42 55 53 59 20 68 61 73 20 62 65 65 6e 20 65 6e  BUSY has been en
b390: 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20  countered */..  
b3a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
b3b0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
b3c0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
b3d0: 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e  t( !pnLog || *pn
b3e0: 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73  Log==-1 );.  ass
b3f0: 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20  ert( !pnCkpt || 
b400: 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a  *pnCkpt==-1 );..
b410: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
b420: 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49  >nDb && rc==SQLI
b430: 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
b440: 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69   if( i==iDb || i
b450: 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41  Db==SQLITE_MAX_A
b460: 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20  TTACHED ){.     
b470: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
b480: 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d  eeCheckpoint(db-
b490: 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f  >aDb[i].pBt, eMo
b4a0: 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70  de, pnLog, pnCkp
b4b0: 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20  t);.      pnLog 
b4c0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70  = 0;.      pnCkp
b4d0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
b4e0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
b4f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75 73   ){.        bBus
b500: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  y = 1;.        r
b510: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b520: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b530: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
b540: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42 75  SQLITE_OK && bBu
b550: 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  sy) ? SQLITE_BUS
b560: 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  Y : rc;.}.#endif
b570: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
b580: 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  WAL */../*.** Th
b590: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
b5a0: 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e  rns true if main
b5b0: 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62  -memory should b
b5c0: 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
b5d0: 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  f.** a temporary
b5e0: 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69   file for transi
b5f0: 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73 20  ent pager files 
b600: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  and statement jo
b610: 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76  urnals..** The v
b620: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64 65  alue returned de
b630: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
b640: 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73  ue of db->temp_s
b650: 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a  tore (runtime.**
b660: 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20   parameter) and 
b670: 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  the compile time
b680: 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45   value of SQLITE
b690: 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65  _TEMP_STORE. The
b6a0: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  .** following ta
b6b0: 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
b6c0: 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62  e relationship b
b6d0: 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f  etween these two
b6e0: 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74   values.** and t
b6f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  his functions re
b700: 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  turn value..**.*
b710: 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  *   SQLITE_TEMP_
b720: 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65  STORE     db->te
b730: 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63  mp_store     Loc
b740: 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61  ation of tempora
b750: 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  ry database.**  
b760: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
b770: 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
b780: 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
b790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b7a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20  --------.**   0 
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7c0: 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
b7d0: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
b7e0: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
b7f0: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
b800: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
b810: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
b820: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
b830: 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
b840: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
b850: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
b860: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
b870: 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
b880: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8a0: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
b8b0: 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8d0: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
b8e0: 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
b8f0: 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20  turn 0).**   2  
b900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b910: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
b920: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
b930: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
b940: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
b950: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
b960: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
b970: 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
b980: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
b990: 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20           any    
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
b9b0: 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
b9c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
b9d0: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73  empInMemory(cons
b9e0: 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t sqlite3 *db){.
b9f0: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
ba00: 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72  STORE==1.  retur
ba10: 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
ba20: 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  re==2 );.#endif.
ba30: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
ba40: 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72  STORE==2.  retur
ba50: 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
ba60: 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a  re!=1 );.#endif.
ba70: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
ba80: 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74 75 72  STORE==3.  retur
ba90: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  n 1;.#endif.#if 
baa0: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
bab0: 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45  E<1 || SQLITE_TE
bac0: 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72 65 74  MP_STORE>3.  ret
bad0: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
bae0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
baf0: 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  F-8 encoded Engl
bb00: 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
bb10: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
bb20: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
bb30: 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  rror..*/.const c
bb40: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
bb50: 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29  msg(sqlite3 *db)
bb60: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
bb70: 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
bb80: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
bb90: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
bba0: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66  NOMEM);.  }.  if
bbb0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
bbc0: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
bbd0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
bbe0: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
bbf0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
bc00: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
bc10: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
bc20: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
bc30: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
bc40: 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  ){.    z = sqlit
bc50: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
bc60: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b  NOMEM);.  }else{
bc70: 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  .    z = (char*)
bc80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
bc90: 78 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  xt(db->pErr);.  
bca0: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
bcb0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
bcc0: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
bcd0: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
bce0: 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f  ErrStr(db->errCo
bcf0: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  de);.    }.  }. 
bd00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
bd10: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
bd20: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
bd30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
bd40: 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
bd50: 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e  Return UTF-16 en
bd60: 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  coded English la
bd70: 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
bd80: 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
bd90: 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a  ecent.** error..
bda0: 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
bdb0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28  qlite3_errmsg16(
bdc0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
bdd0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
bde0: 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a   outOfMem[] = {.
bdf0: 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74      'o', 'u', 't
be00: 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27  ', ' ', 'o', 'f'
be10: 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c  , ' ', 'm', 'e',
be20: 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20   'm', 'o', 'r', 
be30: 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74  'y', 0.  };.  st
be40: 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d  atic const u16 m
be50: 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  isuse[] = {.    
be60: 27 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c 20 27  'l', 'i', 'b', '
be70: 72 27 2c 20 27 61 27 2c 20 27 72 27 2c 20 27 79  r', 'a', 'r', 'y
be80: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 72 27  ', ' ', .    'r'
be90: 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c  , 'o', 'u', 't',
bea0: 20 27 69 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20   'i', 'n', 'e', 
beb0: 27 20 27 2c 20 0a 20 20 20 20 27 63 27 2c 20 27  ' ', .    'c', '
bec0: 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65  a', 'l', 'l', 'e
bed0: 27 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'd', ' ', .  
bee0: 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c    'o', 'u', 't',
bef0: 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20   ' ', .    'o', 
bf00: 27 66 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'f', ' ', .    '
bf10: 73 27 2c 20 27 65 27 2c 20 27 71 27 2c 20 27 75  s', 'e', 'q', 'u
bf20: 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27 63 27  ', 'e', 'n', 'c'
bf30: 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20  , 'e', 0.  };.. 
bf40: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a   const void *z;.
bf50: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
bf60: 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29   return (void *)
bf70: 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20  outOfMem;.  }.  
bf80: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
bf90: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
bfa0: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
bfb0: 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65  n (void *)misuse
bfc0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
bfd0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
bfe0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
bff0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c000: 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20  {.    z = (void 
c010: 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65  *)outOfMem;.  }e
c020: 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  lse{.    z = sql
c030: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
c040: 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  6(db->pErr);.   
c050: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
c060: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
c070: 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
c080: 2d 31 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  -1, sqlite3ErrSt
c090: 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 2c 0a  r(db->errCode),.
c0a0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
c0b0: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
c0c0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7a 20  TATIC);.      z 
c0d0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
c0e0: 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
c0f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  ;.    }.    /* A
c100: 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61   malloc() may ha
c110: 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69 6e  ve failed within
c120: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
c130: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
c140: 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  6().    ** above
c150: 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
c160: 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
c170: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c180: 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20   flag needs to. 
c190: 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65 64     ** be cleared
c1a0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
c1b0: 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65 63  g. Do this direc
c1c0: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
c1d0: 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  via.    ** sqlit
c1e0: 65 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20  e3ApiExit(), to 
c1f0: 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68  avoid setting th
c200: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
c210: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
c220: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e  .    */.    db->
c230: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
c240: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
c250: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
c260: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
c270: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
c280: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
c290: 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  6 */../*.** Retu
c2a0: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
c2b0: 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65  nt error code ge
c2c0: 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53 51  nerated by an SQ
c2d0: 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66  Lite routine. If
c2e0: 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73   NULL is.** pass
c2f0: 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
c300: 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61  ion, we assume a
c310: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
c320: 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   during sqlite3_
c330: 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  open()..*/.int s
c340: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73  qlite3_errcode(s
c350: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
c360: 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65  f( db && !sqlite
c370: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
c380: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
c390: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
c3a0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
c3b0: 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
c3c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
c3d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c3e0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
c3f0: 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64  eturn db->errCod
c400: 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  e & db->errMask;
c410: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  .}.int sqlite3_e
c420: 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
c430: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
c440: 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
c450: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
c460: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
c470: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
c480: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
c490: 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
c4a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
c4b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c4c0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
c4d0: 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
c4e0: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  de;.}../*.** Cre
c4f0: 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ate a new collat
c500: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ing function for
c510: 20 64 61 74 61 62 61 73 65 20 22 64 62 22 2e 20   database "db". 
c520: 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61   The name is zNa
c530: 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e  me.** and the en
c540: 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a  coding is enc..*
c550: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65  /.static int cre
c560: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  ateCollation(.  
c570: 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63  sqlite3* db,.  c
c580: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
c590: 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 76  , .  u8 enc,.  v
c5a0: 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
c5b0: 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
c5c0: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
c5d0: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
c5e0: 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c  *),.  void(*xDel
c5f0: 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f  )(void*).){.  Co
c600: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
c610: 69 6e 74 20 65 6e 63 32 3b 0a 20 20 69 6e 74 20  int enc2;.  int 
c620: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
c630: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
c640: 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
c650: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c660: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
c670: 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54   /* If SQLITE_UT
c680: 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64  F16 is specified
c690: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
c6a0: 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d   type, transform
c6b0: 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e   this.  ** to on
c6c0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
c6d0: 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54  6LE or SQLITE_UT
c6e0: 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a  F16BE using the.
c6f0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31    ** SQLITE_UTF1
c700: 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53  6NATIVE macro. S
c710: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e  QLITE_UTF16 is n
c720: 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
c730: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20  ly..  */.  enc2 
c740: 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73  = enc;.  testcas
c750: 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  e( enc2==SQLITE_
c760: 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63  UTF16 );.  testc
c770: 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
c780: 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
c790: 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53  );.  if( enc2==S
c7a0: 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65  QLITE_UTF16 || e
c7b0: 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
c7c0: 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20  6_ALIGNED ){.   
c7d0: 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55   enc2 = SQLITE_U
c7e0: 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a  TF16NATIVE;.  }.
c7f0: 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54    if( enc2<SQLIT
c800: 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53  E_UTF8 || enc2>S
c810: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b  QLITE_UTF16BE ){
c820: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c830: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
c840: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
c850: 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  if this call is 
c860: 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c  removing or repl
c870: 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  acing an existin
c880: 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a  g collation .  *
c890: 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73  * sequence. If s
c8a0: 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  o, and there are
c8b0: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74   active VMs, ret
c8c0: 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65  urn busy. If the
c8d0: 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61  re.  ** are no a
c8e0: 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c  ctive VMs, inval
c8f0: 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f  idate any pre-co
c900: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
c910: 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20  s..  */.  pColl 
c920: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
c930: 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
c940: 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  2, zName, 0);.  
c950: 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f  if( pColl && pCo
c960: 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20  ll->xCmp ){.    
c970: 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  if( db->activeVd
c980: 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  beCnt ){.      s
c990: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
c9a0: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
c9b0: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
c9c0: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63   delete/modify c
c9d0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
c9e0: 65 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20  e due to active 
c9f0: 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20  statements");.  
ca00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ca10: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
ca20: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
ca30: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
ca40: 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  s(db);..    /* I
ca50: 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  f collation sequ
ca60: 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63  ence pColl was c
ca70: 72 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20  reated directly 
ca80: 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20  by a call to.   
ca90: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61   ** sqlite3_crea
caa0: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e  te_collation, an
cab0: 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20  d not generated 
cac0: 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  by synthCollSeq(
cad0: 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ),.    ** then a
cae0: 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62  ny copies made b
caf0: 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
cb00: 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61   need to be inva
cb10: 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  lidated..    ** 
cb20: 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20  Also, collation 
cb30: 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c  destructor - Col
cb40: 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75  lSeq.xDel() - fu
cb50: 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a  nction may need.
cb60: 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c      ** to be cal
cb70: 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  led..    */ .   
cb80: 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63   if( (pColl->enc
cb90: 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36   & ~SQLITE_UTF16
cba0: 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20  _ALIGNED)==enc2 
cbb0: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
cbc0: 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *aColl = sqlite
cbd0: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
cbe0: 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20  CollSeq, zName, 
cbf0: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e  nName);.      in
cc00: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
cc10: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
cc20: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
cc30: 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  p = &aColl[j];. 
cc40: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e         if( p->en
cc50: 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
cc60: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
cc70: 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->xDel ){.      
cc80: 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d        p->xDel(p-
cc90: 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20  >pUser);.       
cca0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
ccb0: 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20  ->xCmp = 0;.    
ccc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ccd0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c    }.  }..  pColl
cce0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
ccf0: 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
cd00: 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20  c2, zName, 1);. 
cd10: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
cd20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
cd30: 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43  MEM;.  pColl->xC
cd40: 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20  mp = xCompare;. 
cd50: 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20   pColl->pUser = 
cd60: 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78  pCtx;.  pColl->x
cd70: 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43  Del = xDel;.  pC
cd80: 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28  oll->enc = (u8)(
cd90: 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51  enc2 | (enc & SQ
cda0: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
cdb0: 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ED));.  sqlite3E
cdc0: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
cdd0: 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  OK, 0);.  return
cde0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
cdf0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79  /*.** This array
ce00: 20 64 65 66 69 6e 65 73 20 68 61 72 64 20 75 70   defines hard up
ce10: 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69  per bounds on li
ce20: 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65  mit values.  The
ce30: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  .** initializer 
ce40: 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20  must be kept in 
ce50: 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 53 51  sync with the SQ
ce60: 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20  LITE_LIMIT_*.** 
ce70: 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69  #defines in sqli
ce80: 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  te3.h..*/.static
ce90: 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64   const int aHard
cea0: 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51  Limit[] = {.  SQ
ceb0: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c  LITE_MAX_LENGTH,
cec0: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  .  SQLITE_MAX_SQ
ced0: 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  L_LENGTH,.  SQLI
cee0: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20  TE_MAX_COLUMN,. 
cef0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
cf00: 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45  _DEPTH,.  SQLITE
cf10: 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
cf20: 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LECT,.  SQLITE_M
cf30: 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51  AX_VDBE_OP,.  SQ
cf40: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
cf50: 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f  N_ARG,.  SQLITE_
cf60: 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20  MAX_ATTACHED,.  
cf70: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
cf80: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a  PATTERN_LENGTH,.
cf90: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52    SQLITE_MAX_VAR
cfa0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a 20 20  IABLE_NUMBER,.  
cfb0: 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
cfc0: 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a  ER_DEPTH,.};../*
cfd0: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
cfe0: 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72  e hard limits ar
cff0: 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61  e set to reasona
d000: 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69  ble values.*/.#i
d010: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  f SQLITE_MAX_LEN
d020: 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
d030: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
d040: 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
d050: 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
d060: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
d070: 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
d080: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ror SQLITE_MAX_S
d090: 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  QL_LENGTH must b
d0a0: 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
d0b0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
d0c0: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e  _MAX_SQL_LENGTH>
d0d0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
d0e0: 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  H.# error SQLITE
d0f0: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
d100: 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61  must not be grea
d110: 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  ter than SQLITE_
d120: 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69  MAX_LENGTH.#endi
d130: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
d140: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
d150: 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <2.# error SQLIT
d160: 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
d170: 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61 74  ELECT must be at
d180: 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a   least 2.#endif.
d190: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  #if SQLITE_MAX_V
d1a0: 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f  DBE_OP<40.# erro
d1b0: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  r SQLITE_MAX_VDB
d1c0: 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20  E_OP must be at 
d1d0: 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a  least 40.#endif.
d1e0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  #if SQLITE_MAX_F
d1f0: 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c  UNCTION_ARG<0 ||
d200: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
d210: 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a 23 20  TION_ARG>1000.# 
d220: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
d230: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75  _FUNCTION_ARG mu
d240: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  st be between 0 
d250: 61 6e 64 20 31 30 30 30 0a 23 65 6e 64 69 66 0a  and 1000.#endif.
d260: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  #if SQLITE_MAX_A
d270: 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c  TTACHED<0 || SQL
d280: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
d290: 3e 36 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  >62.# error SQLI
d2a0: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20  TE_MAX_ATTACHED 
d2b0: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
d2c0: 30 20 61 6e 64 20 36 32 0a 23 65 6e 64 69 66 0a  0 and 62.#endif.
d2d0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
d2e0: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
d2f0: 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  TH<1.# error SQL
d300: 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
d310: 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74  TERN_LENGTH must
d320: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
d330: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
d340: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36  _MAX_COLUMN>3276
d350: 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  7.# error SQLITE
d360: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74  _MAX_COLUMN must
d370: 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37 36   not exceed 3276
d380: 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  7.#endif.#if SQL
d390: 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
d3a0: 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20  DEPTH<1.# error 
d3b0: 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
d3c0: 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65  ER_DEPTH must be
d3d0: 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64   at least 1.#end
d3e0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  if.../*.** Chang
d3f0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  e the value of a
d400: 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20   limit.  Report 
d410: 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a  the old value..*
d420: 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20  * If an invalid 
d430: 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73  limit index is s
d440: 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20  upplied, report 
d450: 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63  -1..** Make no c
d460: 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c  hanges but still
d470: 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20   report the old 
d480: 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20  value if the.** 
d490: 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  new limit is neg
d4a0: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ative..**.** A n
d4b0: 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64  ew lower limit d
d4c0: 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65  oes not shrink e
d4d0: 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63  xisting construc
d4e0: 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79  ts..** It merely
d4f0: 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f   prevents new co
d500: 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78  nstructs that ex
d510: 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a  ceed the limit.*
d520: 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a  * from forming..
d530: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c  */.int sqlite3_l
d540: 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  imit(sqlite3 *db
d550: 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69  , int limitId, i
d560: 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20  nt newLimit){.  
d570: 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 0a  int oldLimit;...
d580: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
d590: 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20  : R-30189-54097 
d5a0: 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63  For each limit c
d5b0: 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c  ategory SQLITE_L
d5c0: 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74  IMIT_NAME.  ** t
d5d0: 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75  here is a hard u
d5e0: 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61  pper bound set a
d5f0: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62  t compile-time b
d600: 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73  y a C preprocess
d610: 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61  or.  ** macro ca
d620: 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lled SQLITE_MAX_
d630: 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d  NAME. (The "_LIM
d640: 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  IT_" in the name
d650: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20   is changed to. 
d660: 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20   ** "_MAX_".).  
d670: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  */.  assert( aHa
d680: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
d690: 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  IMIT_LENGTH]==SQ
d6a0: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
d6b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
d6c0: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
d6d0: 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
d6e0: 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  ==SQLITE_MAX_SQL
d6f0: 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
d700: 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
d710: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
d720: 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  UMN]==SQLITE_MAX
d730: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73  _COLUMN );.  ass
d740: 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
d750: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
d760: 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
d770: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20  _MAX_EXPR_DEPTH 
d780: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
d790: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
d7a0: 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
d7b0: 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LECT]==SQLITE_MA
d7c0: 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
d7d0: 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  T);.  assert( aH
d7e0: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
d7f0: 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d  LIMIT_VDBE_OP]==
d800: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
d810: 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OP );.  assert( 
d820: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
d830: 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
d840: 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  _ARG]==SQLITE_MA
d850: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29  X_FUNCTION_ARG )
d860: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
d870: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
d880: 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53  MIT_ATTACHED]==S
d890: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
d8a0: 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
d8b0: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
d8c0: 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
d8d0: 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20  TERN_LENGTH]==. 
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
d910: 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
d920: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a  TTERN_LENGTH );.
d930: 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
d940: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
d950: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
d960: 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  R]==SQLITE_MAX_V
d970: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b  ARIABLE_NUMBER);
d980: 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
d990: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
d9a0: 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
d9b0: 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  ]==SQLITE_MAX_TR
d9c0: 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20  IGGER_DEPTH );. 
d9d0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
d9e0: 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
d9f0: 50 54 48 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c  PTH==(SQLITE_N_L
da00: 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69  IMIT-1) );...  i
da10: 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20  f( limitId<0 || 
da20: 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f  limitId>=SQLITE_
da30: 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72  N_LIMIT ){.    r
da40: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
da50: 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61  oldLimit = db->a
da60: 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a  Limit[limitId];.
da70: 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
da80: 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
da90: 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
daa0: 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a  -52476-28732 */.
dab0: 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
dac0: 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69  >aHardLimit[limi
dad0: 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65  tId] ){.      ne
dae0: 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c 69  wLimit = aHardLi
daf0: 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f  mit[limitId];  /
db00: 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32  * IMP: R-51463-2
db10: 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  5634 */.    }.  
db20: 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d    db->aLimit[lim
db30: 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74  itId] = newLimit
db40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ;.  }.  return o
db50: 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20  ldLimit;        
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db70: 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35 34  IMP: R-53341-354
db80: 31 39 20 2a 2f 0a 7d 0a 23 69 66 20 64 65 66 69  19 */.}.#if defi
db90: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
dba0: 45 5f 41 55 54 4f 5f 50 52 4f 46 49 4c 45 29 0a  E_AUTO_PROFILE).
dbb0: 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74  void _sqlite_aut
dbc0: 6f 5f 70 72 6f 66 69 6c 65 28 76 6f 69 64 20 2a  o_profile(void *
dbd0: 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  aux, const char 
dbe0: 2a 73 71 6c 2c 20 75 36 34 20 6e 73 29 3b 0a 76  *sql, u64 ns);.v
dbf0: 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f  oid _sqlite_auto
dc00: 5f 74 72 61 63 65 28 76 6f 69 64 20 2a 61 75 78  _trace(void *aux
dc10: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  , const char *sq
dc20: 6c 29 3b 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65  l);.void _sqlite
dc30: 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65 28 76 6f  _auto_profile(vo
dc40: 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63  id *aux, const c
dc50: 68 61 72 20 2a 73 71 6c 2c 20 75 36 34 20 6e 73  har *sql, u64 ns
dc60: 29 20 7b 0a 23 70 72 61 67 6d 61 20 75 6e 75 73  ) {.#pragma unus
dc70: 65 64 28 61 75 78 29 0a 09 66 70 72 69 6e 74 66  ed(aux)..fprintf
dc80: 28 73 74 64 65 72 72 2c 20 22 51 75 65 72 79 3a  (stderr, "Query:
dc90: 20 25 73 5c 6e 20 45 78 65 63 75 74 69 6f 6e 20   %s\n Execution 
dca0: 54 69 6d 65 3a 20 25 6c 6c 75 20 6d 73 5c 6e 22  Time: %llu ms\n"
dcb0: 2c 20 73 71 6c 2c 20 6e 73 20 2f 20 31 30 30 30  , sql, ns / 1000
dcc0: 30 30 30 29 3b 0a 7d 0a 76 6f 69 64 20 5f 73 71  000);.}.void _sq
dcd0: 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 28  lite_auto_trace(
dce0: 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74  void *aux, const
dcf0: 20 63 68 61 72 20 2a 73 71 6c 29 20 7b 0a 09 66   char *sql) {..f
dd00: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
dd10: 54 72 61 63 65 53 51 4c 28 25 70 29 3a 20 25 73  TraceSQL(%p): %s
dd20: 5c 6e 22 2c 20 61 75 78 2c 20 73 71 6c 29 3b 0a  \n", aux, sql);.
dd30: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
dd40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
dd50: 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62   used to parse b
dd60: 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e  oth URIs and non
dd70: 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70  -URI filenames p
dd80: 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  assed by the.** 
dd90: 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63  user to API func
dda0: 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70  tions sqlite3_op
ddb0: 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  en() or sqlite3_
ddc0: 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66  open_v2(), and f
ddd0: 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55  or database.** U
dde0: 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73  RIs specified as
ddf0: 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20   part of ATTACH 
de00: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
de10: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
de20: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
de30: 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d  ction is the nam
de40: 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
de50: 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c  use (or.** a NUL
de60: 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65  L to signify the
de70: 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66   default VFS) if
de80: 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f   the URI does no
de90: 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73  t contain a "vfs
dea0: 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70  =xxx".** query p
deb0: 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65  arameter. The se
dec0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f  cond argument co
ded0: 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28  ntains the URI (
dee0: 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  or non-URI filen
def0: 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20  ame).** itself. 
df00: 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
df10: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  on is called the
df20: 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c   *pFlags variabl
df30: 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  e should contain
df40: 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20  .** the default 
df50: 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68  flags to open th
df60: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
df70: 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75  e with. The valu
df80: 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a  e stored in.** *
df90: 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70  pFlags may be up
dfa0: 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74  dated before ret
dfb0: 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52  urning if the UR
dfc0: 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61  I filename conta
dfd0: 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78  ins .** "cache=x
dfe0: 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78  xx" or "mode=xxx
dff0: 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  " query paramete
e000: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  rs..**.** If suc
e010: 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
e020: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
e030: 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70  In this case *pp
e040: 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Vfs is set to po
e050: 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46  int to.** the VF
e060: 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  S that should be
e070: 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
e080: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
e090: 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20   *pzFile is set 
e0a0: 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  to.** point to a
e0b0: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
e0c0: 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ng the name of t
e0d0: 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  he file to open.
e0e0: 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
e0f0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
e100: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
e110: 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73  ventually call s
e120: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f  qlite3_free() to
e130: 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
e140: 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   buffer..**.** I
e150: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
e160: 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74  s, then an SQLit
e170: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
e180: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a  returned and *pz
e190: 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65  ErrMsg.** may be
e1a0: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
e1b0: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
e1c0: 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20  ning an English 
e1d0: 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a  language error .
e1e0: 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  ** message. It i
e1f0: 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
e200: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
e210: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
e220: 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
e230: 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69   buffer by calli
e240: 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
e250: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
e260: 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e  3ParseUri(.  con
e270: 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c  st char *zDefaul
e280: 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  tVfs,        /* 
e290: 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f  VFS to use if no
e2a0: 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79   "vfs=xxx" query
e2b0: 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e   option */.  con
e2c0: 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20  st char *zUri,  
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e2e0: 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55  Nul-terminated U
e2f0: 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20  RI to parse */. 
e300: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70   unsigned int *p
e310: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
e320: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49   /* IN/OUT: SQLI
e330: 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
e340: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
e350: 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20  fs **ppVfs,     
e360: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
e370: 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20  FS to use */ .  
e380: 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20  char **pzFile,  
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65  /* OUT: Filename
e3b0: 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52   component of UR
e3c0: 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  I */.  char **pz
e3d0: 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
e3e0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
e3f0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66  rror message (if
e400: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc!=SQLITE_OK) 
e410: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
e420: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
e430: 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73  signed int flags
e440: 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f   = *pFlags;.  co
e450: 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d  nst char *zVfs =
e460: 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20   zDefaultVfs;.  
e470: 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
e480: 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72  har c;.  int nUr
e490: 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
e4a0: 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73  n30(zUri);..  as
e4b0: 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d  sert( *pzErrMsg=
e4c0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66  =0 );..  if( ((f
e4d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
e4e0: 45 4e 5f 55 52 49 29 20 7c 7c 20 73 71 6c 69 74  EN_URI) || sqlit
e4f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
e500: 4f 70 65 6e 55 72 69 29 20 0a 20 20 20 26 26 20  OpenUri) .   && 
e510: 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d  nUri>=5 && memcm
e520: 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c  p(zUri, "file:",
e530: 20 35 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20   5)==0 .  ){.   
e540: 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20   char *zOpt;.   
e550: 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20   int eState;    
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e570: 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20 77  * Parser state w
e580: 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20  hen parsing URI 
e590: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20  */.    int iIn; 
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5b0: 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68       /* Input ch
e5c0: 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
e5d0: 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20  .    int iOut = 
e5e0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
e5f0: 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61     /* Output cha
e600: 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a  racter index */.
e610: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
e620: 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20  nUri+2;         
e630: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
e640: 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ace to allocate 
e650: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  */..    /* Make 
e660: 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f  sure the SQLITE_
e670: 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73  OPEN_URI flag is
e680: 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65   set to indicate
e690: 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65   to the VFS xOpe
e6a0: 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  n .    ** method
e6b0: 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79 20   that there may 
e6c0: 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65 74  be extra paramet
e6d0: 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ers following th
e6e0: 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f  e file-name.  */
e6f0: 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
e700: 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a  LITE_OPEN_URI;..
e710: 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69      for(iIn=0; i
e720: 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20  In<nUri; iIn++) 
e730: 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69  nByte += (zUri[i
e740: 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a  In]=='&');.    z
e750: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
e760: 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
e770: 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72    if( !zFile ) r
e780: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e790: 45 4d 3b 0a 0a 20 20 20 20 2f 2a 20 44 69 73 63  EM;..    /* Disc
e7a0: 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20 61  ard the scheme a
e7b0: 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65 67  nd authority seg
e7c0: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52 49  ments of the URI
e7d0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55 72  . */.    if( zUr
e7e0: 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72  i[5]=='/' && zUr
e7f0: 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i[6]=='/' ){.   
e800: 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20     iIn = 7;.    
e810: 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
e820: 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
e830: 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 0a 20  ='/' ) iIn++;.. 
e840: 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20       if( iIn!=7 
e850: 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d  && (iIn!=16 || m
e860: 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74  emcmp("localhost
e870: 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29  ", &zUri[7], 9))
e880: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
e890: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
e8a0: 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64  mprintf("invalid
e8b0: 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20   uri authority: 
e8c0: 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20  %.*s", .        
e8d0: 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69      iIn-7, &zUri
e8e0: 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [7]);.        rc
e8f0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
e900: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
e910: 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
e920: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
e930: 20 20 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 20        iIn = 5;. 
e940: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
e950: 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61  y the filename a
e960: 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70 61 72  nd any query par
e970: 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65  ameters into the
e980: 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a   zFile buffer. .
e990: 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48      ** Decode %H
e9a0: 48 20 65 73 63 61 70 65 20 63 6f 64 65 73 20 61  H escape codes a
e9b0: 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20  long the way. . 
e9c0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74     **.    ** Wit
e9d0: 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76  hin this loop, v
e9e0: 61 72 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d  ariable eState m
e9f0: 61 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20  ay be set to 0, 
ea00: 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e  1 or 2, dependin
ea10: 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  g.    ** on the 
ea20: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e  parsing context.
ea30: 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   As follows:.   
ea40: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20   **.    **   0: 
ea50: 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d  Parsing file-nam
ea60: 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50  e..    **   1: P
ea70: 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74  arsing name sect
ea80: 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61  ion of a name=va
ea90: 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  lue query parame
eaa0: 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a  ter..    **   2:
eab0: 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73   Parsing value s
eac0: 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65  ection of a name
ead0: 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72  =value query par
eae0: 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  ameter..    */. 
eaf0: 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20     eState = 0;. 
eb00: 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
eb10: 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20  Uri[iIn])!=0 && 
eb20: 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20  c!='#' ){.      
eb30: 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  iIn++;.      if(
eb40: 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20   c=='%' .       
eb50: 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67  && sqlite3Isxdig
eb60: 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20  it(zUri[iIn]) . 
eb70: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
eb80: 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49  Isxdigit(zUri[iI
eb90: 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a  n+1]) .      ){.
eba0: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65          int octe
ebb0: 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54  t = (sqlite3HexT
ebc0: 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d  oInt(zUri[iIn++]
ebd0: 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20  ) << 4);.       
ebe0: 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65   octet += sqlite
ebf0: 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69  3HexToInt(zUri[i
ec00: 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20  In++]);..       
ec10: 20 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d   assert( octet>=
ec20: 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29  0 && octet<256 )
ec30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 63  ;.        if( oc
ec40: 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tet==0 ){.      
ec50: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
ec60: 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
ec70: 20 22 25 30 30 22 20 61 70 70 65 61 72 73 20 77   "%00" appears w
ec80: 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49  ithin the URI. I
ec90: 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
eca0: 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f   ** case we igno
ecb0: 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74  re all text in t
ecc0: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
ecd0: 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f  the path, name o
ece0: 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76  r.          ** v
ecf0: 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62  alue currently b
ed00: 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20  eing parsed. So 
ed10: 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65  ignore the curre
ed20: 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 20 20  nt character.   
ed30: 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b         ** and sk
ed40: 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22  ip to the next "
ed50: 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20  ?", "=" or "&", 
ed60: 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
ed70: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  */.          whi
ed80: 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49  le( (c = zUri[iI
ed90: 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27  n])!=0 && c!='#'
eda0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
edb0: 26 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c  && (eState!=0 ||
edc0: 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20   c!='?').       
edd0: 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
ede0: 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20  e!=1 || (c!='=' 
edf0: 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20  && c!='&')).    
ee00: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53            && (eS
ee10: 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26  tate!=2 || c!='&
ee20: 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  ').          ){.
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b              iIn+
ee40: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
ee50: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
ee60: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
ee70: 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a       c = octet;.
ee80: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ee90: 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d  eState==1 && (c=
eea0: 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20  ='&' || c=='=') 
eeb0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
eec0: 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20  File[iOut-1]==0 
eed0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
eee0: 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20  An empty option 
eef0: 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69  name. Ignore thi
ef00: 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74  s option altoget
ef10: 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  her. */.        
ef20: 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
ef30: 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
ef40: 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e  ='#' && zUri[iIn
ef50: 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b  -1]!='&' ) iIn++
ef60: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
ef70: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
ef80: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
ef90: 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  &' ){.          
efa0: 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
efb0: 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65  '\0';.        }e
efc0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65  lse{.          e
efd0: 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20  State = 2;.     
efe0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
eff0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
f000: 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26  if( (eState==0 &
f010: 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53  & c=='?') || (eS
f020: 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26  tate==2 && c=='&
f030: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  ') ){.        c 
f040: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74  = 0;.        eSt
f050: 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ate = 1;.      }
f060: 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  .      zFile[iOu
f070: 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a  t++] = c;.    }.
f080: 20 20 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d      if( eState==
f090: 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b  1 ) zFile[iOut++
f0a0: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
f0b0: 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
f0c0: 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f  0';.    zFile[iO
f0d0: 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  ut++] = '\0';.. 
f0e0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
f0f0: 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70  here were any op
f100: 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20  tions specified 
f110: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69  that should be i
f120: 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20 20 20  nterpreted .    
f130: 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73  ** here. Options
f140: 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 72 70   that are interp
f150: 72 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75  reted here inclu
f160: 64 65 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f  de "vfs" and tho
f170: 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  se that.    ** c
f180: 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61  orrespond to fla
f190: 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70  gs that may be p
f1a0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c  assed to the sql
f1b0: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20  ite3_open_v2(). 
f1c0: 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f     ** method. */
f1d0: 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69  .    zOpt = &zFi
f1e0: 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  le[sqlite3Strlen
f1f0: 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20  30(zFile)+1];.  
f200: 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d    while( zOpt[0]
f210: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
f220: 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  pt = sqlite3Strl
f230: 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20  en30(zOpt);.    
f240: 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26    char *zVal = &
f250: 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20  zOpt[nOpt+1];.  
f260: 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73      int nVal = s
f270: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
f280: 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  Val);..      if(
f290: 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63   nOpt==3 && memc
f2a0: 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20  mp("vfs", zOpt, 
f2b0: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  3)==0 ){.       
f2c0: 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20   zVfs = zVal;.  
f2d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f2e0: 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f     struct OpenMo
f2f0: 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63  de {.          c
f300: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
f310: 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65          int mode
f320: 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f  ;.        } *aMo
f330: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
f340: 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20  char *zModeType 
f350: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
f360: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20   mask = 0;.     
f370: 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30     int limit = 0
f380: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ;..        if( n
f390: 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Opt==5 && memcmp
f3a0: 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20  ("cache", zOpt, 
f3b0: 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  5)==0 ){.       
f3c0: 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
f3d0: 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65   OpenMode aCache
f3e0: 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Mode[] = {.     
f3f0: 20 20 20 20 20 20 20 7b 20 22 73 68 61 72 65 64         { "shared
f400: 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
f410: 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20  SHAREDCACHE },. 
f420: 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 70 72             { "pr
f430: 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f  ivate", SQLITE_O
f440: 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
f450: 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
f460: 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
f470: 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
f480: 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
f490: 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c  PEN_SHAREDCACHE|
f4a0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
f4b0: 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20  ATECACHE;.      
f4c0: 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63      aMode = aCac
f4d0: 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  heMode;.        
f4e0: 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a    limit = mask;.
f4f0: 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
f500: 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20  ype = "cache";. 
f510: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f520: 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20   if( nOpt==4 && 
f530: 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a  memcmp("mode", z
f540: 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 4)==0 ){.  
f550: 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73          static s
f560: 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61  truct OpenMode a
f570: 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20  OpenMode[] = {. 
f580: 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f             { "ro
f590: 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
f5a0: 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20  READONLY },.    
f5b0: 20 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20          { "rw", 
f5c0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
f5d0: 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20  DWRITE }, .     
f5e0: 20 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20         { "rwc", 
f5f0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
f600: 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
f610: 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20  PEN_CREATE },.  
f620: 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30            { 0, 0
f630: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a   }.          };.
f640: 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20  .          mask 
f650: 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
f660: 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
f670: 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
f680: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b  ITE_OPEN_CREATE;
f690: 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65  .          aMode
f6a0: 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20   = aOpenMode;.  
f6b0: 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20          limit = 
f6c0: 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20  mask & flags;.  
f6d0: 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
f6e0: 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20 20  e = "access";.  
f6f0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
f700: 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20   if( aMode ){.  
f710: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
f720: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64           int mod
f730: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
f740: 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b   for(i=0; aMode[
f750: 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i].z; i++){.    
f760: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
f770: 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d  ar *z = aMode[i]
f780: 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  .z;.            
f790: 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65  if( nVal==sqlite
f7a0: 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26 20  3Strlen30(z) && 
f7b0: 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20  0==memcmp(zVal, 
f7c0: 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20  z, nVal) ){.    
f7d0: 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20 3d            mode =
f7e0: 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a   aMode[i].mode;.
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
f800: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
f810: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
f820: 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f 64           if( mod
f830: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
f840: 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
f850: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
f860: 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64 65  "no such %s mode
f870: 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65  : %s", zModeType
f880: 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , zVal);.       
f890: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f8a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
f8b0: 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75      goto parse_u
f8c0: 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ri_out;.        
f8d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
f8e0: 28 20 6d 6f 64 65 3e 6c 69 6d 69 74 20 29 7b 0a  ( mode>limit ){.
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
f900: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
f910: 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65  mprintf("%s mode
f920: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73   not allowed: %s
f930: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f950: 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65             zMode
f960: 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20  Type, zVal);.   
f970: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
f980: 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20  LITE_PERM;.     
f990: 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
f9a0: 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20  e_uri_out;.     
f9b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f9c0: 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20   flags = (flags 
f9d0: 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b  & ~mask) | mode;
f9e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f9f0: 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d   }..      zOpt =
fa00: 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a   &zVal[nVal+1];.
fa10: 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
fa20: 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69      zFile = sqli
fa30: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b  te3_malloc(nUri+
fa40: 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69  2);.    if( !zFi
fa50: 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
fa60: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65  TE_NOMEM;.    me
fa70: 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69  mcpy(zFile, zUri
fa80: 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a 46 69  , nUri);.    zFi
fa90: 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b  le[nUri] = '\0';
faa0: 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b  .    zFile[nUri+
fab0: 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 0a  1] = '\0';.  }..
fac0: 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74    *ppVfs = sqlit
fad0: 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73  e3_vfs_find(zVfs
fae0: 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d  );.  if( *ppVfs=
faf0: 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72  =0 ){.    *pzErr
fb00: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
fb10: 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76  rintf("no such v
fb20: 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a  fs: %s", zVfs);.
fb30: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
fb40: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73  ERROR;.  }. pars
fb50: 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28  e_uri_out:.  if(
fb60: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
fb70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
fb80: 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a  ee(zFile);.    z
fb90: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  File = 0;.  }.  
fba0: 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  *pFlags = flags;
fbb0: 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69  .  *pzFile = zFi
fbc0: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  le;.  return rc;
fbd0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
fbe0: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
fbf0: 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67   work of opening
fc00: 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62   a database on b
fc10: 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69  ehalf of.** sqli
fc20: 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73  te3_open() and s
fc30: 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e  qlite3_open16().
fc40: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
fc50: 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d  lename "zFilenam
fc60: 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38  e"  .** is UTF-8
fc70: 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61   encoded..*/.sta
fc80: 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61  tic int openData
fc90: 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  base(.  const ch
fca0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f  ar *zFilename, /
fcb0: 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
fcc0: 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  ame UTF-8 encode
fcd0: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
fce0: 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a  *ppDb,        /*
fcf0: 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64   OUT: Returned d
fd00: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
fd10: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
fd20: 20 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70   flags,    /* Op
fd30: 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20  erational flags 
fd40: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
fd50: 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e  *zVfs       /* N
fd60: 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74  ame of the VFS t
fd70: 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71  o use */.){.  sq
fd80: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fda0: 20 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64   Store allocated
fdb0: 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
fdc0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fde0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
fdf0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65   */.  int isThre
fe00: 61 64 73 61 66 65 3b 20 20 20 20 20 20 20 20 20  adsafe;         
fe10: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
fe20: 72 20 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e  r threadsafe con
fe30: 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68  nections */.  ch
fe40: 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20  ar *zOpen = 0;  
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe60: 20 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65   Filename argume
fe70: 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74  nt to pass to Bt
fe80: 72 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63  reeOpen() */.  c
fe90: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
fea0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
feb0: 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * Error message 
fec0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73  from sqlite3Pars
fed0: 65 55 72 69 28 29 20 2a 2f 0a 0a 20 20 2a 70 70  eUri() */..  *pp
fee0: 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  Db = 0;.#ifndef 
fef0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
ff00: 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69  INIT.  rc = sqli
ff10: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
ff20: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
ff30: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a  urn rc;.#endif..
ff40: 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20    /* Only allow 
ff50: 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61  sensible combina
ff60: 74 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e  tions of bits in
ff70: 20 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   the flags argum
ff80: 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f  ent.  .  ** Thro
ff90: 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  w an error if an
ffa0: 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62  y non-sense comb
ffb0: 69 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e  ination is used.
ffc0: 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20    If we.  ** do 
ffd0: 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61  not block illega
ffe0: 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68  l combinations h
fff0: 65 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72  ere, it could tr
10000 69 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72  igger.  ** asser
10010 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
10020 6e 20 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e  n deeper layers.
10030 20 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69    Sensible combi
10040 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65  nations.  ** are
10050 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20  :.  **.  **  1: 
10060 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
10070 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20  DONLY.  **  2:  
10080 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
10090 57 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20  WRITE.  **  6:  
100a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
100b0 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
100c0 50 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a  PEN_CREATE.  */.
100d0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
100e0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20  _OPEN_READONLY  
100f0 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73  == 0x01 );.  ass
10100 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
10110 5f 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78  _READWRITE == 0x
10120 30 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  02 );.  assert( 
10130 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
10140 54 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b  TE    == 0x04 );
10150 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c  .  testcase( (1<
10160 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30  <(flags&7))==0x0
10170 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59  2 ); /* READONLY
10180 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
10190 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d  (1<<(flags&7))==
101a0 30 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57  0x04 ); /* READW
101b0 52 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61  RITE */.  testca
101c0 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37  se( (1<<(flags&7
101d0 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52  ))==0x40 ); /* R
101e0 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
101f0 45 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c  E */.  if( ((1<<
10200 28 66 6c 61 67 73 26 37 29 29 20 26 20 30 78 34  (flags&7)) & 0x4
10210 36 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  6)==0 ) return S
10220 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
10230 54 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  T;..  if( sqlite
10240 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
10250 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  oreMutex==0 ){. 
10260 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
10270 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
10280 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
10290 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a  OPEN_NOMUTEX ){.
102a0 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
102b0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
102c0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
102d0 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
102e0 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  ){.    isThreads
102f0 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  afe = 1;.  }else
10300 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
10310 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  fe = sqlite3Glob
10320 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
10330 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  tex;.  }.  if( f
10340 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
10350 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20  EN_PRIVATECACHE 
10360 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20  ){.    flags &= 
10370 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41  ~SQLITE_OPEN_SHA
10380 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73  REDCACHE;.  }els
10390 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f  e if( sqlite3Glo
103a0 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64  balConfig.shared
103b0 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a  CacheEnabled ){.
103c0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
103d0 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
103e0 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ACHE;.  }..  /* 
103f0 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62  Remove harmful b
10400 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61  its from the fla
10410 67 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a  gs parameter.  *
10420 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54  *.  ** The SQLIT
10430 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61  E_OPEN_NOMUTEX a
10440 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  nd SQLITE_OPEN_F
10450 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77  ULLMUTEX flags w
10460 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77  ere.  ** dealt w
10470 69 74 68 20 69 6e 20 74 68 65 20 70 72 65 76 69  ith in the previ
10480 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20  ous code block. 
10490 20 42 65 73 69 64 65 73 20 74 68 65 73 65 2c 20   Besides these, 
104a0 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61  the only.  ** va
104b0 6c 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20  lid input flags 
104c0 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  for sqlite3_open
104d0 5f 76 32 28 29 20 61 72 65 20 53 51 4c 49 54 45  _v2() are SQLITE
104e0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a  _OPEN_READONLY,.
104f0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e    ** SQLITE_OPEN
10500 5f 52 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49  _READWRITE, SQLI
10510 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
10520 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
10530 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51  EDCACHE,.  ** SQ
10540 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
10550 45 43 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65  ECACHE, and some
10560 20 72 65 73 65 72 76 65 64 20 62 69 74 73 2e 20   reserved bits. 
10570 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20   Silently mask. 
10580 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65   ** off all othe
10590 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20  r flags..  */.  
105a0 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c  flags &=  ~( SQL
105b0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
105c0 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20  NCLOSE |.       
105d0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
105e0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a  PEN_EXCLUSIVE |.
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
10600 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
10610 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  DB |.           
10620 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
10630 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20  TEMP_DB | .     
10640 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
10650 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
10660 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
10670 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
10680 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20  _MAIN_JOURNAL | 
10690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
106a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
106b0 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
106c0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
106d0 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
106e0 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
106f0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
10700 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c  MASTER_JOURNAL |
10710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10720 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
10730 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEX |.          
10740 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
10750 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20  _FULLMUTEX |.   
10760 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
10770 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20  TE_OPEN_WAL.    
10780 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f           );..  /
10790 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
107a0 71 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63  qlite data struc
107b0 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73  ture */.  db = s
107c0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
107d0 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  ( sizeof(sqlite3
107e0 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30  ) );.  if( db==0
107f0 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f   ) goto opendb_o
10800 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65  ut;.  if( isThre
10810 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62  adsafe ){.    db
10820 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
10830 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
10840 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
10850 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  VE);.    if( db-
10860 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
10870 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10880 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20  db);.      db = 
10890 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  0;.      goto op
108a0 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  endb_out;.    }.
108b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
108c0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
108d0 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d  tex);.  db->errM
108e0 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62  ask = 0xff;.  db
108f0 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d  ->nDb = 2;.  db-
10900 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
10910 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62  MAGIC_BUSY;.  db
10920 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
10930 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74  tatic;..  assert
10940 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69  ( sizeof(db->aLi
10950 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61  mit)==sizeof(aHa
10960 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65  rdLimit) );.  me
10970 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c  mcpy(db->aLimit,
10980 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a   aHardLimit, siz
10990 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29  eof(db->aLimit))
109a0 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  ;.  db->autoComm
109b0 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65  it = 1;.  db->ne
109c0 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a  xtAutovac = -1;.
109d0 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69    db->nextPagesi
109e0 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c  ze = 0;.  db->fl
109f0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
10a00 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51  ortColNames | SQ
10a10 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 20 7c  LITE_AutoIndex |
10a20 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72   SQLITE_EnableTr
10a30 69 67 67 65 72 0a 23 69 66 20 53 51 4c 49 54 45  igger.#if SQLITE
10a40 5f 44 45 46 41 55 4c 54 5f 43 4b 50 54 46 55 4c  _DEFAULT_CKPTFUL
10a50 4c 46 53 59 4e 43 0a 20 20 20 20 20 20 20 20 20  LFSYNC.         
10a60 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
10a70 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63 0a 23  _CkptFullFSync.#
10a80 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
10a90 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f  _DEFAULT_FILE_FO
10aa0 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20  RMAT<4.         
10ab0 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
10ac0 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23  _LegacyFileFmt.#
10ad0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
10ae0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f  ITE_ENABLE_LOAD_
10af0 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20  EXTENSION.      
10b00 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
10b10 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f  ITE_LoadExtensio
10b20 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  n.#endif.#if SQL
10b30 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43 55  ITE_DEFAULT_RECU
10b40 52 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a 20  RSIVE_TRIGGERS. 
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b60 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67  | SQLITE_RecTrig
10b70 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66 20  gers.#endif.#if 
10b80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
10b90 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b  EFAULT_FOREIGN_K
10ba0 45 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f 44  EYS) && SQLITE_D
10bb0 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b  EFAULT_FOREIGN_K
10bc0 45 59 53 0a 20 20 20 20 20 20 20 20 20 20 20 20  EYS.            
10bd0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f       | SQLITE_Fo
10be0 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66  reignKeys.#endif
10bf0 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74  .      ;.  sqlit
10c00 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e  e3HashInit(&db->
10c10 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64  aCollSeq);.#ifnd
10c20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
10c30 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71  IRTUALTABLE.  sq
10c40 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
10c50 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
10c60 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  dif..  /* Add th
10c70 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
10c80 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e  ion sequence BIN
10c90 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b  ARY. BINARY work
10ca0 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38  s for both UTF-8
10cb0 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36  .  ** and UTF-16
10cc0 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72 73 69  , so add a versi
10cd0 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61  on for each to a
10ce0 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73  void any unneces
10cf0 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72  sary.  ** conver
10d00 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20  sions. The only 
10d10 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f  error that can o
10d20 63 63 75 72 20 68 65 72 65 20 69 73 20 61 20 6d  ccur here is a m
10d30 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e  alloc() failure.
10d40 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f  .  */.  createCo
10d50 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e  llation(db, "BIN
10d60 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ARY", SQLITE_UTF
10d70 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  8, 0, binCollFun
10d80 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
10d90 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49  ollation(db, "BI
10da0 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54  NARY", SQLITE_UT
10db0 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c  F16BE, 0, binCol
10dc0 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
10dd0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
10de0 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
10df0 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69  E_UTF16LE, 0, bi
10e00 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
10e10 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
10e20 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51  (db, "RTRIM", SQ
10e30 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64  LITE_UTF8, (void
10e40 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  *)1, binCollFunc
10e50 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  , 0);.  if( db->
10e60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
10e70 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
10e80 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 70  out;.  }.  db->p
10e90 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  DfltColl = sqlit
10ea0 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
10eb0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22  , SQLITE_UTF8, "
10ec0 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20 61  BINARY", 0);.  a
10ed0 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74  ssert( db->pDflt
10ee0 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  Coll!=0 );..  /*
10ef0 20 41 6c 73 6f 20 61 64 64 20 61 20 55 54 46 2d   Also add a UTF-
10f00 38 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69  8 case-insensiti
10f10 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ve collation seq
10f20 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72 65 61  uence. */.  crea
10f30 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
10f40 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45  "NOCASE", SQLITE
10f50 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65  _UTF8, 0, nocase
10f60 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30  CollatingFunc, 0
10f70 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74  );..  /* Parse t
10f80 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20  he filename/URI 
10f90 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64  argument. */.  d
10fa0 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66  b->openFlags = f
10fb0 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c  lags;.  rc = sql
10fc0 69 74 65 33 50 61 72 73 65 55 72 69 28 7a 56 66  ite3ParseUri(zVf
10fd0 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66  s, zFilename, &f
10fe0 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c  lags, &db->pVfs,
10ff0 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73   &zOpen, &zErrMs
11000 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  g);.  if( rc!=SQ
11010 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
11020 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
11030 4d 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63  MEM ) db->malloc
11040 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
11050 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
11060 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22   rc, zErrMsg ? "
11070 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67  %s" : 0, zErrMsg
11080 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
11090 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
110a0 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
110b0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  t;.  }..  /* Ope
110c0 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61  n the backend da
110d0 74 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f  tabase driver */
110e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
110f0 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
11100 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64  s, zOpen, db, &d
11110 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30  b->aDb[0].pBt, 0
11120 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11130 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
11140 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  | SQLITE_OPEN_MA
11150 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63  IN_DB);.  if( rc
11160 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11170 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11180 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b  E_IOERR_NOMEM ){
11190 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
111a0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
111b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
111c0 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20  (db, rc, 0);.   
111d0 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
111e0 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b  ;.  }.  db->aDb[
111f0 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  0].pSchema = sql
11200 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62  ite3SchemaGet(db
11210 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  , db->aDb[0].pBt
11220 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  );.  db->aDb[1].
11230 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
11240 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30  3SchemaGet(db, 0
11250 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65  );...  /* The de
11260 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76  fault safety_lev
11270 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  el for the main 
11280 64 61 74 61 62 61 73 65 20 69 73 20 27 66 75 6c  database is 'ful
11290 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70  l'; for the temp
112a0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69  .  ** database i
112b0 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69  t is 'NONE'. Thi
112c0 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61  s matches the pa
112d0 67 65 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c  ger layer defaul
112e0 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d  ts.  .  */.  db-
112f0 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  >aDb[0].zName = 
11300 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44  "main";.  db->aD
11310 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[0].safety_leve
11320 6c 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62  l = 3;.  db->aDb
11330 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d  [1].zName = "tem
11340 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  p";.  db->aDb[1]
11350 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
11360 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  1;..  db->magic 
11370 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f  = SQLITE_MAGIC_O
11380 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  PEN;.  if( db->m
11390 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
113a0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
113b0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ut;.  }..  /* Re
113c0 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74  gister all built
113d0 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62  -in functions, b
113e0 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ut do not attemp
113f0 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20  t to read the.  
11400 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65  ** database sche
11410 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20  ma yet. This is 
11420 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68  delayed until th
11430 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
11440 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69   database.  ** i
11450 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f  s accessed..  */
11460 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
11470 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
11480 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69  );.  sqlite3Regi
11490 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74  sterBuiltinFunct
114a0 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  ions(db);..  /* 
114b0 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65  Load automatic e
114c0 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65  xtensions - exte
114d0 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  nsions that have
114e0 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64   been registered
114f0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
11500 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69  sqlite3_automati
11510 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50  c_extension() AP
11520 49 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  I..  */.  rc = s
11530 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
11540 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  b);.  if( rc==SQ
11550 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
11560 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78  qlite3AutoLoadEx
11570 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20  tensions(db);.  
11580 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
11590 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20  rrcode(db);.    
115a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
115b0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
115c0 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20  opendb_out;.    
115d0 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
115e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31  LITE_ENABLE_FTS1
115f0 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
11600 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
11610 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
11620 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74  e3Fts1Init(sqlit
11630 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  e3*);.    rc = s
11640 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 64  qlite3Fts1Init(d
11650 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
11660 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11670 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20  ABLE_FTS2.  if( 
11680 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
11690 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
116a0 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  OK ){.    extern
116b0 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32   int sqlite3Fts2
116c0 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a  Init(sqlite3*);.
116d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
116e0 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts2Init(db);.  
116f0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
11700 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
11710 54 53 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS3.  if( !db->m
11720 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
11730 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11740 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11750 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts3Init(db);.  
11760 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
11770 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
11780 43 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  CU.  if( !db->ma
11790 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
117a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
117b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49     rc = sqlite3I
117c0 63 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  cuInit(db);.  }.
117d0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
117e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52  QLITE_ENABLE_RTR
117f0 45 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  EE.  if( !db->ma
11800 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
11810 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20  ==SQLITE_OK){.  
11820 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74    rc = sqlite3Rt
11830 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  reeInit(db);.  }
11840 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
11850 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
11860 30 29 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49  0);..  /* -DSQLI
11870 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
11880 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20  NG_MODE=1 makes 
11890 45 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65  EXCLUSIVE the de
118a0 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20  fault locking.  
118b0 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49  ** mode.  -DSQLI
118c0 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
118d0 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e  NG_MODE=0 make N
118e0 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c  ORMAL the defaul
118f0 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d  t locking.  ** m
11900 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68  ode.  Doing noth
11910 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20  ing at all also 
11920 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65  makes NORMAL the
11930 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23   default..  */.#
11940 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  ifdef SQLITE_DEF
11950 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
11960 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b  E.  db->dfltLock
11970 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mode = SQLITE_DE
11980 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
11990 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  DE;.  sqlite3Pag
119a0 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71  erLockingMode(sq
119b0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
119c0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c  db->aDb[0].pBt),
119d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
119e0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
119f0 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
11a00 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a  G_MODE);.#endif.
11a10 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65  .  /* Enable the
11a20 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f   lookaside-mallo
11a30 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20  c subsystem */. 
11a40 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
11a50 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c  db, 0, sqlite3Gl
11a60 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
11a70 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20  kaside,.        
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a90 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
11aa0 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b  fig.nLookaside);
11ab0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ..  sqlite3_wal_
11ac0 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64  autocheckpoint(d
11ad0 62 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  b, SQLITE_DEFAUL
11ae0 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50  T_WAL_AUTOCHECKP
11af0 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f  OINT);..opendb_o
11b00 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ut:.  sqlite3_fr
11b10 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28  ee(zOpen);.  if(
11b20 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72   db ){.    asser
11b30 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20  t( db->mutex!=0 
11b40 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66 65 3d  || isThreadsafe=
11b50 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f  =0 || sqlite3Glo
11b60 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
11b70 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73  utex==0 );.    s
11b80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
11b90 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
11ba0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
11bb0 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
11bc0 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c   assert( db!=0 |
11bd0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
11be0 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  EM );.  if( rc==
11bf0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
11c00 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
11c10 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20  e(db);.    db = 
11c20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  0;.  }else if( r
11c30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11c40 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
11c50 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43  SQLITE_MAGIC_SIC
11c60 4b 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  K;.  }.#if defin
11c70 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
11c80 5f 41 55 54 4f 5f 50 52 4f 46 49 4c 45 29 0a 20  _AUTO_PROFILE). 
11c90 20 69 66 28 20 64 62 20 26 26 20 21 72 63 20 29   if( db && !rc )
11ca0 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76 70  {.    char *envp
11cb0 72 6f 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28  rofile = getenv(
11cc0 22 53 51 4c 49 54 45 5f 41 55 54 4f 5f 50 52 4f  "SQLITE_AUTO_PRO
11cd0 46 49 4c 45 22 29 3b 0a 20 20 20 20 63 68 61 72  FILE");.    char
11ce0 20 2a 65 6e 76 74 72 61 63 65 20 3d 20 67 65 74   *envtrace = get
11cf0 65 6e 76 28 22 53 51 4c 49 54 45 5f 41 55 54 4f  env("SQLITE_AUTO
11d00 5f 54 52 41 43 45 22 29 3b 0a 20 20 20 20 0a 20  _TRACE");.    . 
11d10 20 20 20 69 66 28 20 65 6e 76 70 72 6f 66 69 6c     if( envprofil
11d20 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  e!=NULL ){.     
11d30 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65   sqlite3_profile
11d40 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75 74  (db, _sqlite_aut
11d50 6f 5f 70 72 6f 66 69 6c 65 2c 20 64 62 29 3b 0a  o_profile, db);.
11d60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 6e      }.    if( en
11d70 76 74 72 61 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a  vtrace!=NULL ){.
11d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
11d90 61 63 65 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f  ace(db, _sqlite_
11da0 61 75 74 6f 5f 74 72 61 63 65 2c 20 64 62 29 3b  auto_trace, db);
11db0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
11dc0 66 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a  f.  *ppDb = db;.
11dd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11de0 41 42 4c 45 5f 53 51 4c 52 52 0a 20 20 53 52 52  ABLE_SQLRR.  SRR
11df0 65 63 4f 70 65 6e 28 64 62 2c 20 7a 46 69 6c 65  ecOpen(db, zFile
11e00 6e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 23 65  name, flags);.#e
11e10 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 73 71  ndif.  return sq
11e20 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20  lite3ApiExit(0, 
11e30 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  rc);.}../*.** Op
11e40 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
11e50 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
11e60 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20   sqlite3_open(. 
11e70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
11e80 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
11e90 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20  e3 **ppDb .){.  
11ea0 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62  return openDatab
11eb0 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ase(zFilename, p
11ec0 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pDb,.           
11ed0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
11ee0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
11ef0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
11f00 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74  REATE, 0);.}.int
11f10 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
11f20 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
11f30 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44  filename,   /* D
11f40 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
11f50 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71   (UTF-8) */.  sq
11f60 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20  lite3 **ppDb,   
11f70 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51        /* OUT: SQ
11f80 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a  Lite db handle *
11f90 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
11fb0 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
11fc0 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20  char *zVfs      
11fd0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53    /* Name of VFS
11fe0 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a   module to use *
11ff0 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70  /.){.  return op
12000 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e  enDatabase(filen
12010 61 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e 73 69  ame, ppDb, (unsi
12020 67 6e 65 64 20 69 6e 74 29 66 6c 61 67 73 2c 20  gned int)flags, 
12030 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  zVfs);.}..#ifnde
12040 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
12050 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  F16./*.** Open a
12060 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61   new database ha
12070 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
12080 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63  ite3_open16(.  c
12090 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65  onst void *zFile
120a0 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33  name, .  sqlite3
120b0 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61   **ppDb.){.  cha
120c0 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61  r const *zFilena
120d0 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e  me8;   /* zFilen
120e0 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55  ame encoded in U
120f0 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20  TF-8 instead of 
12100 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69  UTF-16 */.  sqli
12110 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
12120 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
12130 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 20  sert( zFilename 
12140 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70 44  );.  assert( ppD
12150 62 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d 20 30  b );.  *ppDb = 0
12160 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
12170 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
12180 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
12190 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
121a0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
121b0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56 61 6c 20  ;.#endif.  pVal 
121c0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
121d0 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
121e0 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
121f0 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
12200 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
12210 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  VE, SQLITE_STATI
12220 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38  C);.  zFilename8
12230 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
12240 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45  ext(pVal, SQLITE
12250 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46  _UTF8);.  if( zF
12260 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20  ilename8 ){.    
12270 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73  rc = openDatabas
12280 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70  e(zFilename8, pp
12290 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
122a0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
122b0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
122c0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
122d0 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73  EATE, 0);.    as
122e0 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72  sert( *ppDb || r
122f0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
12300 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
12310 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48  QLITE_OK && !DbH
12320 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62  asProperty(*ppDb
12330 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , 0, DB_SchemaLo
12340 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20 45  aded) ){.      E
12350 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49  NC(*ppDb) = SQLI
12360 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
12370 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
12380 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
12390 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  OMEM;.  }.  sqli
123a0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
123b0 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 71  l);..  return sq
123c0 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20  lite3ApiExit(0, 
123d0 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  rc);.}.#endif /*
123e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
123f0 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
12400 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
12410 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
12420 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
12430 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
12440 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
12450 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73  e_collation(.  s
12460 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
12470 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
12480 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
12490 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
124a0 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
124b0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
124c0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
124d0 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
124e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
124f0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
12500 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
12510 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12520 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65  );.  rc = create
12530 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
12540 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  ame, (u8)enc, pC
12550 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
12560 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
12570 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
12580 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12590 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
125a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
125b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
125c0 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
125d0 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
125e0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
125f0 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
12600 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
12610 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71  llation_v2(.  sq
12620 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
12630 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
12640 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20   .  int enc, .  
12650 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
12660 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
12670 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
12680 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
12690 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65  d*),.  void(*xDe
126a0 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  l)(void*).){.  i
126b0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
126c0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
126d0 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
126e0 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
126f0 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63  iled );.  rc = c
12700 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
12710 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e  b, zName, (u8)en
12720 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  c, pCtx, xCompar
12730 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d  e, xDel);.  rc =
12740 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
12750 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
12760 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
12770 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
12780 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
12790 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
127a0 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  TF16./*.** Regis
127b0 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
127c0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
127d0 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
127e0 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
127f0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12800 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73  collation16(.  s
12810 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
12820 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65  onst void *zName
12830 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20  ,.  int enc, .  
12840 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
12850 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
12860 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
12870 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
12880 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  d*).){.  int rc 
12890 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
128a0 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20 20 73  har *zName8;.  s
128b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
128c0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
128d0 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
128e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
128f0 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33  zName8 = sqlite3
12900 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61  Utf16to8(db, zNa
12910 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
12920 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 69  TF16NATIVE);.  i
12930 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20  f( zName8 ){.   
12940 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
12950 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38  ation(db, zName8
12960 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c  , (u8)enc, pCtx,
12970 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20   xCompare, 0);. 
12980 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
12990 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20 20  (db, zName8);.  
129a0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
129b0 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
129c0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
129d0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
129e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
129f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12a00 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
12a10 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
12a20 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71   a collation seq
12a30 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61  uence factory ca
12a40 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20  llback with the 
12a50 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
12a60 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61  ** db. Replace a
12a70 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e  ny previously in
12a80 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f  stalled collatio
12a90 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
12aa0 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
12ab0 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  e3_collation_nee
12ac0 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ded(.  sqlite3 *
12ad0 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  db, .  void *pCo
12ae0 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20  llNeededArg, .  
12af0 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65  void(*xCollNeede
12b00 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  d)(void*,sqlite3
12b10 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
12b20 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20  onst char*).){. 
12b30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
12b40 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
12b50 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
12b60 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64  ed = xCollNeeded
12b70 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
12b80 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d  ded16 = 0;.  db-
12b90 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20  >pCollNeededArg 
12ba0 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  = pCollNeededArg
12bb0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
12bc0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
12bd0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
12be0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
12bf0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
12c00 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  TF16./*.** Regis
12c10 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  ter a collation 
12c20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
12c30 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
12c40 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
12c50 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63  le.** db. Replac
12c60 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79  e any previously
12c70 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61   installed colla
12c80 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
12c90 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctory..*/.int sq
12ca0 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
12cb0 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69  needed16(.  sqli
12cc0 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
12cd0 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
12ce0 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
12cf0 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c  Needed16)(void*,
12d00 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65  sqlite3*,int eTe
12d10 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64  xtRep,const void
12d20 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  *).){.  sqlite3_
12d30 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
12d40 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43  mutex);.  db->xC
12d50 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20  ollNeeded = 0;. 
12d60 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
12d70 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64  16 = xCollNeeded
12d80 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e  16;.  db->pCollN
12d90 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
12da0 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
12db0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
12dc0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
12dd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12de0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12df0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
12e00 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
12e10 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
12e20 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  D./*.** This fun
12e30 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20  ction is now an 
12e40 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20  anachronism. It 
12e50 75 73 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  used to be used 
12e60 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20  to recover from 
12e70 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61  a.** malloc() fa
12e80 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74  ilure, but SQLit
12e90 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20  e now does this 
12ea0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a  automatically..*
12eb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c  /.int sqlite3_gl
12ec0 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69  obal_recover(voi
12ed0 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d){.  return SQL
12ee0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
12ef0 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20  ../*.** Test to 
12f00 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  see whether or n
12f10 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
12f20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e  connection is in
12f30 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d   autocommit.** m
12f40 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ode.  Return TRU
12f50 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 46  E if it is and F
12f60 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75  ALSE if not.  Au
12f70 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73  tocommit mode is
12f80 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c   on.** by defaul
12f90 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69  t.  Autocommit i
12fa0 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61 20  s disabled by a 
12fb0 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20  BEGIN statement 
12fc0 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a  and reenabled.**
12fd0 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d   by the next COM
12fe0 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e  MIT or ROLLBACK.
12ff0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48 49 53  .**.******* THIS
13000 20 49 53 20 41 4e 20 45 58 50 45 52 49 4d 45 4e   IS AN EXPERIMEN
13010 54 41 4c 20 41 50 49 20 41 4e 44 20 49 53 20 53  TAL API AND IS S
13020 55 42 4a 45 43 54 20 54 4f 20 43 48 41 4e 47 45  UBJECT TO CHANGE
13030 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73   ******.*/.int s
13040 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
13050 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
13060 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
13070 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a  >autoCommit;.}..
13080 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
13090 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ing routines are
130a0 20 73 75 62 74 69 74 75 74 65 73 20 66 6f 72 20   subtitutes for 
130b0 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45  constants SQLITE
130c0 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c  _CORRUPT,.** SQL
130d0 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49  ITE_MISUSE, SQLI
130e0 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c  TE_CANTOPEN, SQL
130f0 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20 70 6f  ITE_IOERR and po
13100 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72  ssibly other err
13110 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e  or.** constants.
13120 20 20 54 68 65 79 20 73 65 72 76 65 72 20 74 77    They server tw
13130 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a  o purposes:.**.*
13140 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20 61 73  *   1.  Serve as
13150 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c   a convenient pl
13160 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65  ace to set a bre
13170 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62  akpoint in a deb
13180 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74  ugger.**       t
13190 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 76 65  o detect when ve
131a0 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64  rsion error cond
131b0 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a  itions occurs..*
131c0 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b  *.**   2.  Invok
131d0 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  e sqlite3_log() 
131e0 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 73  to provide the s
131f0 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74  ource code locat
13200 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20  ion where.**    
13210 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65     a low-level e
13220 72 72 6f 72 20 69 73 20 66 69 72 73 74 20 64 65  rror is first de
13230 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  tected..*/.int s
13240 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72 72  qlite3CorruptErr
13250 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
13260 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
13270 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
13280 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c  xLog!=0 );.  sql
13290 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
132a0 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20 20 20  CORRUPT,.       
132b0 20 20 20 20 20 20 20 22 64 61 74 61 62 61 73 65         "database
132c0 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74 20 6c   corruption at l
132d0 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
132e0 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
132f0 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
13300 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
13310 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13320 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e 74  E_CORRUPT;.}.int
13330 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72   sqlite3MisuseEr
13340 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
13350 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
13360 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
13370 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
13380 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
13390 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20 20 20 20  _MISUSE, .      
133a0 20 20 20 20 20 20 20 20 22 6d 69 73 75 73 65 20          "misuse 
133b0 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25  at line %d of [%
133c0 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20  .10s]",.        
133d0 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30        lineno, 20
133e0 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  +sqlite3_sourcei
133f0 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  d());.  return S
13400 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a  QLITE_MISUSE;.}.
13410 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f  int sqlite3Canto
13420 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  penError(int lin
13430 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
13440 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
13450 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
13460 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53  .  sqlite3_log(S
13470 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20  QLITE_CANTOPEN, 
13480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
13490 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
134a0 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
134b0 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
134c0 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32         lineno, 2
134d0 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  0+sqlite3_source
134e0 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
134f0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
13500 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
13510 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
13520 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  TED./*.** This i
13530 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20  s a convenience 
13540 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b  routine that mak
13550 65 73 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c  es sure that all
13560 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
13570 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69  .** data for thi
13580 73 20 74 68 72 65 61 64 20 68 61 73 20 62 65 65  s thread has bee
13590 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a  n deallocated..*
135a0 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c  *.** SQLite no l
135b0 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72 65 61  onger uses threa
135c0 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61 20  d-specific data 
135d0 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  so this routine 
135e0 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f  is now a.** no-o
135f0 70 2e 20 20 49 74 20 69 73 20 72 65 74 61 69 6e  p.  It is retain
13600 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61  ed for historica
13610 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e  l compatibility.
13620 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13630 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28  _thread_cleanup(
13640 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a  void){.}.#endif.
13650 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65  ./*.** Return me
13660 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ta information a
13670 62 6f 75 74 20 61 20 73 70 65 63 69 66 69 63 20  bout a specific 
13680 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61  column of a data
13690 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53  base table..** S
136a0 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71  ee comment in sq
136b0 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e  lite3.h (sqlite.
136c0 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c  h.in) for detail
136d0 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
136e0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
136f0 4e 5f 4d 45 54 41 44 41 54 41 0a 69 6e 74 20 73  N_METADATA.int s
13700 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
13710 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
13720 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
13730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
13740 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
13750 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
13760 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20   *zDbName,      
13770 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61    /* Database na
13780 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  me or NULL */.  
13790 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
137a0 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54  leName,     /* T
137b0 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63  able name */.  c
137c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
137d0 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f  mnName,    /* Co
137e0 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63  lumn name */.  c
137f0 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61  har const **pzDa
13800 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55  taType,    /* OU
13810 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64  TPUT: Declared d
13820 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68  ata type */.  ch
13830 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c  ar const **pzCol
13840 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54  lSeq,     /* OUT
13850 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73  PUT: Collation s
13860 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a  equence name */.
13870 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c    int *pNotNull,
13880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13890 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
138a0 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
138b0 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20  aint exists */. 
138c0 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65   int *pPrimaryKe
138d0 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
138e0 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
138f0 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50  column part of P
13900 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74  K */.  int *pAut
13910 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  oinc            
13920 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
13930 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20  ue if column is 
13940 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a  auto-increment *
13950 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
13960 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
13970 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   0;.  Table *pTa
13980 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20  b = 0;.  Column 
13990 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pCol = 0;.  int
139a0 20 69 43 6f 6c 3b 0a 0a 20 20 63 68 61 72 20 63   iCol;..  char c
139b0 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20  onst *zDataType 
139c0 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
139d0 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b  t *zCollSeq = 0;
139e0 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d  .  int notnull =
139f0 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72   0;.  int primar
13a00 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ykey = 0;.  int 
13a10 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20 20  autoinc = 0;..  
13a20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64 61  /* Ensure the da
13a30 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61  tabase schema ha
13a40 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f  s been loaded */
13a50 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13a60 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
13a70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
13a80 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
13a90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69   rc = sqlite3Ini
13aa0 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b  t(db, &zErrMsg);
13ab0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
13ac0 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f  !=rc ){.    goto
13ad0 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a   error_out;.  }.
13ae0 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
13af0 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69   table in questi
13b00 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73  on */.  pTab = s
13b10 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
13b20 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20  db, zTableName, 
13b30 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zDbName);.  if( 
13b40 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70  !pTab || pTab->p
13b50 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54  Select ){.    pT
13b60 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  ab = 0;.    goto
13b70 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a   error_out;.  }.
13b80 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63  .  /* Find the c
13b90 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20  olumn for which 
13ba0 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74 65  info is requeste
13bb0 64 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  d */.  if( sqlit
13bc0 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d  e3IsRowid(zColum
13bd0 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 69 43  nName) ){.    iC
13be0 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
13bf0 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  ;.    if( iCol>=
13c00 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20  0 ){.      pCol 
13c10 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
13c20 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ol];.    }.  }el
13c30 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c  se{.    for(iCol
13c40 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
13c50 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
13c60 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
13c70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
13c80 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
13c90 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
13ca0 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61  zName, zColumnNa
13cb0 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
13cc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
13cd0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
13ce0 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  ==pTab->nCol ){.
13cf0 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a        pTab = 0;.
13d00 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72        goto error
13d10 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
13d20 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
13d30 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73  ing block stores
13d40 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d   the meta inform
13d50 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ation that will 
13d60 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a  be returned.  **
13d70 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
13d80 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  n local variable
13d90 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f  s zDataType, zCo
13da0 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20  llSeq, notnull, 
13db0 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20  primarykey.  ** 
13dc0 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20  and autoinc. At 
13dd0 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
13de0 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69   are two possibi
13df0 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20  lities:.  ** .  
13e00 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73 70  **     1. The sp
13e10 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e  ecified column n
13e20 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20  ame was rowid", 
13e30 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64  "oid" or "_rowid
13e40 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  _" .  **        
13e50 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
13e60 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61  explicitly decla
13e70 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20  red IPK column. 
13e80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32  .  **.  **     2
13e90 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e  . The table is n
13ea0 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74 68  ot a view and th
13eb0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64  e column name id
13ec0 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a  entified an .  *
13ed0 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63 69  *        explici
13ee0 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  tly declared col
13ef0 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69  umn. Copy meta i
13f00 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
13f10 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69  *pCol..  */ .  i
13f20 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a  f( pCol ){.    z
13f30 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d  DataType = pCol-
13f40 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f 6c  >zType;.    zCol
13f50 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f  lSeq = pCol->zCo
13f60 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20  ll;.    notnull 
13f70 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21  = pCol->notNull!
13f80 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b  =0;.    primaryk
13f90 65 79 20 20 3d 20 70 43 6f 6c 2d 3e 69 73 50 72  ey  = pCol->isPr
13fa0 69 6d 4b 65 79 21 3d 30 3b 0a 20 20 20 20 61 75  imKey!=0;.    au
13fb0 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50  toinc = pTab->iP
13fc0 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54  Key==iCol && (pT
13fd0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
13fe0 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  F_Autoincrement)
13ff0 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  !=0;.  }else{.  
14000 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49    zDataType = "I
14010 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69  NTEGER";.    pri
14020 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d  marykey = 1;.  }
14030 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71  .  if( !zCollSeq
14040 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71   ){.    zCollSeq
14050 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d   = "BINARY";.  }
14060 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73  ..error_out:.  s
14070 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
14080 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57  All(db);..  /* W
14090 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74  hether the funct
140a0 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64  ion call succeed
140b0 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65  ed or failed, se
140c0 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72  t the output par
140d0 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20  ameters.  ** to 
140e0 77 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c  whatever their l
140f0 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74  ocal counterpart
14100 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e  s contain. If an
14110 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72   error did occur
14120 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20  ,.  ** this has 
14130 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65  the effect of ze
14140 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74  roing all output
14150 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a   parameters..  *
14160 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79  /.  if( pzDataTy
14170 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65  pe ) *pzDataType
14180 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20   = zDataType;.  
14190 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20  if( pzCollSeq ) 
141a0 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f  *pzCollSeq = zCo
141b0 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f  llSeq;.  if( pNo
141c0 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c  tNull ) *pNotNul
141d0 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69  l = notnull;.  i
141e0 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29  f( pPrimaryKey )
141f0 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20   *pPrimaryKey = 
14200 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66  primarykey;.  if
14210 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41  ( pAutoinc ) *pA
14220 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63  utoinc = autoinc
14230 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
14240 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20  OK==rc && !pTab 
14250 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
14260 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
14270 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  );.    zErrMsg =
14280 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
14290 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  db, "no such tab
142a0 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73  le column: %s.%s
142b0 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20  ", zTableName,. 
142c0 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61         zColumnNa
142d0 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
142e0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
142f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
14300 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f  b, rc, (zErrMsg?
14310 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67  "%s":0), zErrMsg
14320 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
14330 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b  ee(db, zErrMsg);
14340 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
14350 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
14360 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14370 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
14380 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14390 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
143a0 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
143b0 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
143c0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
143d0 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e  ime slept..*/.in
143e0 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28  t sqlite3_sleep(
143f0 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74  int ms){.  sqlit
14400 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20  e3_vfs *pVfs;.  
14410 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d  int rc;.  pVfs =
14420 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
14430 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73  d(0);.  if( pVfs
14440 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
14450 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
14460 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c  ion works in mil
14470 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74  liseconds, but t
14480 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73  he underlying Os
14490 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50  Sleep() .  ** AP
144a0 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f  I uses microseco
144b0 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31  nds. Hence the 1
144c0 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  000's..  */.  rc
144d0 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65   = (sqlite3OsSle
144e0 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73  ep(pVfs, 1000*ms
144f0 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  )/1000);.  retur
14500 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
14510 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
14520 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65   the extended re
14530 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69  sult codes..*/.i
14540 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  nt sqlite3_exten
14550 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
14560 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
14570 74 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71 6c 69  t onoff){.  sqli
14580 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
14590 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
145a0 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66  ->errMask = onof
145b0 66 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a  f ? 0xffffffff :
145c0 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33   0xff;.  sqlite3
145d0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
145e0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
145f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14600 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
14610 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65   xFileControl me
14620 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63  thod on a partic
14630 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a  ular database..*
14640 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69  /.int sqlite3_fi
14650 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  le_control(sqlit
14660 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
14670 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74  ar *zDbName, int
14680 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
14690 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
146a0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69 6e 74  ITE_ERROR;.  int
146b0 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f   iDb;.  sqlite3_
146c0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
146d0 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44  mutex);.  if( zD
146e0 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  bName==0 ){.    
146f0 69 44 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  iDb = 0;.  }else
14700 7b 0a 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b  {.    for(iDb=0;
14710 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
14720 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  b++){.      if( 
14730 73 74 72 63 6d 70 28 64 62 2d 3e 61 44 62 5b 69  strcmp(db->aDb[i
14740 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 4e 61  Db].zName, zDbNa
14750 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
14760 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
14770 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 7b 0a 20  iDb<db->nDb ){. 
14780 20 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65     Btree *pBtree
14790 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
147a0 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
147b0 72 65 65 20 29 7b 0a 20 20 20 20 20 20 50 61 67  ree ){.      Pag
147c0 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
147d0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
147e0 66 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  fd;.      sqlite
147f0 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
14800 65 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ee);.      pPage
14810 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
14820 50 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Pager(pBtree);. 
14830 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14840 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ger!=0 );.      
14850 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
14860 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20  rFile(pPager);. 
14870 20 20 20 20 20 61 73 73 65 72 74 28 20 66 64 21       assert( fd!
14880 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
14890 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
148a0 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b  _FILE_POINTER ){
148b0 0a 20 20 20 20 20 20 20 20 2a 28 73 71 6c 69 74  .        *(sqlit
148c0 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d  e3_file**)pArg =
148d0 20 66 64 3b 0a 20 20 20 20 20 20 20 20 72 63 20   fd;.        rc 
148e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
148f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 64 2d     }else if( fd-
14900 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
14910 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14920 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66  3OsFileControl(f
14930 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20  d, op, pArg);.  
14940 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14950 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
14960 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 20 20 7d  OTFOUND;.      }
14970 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
14980 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
14990 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
149a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
149b0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
149c0 72 65 74 75 72 6e 20 72 63 3b 20 20 20 0a 7d 0a  return rc;   .}.
149d0 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
149e0 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20   to the testing 
149f0 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71  logic..*/.int sq
14a00 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
14a10 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  ol(int op, ...){
14a20 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23  .  int rc = 0;.#
14a30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14a40 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a  IT_BUILTIN_TEST.
14a50 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
14a60 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29  va_start(ap, op)
14a70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
14a80 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  {..    /*.    **
14a90 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
14aa0 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  t state of the P
14ab0 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  RNG..    */.    
14ac0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
14ad0 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20  CTRL_PRNG_SAVE: 
14ae0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
14af0 72 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a  rngSaveState();.
14b00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14b10 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
14b20 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 73 74  * Restore the st
14b30 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20  ate of the PRNG 
14b40 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61 74  to the last stat
14b50 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20  e saved using.  
14b60 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20    ** PRNG_SAVE. 
14b70 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61   If PRNG_SAVE ha
14b80 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62  s never before b
14b90 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  een called, then
14ba0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72  .    ** this ver
14bb0 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47  b acts like PRNG
14bc0 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20  _RESET..    */. 
14bd0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
14be0 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
14bf0 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  TORE: {.      sq
14c00 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65  lite3PrngRestore
14c10 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
14c20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
14c30 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74   /*.    ** Reset
14c40 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74   the PRNG back t
14c50 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69  o its uninitiali
14c60 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68 65 20  zed state.  The 
14c70 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  next call.    **
14c80 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   to sqlite3_rand
14c90 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65  omness() will re
14ca0 73 65 65 64 20 74 68 65 20 50 52 4e 47 20 75 73  seed the PRNG us
14cb0 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c  ing a single cal
14cc0 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  l.    ** to the 
14cd0 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68  xRandomness meth
14ce0 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  od of the defaul
14cf0 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20  t VFS..    */.  
14d00 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
14d10 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45  STCTRL_PRNG_RESE
14d20 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
14d30 65 33 50 72 6e 67 52 65 73 65 74 53 74 61 74 65  e3PrngResetState
14d40 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
14d50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
14d60 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
14d70 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56  est_control(BITV
14d80 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70  EC_TEST, size, p
14d90 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20  rogram).    **. 
14da0 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74     ** Run a test
14db0 20 61 67 61 69 6e 73 74 20 61 20 42 69 74 76 65   against a Bitve
14dc0 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65  c object of size
14dd0 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61  .  The program a
14de0 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69  rgument.    ** i
14df0 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e  s an array of in
14e00 74 65 67 65 72 73 20 74 68 61 74 20 64 65 66 69  tegers that defi
14e10 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20 20 52  nes the test.  R
14e20 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20  eturn -1 on a.  
14e30 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f    ** memory allo
14e40 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20  cation error, 0 
14e50 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e  on success, or n
14e60 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65  on-zero for an e
14e70 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65  rror..    ** See
14e80 20 74 68 65 20 73 71 6c 69 74 65 33 42 69 74 76   the sqlite3Bitv
14e90 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20  ecBuiltinTest() 
14ea0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
14eb0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20  nformation..    
14ec0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
14ed0 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56  TE_TESTCTRL_BITV
14ee0 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20  EC_TEST: {.     
14ef0 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67   int sz = va_arg
14f00 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
14f10 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61   int *aProg = va
14f20 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a  _arg(ap, int*);.
14f30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14f40 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
14f50 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a  est(sz, aProg);.
14f60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14f70 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
14f80 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
14f90 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d  control(BENIGN_M
14fa0 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65  ALLOC_HOOKS, xBe
14fb0 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a  gin, xEnd).    *
14fc0 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65  *.    ** Registe
14fd0 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20  r hooks to call 
14fe0 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63  to indicate whic
14ff0 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  h malloc() failu
15000 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20  res .    ** are 
15010 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20  benign..    */. 
15020 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
15030 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d  ESTCTRL_BENIGN_M
15040 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20  ALLOC_HOOKS: {. 
15050 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
15060 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f  d (*void_functio
15070 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20  n)(void);.      
15080 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
15090 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20  enignBegin;.    
150a0 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
150b0 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20  xBenignEnd;.    
150c0 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d    xBenignBegin =
150d0 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
150e0 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
150f0 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76    xBenignEnd = v
15100 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
15110 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
15120 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c  sqlite3BenignMal
15130 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e  locHooks(xBenign
15140 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e  Begin, xBenignEn
15150 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
15160 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
15170 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
15180 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
15190 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
151a0 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e  ING_BYTE, unsign
151b0 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  ed int X).    **
151c0 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
151d0 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20  PENDING byte to 
151e0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
151f0 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e   argument, if X>
15200 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e  0..    ** Make n
15210 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d  o changes if X==
15220 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76  0.  Return the v
15230 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64  alue of the pend
15240 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  ing byte.    ** 
15250 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62  as it existing b
15260 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
15270 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  ne was called.. 
15280 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50     **.    ** IMP
15290 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e  ORTANT:  Changin
152a0 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  g the PENDING by
152b0 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30  te from 0x400000
152c0 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20  00 results in.  
152d0 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74    ** an incompat
152e0 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69  ible database fi
152f0 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e  le format.  Chan
15300 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47  ging the PENDING
15310 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69   byte.    ** whi
15320 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  le any database 
15330 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70  connection is op
15340 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e  en results in un
15350 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20  defined and.    
15360 2a 2a 20 64 69 6c 65 74 65 72 69 6f 75 73 20 62  ** dileterious b
15370 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a  ehavior..    */.
15380 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
15390 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
153a0 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72  _BYTE: {.      r
153b0 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  c = PENDING_BYTE
153c0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
153d0 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20  _OMIT_WSD.      
153e0 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  {.        unsign
153f0 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20  ed int newVal = 
15400 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
15410 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
15420 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73    if( newVal ) s
15430 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74  qlite3PendingByt
15440 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20  e = newVal;.    
15450 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
15460 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
15470 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
15480 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
15490 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
154a0 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58  RL_ASSERT, int X
154b0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
154c0 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
154d0 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
154e0 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74  test to see whet
154f0 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a  her or not.    *
15500 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65  * assert() was e
15510 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
15520 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73  e-time.  If X is
15530 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74   true and assert
15540 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61  ().    ** is ena
15550 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  bled, then the r
15560 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
15570 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72  rue.  If X is tr
15580 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73  ue and.    ** as
15590 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
155a0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  ed, then the ret
155b0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72  urn value is zer
155c0 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20  o.  If X is.    
155d0 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  ** false and ass
155e0 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
155f0 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72  , then the asser
15600 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74  tion fires and t
15610 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
15620 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20  s aborts.  If X 
15630 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  is false and ass
15640 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
15650 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  d, then the.    
15660 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
15670 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a  is zero..    */.
15680 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
15690 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a  TESTCTRL_ASSERT:
156a0 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c   {.      volatil
156b0 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20  e int x = 0;.   
156c0 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d 20     assert( (x = 
156d0 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21  va_arg(ap,int))!
156e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
156f0 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   x;.      break;
15700 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a  .    }...    /*.
15710 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
15720 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
15730 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
15740 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  AYS, int X).    
15750 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
15760 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
15770 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
15780 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c  o see how the AL
15790 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20  WAYS and.    ** 
157a0 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72  NEVER macros wer
157b0 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  e defined at com
157c0 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a  pile-time..    *
157d0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74  *.    ** The ret
157e0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57  urn value is ALW
157f0 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a  AYS(X).  .    **
15800 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
15810 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20  mmended test is 
15820 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65  X==2.  If the re
15830 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c  turn value is 2,
15840 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20   that means.    
15850 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20  ** ALWAYS() and 
15860 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68  NEVER() are both
15870 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
15880 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63  ugh macros, whic
15890 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  h is the.    ** 
158a0 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e  default setting.
158b0 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
158c0 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e  value is 1, then
158d0 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74   ALWAYS() is eit
158e0 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d  her.    ** hard-
158f0 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72  coded to true or
15900 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73   else it asserts
15910 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74   if its argument
15920 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a   is false..    *
15930 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61  * The first beha
15940 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64  vior (hard-coded
15950 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65   to true) is the
15960 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
15970 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
15980 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
15990 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  t assert() is di
159a0 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73  sabled and the s
159b0 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68  econd.    ** beh
159c0 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66  avior (assert if
159d0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
159e0 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c   ALWAYS() is fal
159f0 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20  se) is the case 
15a00 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
15a10 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
15a20 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65   shows that asse
15a30 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e  rt() is enabled.
15a40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
15a50 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74  he run-time test
15a60 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74   procedure might
15a70 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20   look something 
15a80 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
15a90 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20  *.    **    if( 
15aa0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
15ab0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
15ac0 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d  CTRL_ALWAYS, 2)=
15ad0 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20  =2 ){.    **    
15ae0 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e    // ALWAYS() an
15af0 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f  d NEVER() are no
15b00 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
15b10 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20   macros.    **  
15b20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
15b30 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
15b40 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
15b50 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20  _ASSERT, 1) ){. 
15b60 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
15b70 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20  WAYS(x) asserts 
15b80 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20  that x is true. 
15b90 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73  NEVER(x) asserts
15ba0 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20   x is false..   
15bb0 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   **    }else{.  
15bc0 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
15bd0 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73  AYS(x) is a cons
15be0 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78  tant 1.  NEVER(x
15bf0 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
15c00 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20  0..    **    }. 
15c10 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
15c20 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
15c30 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69  LWAYS: {.      i
15c40 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
15c50 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20  ,int);.      rc 
15c60 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20 20  = ALWAYS(x);.   
15c70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15c80 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
15c90 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
15ca0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52  QLITE_TESTCTRL_R
15cb0 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20  ESERVE, sqlite3 
15cc0 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
15cd0 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
15ce0 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20  e nReserve size 
15cf0 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69  to N for the mai
15d00 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68  n database on th
15d10 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
15d20 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  * connection db.
15d30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
15d40 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
15d50 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20  _RESERVE: {.    
15d60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15d70 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
15d80 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  e3*);.      int 
15d90 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
15da0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
15db0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
15dc0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
15dd0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
15de0 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b  ageSize(db->aDb[
15df0 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29  0].pBt, 0, x, 0)
15e00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
15e10 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
15e20 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72  mutex);.      br
15e30 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
15e40 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  /*  sqlite3_test
15e50 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
15e60 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
15e70 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20  ATIONS, sqlite3 
15e80 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
15e90 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65  **.    ** Enable
15ea0 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69   or disable vari
15eb0 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
15ec0 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  s for testing pu
15ed0 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20  rposes.  The .  
15ee0 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20    ** argument N 
15ef0 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
15f00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f  optimizations to
15f10 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46   be disabled.  F
15f20 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a  or normal.    **
15f30 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f   operation N sho
15f40 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69  uld be 0.  The i
15f50 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65  dea is that a te
15f60 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65  st program (like
15f70 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20   the.    ** SQL 
15f80 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c  Logic Test or SL
15f90 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63  T test module) c
15fa0 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20  an run the same 
15fb0 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  SQL multiple tim
15fc0 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76  es.    ** with v
15fd0 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
15fe0 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f  ions disabled to
15ff0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
16000 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20   same answer.   
16010 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20   ** is obtained 
16020 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20  in every case.. 
16030 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
16040 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
16050 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a  PTIMIZATIONS: {.
16060 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
16070 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
16080 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
16090 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
160a0 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 64 62  p,int);.      db
160b0 2d 3e 66 6c 61 67 73 20 3d 20 28 78 20 26 20 53  ->flags = (x & S
160c0 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29 20 7c  QLITE_OptMask) |
160d0 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 7e 53   (db->flags & ~S
160e0 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29 3b 0a  QLITE_OptMask);.
160f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16100 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
16110 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20  E_N_KEYWORD.    
16120 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
16130 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
16140 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52  ESTCTRL_ISKEYWOR
16150 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  D, const char *z
16160 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20  Word).    **.   
16170 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73 20   ** If zWord is 
16180 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67 6e  a keyword recogn
16190 69 7a 65 64 20 62 79 20 74 68 65 20 70 61 72 73  ized by the pars
161a0 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  er, then return 
161b0 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  the.    ** numbe
161c0 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20 20  r of keywords.  
161d0 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e  Or if zWord is n
161e0 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72 65  ot a keyword, re
161f0 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a  turn 0..    ** .
16200 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74      ** This test
16210 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c 79   feature is only
16220 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
16230 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73  e amalgamation s
16240 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ince.    ** the 
16250 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44  SQLITE_N_KEYWORD
16260 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65   macro is not de
16270 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69  fined in this fi
16280 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20 20  le if SQLite.   
16290 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73 69   ** is built usi
162a0 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f 75 72  ng separate sour
162b0 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f  ce files..    */
162c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
162d0 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57  _TESTCTRL_ISKEYW
162e0 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  ORD: {.      con
162f0 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d  st char *zWord =
16300 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73   va_arg(ap, cons
16310 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  t char*);.      
16320 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
16330 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a  trlen30(zWord);.
16340 20 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c 69        rc = (sqli
16350 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 28  te3KeywordCode((
16360 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54  u8*)zWord, n)!=T
16370 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e  K_ID) ? SQLITE_N
16380 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20  _KEYWORD : 0;.  
16390 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
163a0 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a  .#endif ..    /*
163b0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
163c0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
163d0 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c  TCTRL_SCRATCHMAL
163e0 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20  LOC, sz, &pNew, 
163f0 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20  pFree);.    **. 
16400 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65     ** Pass pFree
16410 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72   into sqlite3Scr
16420 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20  atchFree(). .   
16430 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e   ** If sz>0 then
16440 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61   allocate a scra
16450 74 63 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20  tch buffer into 
16460 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20  pNew.  .    */. 
16470 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
16480 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d  ESTCTRL_SCRATCHM
16490 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76  ALLOC: {.      v
164a0 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70  oid *pFree, **pp
164b0 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  New;.      int s
164c0 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61  z;.      sz = va
164d0 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
164e0 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f       ppNew = va_
164f0 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b  arg(ap, void**);
16500 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 76  .      pFree = v
16510 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
16520 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 20 29  ;.      if( sz )
16530 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65   *ppNew = sqlite
16540 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73  3ScratchMalloc(s
16550 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
16560 33 53 63 72 61 74 63 68 46 72 65 65 28 70 46 72  3ScratchFree(pFr
16570 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ee);.      break
16580 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16590 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
165a0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
165b0 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
165c0 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66  _FAULT, int onof
165d0 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  f);.    **.    *
165e0 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f  * If parameter o
165f0 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  noff is non-zero
16600 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20  , configure the 
16610 77 72 61 70 70 65 72 73 20 73 6f 20 74 68 61 74  wrappers so that
16620 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73   all.    ** subs
16630 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
16640 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20  localtime() and 
16650 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49  variants fail. I
16660 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c  f onoff is zero,
16670 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69  .    ** undo thi
16680 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a  s setting..    *
16690 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
166a0 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c  E_TESTCTRL_LOCAL
166b0 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20  TIME_FAULT: {.  
166c0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
166d0 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69  lConfig.bLocalti
166e0 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67  meFault = va_arg
166f0 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
16700 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
16710 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
16720 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
16730 50 4c 41 49 4e 29 0a 20 20 20 20 2f 2a 20 20 20  PLAIN).    /*   
16740 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
16750 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
16760 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d  CTRL_EXPLAIN_STM
16770 54 2c 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  T,.    **       
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16790 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 63   sqlite3_stmt*,c
167a0 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20  onst char**);.  
167b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 63    **.    ** If c
167c0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
167d0 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
167e0 45 58 50 4c 41 49 4e 2c 20 65 61 63 68 20 73 71  EXPLAIN, each sq
167f0 6c 69 74 65 33 5f 73 74 6d 74 20 68 6f 6c 64 73  lite3_stmt holds
16800 0a 20 20 20 20 2a 2a 20 61 20 73 74 72 69 6e 67  .    ** a string
16810 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
16820 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 70 61  the optimized pa
16830 72 73 65 20 74 72 65 65 2e 20 20 54 68 69 73 20  rse tree.  This 
16840 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 0a 20 20 20  test-control.   
16850 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f   ** returns a po
16860 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 73 74  inter to that st
16870 72 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ring..    */.   
16880 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
16890 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54  TCTRL_EXPLAIN_ST
168a0 4d 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  MT: {.      sqli
168b0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
168c0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
168d0 69 74 65 33 5f 73 74 6d 74 2a 29 3b 0a 20 20 20  ite3_stmt*);.   
168e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a     const char **
168f0 70 7a 52 65 74 20 3d 20 76 61 5f 61 72 67 28 61  pzRet = va_arg(a
16900 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  p, const char**)
16910 3b 0a 20 20 20 20 20 20 2a 70 7a 52 65 74 20 3d  ;.      *pzRet =
16920 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c   sqlite3VdbeExpl
16930 61 6e 61 74 69 6f 6e 28 28 56 64 62 65 2a 29 70  anation((Vdbe*)p
16940 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 62 72 65  Stmt);.      bre
16950 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
16960 0a 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  ..  }.  va_end(a
16970 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  p);.#endif /* SQ
16980 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49  LITE_OMIT_BUILTI
16990 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74 75  N_TEST */.  retu
169a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
169b0 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74  This is a utilit
169c0 79 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75  y routine, usefu
169d0 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65  l to VFS impleme
169e0 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63  ntations, that c
169f0 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20  hecks.** to see 
16a00 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  if a database fi
16a10 6c 65 20 77 61 73 20 61 20 55 52 49 20 74 68 61  le was a URI tha
16a20 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70  t contained a sp
16a30 65 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a  ecific query .**
16a40 20 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20   parameter, and 
16a50 69 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68  if so obtains th
16a60 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71  e value of the q
16a70 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
16a80 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e  **.** The zFilen
16a90 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
16aa0 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69  the filename poi
16ab0 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f  nter passed into
16ac0 20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20   the xOpen().** 
16ad0 6d 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20  method of a VFS 
16ae0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
16af0 20 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75   The zParam argu
16b00 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
16b10 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79   of the.** query
16b20 20 70 61 72 61 6d 65 74 65 72 20 77 65 20 73 65   parameter we se
16b30 65 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ek.  This routin
16b40 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61  e returns the va
16b50 6c 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61  lue of the zPara
16b60 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  m.** parameter i
16b70 66 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66  f it exists.  If
16b80 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 64   the parameter d
16b90 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
16ba0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
16bb0 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f  eturns a NULL po
16bc0 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  inter..*/.const 
16bd0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72  char *sqlite3_ur
16be0 69 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73  i_parameter(cons
16bf0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
16c00 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
16c10 50 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46  Param){.  if( zF
16c20 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ilename==0 ) ret
16c30 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61  urn 0;.  zFilena
16c40 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  me += sqlite3Str
16c50 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
16c60 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a   + 1;.  while( z
16c70 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
16c80 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63 6d     int x = strcm
16c90 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  p(zFilename, zPa
16ca0 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  ram);.    zFilen
16cb0 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  ame += sqlite3St
16cc0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
16cd0 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 78  ) + 1;.    if( x
16ce0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46 69  ==0 ) return zFi
16cf0 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c  lename;.    zFil
16d00 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33  ename += sqlite3
16d10 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
16d20 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72  me) + 1;.  }.  r
16d30 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
16d40 2a 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65  * Return a boole
16d50 61 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71  an value for a q
16d60 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
16d70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 75  */.int sqlite3_u
16d80 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74  ri_boolean(const
16d90 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
16da0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
16db0 61 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29  aram, int bDflt)
16dc0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
16dd0 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  z = sqlite3_uri_
16de0 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e  parameter(zFilen
16df0 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20  ame, zParam);.  
16e00 72 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74  return z ? sqlit
16e10 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 29 20  e3GetBoolean(z) 
16e20 3a 20 28 62 44 66 6c 74 21 3d 30 29 3b 0a 7d 0a  : (bDflt!=0);.}.
16e30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
16e40 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76  64-bit integer v
16e50 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79  alue for a query
16e60 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73   parameter..*/.s
16e70 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c  qlite3_int64 sql
16e80 69 74 65 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a  ite3_uri_int64(.
16e90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
16ea0 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46  ilename,    /* F
16eb0 69 6c 65 6e 61 6d 65 20 61 73 20 70 61 73 73 65  ilename as passe
16ec0 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20  d to xOpen */.  
16ed0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
16ee0 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55 52 49  am,       /* URI
16ef0 20 70 61 72 61 6d 65 74 65 72 20 73 6f 75 67 68   parameter sough
16f00 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  t */.  sqlite3_i
16f10 6e 74 36 34 20 62 44 66 6c 74 20 20 20 20 20 20  nt64 bDflt      
16f20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66 20 70 61   /* return if pa
16f30 72 61 6d 65 74 65 72 20 69 73 20 6d 69 73 73 69  rameter is missi
16f40 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ng */.){.  const
16f50 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
16f60 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
16f70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72  (zFilename, zPar
16f80 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  am);.  sqlite3_i
16f90 6e 74 36 34 20 76 3b 0a 20 20 69 66 28 20 7a 20  nt64 v;.  if( z 
16fa0 26 26 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34  && sqlite3Atoi64
16fb0 28 7a 2c 20 26 76 2c 20 73 71 6c 69 74 65 33 53  (z, &v, sqlite3S
16fc0 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49  trlen30(z), SQLI
16fd0 54 45 5f 55 54 46 38 29 3d 3d 53 51 4c 49 54 45  TE_UTF8)==SQLITE
16fe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c 74  _OK ){.    bDflt
16ff0 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = v;.  }.  retu
17000 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  rn bDflt;.}../*.
17010 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
17020 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  lename of the da
17030 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
17040 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
17050 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
17060 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
17070 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
17080 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ame(sqlite3 *db,
17090 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
170a0 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
170b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
170c0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
170d0 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
170e0 42 74 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  Bt && sqlite3Str
170f0 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62  ICmp(zDbName, db
17100 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ->aDb[i].zName)=
17110 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
17120 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  rn sqlite3BtreeG
17130 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
17140 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
17150 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
17160 3b 0a 7d 0a 0a 23 69 66 20 28 53 51 4c 49 54 45  ;.}..#if (SQLITE
17170 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50  _ENABLE_APPLE_SP
17180 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28  I>0) && defined(
17190 5f 5f 41 50 50 4c 45 5f 5f 29 0a 0a 23 69 6e 63  __APPLE__)..#inc
171a0 6c 75 64 65 20 22 73 71 6c 69 74 65 33 5f 70 72  lude "sqlite3_pr
171b0 69 76 61 74 65 2e 68 22 0a 0a 2f 2a 20 0a 2a 2a  ivate.h"../* .**
171c0 20 54 65 73 74 69 6e 67 20 61 20 66 69 6c 65 20   Testing a file 
171d0 70 61 74 68 20 66 6f 72 20 73 71 6c 69 74 65 20  path for sqlite 
171e0 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 61 20  locks held by a 
171f0 70 72 6f 63 65 73 73 20 49 44 2e 20 0a 2a 2a 20  process ID. .** 
17200 52 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c  Returns SQLITE_L
17210 4f 43 4b 53 54 41 54 45 5f 4f 4e 20 69 66 20 6c  OCKSTATE_ON if l
17220 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74  ocks are present
17230 20 6f 6e 20 70 61 74 68 0a 2a 2a 20 74 68 61 74   on path.** that
17240 20 77 6f 75 6c 64 20 70 72 65 76 65 6e 74 20 77   would prevent w
17250 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
17260 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 5f  tabase..*/.int _
17270 73 71 6c 69 74 65 33 5f 6c 6f 63 6b 73 74 61 74  sqlite3_lockstat
17280 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  e(const char *pa
17290 74 68 2c 20 70 69 64 5f 74 20 70 69 64 29 7b 0a  th, pid_t pid){.
172a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
172b0 4e 55 4c 4c 3b 0a 20 20 0a 20 20 69 66 28 20 73  NULL;.  .  if( s
172c0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70  qlite3_open_v2(p
172d0 61 74 68 2c 20 26 64 62 2c 20 53 51 4c 49 54 45  ath, &db, SQLITE
172e0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20  _OPEN_READONLY, 
172f0 4e 55 4c 4c 29 20 3d 3d 20 53 51 4c 49 54 45 5f  NULL) == SQLITE_
17300 4f 4b 20 29 7b 0a 20 20 20 20 4c 6f 63 6b 73 74  OK ){.    Lockst
17310 61 74 65 50 49 44 20 6c 6f 63 6b 73 74 61 74 65  atePID lockstate
17320 20 3d 20 7b 70 69 64 2c 20 2d 31 7d 3b 0a 20 20   = {pid, -1};.  
17330 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
17340 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c  ontrol(db, NULL,
17350 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
17360 43 4b 53 54 41 54 45 5f 50 49 44 2c 20 26 6c 6f  CKSTATE_PID, &lo
17370 63 6b 73 74 61 74 65 29 3b 0a 20 20 20 20 73 71  ckstate);.    sq
17380 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
17390 0a 20 20 20 20 69 6e 74 20 73 74 61 74 65 20 3d  .    int state =
173a0 20 6c 6f 63 6b 73 74 61 74 65 2e 73 74 61 74 65   lockstate.state
173b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 74 61  ;.    return sta
173c0 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
173d0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54   SQLITE_LOCKSTAT
173e0 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23 65 6e 64  E_ERROR;.}..#end
173f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
17400 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 20 2a 2f  BLE_APPLE_SPI */
17410 0a                                               .