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

Artifact fbe239ee3e61b0e83a8d53028e9efaf8368bc73f:


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 35 34 38 32 33 2d 34 31 33 34 33 20 54   R-54823-41343 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 6d 75 74 65 78 69 6e 67 20 63 6f 64  led mutexing cod
0740: 65 20 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f  e omitted due to
0750: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54  .** the SQLITE_T
0760: 48 52 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c  HREADSAFE compil
0770: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65  e-time option be
0780: 69 6e 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f  ing set to 0..*/
0790: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72  .int sqlite3_thr
07a0: 65 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72  eadsafe(void){ r
07b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52  eturn SQLITE_THR
07c0: 45 41 44 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20  EADSAFE; }..#if 
07d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
07e0: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
07f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0800: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a  ABLE_IOTRACE)./*
0810: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
0820: 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f  wing function po
0830: 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  inter is not NUL
0840: 4c 20 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49  L and if.** SQLI
0850: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
0860: 45 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  E is enabled, th
0870: 65 6e 20 6d 65 73 73 61 67 65 73 20 64 65 73 63  en messages desc
0880: 72 69 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63  ribing.** I/O ac
0890: 74 69 76 65 20 61 72 65 20 77 72 69 74 74 65 6e  tive are written
08a0: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
08b0: 74 69 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73  tion.  These mes
08c0: 73 61 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74  sages.** are int
08d0: 65 6e 64 65 64 20 66 6f 72 20 64 65 62 75 67 67  ended for debugg
08e0: 69 6e 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c  ing activity onl
08f0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c  y..*/.void (*sql
0900: 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e  ite3IoTrace)(con
0910: 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d  st char*, ...) =
0920: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
0930: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
0940: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
0950: 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73  le points to a s
0960: 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74  tring which is t
0970: 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20  he.** name of a 
0980: 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20  directory, then 
0990: 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77  that directory w
09a0: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73  ill be used to s
09b0: 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72  tore.** temporar
09c0: 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  y files..**.** S
09d0: 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41  ee also the "PRA
09e0: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  GMA temp_store_d
09f0: 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f  irectory" SQL co
0a00: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a  mmand..*/.char *
0a10: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
0a20: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a  ectory = 0;../*.
0a30: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 53 51  ** Initialize SQ
0a40: 4c 69 74 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  Lite.  .**.** Th
0a50: 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
0a60: 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 69  be called to ini
0a70: 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f  tialize the memo
0a80: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 0a 2a  ry allocation,.*
0a90: 2a 20 56 46 53 2c 20 61 6e 64 20 6d 75 74 65 78  * VFS, and mutex
0aa0: 20 73 75 62 73 79 73 74 65 6d 73 20 70 72 69 6f   subsystems prio
0ab0: 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 73  r to doing any s
0ac0: 65 72 69 6f 75 73 20 77 6f 72 6b 20 77 69 74 68  erious work with
0ad0: 0a 2a 2a 20 53 51 4c 69 74 65 2e 20 20 42 75 74  .** SQLite.  But
0ae0: 20 61 73 20 6c 6f 6e 67 20 61 73 20 79 6f 75 20   as long as you 
0af0: 64 6f 20 6e 6f 74 20 63 6f 6d 70 69 6c 65 20 77  do not compile w
0b00: 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ith SQLITE_OMIT_
0b10: 41 55 54 4f 49 4e 49 54 0a 2a 2a 20 74 68 69 73  AUTOINIT.** this
0b20: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
0b30: 20 63 61 6c 6c 65 64 20 61 75 74 6f 6d 61 74 69   called automati
0b40: 63 61 6c 6c 79 20 62 79 20 6b 65 79 20 72 6f 75  cally by key rou
0b50: 74 69 6e 65 73 20 73 75 63 68 20 61 73 0a 2a 2a  tines such as.**
0b60: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e   sqlite3_open().
0b70: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f    .**.** This ro
0b80: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
0b90: 20 65 78 63 65 70 74 20 6f 6e 20 69 74 73 20 76   except on its v
0ba0: 65 72 79 20 66 69 72 73 74 20 63 61 6c 6c 20 66  ery first call f
0bb0: 6f 72 20 74 68 65 20 70 72 6f 63 65 73 73 2c 0a  or the process,.
0bc0: 2a 2a 20 6f 72 20 66 6f 72 20 74 68 65 20 66 69  ** or for the fi
0bd0: 72 73 74 20 63 61 6c 6c 20 61 66 74 65 72 20 61  rst call after a
0be0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
0bf0: 5f 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a  _shutdown..**.**
0c00: 20 54 68 65 20 66 69 72 73 74 20 74 68 72 65 61   The first threa
0c10: 64 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 72  d to call this r
0c20: 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 68 65 20  outine runs the 
0c30: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
0c40: 6f 0a 2a 2a 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e  o.** completion.
0c50: 20 20 49 66 20 73 75 62 73 65 71 75 65 6e 74 20    If subsequent 
0c60: 74 68 72 65 61 64 73 20 63 61 6c 6c 20 74 68 69  threads call thi
0c70: 73 20 72 6f 75 74 69 6e 65 20 62 65 66 6f 72 65  s routine before
0c80: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 68   the first.** th
0c90: 72 65 61 64 20 68 61 73 20 66 69 6e 69 73 68 65  read has finishe
0ca0: 64 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  d the initializa
0cb0: 74 69 6f 6e 20 70 72 6f 63 65 73 73 2c 20 74 68  tion process, th
0cc0: 65 6e 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  en the subsequen
0cd0: 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 6d 75 73  t.** threads mus
0ce0: 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68  t block until th
0cf0: 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20 66  e first thread f
0d00: 69 6e 69 73 68 65 73 20 77 69 74 68 20 74 68 65  inishes with the
0d10: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e   initialization.
0d20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
0d30: 20 74 68 72 65 61 64 20 6d 69 67 68 74 20 63 61   thread might ca
0d40: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
0d50: 72 65 63 75 72 73 69 76 65 6c 79 2e 20 20 52 65  recursively.  Re
0d60: 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 73  cursive.** calls
0d70: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
0d80: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 6c 6f 63   should not bloc
0d90: 6b 2c 20 6f 66 20 63 6f 75 72 73 65 2e 20 20 4f  k, of course.  O
0da0: 74 68 65 72 77 69 73 65 20 74 68 65 0a 2a 2a 20  therwise the.** 
0db0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70  initialization p
0dc0: 72 6f 63 65 73 73 20 77 6f 75 6c 64 20 6e 65 76  rocess would nev
0dd0: 65 72 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2a 0a  er complete..**.
0de0: 2a 2a 20 4c 65 74 20 58 20 62 65 20 74 68 65 20  ** Let X be the 
0df0: 66 69 72 73 74 20 74 68 72 65 61 64 20 74 6f 20  first thread to 
0e00: 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  enter this routi
0e10: 6e 65 2e 20 20 4c 65 74 20 59 20 62 65 20 73 6f  ne.  Let Y be so
0e20: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 74 68 72 65  me other.** thre
0e30: 61 64 2e 20 20 54 68 65 6e 20 77 68 69 6c 65 20  ad.  Then while 
0e40: 74 68 65 20 69 6e 69 74 69 61 6c 20 69 6e 76 6f  the initial invo
0e50: 63 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 72  cation of this r
0e60: 6f 75 74 69 6e 65 20 62 79 20 58 20 69 73 0a 2a  outine by X is.*
0e70: 2a 20 69 6e 63 6f 6d 70 6c 65 74 65 2c 20 69 74  * incomplete, it
0e80: 20 69 73 20 72 65 71 75 69 72 65 64 20 74 68 61   is required tha
0e90: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43  t:.**.**    *  C
0ea0: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
0eb0: 74 69 6e 65 20 66 72 6f 6d 20 59 20 6d 75 73 74  tine from Y must
0ec0: 20 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65   block until the
0ed0: 20 6f 75 74 65 72 2d 6d 6f 73 74 0a 2a 2a 20 20   outer-most.**  
0ee0: 20 20 20 20 20 63 61 6c 6c 20 62 79 20 58 20 63       call by X c
0ef0: 6f 6d 70 6c 65 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ompletes..**.** 
0f00: 20 20 20 2a 20 20 52 65 63 75 72 73 69 76 65 20     *  Recursive 
0f10: 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f  calls to this ro
0f20: 75 74 69 6e 65 20 66 72 6f 6d 20 74 68 72 65 61  utine from threa
0f30: 64 20 58 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  d X return immed
0f40: 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20  iately.**       
0f50: 77 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67  without blocking
0f60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0f70: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 76 6f 69 64  _initialize(void
0f80: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
0f90: 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20  ex *pMaster;    
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73 74    /* The main st
0fc0: 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20  atic mutex */.  
0fd0: 69 6e 74 20 72 63 3b 20 20 20 20 20 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 2f 2a 20               /* 
1000: 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a  Result code */..
1010: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
1020: 49 54 5f 57 53 44 0a 20 20 72 63 20 3d 20 73 71  IT_WSD.  rc = sq
1030: 6c 69 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34  lite3_wsd_init(4
1040: 30 39 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20  096, 24);.  if( 
1050: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1060: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1070: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1080: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c   If SQLite is al
1090: 72 65 61 64 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ready completely
10a0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68   initialized, th
10b0: 65 6e 20 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a  en this call.  *
10c0: 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 69 6e 69  * to sqlite3_ini
10d0: 74 69 61 6c 69 7a 65 28 29 20 73 68 6f 75 6c 64  tialize() should
10e0: 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75   be a no-op.  Bu
10f0: 74 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  t the initializa
1100: 74 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73 74 20 62  tion.  ** must b
1110: 65 20 63 6f 6d 70 6c 65 74 65 2e 20 20 53 6f 20  e complete.  So 
1120: 69 73 49 6e 69 74 20 6d 75 73 74 20 6e 6f 74 20  isInit must not 
1130: 62 65 20 73 65 74 20 75 6e 74 69 6c 20 74 68 65  be set until the
1140: 20 76 65 72 79 20 65 6e 64 0a 20 20 2a 2a 20 6f   very end.  ** o
1150: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  f this routine..
1160: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
1170: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1180: 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53  sInit ) return S
1190: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
11a0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6d 75  Make sure the mu
11b0: 74 65 78 20 73 75 62 73 79 73 74 65 6d 20 69 73  tex subsystem is
11c0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 49   initialized.  I
11d0: 66 20 75 6e 61 62 6c 65 20 74 6f 20 0a 20 20 2a  f unable to .  *
11e0: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * initialize the
11f0: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
1200: 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20 77  , return early w
1210: 69 74 68 20 74 68 65 20 65 72 72 6f 72 2e 0a 20  ith the error.. 
1220: 20 2a 2a 20 49 66 20 74 68 65 20 73 79 73 74 65   ** If the syste
1230: 6d 20 69 73 20 73 6f 20 73 69 63 6b 20 74 68 61  m is so sick tha
1240: 74 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  t we are unable 
1250: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 75  to allocate a mu
1260: 74 65 78 2c 0a 20 20 2a 2a 20 74 68 65 72 65 20  tex,.  ** there 
1270: 69 73 20 6e 6f 74 20 6d 75 63 68 20 53 51 4c 69  is not much SQLi
1280: 74 65 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 62  te is going to b
1290: 65 20 61 62 6c 65 20 74 6f 20 64 6f 2e 0a 20 20  e able to do..  
12a0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 75 74 65  **.  ** The mute
12b0: 78 20 73 75 62 73 79 73 74 65 6d 20 6d 75 73 74  x subsystem must
12c0: 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20 73 65   take care of se
12d0: 72 69 61 6c 69 7a 69 6e 67 20 69 74 73 20 6f 77  rializing its ow
12e0: 6e 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  n.  ** initializ
12f0: 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ation..  */.  rc
1300: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 49   = sqlite3MutexI
1310: 6e 69 74 28 29 3b 0a 20 20 69 66 28 20 72 63 20  nit();.  if( rc 
1320: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
1330: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1340: 65 20 6d 61 6c 6c 6f 63 28 29 20 73 79 73 74 65  e malloc() syste
1350: 6d 20 61 6e 64 20 74 68 65 20 72 65 63 75 72 73  m and the recurs
1360: 69 76 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d  ive pInitMutex m
1370: 75 74 65 78 2e 0a 20 20 2a 2a 20 54 68 69 73 20  utex..  ** This 
1380: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 72 6f  operation is pro
1390: 74 65 63 74 65 64 20 62 79 20 74 68 65 20 53 54  tected by the ST
13a0: 41 54 49 43 5f 4d 41 53 54 45 52 20 6d 75 74 65  ATIC_MASTER mute
13b0: 78 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  x.  Note that.  
13c0: 2a 2a 20 4d 75 74 65 78 41 6c 6c 6f 63 28 29 20  ** MutexAlloc() 
13d0: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  is called for a 
13e0: 73 74 61 74 69 63 20 6d 75 74 65 78 20 70 72 69  static mutex pri
13f0: 6f 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 69  or to initializi
1400: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6d 61 6c 6c  ng the.  ** mall
1410: 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2d 20 74  oc subsystem - t
1420: 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74  his implies that
1430: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
1440: 6f 66 20 61 20 73 74 61 74 69 63 0a 20 20 2a 2a  of a static.  **
1450: 20 6d 75 74 65 78 20 6d 75 73 74 20 6e 6f 74 20   mutex must not 
1460: 72 65 71 75 69 72 65 20 73 75 70 70 6f 72 74 20  require support 
1470: 66 72 6f 6d 20 74 68 65 20 6d 61 6c 6c 6f 63 20  from the malloc 
1480: 73 75 62 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a  subsystem..  */.
1490: 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    pMaster = sqli
14a0: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
14b0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
14c0: 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c  C_MASTER);.  sql
14d0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14e0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c  (pMaster);.  sql
14f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1500: 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d 20 31  .isMutexInit = 1
1510: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
1520: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
1530: 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20  allocInit ){.   
1540: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c   rc = sqlite3Mal
1550: 6c 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d 0a 20  locInit();.  }. 
1560: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1570: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1580: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1590: 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31 3b 0a  MallocInit = 1;.
15a0: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
15b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
15c0: 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  itMutex ){.     
15d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
15e0: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20  nfig.pInitMutex 
15f0: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  =.           sql
1600: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
1610: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55  QLITE_MUTEX_RECU
1620: 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20 69 66  RSIVE);.      if
1630: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1640: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
1650: 20 26 26 20 21 73 71 6c 69 74 65 33 47 6c 6f 62   && !sqlite3Glob
1660: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
1670: 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 72  tex ){.        r
1680: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16a0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
16b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
16c0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16d0: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
16e0: 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ++;.  }.  sqlite
16f0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
1700: 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66  aster);..  /* If
1710: 20 72 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54   rc is not SQLIT
1720: 45 5f 4f 4b 20 61 74 20 74 68 69 73 20 70 6f 69  E_OK at this poi
1730: 6e 74 2c 20 74 68 65 6e 20 65 69 74 68 65 72 20  nt, then either 
1740: 74 68 65 20 6d 61 6c 6c 6f 63 0a 20 20 2a 2a 20  the malloc.  ** 
1750: 73 75 62 73 79 73 74 65 6d 20 63 6f 75 6c 64 20  subsystem could 
1760: 6e 6f 74 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  not be initializ
1770: 65 64 20 6f 72 20 74 68 65 20 73 79 73 74 65 6d  ed or the system
1780: 20 66 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63   failed to alloc
1790: 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70 49 6e  ate.  ** the pIn
17a0: 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 20 52  itMutex mutex. R
17b0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
17c0: 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e 20 20  n either case.  
17d0: 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  */.  if( rc!=SQL
17e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
17f0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1800: 2f 2a 20 44 6f 20 74 68 65 20 72 65 73 74 20 6f  /* Do the rest o
1810: 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  f the initializa
1820: 74 69 6f 6e 20 75 6e 64 65 72 20 74 68 65 20 72  tion under the r
1830: 65 63 75 72 73 69 76 65 20 6d 75 74 65 78 20 73  ecursive mutex s
1840: 6f 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 77  o.  ** that we w
1850: 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 68  ill be able to h
1860: 61 6e 64 6c 65 20 72 65 63 75 72 73 69 76 65 20  andle recursive 
1870: 63 61 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a 2a 20  calls into.  ** 
1880: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
1890: 7a 65 28 29 2e 20 20 54 68 65 20 72 65 63 75 72  ze().  The recur
18a0: 73 69 76 65 20 63 61 6c 6c 73 20 6e 6f 72 6d 61  sive calls norma
18b0: 6c 6c 79 20 63 6f 6d 65 20 74 68 72 6f 75 67 68  lly come through
18c0: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 73  .  ** sqlite3_os
18d0: 5f 69 6e 69 74 28 29 20 77 68 65 6e 20 69 74 20  _init() when it 
18e0: 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f  invokes sqlite3_
18f0: 76 66 73 5f 72 65 67 69 73 74 65 72 28 29 2c 20  vfs_register(), 
1900: 62 75 74 20 6f 74 68 65 72 0a 20 20 2a 2a 20 72  but other.  ** r
1910: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6d  ecursive calls m
1920: 69 67 68 74 20 61 6c 73 6f 20 62 65 20 70 6f 73  ight also be pos
1930: 73 69 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  sible..  **.  **
1940: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
1950: 4f 46 3a 20 52 2d 30 30 31 34 30 2d 33 37 34 34  OF: R-00140-3744
1960: 35 20 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74  5 SQLite automat
1970: 69 63 61 6c 6c 79 20 73 65 72 69 61 6c 69 7a 65  ically serialize
1980: 73 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 74 6f 20  s calls.  ** to 
1990: 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64  the xInit method
19a0: 2c 20 73 6f 20 74 68 65 20 78 49 6e 69 74 20 6d  , so the xInit m
19b0: 65 74 68 6f 64 20 6e 65 65 64 20 6e 6f 74 20 62  ethod need not b
19c0: 65 20 74 68 72 65 61 64 73 61 66 65 2e 0a 20 20  e threadsafe..  
19d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  **.  ** The foll
19e0: 6f 77 69 6e 67 20 6d 75 74 65 78 20 69 73 20 77  owing mutex is w
19f0: 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 61  hat serializes a
1a00: 63 63 65 73 73 20 74 6f 20 74 68 65 20 61 70 70  ccess to the app
1a10: 64 65 66 20 70 63 61 63 68 65 20 78 49 6e 69 74  def pcache xInit
1a20: 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 73 2e 20 20  .  ** methods.  
1a30: 54 68 65 20 73 71 6c 69 74 65 33 5f 70 63 61 63  The sqlite3_pcac
1a40: 68 65 5f 6d 65 74 68 6f 64 73 2e 78 49 6e 69 74  he_methods.xInit
1a50: 28 29 20 61 6c 6c 20 69 73 20 65 6d 62 65 64 64  () all is embedd
1a60: 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63  ed in the.  ** c
1a70: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63  all to sqlite3Pc
1a80: 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29  acheInitialize()
1a90: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1aa0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
1ab0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ac0: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20  .pInitMutex);.  
1ad0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1ae0: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d  lConfig.isInit==
1af0: 30 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  0 && sqlite3Glob
1b00: 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72  alConfig.inProgr
1b10: 65 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20 46 75  ess==0 ){.    Fu
1b20: 6e 63 44 65 66 48 61 73 68 20 2a 70 48 61 73 68  ncDefHash *pHash
1b30: 20 3d 20 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44   = &GLOBAL(FuncD
1b40: 65 66 48 61 73 68 2c 20 73 71 6c 69 74 65 33 47  efHash, sqlite3G
1b50: 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29 3b  lobalFunctions);
1b60: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
1b70: 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72  alConfig.inProgr
1b80: 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  ess = 1;.    mem
1b90: 73 65 74 28 70 48 61 73 68 2c 20 30 2c 20 73 69  set(pHash, 0, si
1ba0: 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f 62  zeof(sqlite3Glob
1bb0: 61 6c 46 75 6e 63 74 69 6f 6e 73 29 29 3b 0a 20  alFunctions));. 
1bc0: 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74     sqlite3Regist
1bd0: 65 72 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e  erGlobalFunction
1be0: 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  s();.    if( sql
1bf0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1c00: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d 3d 30  .isPCacheInit==0
1c10: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1c20: 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74  qlite3PcacheInit
1c30: 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20 7d 0a  ialize();.    }.
1c40: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1c60: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1c70: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
1c80: 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 1;.      rc = 
1c90: 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28 29 3b  sqlite3OsInit();
1ca0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1cb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1cc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
1cd0: 63 68 65 42 75 66 66 65 72 53 65 74 75 70 28 20  cheBufferSetup( 
1ce0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1cf0: 66 69 67 2e 70 50 61 67 65 2c 20 0a 20 20 20 20  fig.pPage, .    
1d00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1d10: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65  balConfig.szPage
1d20: 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  , sqlite3GlobalC
1d30: 6f 6e 66 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20  onfig.nPage);.  
1d40: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1d50: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d  lConfig.isInit =
1d60: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   1;.    }.    sq
1d70: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1d80: 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30  g.inProgress = 0
1d90: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1da0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
1db0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1dc0: 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20  pInitMutex);..  
1dd0: 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72  /* Go back under
1de0: 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74 65   the static mute
1df0: 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74  x and clean up t
1e00: 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a  he recursive.  *
1e10: 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65  * mutex to preve
1e20: 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65  nt a resource le
1e30: 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ak..  */.  sqlit
1e40: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1e50: 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Master);.  sqlit
1e60: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
1e70: 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a  RefInitMutex--;.
1e80: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1e90: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
1ea0: 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20  itMutex<=0 ){.  
1eb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ec0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1ed0: 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29  efInitMutex==0 )
1ee0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
1ef0: 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33  tex_free(sqlite3
1f00: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1f10: 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71  itMutex);.    sq
1f20: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1f30: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30  g.pInitMutex = 0
1f40: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1f50: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
1f60: 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ter);..  /* The 
1f70: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73  following is jus
1f80: 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  t a sanity check
1f90: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51   to make sure SQ
1fa0: 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65  Lite has.  ** be
1fb0: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72  en compiled corr
1fc0: 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d  ectly.  It is im
1fd0: 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74  portant to run t
1fe0: 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20  his code, but.  
1ff0: 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
2000: 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f   to run it too o
2010: 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70  ften and soak up
2020: 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20   CPU cycles for 
2030: 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20  no.  ** reason. 
2040: 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e   So we run it on
2050: 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61  ce during initia
2060: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  lization..  */.#
2070: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69  ifndef NDEBUG.#i
2080: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2090: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
20a0: 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69  .  /* This secti
20b0: 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c  on of code's onl
20c0: 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76 69  y "output" is vi
20d0: 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  a assert() state
20e0: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28  ments. */.  if (
20f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2100: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2110: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2120: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2130: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
2140: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
2150: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
2160: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
2170: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
2180: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2190: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
21a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
21b0: 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
21c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68  }../*.** Undo th
21d0: 65 20 65 66 66 65 63 74 73 20 6f 66 20 73 71 6c  e effects of sql
21e0: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
21f0: 29 2e 20 20 4d 75 73 74 20 6e 6f 74 20 62 65 20  ).  Must not be 
2200: 63 61 6c 6c 65 64 20 77 68 69 6c 65 0a 2a 2a 20  called while.** 
2210: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
2220: 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 63  nding database c
2230: 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65  onnections or me
2240: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  mory allocations
2250: 20 6f 72 0a 2a 2a 20 77 68 69 6c 65 20 61 6e 79   or.** while any
2260: 20 70 61 72 74 20 6f 66 20 53 51 4c 69 74 65 20   part of SQLite 
2270: 69 73 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20  is otherwise in 
2280: 75 73 65 20 69 6e 20 61 6e 79 20 74 68 72 65 61  use in any threa
2290: 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
22a0: 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ine is not threa
22b0: 64 73 61 66 65 2e 20 20 42 75 74 20 69 74 20 69  dsafe.  But it i
22c0: 73 20 73 61 66 65 20 74 6f 20 69 6e 76 6f 6b 65  s safe to invoke
22d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
22e0: 20 6f 6e 20 77 68 65 6e 20 53 51 4c 69 74 65 20   on when SQLite 
22f0: 69 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20  is already shut 
2300: 64 6f 77 6e 2e 20 20 49 66 20 53 51 4c 69 74 65  down.  If SQLite
2310: 20 69 73 20 61 6c 72 65 61 64 79 20 73 68 75 74   is already shut
2320: 20 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20 74 68   down.** when th
2330: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
2340: 76 6f 6b 65 64 2c 20 74 68 65 6e 20 74 68 69 73  voked, then this
2350: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61   routine is a ha
2360: 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f  rmless no-op..*/
2370: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 75  .int sqlite3_shu
2380: 74 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 20 20 69  tdown(void){.  i
2390: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
23a0: 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 7b  Config.isInit ){
23b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .    sqlite3_os_
23c0: 65 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  end();.    sqlit
23d0: 65 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78  e3_reset_auto_ex
23e0: 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73  tension();.    s
23f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2400: 69 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  ig.isInit = 0;. 
2410: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
2420: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50  GlobalConfig.isP
2430: 43 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20  CacheInit ){.   
2440: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68   sqlite3PcacheSh
2450: 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71  utdown();.    sq
2460: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2470: 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d  g.isPCacheInit =
2480: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
2490: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
24a0: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29  g.isMallocInit )
24b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c  {.    sqlite3Mal
24c0: 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71  locEnd();.    sq
24d0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
24e0: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d  g.isMallocInit =
24f0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
2500: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2510: 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 29 7b  g.isMutexInit ){
2520: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65  .    sqlite3Mute
2530: 78 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69  xEnd();.    sqli
2540: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2550: 69 73 4d 75 74 65 78 49 6e 69 74 20 3d 20 30 3b  isMutexInit = 0;
2560: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
2570: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2580: 2a 2a 20 54 68 69 73 20 41 50 49 20 61 6c 6c 6f  ** This API allo
2590: 77 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20  ws applications 
25a0: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 67 6c  to modify the gl
25b0: 6f 62 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69  obal configurati
25c0: 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c  on of.** the SQL
25d0: 69 74 65 20 6c 69 62 72 61 72 79 20 61 74 20 72  ite library at r
25e0: 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54  un-time..**.** T
25f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
2600: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
2610: 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  d when there are
2620: 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a   no outstanding.
2630: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
2640: 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72  ections or memor
2650: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20  y allocations.  
2660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2670: 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 61 66  not.** threadsaf
2680: 65 2e 20 20 46 61 69 6c 75 72 65 20 74 6f 20 68  e.  Failure to h
2690: 65 65 64 20 74 68 65 73 65 20 77 61 72 6e 69 6e  eed these warnin
26a0: 67 73 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 75  gs can lead to u
26b0: 6e 70 72 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20  npredictable.** 
26c0: 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74  behavior..*/.int
26d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
26e0: 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20  int op, ...){.  
26f0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
2700: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2710: 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  ;..  /* sqlite3_
2720: 63 6f 6e 66 69 67 28 29 20 73 68 61 6c 6c 20 72  config() shall r
2730: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
2740: 55 53 45 20 69 66 20 69 74 20 69 73 20 69 6e 76  USE if it is inv
2750: 6f 6b 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20  oked while.  ** 
2760: 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61  the SQLite libra
2770: 72 79 20 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f  ry is in use. */
2780: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
2790: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69  obalConfig.isIni
27a0: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
27b0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a  E_MISUSE_BKPT;..
27c0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f    va_start(ap, o
27d0: 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p);.  switch( op
27e0: 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4d 75 74 65   ){..    /* Mute
27f0: 78 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  x configuration 
2800: 6f 70 74 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79  options are only
2810: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 20   available in a 
2820: 74 68 72 65 61 64 73 61 66 65 0a 20 20 20 20 2a  threadsafe.    *
2830: 2a 20 63 6f 6d 70 69 6c 65 2e 20 0a 20 20 20 20  * compile. .    
2840: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
2850: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
2860: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
2870: 41 44 53 41 46 45 3e 30 0a 20 20 20 20 63 61 73  ADSAFE>0.    cas
2880: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
2890: 53 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a  SINGLETHREAD: {.
28a0: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
28b0: 20 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f   all mutexing */
28c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
28d0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
28e0: 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Mutex = 0;.     
28f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2900: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
2910: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
2920: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2930: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
2940: 55 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a 20 20  ULTITHREAD: {.  
2950: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d      /* Disable m
2960: 75 74 65 78 69 6e 67 20 6f 66 20 64 61 74 61 62  utexing of datab
2970: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
2980: 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62  */.      /* Enab
2990: 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20 63  le mutexing of c
29a0: 6f 72 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ore data structu
29b0: 72 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  res */.      sql
29c0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
29d0: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b  .bCoreMutex = 1;
29e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
29f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
2a00: 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Mutex = 0;.     
2a10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2a20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2a30: 4e 46 49 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a  NFIG_SERIALIZED:
2a40: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62   {.      /* Enab
2a50: 6c 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20  le all mutexing 
2a60: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2a70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
2a80: 72 65 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20  reMutex = 1;.   
2a90: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2aa0: 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
2ab0: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  x = 1;.      bre
2ac0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
2ad0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
2ae0: 5f 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  _MUTEX: {.      
2af0: 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c  /* Specify an al
2b00: 74 65 72 6e 61 74 69 76 65 20 6d 75 74 65 78 20  ternative mutex 
2b10: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
2b20: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
2b30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65  lobalConfig.mute
2b40: 78 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  x = *va_arg(ap, 
2b50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65  sqlite3_mutex_me
2b60: 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62  thods*);.      b
2b70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2b80: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2b90: 49 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a 20  IG_GETMUTEX: {. 
2ba0: 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65       /* Retrieve
2bb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 75 74   the current mut
2bc0: 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ex implementatio
2bd0: 6e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61  n */.      *va_a
2be0: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d  rg(ap, sqlite3_m
2bf0: 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20 3d  utex_methods*) =
2c00: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2c10: 6e 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20 20  nfig.mutex;.    
2c20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
2c30: 65 6e 64 69 66 0a 0a 0a 20 20 20 20 63 61 73 65  endif...    case
2c40: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
2c50: 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f  ALLOC: {.      /
2c60: 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74  * Specify an alt
2c70: 65 72 6e 61 74 69 76 65 20 6d 61 6c 6c 6f 63 20  ernative malloc 
2c80: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
2c90: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
2ca0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20  lobalConfig.m = 
2cb0: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
2cc0: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a  te3_mem_methods*
2cd0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2ce0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2cf0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
2d00: 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
2d10: 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20  /* Retrieve the 
2d20: 63 75 72 72 65 6e 74 20 6d 61 6c 6c 6f 63 28 29  current malloc()
2d30: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2d40: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
2d50: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d60: 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20  .m.xMalloc==0 ) 
2d70: 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66  sqlite3MemSetDef
2d80: 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 2a 76  ault();.      *v
2d90: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
2da0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 20  3_mem_methods*) 
2db0: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
2dc0: 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20 20 20 62  onfig.m;.      b
2dd0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2de0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2df0: 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a 20 7b 0a  IG_MEMSTATUS: {.
2e00: 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20        /* Enable 
2e10: 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 6d  or disable the m
2e20: 61 6c 6c 6f 63 20 73 74 61 74 75 73 20 63 6f 6c  alloc status col
2e30: 6c 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  lection */.     
2e40: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2e50: 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20  nfig.bMemstat = 
2e60: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
2e70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2e80: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2e90: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54  ITE_CONFIG_SCRAT
2ea0: 43 48 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  CH: {.      /* D
2eb0: 65 73 69 67 6e 61 74 65 20 61 20 62 75 66 66 65  esignate a buffe
2ec0: 72 20 66 6f 72 20 73 63 72 61 74 63 68 20 6d 65  r for scratch me
2ed0: 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20  mory space */.  
2ee0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2ef0: 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68  lConfig.pScratch
2f00: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
2f10: 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  id*);.      sqli
2f20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2f30: 73 7a 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61  szScratch = va_a
2f40: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
2f50: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2f60: 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 20  Config.nScratch 
2f70: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
2f80: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2f90: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2fa0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47  QLITE_CONFIG_PAG
2fb0: 45 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20  ECACHE: {.      
2fc0: 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20 62  /* Designate a b
2fd0: 75 66 66 65 72 20 66 6f 72 20 70 61 67 65 20 63  uffer for page c
2fe0: 61 63 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63  ache memory spac
2ff0: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
3000: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
3010: 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70  Page = va_arg(ap
3020: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
3030: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3040: 66 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f  fig.szPage = va_
3050: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3060: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3070: 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20  lConfig.nPage = 
3080: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3090: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
30a0: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51    }..    case SQ
30b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43  LITE_CONFIG_PCAC
30c0: 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53  HE: {.      /* S
30d0: 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e  pecify an altern
30e0: 61 74 69 76 65 20 70 61 67 65 20 63 61 63 68 65  ative page cache
30f0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
3100: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3110: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61  GlobalConfig.pca
3120: 63 68 65 20 3d 20 2a 76 61 5f 61 72 67 28 61 70  che = *va_arg(ap
3130: 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  , sqlite3_pcache
3140: 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20  _methods*);.    
3150: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
3160: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3170: 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45  CONFIG_GETPCACHE
3180: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
3190: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
31a0: 67 2e 70 63 61 63 68 65 2e 78 49 6e 69 74 3d 3d  g.pcache.xInit==
31b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
31c0: 69 74 65 33 50 43 61 63 68 65 53 65 74 44 65 66  ite3PCacheSetDef
31d0: 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a  ault();.      }.
31e0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
31f0: 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  , sqlite3_pcache
3200: 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c  _methods*) = sql
3210: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3220: 2e 70 63 61 63 68 65 3b 0a 20 20 20 20 20 20 62  .pcache;.      b
3230: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
3240: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3250: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20  ENABLE_MEMSYS3) 
3260: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
3270: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
3280: 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
3290: 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b  E_CONFIG_HEAP: {
32a0: 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e  .      /* Design
32b0: 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72  ate a buffer for
32c0: 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 73 70 61   heap memory spa
32d0: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
32e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
32f0: 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61  pHeap = va_arg(a
3300: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
3310: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3320: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
3330: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3340: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3350: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
3360: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3370: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
3380: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3390: 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20  mnReq<1 ){.     
33a0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
33b0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31  Config.mnReq = 1
33c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
33d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
33e0: 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c  onfig.mnReq>(1<<
33f0: 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  12) ){.        /
3400: 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73  * cap min reques
3410: 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a  t size at 2^12 *
3420: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
3430: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
3440: 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20  Req = (1<<12);. 
3450: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
3460: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
3470: 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29  onfig.pHeap==0 )
3480: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
3490: 74 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72  the heap pointer
34a0: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 72   is NULL, then r
34b0: 65 73 74 6f 72 65 20 74 68 65 20 6d 61 6c 6c 6f  estore the mallo
34c0: 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  c implementation
34d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  .        ** back
34e0: 20 74 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72   to NULL pointer
34f0: 73 20 74 6f 6f 2e 20 20 54 68 69 73 20 77 69 6c  s too.  This wil
3500: 6c 20 63 61 75 73 65 20 74 68 65 20 6d 61 6c 6c  l cause the mall
3510: 6f 63 20 74 6f 20 67 6f 0a 20 20 20 20 20 20 20  oc to go.       
3520: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20   ** back to its 
3530: 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e  default implemen
3540: 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69  tation when sqli
3550: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
3560: 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72   is.        ** r
3570: 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  un..        */. 
3580: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73         memset(&s
3590: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
35a0: 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ig.m, 0, sizeof(
35b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
35c0: 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d  fig.m));.      }
35d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
35e0: 20 54 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65   The heap pointe
35f0: 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  r is not NULL, t
3600: 68 65 6e 20 69 6e 73 74 61 6c 6c 20 6f 6e 65 20  hen install one 
3610: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
3620: 2a 20 6d 65 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20  * mem5.c/mem3.c 
3630: 6d 65 74 68 6f 64 73 2e 20 49 66 20 6e 65 69 74  methods. If neit
3640: 68 65 72 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  her ENABLE_MEMSY
3650: 53 33 20 6e 6f 72 0a 20 20 20 20 20 20 20 20 2a  S3 nor.        *
3660: 2a 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  * ENABLE_MEMSYS5
3670: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 72 65 74   is defined, ret
3680: 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  urn an error..  
3690: 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20        */.#ifdef 
36a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
36b0: 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20 73 71  MSYS3.        sq
36c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
36d0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
36e0: 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23  mGetMemsys3();.#
36f0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
3700: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
3710: 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  S5.        sqlit
3720: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3730: 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65   = *sqlite3MemGe
3740: 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64  tMemsys5();.#end
3750: 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
3760: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3770: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
3780: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f  QLITE_CONFIG_LOO
3790: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
37a0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
37b0: 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20  fig.szLookaside 
37c0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
37d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
37e0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
37f0: 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67  okaside = va_arg
3800: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3810: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3820: 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64    .    /* Record
3830: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3840: 65 20 6c 6f 67 67 65 72 20 66 75 6e 63 63 74 69  e logger funccti
3850: 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72 73 74  on and its first
3860: 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a   argument..    *
3870: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73  * The default is
3880: 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20   NULL.  Logging 
3890: 69 73 20 64 69 73 61 62 6c 65 64 20 69 66 20 74  is disabled if t
38a0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  he function poin
38b0: 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55  ter is.    ** NU
38c0: 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  LL..    */.    c
38d0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
38e0: 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f  G_LOG: {.      /
38f0: 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20  * MSVC is picky 
3900: 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75  about pulling fu
3910: 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20  nc ptrs from va 
3920: 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  lists..      ** 
3930: 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d  http://support.m
3940: 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f  icrosoft.com/kb/
3950: 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73  47961.      ** s
3960: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3970: 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67  ig.xLog = va_arg
3980: 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69  (ap, void(*)(voi
3990: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  d*,int,const cha
39a0: 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20  r*));.      */. 
39b0: 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
39c0: 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f  d(*LOGFUNC_t)(vo
39d0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
39e0: 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ar*);.      sqli
39f0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3a00: 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  xLog = va_arg(ap
3a10: 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20  , LOGFUNC_t);.  
3a20: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3a30: 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20  lConfig.pLogArg 
3a40: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3a50: 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d*);.      break
3a60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
3a70: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3a80: 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  URI: {.      sql
3a90: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3aa0: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
3ab0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
3ac0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3ad0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
3ae0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
3af0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  E_ERROR;.      b
3b00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
3b10: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
3b20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3b30: 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c  .** Set up the l
3b40: 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 73  ookaside buffers
3b50: 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
3b60: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52  connection..** R
3b70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
3b80: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a  on success.  .**
3b90: 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73   If lookaside is
3ba0: 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c   already active,
3bb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
3bc0: 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  USY..**.** The s
3bd0: 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  z parameter is t
3be0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
3bf0: 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61  es in each looka
3c00: 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68  side slot..** Th
3c10: 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20  e cnt parameter 
3c20: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
3c30: 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61   slots.  If pSta
3c40: 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a  rt is NULL the.*
3c50: 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
3c60: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
3c70: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
3c80: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
3c90: 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74  ()..** If pStart
3ca0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
3cb0: 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62  n it is sz*cnt b
3cc0: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74  ytes of memory t
3cd0: 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65  o use for.** the
3ce0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
3cf0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
3d00: 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
3d10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
3d20: 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c  d *pBuf, int sz,
3d30: 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69   int cnt){.  voi
3d40: 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28  d *pStart;.  if(
3d50: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
3d60: 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Out ){.    retur
3d70: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
3d80: 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79   }.  /* Free any
3d90: 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73   existing lookas
3da0: 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  ide buffer for t
3db0: 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72  his handle befor
3dc0: 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e  e.  ** allocatin
3dd0: 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77  g a new one so w
3de0: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20  e don't have to 
3df0: 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a  have space for .
3e00: 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65    ** both at the
3e10: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f   same time..  */
3e20: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
3e30: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
3e40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
3e50: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
3e60: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
3e70: 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  /* The size of a
3e80: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20   lookaside slot 
3e90: 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67  needs to be larg
3ea0: 65 72 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65  er than a pointe
3eb0: 72 0a 20 20 2a 2a 20 74 6f 20 62 65 20 75 73 65  r.  ** to be use
3ec0: 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ful..  */.  if( 
3ed0: 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28  sz<=(int)sizeof(
3ee0: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20  LookasideSlot*) 
3ef0: 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  ) sz = 0;.  if( 
3f00: 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b  cnt<0 ) cnt = 0;
3f10: 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20  .  if( sz==0 || 
3f20: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a  cnt==0 ){.    sz
3f30: 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
3f40: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
3f50: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
3f60: 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38   sz = ROUNDDOWN8
3f70: 28 73 7a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  (sz); /* IMP: R-
3f80: 33 33 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20  33038-09382 */. 
3f90: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
3fa0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
3fb0: 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69     pStart = sqli
3fc0: 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e  te3Malloc( sz*cn
3fd0: 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  t );  /* IMP: R-
3fe0: 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20  61949-35727 */. 
3ff0: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
4000: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d  ignMalloc();.  }
4010: 65 6c 73 65 7b 0a 20 20 20 20 73 7a 20 3d 20 52  else{.    sz = R
4020: 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20 2f  OUNDDOWN8(sz); /
4030: 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38 2d 30  * IMP: R-33038-0
4040: 39 33 38 32 20 2a 2f 0a 20 20 20 20 70 53 74 61  9382 */.    pSta
4050: 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20  rt = pBuf;.  }. 
4060: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
4070: 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a  Start = pStart;.
4080: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4090: 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d  pFree = 0;.  db-
40a0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20  >lookaside.sz = 
40b0: 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70  (u16)sz;.  if( p
40c0: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74  Start ){.    int
40d0: 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64   i;.    Lookasid
40e0: 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73  eSlot *p;.    as
40f0: 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29  sert( sz > (int)
4100: 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65  sizeof(Lookaside
4110: 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70 20  Slot*) );.    p 
4120: 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  = (LookasideSlot
4130: 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f  *)pStart;.    fo
4140: 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b  r(i=cnt-1; i>=0;
4150: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
4160: 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b  pNext = db->look
4170: 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20  aside.pFree;.   
4180: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
4190: 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20 20  .pFree = p;.    
41a0: 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65    p = (Lookaside
41b0: 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b  Slot*)&((u8*)p)[
41c0: 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  sz];.    }.    d
41d0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e  b->lookaside.pEn
41e0: 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = p;.    db->l
41f0: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
4200: 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 1;.    db->l
4210: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
4220: 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a  ed = pBuf==0 ?1:
4230: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
4240: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
4250: 6e 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  nd = 0;.    db->
4260: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
4270: 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ed = 0;.    db->
4280: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
4290: 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ced = 0;.  }.  r
42a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
42b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
42c0: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
42d0: 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
42e0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
42f0: 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74  ..*/.sqlite3_mut
4300: 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d  ex *sqlite3_db_m
4310: 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  utex(sqlite3 *db
4320: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
4330: 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mutex;.}../*.** 
4340: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
4350: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
4360: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
4370: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
4380: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
4390: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
43a0: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
43b0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
43c0: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
43d0: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
43e0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
43f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
4400: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
4410: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
4420: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
4430: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a   void*); /* IMP:
4440: 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a   R-26835-10964 *
4450: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  /.      int sz =
4460: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4470: 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  ;       /* IMP: 
4480: 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f  R-47871-25994 */
4490: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
44a0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
44b0: 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ;      /* IMP: R
44c0: 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a  -04460-53386 */.
44d0: 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70        rc = setup
44e0: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42  Lookaside(db, pB
44f0: 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20  uf, sz, cnt);.  
4500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4510: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
4520: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
4530: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
4540: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
4550: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a   /* The opcode *
4560: 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d 61  /.        u32 ma
4570: 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  sk;    /* Mask o
4580: 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c  f the bit in sql
4590: 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65  ite3.flags to se
45a0: 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20  t/clear */.     
45b0: 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b   } aFlagOp[] = {
45c0: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
45d0: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
45e0: 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54  E_FKEY,    SQLIT
45f0: 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20  E_ForeignKeys   
4600: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
4610: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
4620: 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51  ABLE_TRIGGER, SQ
4630: 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
4640: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  er  },.      };.
4650: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
4660: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
4670: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
4680: 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32  * IMP: R-42790-2
4690: 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f  3372 */.      fo
46a0: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
46b0: 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b  ze(aFlagOp); i++
46c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
46d0: 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70  FlagOp[i].op==op
46e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
46f0: 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67  t onoff = va_arg
4700: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4710: 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d       int *pRes =
4720: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
4730: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
4740: 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e   oldFlags = db->
4750: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
4760: 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a   if( onoff>0 ){.
4770: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
4780: 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70  flags |= aFlagOp
4790: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
47a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
47b0: 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  off==0 ){.      
47c0: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
47d0: 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  &= ~aFlagOp[i].m
47e0: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
47f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
4800: 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61  ldFlags!=db->fla
4810: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
4820: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
4830: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
4840: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
4850: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
4860: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20   pRes ){.       
4870: 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62       *pRes = (db
4880: 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f  ->flags & aFlagO
4890: 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20  p[i].mask)!=0;. 
48a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
48b0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
48c0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  _OK;.          b
48d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
48e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
48f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
4900: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
4910: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
4920: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
4930: 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b  if the buffer z[
4940: 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  0..n-1] contains
4950: 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a   all spaces..*/.
4960: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70  static int allSp
4970: 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  aces(const char 
4980: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68  *z, int n){.  wh
4990: 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
49a0: 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20  1]==' ' ){ n--; 
49b0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b  }.  return n==0;
49c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
49d0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
49e0: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
49f0: 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20   named "BINARY" 
4a00: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a  which is always.
4a10: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ** available..**
4a20: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c  .** If the padFl
4a30: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ag argument is n
4a40: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61  ot NULL then spa
4a50: 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68  ce padding at th
4a60: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69  e end.** of stri
4a70: 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ngs is ignored. 
4a80: 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73   This implements
4a90: 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61   the RTRIM colla
4aa0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
4ab0: 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28  int binCollFunc(
4ac0: 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67  .  void *padFlag
4ad0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
4ae0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
4af0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
4b00: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
4b10: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
4b20: 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
4b30: 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
4b40: 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d  y2;.  rc = memcm
4b50: 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  p(pKey1, pKey2, 
4b60: 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
4b70: 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c  ){.    if( padFl
4b80: 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  ag.     && allSp
4b90: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
4ba0: 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a  y1)+n, nKey1-n).
4bb0: 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65       && allSpace
4bc0: 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29  s(((char*)pKey2)
4bd0: 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20  +n, nKey2-n).   
4be0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61   ){.      /* Lea
4bf0: 76 65 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20  ve rc unchanged 
4c00: 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  at 0 */.    }els
4c10: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b  e{.      rc = nK
4c20: 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20  ey1 - nKey2;.   
4c30: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4c40: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  rc;.}../*.** Ano
4c50: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
4c60: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
4c70: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
4c80: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
4c90: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
4ca0: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
4cb0: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
4cc0: 6e 64 61 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndant.** compari
4cd0: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
4ce0: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
4cf0: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
4d00: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
4d10: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
4d20: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
4d30: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
4d40: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
4d50: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
4d60: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
4d70: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
4d80: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
4d90: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
4da0: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
4db0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
4dc0: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
4dd0: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
4de0: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
4df0: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
4e00: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
4e10: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
4e20: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
4e30: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
4e40: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
4e50: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
4e60: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
4e70: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
4e80: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
4e90: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
4ea0: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
4eb0: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
4ec0: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
4ed0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
4ee0: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
4ef0: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
4f00: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
4f10: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
4f20: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
4f30: 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  lastRowid;.}../*
4f40: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
4f50: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
4f60: 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   in the most rec
4f70: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
4f80: 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69  te3_exec()..*/.i
4f90: 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  nt sqlite3_chang
4fa0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
4fb0: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
4fc0: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
4fd0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
4fe0: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
4ff0: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
5000: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
5010: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5020: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
5030: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
5040: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61  return db->nTota
5050: 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  lChange;.}../*.*
5060: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e  * Close all open
5070: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69   savepoints. Thi
5080: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
5090: 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c  manipulates fiel
50a0: 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ds of the.** dat
50b0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a  abase handle obj
50c0: 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  ect, it does not
50d0: 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70   close any savep
50e0: 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62  oints that may b
50f0: 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65  e open.** at the
5100: 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65   b-tree/pager le
5110: 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  vel..*/.void sql
5120: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
5130: 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
5140: 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70  {.  while( db->p
5150: 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
5160: 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70   Savepoint *pTmp
5170: 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
5180: 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65  t;.    db->pSave
5190: 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e  point = pTmp->pN
51a0: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
51b0: 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29  DbFree(db, pTmp)
51c0: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76  ;.  }.  db->nSav
51d0: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62  epoint = 0;.  db
51e0: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
51f0: 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61  ;.  db->isTransa
5200: 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
5210: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   0;.}../*.** Inv
5220: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
5230: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f  or function asso
5240: 63 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63  ciated with Func
5250: 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45  Def p, if any. E
5260: 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69  xcept,.** if thi
5270: 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  s is not the las
5280: 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75  t copy of the fu
5290: 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69  nction, do not i
52a0: 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70  nvoke it. Multip
52b0: 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20  le.** copies of 
52c0: 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f  a single functio
52d0: 6e 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68  n are created wh
52e0: 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69  en create_functi
52f0: 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a  on() is called.*
5300: 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e  * with SQLITE_AN
5310: 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  Y as the encodin
5320: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
5330: 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f  d functionDestro
5340: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  y(sqlite3 *db, F
5350: 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75  uncDef *p){.  Fu
5360: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
5370: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70  estructor = p->p
5380: 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66  Destructor;.  if
5390: 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ( pDestructor ){
53a0: 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72  .    pDestructor
53b0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
53c0: 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e  ( pDestructor->n
53d0: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
53e0: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65  pDestructor->xDe
53f0: 73 74 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f  stroy(pDestructo
5400: 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20  r->pUserData);. 
5410: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5420: 65 65 28 64 62 2c 20 70 44 65 73 74 72 75 63 74  ee(db, pDestruct
5430: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  or);.    }.  }.}
5440: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
5450: 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65   existing SQLite
5460: 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 69 6e 74   database.*/.int
5470: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73   sqlite3_close(s
5480: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48  qlite3 *db){.  H
5490: 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20  ashElem *i;     
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
54b0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69 74 65  * Hash table ite
54c0: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a  rator */.  int j
54d0: 3b 0a 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  ;..  if( !db ){.
54e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
54f0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
5500: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
5510: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
5520: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
5530: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
5540: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
5550: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
5560: 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f  mutex);..  /* Fo
5570: 72 63 65 20 78 44 65 73 74 72 6f 79 20 63 61 6c  rce xDestroy cal
5580: 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61  ls on all virtua
5590: 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 73 71  l tables */.  sq
55a0: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
55b0: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d 31 29  alSchema(db, -1)
55c0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61  ;..  /* If a tra
55d0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
55e0: 2c 20 74 68 65 20 52 65 73 65 74 49 6e 74 65 72  , the ResetInter
55f0: 6e 61 6c 53 63 68 65 6d 61 28 29 20 63 61 6c 6c  nalSchema() call
5600: 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c   above.  ** will
5610: 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64   not have called
5620: 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74   the xDisconnect
5630: 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79  () method on any
5640: 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61   virtual.  ** ta
5650: 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e  bles in the db->
5660: 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e  aVTrans[] array.
5670: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
5680: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
5690: 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77  ck().  ** call w
56a0: 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65  ill do so. We ne
56b0: 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ed to do this be
56c0: 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20 66  fore the check f
56d0: 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53  or active.  ** S
56e0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65  QL statements be
56f0: 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61  low, as the v-ta
5700: 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ble implementati
5710: 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e  on may be storin
5720: 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70  g.  ** some prep
5730: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
5740: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f  internally..  */
5750: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
5760: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f  llback(db);..  /
5770: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
5780: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 56  ny outstanding V
5790: 4d 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  Ms, return SQLIT
57a0: 45 5f 42 55 53 59 2e 20 2a 2f 0a 20 20 69 66 28  E_BUSY. */.  if(
57b0: 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20   db->pVdbe ){.  
57c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
57d0: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
57e0: 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65  .        "unable
57f0: 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f   to close due to
5800: 20 75 6e 66 69 6e 61 6c 69 73 65 64 20 73 74 61   unfinalised sta
5810: 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 73  tements");.    s
5820: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
5830: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
5840: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5850: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 61 73 73  _BUSY;.  }.  ass
5860: 65 72 74 28 20 73 71 6c 69 74 65 33 53 61 66 65  ert( sqlite3Safe
5870: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
5880: 64 62 29 20 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d  db) );..  for(j=
5890: 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b  0; j<db->nDb; j+
58a0: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
58b0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  Bt = db->aDb[j].
58c0: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
58d0: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
58e0: 49 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20  IsInBackup(pBt) 
58f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5900: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
5910: 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20  _BUSY, .        
5920: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f    "unable to clo
5930: 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 69  se due to unfini
5940: 73 68 65 64 20 62 61 63 6b 75 70 20 6f 70 65 72  shed backup oper
5950: 61 74 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 73  ation");.      s
5960: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
5970: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
5980: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
5990: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
59a0: 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e   }..  /* Free an
59b0: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61  y outstanding Sa
59c0: 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
59d0: 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  es. */.  sqlite3
59e0: 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
59f0: 64 62 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  db);..  for(j=0;
5a00: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
5a10: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
5a20: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
5a30: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  j];.    if( pDb-
5a40: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71  >pBt ){.      sq
5a50: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
5a60: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20  pDb->pBt);.     
5a70: 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20   pDb->pBt = 0;. 
5a80: 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b       if( j!=1 ){
5a90: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53  .        pDb->pS
5aa0: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20  chema = 0;.     
5ab0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
5ac0: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
5ad0: 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d 31  nalSchema(db, -1
5ae0: 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68  );..  /* Tell th
5af0: 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79  e code in notify
5b00: 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e  .c that the conn
5b10: 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72  ection no longer
5b20: 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20   holds any.  ** 
5b30: 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e  locks and does n
5b40: 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20 66  ot require any f
5b50: 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f  urther unlock-no
5b60: 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
5b70: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f    */.  sqlite3Co
5b80: 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64  nnectionClosed(d
5b90: 62 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  b);..  assert( d
5ba0: 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61  b->nDb<=2 );.  a
5bb0: 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d  ssert( db->aDb==
5bc0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b  db->aDbStatic );
5bd0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72  .  for(j=0; j<Ar
5be0: 72 61 79 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e  raySize(db->aFun
5bf0: 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  c.a); j++){.    
5c00: 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20  FuncDef *pNext, 
5c10: 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20  *pHash, *p;.    
5c20: 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e  for(p=db->aFunc.
5c30: 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68  a[j]; p; p=pHash
5c40: 29 7b 0a 20 20 20 20 20 20 70 48 61 73 68 20 3d  ){.      pHash =
5c50: 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 20   p->pHash;.     
5c60: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
5c70: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73       functionDes
5c80: 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20  troy(db, p);.   
5c90: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e       pNext = p->
5ca0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73  pNext;.        s
5cb0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5cc0: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d   p);.        p =
5cd0: 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a   pNext;.      }.
5ce0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
5cf0: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
5d00: 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
5d10: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
5d20: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43  hNext(i)){.    C
5d30: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
5d40: 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74  (CollSeq *)sqlit
5d50: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
5d60: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20    /* Invoke any 
5d70: 64 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69  destructors regi
5d80: 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61  stered for colla
5d90: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
5da0: 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  er data. */.    
5db0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b  for(j=0; j<3; j+
5dc0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  +){.      if( pC
5dd0: 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20  oll[j].xDel ){. 
5de0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e         pColl[j].
5df0: 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55  xDel(pColl[j].pU
5e00: 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ser);.      }.  
5e10: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
5e20: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29  bFree(db, pColl)
5e30: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
5e40: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43  ashClear(&db->aC
5e50: 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66  ollSeq);.#ifndef
5e60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
5e70: 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28  TUALTABLE.  for(
5e80: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
5e90: 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
5ea0: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
5eb0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f  Next(i)){.    Mo
5ec0: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
5ed0: 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  dule *)sqliteHas
5ee0: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
5ef0: 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79  ( pMod->xDestroy
5f00: 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e   ){.      pMod->
5f10: 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70  xDestroy(pMod->p
5f20: 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Aux);.    }.    
5f30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5f40: 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73  , pMod);.  }.  s
5f50: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
5f60: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23  &db->aModule);.#
5f70: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
5f80: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
5f90: 5f 4f 4b 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c  _OK, 0); /* Deal
5fa0: 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63 68  locates any cach
5fb0: 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73  ed error strings
5fc0: 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70  . */.  if( db->p
5fd0: 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
5fe0: 65 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e  e3ValueFree(db->
5ff0: 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pErr);.  }.  sql
6000: 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69  ite3CloseExtensi
6010: 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e  ons(db);..  db->
6020: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
6030: 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f  AGIC_ERROR;..  /
6040: 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62  * The temp-datab
6050: 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c  ase schema is al
6060: 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e  located differen
6070: 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  tly from the oth
6080: 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f  er schema.  ** o
6090: 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71  bjects (using sq
60a0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72  liteMalloc() dir
60b0: 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f  ectly, instead o
60c0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  f sqlite3BtreeSc
60d0: 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f  hema())..  ** So
60e0: 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
60f0: 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f  freed here. Todo
6100: 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74  : Why not roll t
6110: 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69  he temp schema i
6120: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d  nto.  ** the sam
6130: 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  e sqliteMalloc()
6140: 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74   as the one that
6150: 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64   allocates the d
6160: 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74  atabase .  ** st
6170: 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20  ructure?.  */.  
6180: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
6190: 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  , db->aDb[1].pSc
61a0: 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
61b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
61c0: 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d  >mutex);.  db->m
61d0: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
61e0: 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71  GIC_CLOSED;.  sq
61f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
6200: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
6210: 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61  ssert( db->looka
6220: 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20  side.nOut==0 ); 
6230: 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c   /* Fails on a l
6240: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20  ookaside memory 
6250: 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62  leak */.  if( db
6260: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
6270: 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  loced ){.    sql
6280: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f  ite3_free(db->lo
6290: 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b  okaside.pStart);
62a0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
62b0: 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 52 52 0a  TE_ENABLE_SQLRR.
62c0: 20 20 53 52 52 65 63 43 6c 6f 73 65 28 64 62 29    SRRecClose(db)
62d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 71  ;.#endif.  .  sq
62e0: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a  lite3_free(db);.
62f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6300: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  OK;.}../*.** Rol
6310: 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61  lback all databa
6320: 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69  se files..*/.voi
6330: 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
6340: 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  kAll(sqlite3 *db
6350: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
6360: 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20  t inTrans = 0;. 
6370: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6380: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
6390: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
63a0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
63b0: 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d  lloc();.  for(i=
63c0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
63d0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  +){.    if( db->
63e0: 61 44 62 5b 69 5d 2e 70 42 74 20 29 7b 0a 20 20  aDb[i].pBt ){.  
63f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
6400: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 64 62  treeIsInTrans(db
6410: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b  ->aDb[i].pBt) ){
6420: 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73  .        inTrans
6430: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
6440: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
6450: 52 6f 6c 6c 62 61 63 6b 28 64 62 2d 3e 61 44 62  Rollback(db->aDb
6460: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20 20  [i].pBt);.      
6470: 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72 61  db->aDb[i].inTra
6480: 6e 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ns = 0;.    }.  
6490: 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52  }.  sqlite3VtabR
64a0: 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73  ollback(db);.  s
64b0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
64c0: 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20  alloc();..  if( 
64d0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
64e0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
64f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
6500: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
6510: 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73  ments(db);.    s
6520: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
6530: 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d 31  nalSchema(db, -1
6540: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 79  );.  }..  /* Any
6550: 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
6560: 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20  aint violations 
6570: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
6580: 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d  solved. */.  db-
6590: 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
65a0: 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65   0;..  /* If one
65b0: 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67   has been config
65c0: 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65  ured, invoke the
65d0: 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63   rollback-hook c
65e0: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  allback */.  if(
65f0: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
6600: 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61  llback && (inTra
6610: 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43  ns || !db->autoC
6620: 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62  ommit) ){.    db
6630: 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
6640: 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  ack(db->pRollbac
6650: 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  kArg);.  }.}../*
6660: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61  .** Return a sta
6670: 74 69 63 20 73 74 72 69 6e 67 20 74 68 61 74 20  tic string that 
6680: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69  describes the ki
6690: 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63  nd of error spec
66a0: 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
66b0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e  argument..*/.con
66c0: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
66d0: 45 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a  ErrStr(int rc){.
66e0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
66f0: 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b  har* const aMsg[
6700: 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c  ] = {.    /* SQL
6710: 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20  ITE_OK          
6720: 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72  */ "not an error
6730: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6740: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20  _ERROR       */ 
6750: 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72  "SQL logic error
6760: 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61   or missing data
6770: 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  base",.    /* SQ
6780: 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20  LITE_INTERNAL   
6790: 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51   */ 0,.    /* SQ
67a0: 4c 49 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20  LITE_PERM       
67b0: 20 2a 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d   */ "access perm
67c0: 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a  ission denied",.
67d0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42      /* SQLITE_AB
67e0: 4f 52 54 20 20 20 20 20 20 20 2a 2f 20 22 63 61  ORT       */ "ca
67f0: 6c 6c 62 61 63 6b 20 72 65 71 75 65 73 74 65 64  llback requested
6800: 20 71 75 65 72 79 20 61 62 6f 72 74 22 2c 0a 20   query abort",. 
6810: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53     /* SQLITE_BUS
6820: 59 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74  Y        */ "dat
6830: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22  abase is locked"
6840: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6850: 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22  LOCKED      */ "
6860: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69  database table i
6870: 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f  s locked",.    /
6880: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20  * SQLITE_NOMEM  
6890: 20 20 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20       */ "out of 
68a0: 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20  memory",.    /* 
68b0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
68c0: 20 20 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74     */ "attempt t
68d0: 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e  o write a readon
68e0: 6c 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20  ly database",.  
68f0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45    /* SQLITE_INTE
6900: 52 52 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65  RRUPT   */ "inte
6910: 72 72 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a  rrupted",.    /*
6920: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20   SQLITE_IOERR   
6930: 20 20 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f      */ "disk I/O
6940: 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20   error",.    /* 
6950: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20  SQLITE_CORRUPT  
6960: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
6970: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
6980: 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a  lformed",.    /*
6990: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
69a0: 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20      */ "unknown 
69b0: 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20  operation",.    
69c0: 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20  /* SQLITE_FULL  
69d0: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
69e0: 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75  se or disk is fu
69f0: 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ll",.    /* SQLI
6a00: 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a  TE_CANTOPEN    *
6a10: 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  / "unable to ope
6a20: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22  n database file"
6a30: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6a40: 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22  PROTOCOL    */ "
6a50: 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
6a60: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6a70: 5f 45 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20  _EMPTY       */ 
6a80: 22 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20  "table contains 
6a90: 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a  no data",.    /*
6aa0: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20   SQLITE_SCHEMA  
6ab0: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
6ac0: 20 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e   schema has chan
6ad0: 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ged",.    /* SQL
6ae0: 49 54 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20  ITE_TOOBIG      
6af0: 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c  */ "string or bl
6b00: 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20  ob too big",.   
6b10: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   /* SQLITE_CONST
6b20: 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74  RAINT  */ "const
6b30: 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20  raint failed",. 
6b40: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53     /* SQLITE_MIS
6b50: 4d 41 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74  MATCH    */ "dat
6b60: 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c  atype mismatch",
6b70: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  .    /* SQLITE_M
6b80: 49 53 55 53 45 20 20 20 20 20 20 2a 2f 20 22 6c  ISUSE      */ "l
6b90: 69 62 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63  ibrary routine c
6ba0: 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71  alled out of seq
6bb0: 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53  uence",.    /* S
6bc0: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20  QLITE_NOLFS     
6bd0: 20 20 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c 65    */ "large file
6be0: 20 73 75 70 70 6f 72 74 20 69 73 20 64 69 73 61   support is disa
6bf0: 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  bled",.    /* SQ
6c00: 4c 49 54 45 5f 41 55 54 48 20 20 20 20 20 20 20  LITE_AUTH       
6c10: 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69   */ "authorizati
6c20: 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20  on denied",.    
6c30: 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  /* SQLITE_FORMAT
6c40: 20 20 20 20 20 20 2a 2f 20 22 61 75 78 69 6c 69        */ "auxili
6c50: 61 72 79 20 64 61 74 61 62 61 73 65 20 66 6f 72  ary database for
6c60: 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  mat error",.    
6c70: 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20  /* SQLITE_RANGE 
6c80: 20 20 20 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f        */ "bind o
6c90: 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f  r column index o
6ca0: 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20  ut of range",.  
6cb0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41    /* SQLITE_NOTA
6cc0: 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65  DB      */ "file
6cd0: 20 69 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72   is encrypted or
6ce0: 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61   is not a databa
6cf0: 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 72 63 20 26  se",.  };.  rc &
6d00: 3d 20 30 78 66 66 3b 0a 20 20 69 66 28 20 41 4c  = 0xff;.  if( AL
6d10: 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72  WAYS(rc>=0) && r
6d20: 63 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 61  c<(int)(sizeof(a
6d30: 4d 73 67 29 2f 73 69 7a 65 6f 66 28 61 4d 73 67  Msg)/sizeof(aMsg
6d40: 5b 30 5d 29 29 20 26 26 20 61 4d 73 67 5b 72 63  [0])) && aMsg[rc
6d50: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ]!=0 ){.    retu
6d60: 72 6e 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 7d  rn aMsg[rc];.  }
6d70: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6d80: 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22   "unknown error"
6d90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
6da0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
6db0: 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61  ements a busy ca
6dc0: 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65  llback that slee
6dd0: 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20  ps and tries.** 
6de0: 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69  again until a ti
6df0: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72  meout value is r
6e00: 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d  eached.  The tim
6e10: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a  eout value is.**
6e20: 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
6e30: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
6e40: 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  ds passed in as 
6e50: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
6e60: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
6e70: 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75   int sqliteDefau
6e80: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a  ltBusyCallback(.
6e90: 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20   void *ptr,     
6ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
6eb0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6ec0: 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20   */. int count  
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ee0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
6ef0: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
6f00: 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53  busy */.){.#if S
6f10: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20  QLITE_OS_WIN || 
6f20: 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53  (defined(HAVE_US
6f30: 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
6f40: 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63 20 63  LEEP).  static c
6f50: 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d  onst u8 delays[]
6f60: 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20   =.     { 1, 2, 
6f70: 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32  5, 10, 15, 20, 2
6f80: 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c  5, 25,  25,  50,
6f90: 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73    50, 100 };.  s
6fa0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74  tatic const u8 t
6fb0: 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  otals[] =.     {
6fc0: 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38   0, 1, 3,  8, 18
6fd0: 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30  , 33, 53, 78, 10
6fe0: 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38  3, 128, 178, 228
6ff0: 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45   };.# define NDE
7000: 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28 64 65  LAY ArraySize(de
7010: 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20  lays).  sqlite3 
7020: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
7030: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
7040: 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69  out = db->busyTi
7050: 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c  meout;.  int del
7060: 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73  ay, prior;..  as
7070: 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29  sert( count>=0 )
7080: 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20  ;.  if( count < 
7090: 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65  NDELAY ){.    de
70a0: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75  lay = delays[cou
70b0: 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  nt];.    prior =
70c0: 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a   totals[count];.
70d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c    }else{.    del
70e0: 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c  ay = delays[NDEL
70f0: 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72  AY-1];.    prior
7100: 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59   = totals[NDELAY
7110: 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75  -1] + delay*(cou
7120: 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a  nt-(NDELAY-1));.
7130: 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20    }.  if( prior 
7140: 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75  + delay > timeou
7150: 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  t ){.    delay =
7160: 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72   timeout - prior
7170: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c  ;.    if( delay<
7180: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7190: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
71a0: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65  eep(db->pVfs, de
71b0: 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  lay*1000);.  ret
71c0: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73  urn 1;.#else.  s
71d0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
71e0: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
71f0: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73  nt timeout = ((s
7200: 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62  qlite3 *)ptr)->b
7210: 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66  usyTimeout;.  if
7220: 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30  ( (count+1)*1000
7230: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
7240: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7250: 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70    sqlite3OsSleep
7260: 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30  (db->pVfs, 10000
7270: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
7280: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
7290: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
72a0: 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a  n busy handler..
72b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
72c0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
72d0: 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66  n an operation f
72e0: 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63  ailed with a loc
72f0: 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  k..** If this ro
7300: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f  utine returns no
7310: 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
7320: 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66   is retried.  If
7330: 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30   it.** returns 0
7340: 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  , the operation 
7350: 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53  aborts with an S
7360: 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
7370: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7380: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
7390: 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  r(BusyHandler *p
73a0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
73b0: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c  f( NEVER(p==0) |
73c0: 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c  | p->xFunc==0 ||
73d0: 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65   p->nBusy<0 ) re
73e0: 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70  turn 0;.  rc = p
73f0: 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c  ->xFunc(p->pArg,
7400: 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66   p->nBusy);.  if
7410: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc==0 ){.    p
7420: 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20  ->nBusy = -1;.  
7430: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42  }else{.    p->nB
7440: 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  usy++;.  }.  ret
7450: 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  urn rc; .}../*.*
7460: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
7470: 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c  ets the busy cal
7480: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
7490: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
74a0: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
74b0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
74c0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
74d0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
74e0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
74f0: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
7500: 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  db,.  int (*xBus
7510: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20  y)(void*,int),. 
7520: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
7530: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
7540: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
7550: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
7560: 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79  er.xFunc = xBusy
7570: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
7580: 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b  ler.pArg = pArg;
7590: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
75a0: 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
75b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
75c0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
75d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
75e0: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
75f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
7600: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
7610: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7620: 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73  sets the progres
7630: 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  s callback for a
7640: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
7650: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
7660: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
7670: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
7680: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  en argument. The
7690: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
76a0: 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e  ck will.** be in
76b0: 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73  voked every nOps
76c0: 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69   opcodes..*/.voi
76d0: 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65  d sqlite3_progre
76e0: 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  ss_handler(.  sq
76f0: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
7700: 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a  t nOps,.  int (*
7710: 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a  xProgress)(void*
7720: 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ), .  void *pArg
7730: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
7740: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
7750: 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73  tex);.  if( nOps
7760: 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50  >0 ){.    db->xP
7770: 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72  rogress = xProgr
7780: 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  ess;.    db->nPr
7790: 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f 70 73  ogressOps = nOps
77a0: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
77b0: 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  essArg = pArg;. 
77c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
77d0: 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  xProgress = 0;. 
77e0: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
77f0: 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  Ops = 0;.    db-
7800: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
7810: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
7820: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
7830: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
7840: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
7850: 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20  outine installs 
7860: 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68  a default busy h
7870: 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74  andler that wait
7880: 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65  s for the.** spe
7890: 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66  cified number of
78a0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65   milliseconds be
78b0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30  fore returning 0
78c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
78d0: 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71  _busy_timeout(sq
78e0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d  lite3 *db, int m
78f0: 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20 29  s){.  if( ms>0 )
7900: 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69  {.    db->busyTi
7910: 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 20 20  meout = ms;.    
7920: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
7930: 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44  dler(db, sqliteD
7940: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
7950: 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a  ck, (void*)db);.
7960: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
7970: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
7980: 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  r(db, 0, 0);.  }
7990: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
79a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  _OK;.}../*.** Ca
79b0: 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20  use any pending 
79c0: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f  operation to sto
79d0: 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73  p at its earlies
79e0: 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a  t opportunity..*
79f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69  /.void sqlite3_i
7a00: 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33  nterrupt(sqlite3
7a10: 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31 2e   *db){.  db->u1.
7a20: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20  isInterrupted = 
7a30: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  1;.}.../*.** Thi
7a40: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78  s function is ex
7a50: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61  actly the same a
7a60: 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  s sqlite3_create
7a70: 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63  _function(), exc
7a80: 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ept.** that it i
7a90: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65  s designed to be
7aa0: 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72   called by inter
7ab0: 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69  nal code. The di
7ac0: 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74  fference is.** t
7ad0: 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  hat if a malloc(
7ae0: 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74  ) fails in sqlit
7af0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7b00: 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63  on(), an error c
7b10: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ode.** is return
7b20: 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f  ed and the mallo
7b30: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65  cFailed flag cle
7b40: 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  ared. .*/.int sq
7b50: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
7b60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
7b70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
7b80: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69  unctionName,.  i
7b90: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
7ba0: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65  nc,.  void *pUse
7bb0: 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a  rData,.  void (*
7bc0: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
7bd0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
7be0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
7bf0: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
7c00: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
7c10: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
7c20: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
7c30: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
7c40: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e  context*),.  Fun
7c50: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65  cDestructor *pDe
7c60: 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75  structor.){.  Fu
7c70: 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20  ncDef *p;.  int 
7c80: 6e 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65 72 74  nName;..  assert
7c90: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7ca0: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
7cb0: 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69  );.  if( zFuncti
7cc0: 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20  onName==0 ||.   
7cd0: 20 20 20 28 78 46 75 6e 63 20 26 26 20 28 78 46     (xFunc && (xF
7ce0: 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29 29 20  inal || xStep)) 
7cf0: 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46 75 6e  || .      (!xFun
7d00: 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26 26 20  c && (xFinal && 
7d10: 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20  !xStep)) ||.    
7d20: 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 21 78    (!xFunc && (!x
7d30: 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70 29 29  Final && xStep))
7d40: 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72 67 3c   ||.      (nArg<
7d50: 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54  -1 || nArg>SQLIT
7d60: 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
7d70: 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28 32 35  RG) ||.      (25
7d80: 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  5<(nName = sqlit
7d90: 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e  e3Strlen30( zFun
7da0: 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a  ctionName))) ){.
7db0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7dc0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
7dd0: 20 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51   }.  .#ifndef SQ
7de0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
7df0: 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55    /* If SQLITE_U
7e00: 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65  TF16 is specifie
7e10: 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  d as the encodin
7e20: 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72  g type, transfor
7e30: 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f  m this.  ** to o
7e40: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
7e50: 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
7e60: 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65  TF16BE using the
7e70: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  .  ** SQLITE_UTF
7e80: 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20  16NATIVE macro. 
7e90: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
7ea0: 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
7eb0: 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  lly..  **.  ** I
7ec0: 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20  f SQLITE_ANY is 
7ed0: 73 70 65 63 69 66 69 65 64 2c 20 61 64 64 20 74  specified, add t
7ee0: 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  hree versions of
7ef0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20   the function.  
7f00: 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20 74  ** to the hash t
7f10: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
7f20: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46   enc==SQLITE_UTF
7f30: 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20  16 ){.    enc = 
7f40: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
7f50: 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  VE;.  }else if( 
7f60: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20  enc==SQLITE_ANY 
7f70: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
7f80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
7f90: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
7fa0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
7fb0: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
7fc0: 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61           pUserDa
7fd0: 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70  ta, xFunc, xStep
7fe0: 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72  , xFinal, pDestr
7ff0: 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  uctor);.    if( 
8000: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8010: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
8020: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
8030: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
8040: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
8050: 46 31 36 4c 45 2c 0a 20 20 20 20 20 20 20 20 20  F16LE,.         
8060: 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e   pUserData, xFun
8070: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
8080: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
8090: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
80a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
80b0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
80c0: 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20      }.    enc = 
80d0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a  SQLITE_UTF16BE;.
80e0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20    }.#else.  enc 
80f0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
8100: 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68  endif.  .  /* Ch
8110: 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69  eck if an existi
8120: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  ng function is b
8130: 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20  eing overridden 
8140: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73  or deleted. If s
8150: 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72  o,.  ** and ther
8160: 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
8170: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51  , then return SQ
8180: 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20  LITE_BUSY. If a 
8190: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
81a0: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
81b0: 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68  n/deleted but th
81c0: 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76  ere are no activ
81d0: 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65  e VMs, allow the
81e0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  .  ** operation 
81f0: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20  to continue but 
8200: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
8210: 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  recompiled state
8220: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20  ments..  */.  p 
8230: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
8240: 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74  ction(db, zFunct
8250: 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  ionName, nName, 
8260: 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30  nArg, (u8)enc, 0
8270: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
8280: 3e 69 50 72 65 66 45 6e 63 3d 3d 65 6e 63 20 26  >iPrefEnc==enc &
8290: 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20  & p->nArg==nArg 
82a0: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  ){.    if( db->a
82b0: 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a  ctiveVdbeCnt ){.
82c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
82d0: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
82e0: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
82f0: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
8300: 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74  odify user-funct
8310: 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76  ion due to activ
8320: 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
8330: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
8340: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8350: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8360: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
8370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
8380: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
8390: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
83a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
83b0: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
83c0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
83d0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
83e0: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
83f0: 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20   1);.  assert(p 
8400: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
8410: 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29  led);.  if( !p )
8420: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8430: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
8440: 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72    /* If an older
8450: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
8460: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20  function with a 
8470: 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72  configured destr
8480: 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65  uctor is.  ** be
8490: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76  ing replaced inv
84a0: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
84b0: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65  or function here
84c0: 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44  . */.  functionD
84d0: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a  estroy(db, p);..
84e0: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
84f0: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
8500: 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ctor->nRef++;.  
8510: 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74  }.  p->pDestruct
8520: 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72  or = pDestructor
8530: 3b 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 30  ;.  p->flags = 0
8540: 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78  ;.  p->xFunc = x
8550: 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70  Func;.  p->xStep
8560: 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78   = xStep;.  p->x
8570: 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61  Finalize = xFina
8580: 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74  l;.  p->pUserDat
8590: 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20  a = pUserData;. 
85a0: 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29   p->nArg = (u16)
85b0: 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53  nArg;.  return S
85c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
85d0: 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73  ** Create new us
85e0: 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  er functions..*/
85f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
8600: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
8610: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
8620: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
8630: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
8640: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
8650: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  *p,.  void (*xFu
8660: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
8670: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
8680: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
8690: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
86a0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
86b0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
86c0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
86d0: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
86e0: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75  text*).){.  retu
86f0: 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
8700: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
8710: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
8720: 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  nc, p, xFunc, xS
8730: 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tep,.           
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8750: 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c           xFinal,
8760: 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69   0);.}..int sqli
8770: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8780: 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
8790: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
87a0: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
87b0: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
87c0: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
87d0: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
87e0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
87f0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
8800: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
8810: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
8820: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
8830: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
8840: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
8850: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
8860: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  ,.  void (*xDest
8870: 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a  roy)(void *).){.
8880: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
8890: 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44  E_ERROR;.  FuncD
88a0: 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20  estructor *pArg 
88b0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
88c0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
88d0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65  utex);.  if( xDe
88e0: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72  stroy ){.    pAr
88f0: 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63  g = (FuncDestruc
8900: 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  tor *)sqlite3DbM
8910: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
8920: 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63  zeof(FuncDestruc
8930: 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  tor));.    if( !
8940: 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44  pArg ){.      xD
8950: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20  estroy(p);.     
8960: 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d   goto out;.    }
8970: 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74  .    pArg->xDest
8980: 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a  roy = xDestroy;.
8990: 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44      pArg->pUserD
89a0: 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72  ata = p;.  }.  r
89b0: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
89c0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c  eFunc(db, zFunc,
89d0: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
89e0: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
89f0: 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66  nal, pArg);.  if
8a00: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
8a10: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nRef==0 ){.    a
8a20: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
8a30: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73  E_OK );.    xDes
8a40: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c  troy(p);.    sql
8a50: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8a60: 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a  Arg);.  }.. out:
8a70: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
8a80: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
8a90: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
8aa0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
8ab0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
8ac0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8ad0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20  _OMIT_UTF16.int 
8ae0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
8af0: 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  unction16(.  sql
8b00: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
8b10: 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f  t void *zFunctio
8b20: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
8b30: 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  g,.  int eTextRe
8b40: 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  p,.  void *p,.  
8b50: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
8b60: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
8b70: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
8b80: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
8b90: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
8ba0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
8bb0: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
8bc0: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
8bd0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
8be0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
8bf0: 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71  ar *zFunc8;.  sq
8c00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
8c10: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
8c20: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
8c30: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
8c40: 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55  Func8 = sqlite3U
8c50: 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e  tf16to8(db, zFun
8c60: 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53  ctionName, -1, S
8c70: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
8c80: 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  E);.  rc = sqlit
8c90: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
8ca0: 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65   zFunc8, nArg, e
8cb0: 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46 75 6e  TextRep, p, xFun
8cc0: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
8cd0: 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ,0);.  sqlite3Db
8ce0: 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29  Free(db, zFunc8)
8cf0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8d00: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
8d10: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8d20: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
8d30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
8d40: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
8d50: 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
8d60: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
8d70: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
8d80: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
8d90: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
8da0: 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
8db0: 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
8dc0: 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
8dd0: 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
8de0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
8df0: 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
8e00: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
8e10: 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
8e20: 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
8e30: 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
8e40: 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
8e50: 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
8e60: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
8e70: 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
8e80: 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
8e90: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
8ea0: 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
8eb0: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
8ec0: 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
8ed0: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
8ee0: 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
8ef0: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
8f00: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
8f10: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
8f20: 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
8f30: 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
8f40: 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
8f50: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
8f60: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
8f70: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
8f80: 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
8f90: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
8fa0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
8fb0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
8fc0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
8fd0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
8fe0: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  ( sqlite3FindFun
8ff0: 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ction(db, zName,
9000: 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51   nName, nArg, SQ
9010: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30  LITE_UTF8, 0)==0
9020: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
9030: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e  reateFunc(db, zN
9040: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
9050: 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20  E_UTF8,.        
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
9070: 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46   sqlite3InvalidF
9080: 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  unction, 0, 0, 0
9090: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
90a0: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
90b0: 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73   SQLITE_OK);.  s
90c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
90d0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
90e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
90f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9100: 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52  IT_TRACE./*.** R
9110: 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20  egister a trace 
9120: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  function.  The p
9130: 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65  Arg from the pre
9140: 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
9150: 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72  ed trace.** is r
9160: 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a  eturned.  .**.**
9170: 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75   A NULL trace fu
9180: 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  nction means tha
9190: 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20  t no tracing is 
91a0: 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e  executes.  A non
91b0: 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69  -NULL.** trace i
91c0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
91d0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
91e0: 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
91f0: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a   start of each.*
9200: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  * SQL statement.
9210: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
9220: 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20  3_trace(sqlite3 
9230: 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61  *db, void (*xTra
9240: 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  ce)(void*,const 
9250: 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41  char*), void *pA
9260: 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  rg){.  void *pOl
9270: 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  d;.  sqlite3_mut
9280: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
9290: 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62  ex);.  pOld = db
92a0: 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64  ->pTraceArg;.  d
92b0: 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61  b->xTrace = xTra
92c0: 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65  ce;.  db->pTrace
92d0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
92e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
92f0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
9300: 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f  return pOld;.}./
9310: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
9320: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
9330: 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d  .  The pArg from
9340: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
9350: 72 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70  registered .** p
9360: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20  rofile function 
9370: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a  is returned.  .*
9380: 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66  *.** A NULL prof
9390: 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61  ile function mea
93a0: 6e 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69  ns that no profi
93b0: 6c 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73  ling is executes
93c0: 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  .  A non-NULL.**
93d0: 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f   profile is a po
93e0: 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
93f0: 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f  ion that is invo
9400: 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  ked at the concl
9410: 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68  usion of.** each
9420: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
9430: 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76  hat is run..*/.v
9440: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f  oid *sqlite3_pro
9450: 66 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20  file(.  sqlite3 
9460: 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50  *db,.  void (*xP
9470: 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f  rofile)(void*,co
9480: 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65  nst char*,sqlite
9490: 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64  _uint64),.  void
94a0: 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64   *pArg.){.  void
94b0: 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65   *pOld;.  sqlite
94c0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
94d0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
94e0: 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41   = db->pProfileA
94f0: 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69  rg;.  db->xProfi
9500: 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20  le = xProfile;. 
9510: 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67   db->pProfileArg
9520: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
9530: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
9540: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
9550: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64  urn pOld;.}.#end
9560: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
9570: 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a  T_TRACE */../***
9580: 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 2a 2a   EXPERIMENTAL **
9590: 2a 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  *.**.** Register
95a0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62   a function to b
95b0: 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61  e invoked when a
95c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
95d0: 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65  ments..** If the
95e0: 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f   invoked functio
95f0: 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  n returns non-ze
9600: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d  ro, then the com
9610: 6d 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a  mit becomes a.**
9620: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f   rollback..*/.vo
9630: 69 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d  id *sqlite3_comm
9640: 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  it_hook(.  sqlit
9650: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
9660: 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
9670: 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
9680: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
9690: 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  t (*xCallback)(v
96a0: 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74  oid*),  /* Funct
96b0: 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e  ion to invoke on
96c0: 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a   each commit */.
96d0: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
96f0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
9700: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
9710: 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71  void *pOld;.  sq
9720: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
9730: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
9740: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d  pOld = db->pComm
9750: 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f  itArg;.  db->xCo
9760: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78  mmitCallback = x
9770: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
9780: 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72  pCommitArg = pAr
9790: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
97a0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
97b0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
97c0: 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  ld;.}../*.** Reg
97d0: 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
97e0: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
97f0: 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69  ach time a row i
9800: 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e  s updated,.** in
9810: 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65  serted or delete
9820: 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74  d using this dat
9830: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
9840: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
9850: 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a  e3_update_hook(.
9860: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
9870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9880: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
9890: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
98a0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
98b0: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74  lback)(void*,int
98c0: 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68  ,char const *,ch
98d0: 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74  ar const *,sqlit
98e0: 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64  e_int64),.  void
98f0: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
9900: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
9910: 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
9920: 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
9930: 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pRet;.  sqlite3_
9940: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
9950: 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
9960: 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b   db->pUpdateArg;
9970: 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61  .  db->xUpdateCa
9980: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
9990: 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74  ck;.  db->pUpdat
99a0: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
99b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
99c0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
99d0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
99e0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
99f0: 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
9a00: 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
9a10: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
9a20: 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   is rolled.** ba
9a30: 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ck by this datab
9a40: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
9a50: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
9a60: 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a  _rollback_hook(.
9a70: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9a90: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
9aa0: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
9ab0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
9ac0: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f  lback)(void*), /
9ad0: 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  * Callback funct
9ae0: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
9af0: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
9b00: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
9b10: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
9b20: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
9b30: 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  t;.  sqlite3_mut
9b40: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
9b50: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
9b60: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a  ->pRollbackArg;.
9b70: 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43    db->xRollbackC
9b80: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
9b90: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c  ack;.  db->pRoll
9ba0: 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a  backArg = pArg;.
9bb0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9bc0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
9bd0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
9be0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
9bf0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
9c00: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61  * The sqlite3_wa
9c10: 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63  l_hook() callbac
9c20: 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20  k registered by 
9c30: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
9c40: 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a  checkpoint()..**
9c50: 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f   Invoke sqlite3_
9c60: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69  wal_checkpoint i
9c70: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
9c80: 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f  frames in the lo
9c90: 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65  g file.** is gre
9ca0: 61 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65  ater than sqlite
9cb0: 33 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20 74  3.pWalArg cast t
9cc0: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68  o an integer (th
9cd0: 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72  e value configur
9ce0: 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74  ed by.** wal_aut
9cf0: 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a  ocheckpoint())..
9d00: 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  */ .int sqlite3W
9d10: 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20  alDefaultHook(. 
9d20: 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61   void *pClientDa
9d30: 74 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  ta,     /* Argum
9d40: 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ent */.  sqlite3
9d50: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
9d60: 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  /* Connection */
9d70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9d80: 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74  Db,       /* Dat
9d90: 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
9da0: 46 72 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  Frame           
9db0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c    /* Size of WAL
9dc0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72   */.){.  if( nFr
9dd0: 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f  ame>=SQLITE_PTR_
9de0: 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61  TO_INT(pClientDa
9df0: 74 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ta) ){.    sqlit
9e00: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
9e10: 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  loc();.    sqlit
9e20: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
9e30: 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20  t(db, zDb);.    
9e40: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
9e50: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20  Malloc();.  }.  
9e60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9e70: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9e80: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
9e90: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ../*.** Configur
9ea0: 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c  e an sqlite3_wal
9eb0: 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b  _hook() callback
9ec0: 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   to automaticall
9ed0: 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  y checkpoint.** 
9ee0: 61 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  a database after
9ef0: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
9f00: 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
9f10: 72 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72  re are nFrame or
9f20: 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20  .** more frames 
9f30: 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  in the log file.
9f40: 20 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72   Passing zero or
9f50: 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   a negative valu
9f60: 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61  e as the.** nFra
9f70: 6d 65 20 70 61 72 61 6d 65 74 65 72 20 64 69 73  me parameter dis
9f80: 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20  ables automatic 
9f90: 63 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69  checkpoints enti
9fa0: 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rely..**.** The 
9fb0: 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65  callback registe
9fc0: 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
9fd0: 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e  tion replaces an
9fe0: 79 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62  y existing callb
9ff0: 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65  ack.** registere
a000: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  d using sqlite3_
a010: 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65  wal_hook(). Like
a020: 77 69 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e  wise, registerin
a030: 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  g a callback.** 
a040: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61  using sqlite3_wa
a050: 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65  l_hook() disable
a060: 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  s the automatic 
a070: 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61  checkpoint mecha
a080: 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72  nism.** configur
a090: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
a0a0: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
a0b0: 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  te3_wal_autochec
a0c0: 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
a0d0: 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b  db, int nFrame){
a0e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
a0f0: 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44  MIT_WAL.  UNUSED
a100: 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
a110: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
a120: 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73  ER(nFrame);.#els
a130: 65 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30  e.  if( nFrame>0
a140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
a150: 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c  wal_hook(db, sql
a160: 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f  ite3WalDefaultHo
a170: 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54  ok, SQLITE_INT_T
a180: 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a  O_PTR(nFrame));.
a190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
a1a0: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62  ite3_wal_hook(db
a1b0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
a1c0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
a1d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
a1e0: 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
a1f0: 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
a200: 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74  ed each time a t
a210: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72  ransaction is wr
a220: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68  itten.** into th
a230: 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f  e write-ahead-lo
a240: 67 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  g by this databa
a250: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
a260: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
a270: 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  wal_hook(.  sqli
a280: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
a290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
a2a0: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
a2b0: 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65  o this db handle
a2c0: 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c   */.  int(*xCall
a2d0: 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71  back)(void *, sq
a2e0: 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68  lite3*, const ch
a2f0: 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69  ar*, int),.  voi
a300: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a320: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  First argument p
a330: 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61  assed to xCallba
a340: 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  ck() */.){.#ifnd
a350: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
a360: 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b  AL.  void *pRet;
a370: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a380: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
a390: 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
a3a0: 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78  pWalArg;.  db->x
a3b0: 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  WalCallback = xC
a3c0: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
a3d0: 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  WalArg = pArg;. 
a3e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
a3f0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
a400: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
a410: 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30  #else.  return 0
a420: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
a430: 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74  * Checkpoint dat
a440: 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e  abase zDb..*/.in
a450: 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  t sqlite3_wal_ch
a460: 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73  eckpoint_v2(.  s
a470: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a490: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
a4a0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
a4b0: 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20  r *zDb,         
a4c0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
a4d0: 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  f attached datab
a4e0: 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ase (or NULL) */
a4f0: 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20  .  int eMode,   
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45     /* SQLITE_CHE
a520: 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20  CKPOINT_* value 
a530: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c  */.  int *pnLog,
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a       /* OUT: Siz
a560: 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20  e of WAL log in 
a570: 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20  frames */.  int 
a580: 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20  *pnCkpt         
a590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
a5a0: 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72  UT: Total number
a5b0: 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b   of frames check
a5c0: 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69  pointed */.){.#i
a5d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
a5e0: 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51  _WAL.  return SQ
a5f0: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
a600: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a620: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
a630: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53  */.  int iDb = S
a640: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
a650: 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e  ED;  /* sqlite3.
a660: 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64  aDb[] index of d
a670: 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20  b to checkpoint 
a680: 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  */..  /* Initial
a690: 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 76  ize the output v
a6a0: 61 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69  ariables to -1 i
a6b0: 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
a6c0: 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28  occurs. */.  if(
a6d0: 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20   pnLog ) *pnLog 
a6e0: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b  = -1;.  if( pnCk
a6f0: 70 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d  pt ) *pnCkpt = -
a700: 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51  1;..  assert( SQ
a710: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
a720: 46 55 4c 4c 3e 53 51 4c 49 54 45 5f 43 48 45 43  FULL>SQLITE_CHEC
a730: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 29  KPOINT_PASSIVE )
a740: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
a750: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55  TE_CHECKPOINT_FU
a760: 4c 4c 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  LL<SQLITE_CHECKP
a770: 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a  OINT_RESTART );.
a780: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
a790: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
a7a0: 49 56 45 2b 32 3d 3d 53 51 4c 49 54 45 5f 43 48  IVE+2==SQLITE_CH
a7b0: 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54  ECKPOINT_RESTART
a7c0: 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c   );.  if( eMode<
a7d0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
a7e0: 54 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f  T_PASSIVE || eMo
a7f0: 64 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  de>SQLITE_CHECKP
a800: 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29 7b 0a  OINT_RESTART ){.
a810: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a820: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20  E_MISUSE;.  }.. 
a830: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
a840: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
a850: 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44  .  if( zDb && zD
a860: 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20  b[0] ){.    iDb 
a870: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
a880: 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  ame(db, zDb);.  
a890: 7d 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b  }.  if( iDb<0 ){
a8a0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
a8b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
a8c0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
a8d0: 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e  ITE_ERROR, "unkn
a8e0: 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73  own database: %s
a8f0: 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65  ", zDb);.  }else
a900: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
a910: 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  e3Checkpoint(db,
a920: 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c   iDb, eMode, pnL
a930: 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20  og, pnCkpt);.   
a940: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
a950: 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  , rc, 0);.  }.  
a960: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
a970: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
a980: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
a990: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
a9a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
a9b0: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  if.}.../*.** Che
a9c0: 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65  ckpoint database
a9d0: 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20   zDb. If zDb is 
a9e0: 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20  NULL, or if the 
a9f0: 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74  buffer zDb point
aa00: 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73  s.** to contains
aa10: 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73   a zero-length s
aa20: 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63  tring, all attac
aa30: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72  hed databases ar
aa40: 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74  e .** checkpoint
aa50: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
aa60: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
aa70: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  t(sqlite3 *db, c
aa80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
aa90: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
aaa0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
aab0: 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c  _v2(db, zDb, SQL
aac0: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
aad0: 41 53 53 49 56 45 2c 20 30 2c 20 30 29 3b 0a 7d  ASSIVE, 0, 0);.}
aae0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
aaf0: 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
ab00: 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  Run a checkpoint
ab10: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   on database iDb
ab20: 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
ab30: 70 20 69 66 20 64 61 74 61 62 61 73 65 20 69 44  p if database iD
ab40: 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72  b is.** not curr
ab50: 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41  ently open in WA
ab60: 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  L mode..**.** If
ab70: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
ab80: 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  s open on the da
ab90: 74 61 62 61 73 65 20 62 65 69 6e 67 20 63 68 65  tabase being che
aba0: 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20  ckpointed, this 
abb0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
abc0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  urns SQLITE_LOCK
abd0: 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f  ED and a checkpo
abe0: 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  int is not attem
abf0: 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  pted. If .** an 
ac00: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
ac10: 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  le running the c
ac20: 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51  heckpoint, an SQ
ac30: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
ac40: 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
ac50: 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (i.e. SQLITE_IOE
ac60: 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  RR). Otherwise, 
ac70: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
ac80: 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61   The mutex on da
ac90: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
aca0: 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
acb0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  by the caller. T
acc0: 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f  he mutex.** asso
acd0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
ace0: 73 70 65 63 69 66 69 63 20 62 2d 74 72 65 65 20  specific b-tree 
acf0: 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74  being checkpoint
ad00: 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a  ed is taken by.*
ad10: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
ad20: 77 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70  while the checkp
ad30: 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e  oint is running.
ad40: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73  .**.** If iDb is
ad50: 20 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d   passed SQLITE_M
ad60: 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65  AX_ATTACHED, the
ad70: 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
ad80: 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20  atabases are.** 
ad90: 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66  checkpointed. If
ada0: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
adb0: 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 72  ountered it is r
adc0: 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74  eturned immediat
add0: 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65  ely -.** no atte
ade0: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
adf0: 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65  heckpoint any re
ae00: 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65  maining database
ae10: 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  s..**.** Paramet
ae20: 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20  er eMode is one 
ae30: 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  of SQLITE_CHECKP
ae40: 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55  OINT_PASSIVE, FU
ae50: 4c 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a  LL or RESTART..*
ae60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
ae70: 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20  ckpoint(sqlite3 
ae80: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e  *db, int iDb, in
ae90: 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e  t eMode, int *pn
aea0: 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74  Log, int *pnCkpt
aeb0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
aec0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
aed0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
aee0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ode */.  int i; 
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
af10: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
af20: 75 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73  ugh attached dbs
af30: 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20   */.  int bBusy 
af40: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
af50: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
af60: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73   SQLITE_BUSY has
af70: 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
af80: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
af90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
afa0: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
afb0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f  .  assert( !pnLo
afc0: 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20  g || *pnLog==-1 
afd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e  );.  assert( !pn
afe0: 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d  Ckpt || *pnCkpt=
aff0: 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  =-1 );..  for(i=
b000: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20  0; i<db->nDb && 
b010: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
b020: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d  ++){.    if( i==
b030: 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49  iDb || iDb==SQLI
b040: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20  TE_MAX_ATTACHED 
b050: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
b060: 6c 69 74 65 33 42 74 72 65 65 43 68 65 63 6b 70  lite3BtreeCheckp
b070: 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  oint(db->aDb[i].
b080: 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  pBt, eMode, pnLo
b090: 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
b0a0: 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20    pnLog = 0;.   
b0b0: 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20     pnCkpt = 0;. 
b0c0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
b0d0: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
b0e0: 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20      bBusy = 1;. 
b0f0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
b100: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
b110: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
b120: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
b130: 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20 53 51  K && bBusy) ? SQ
b140: 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a  LITE_BUSY : rc;.
b150: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b160: 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
b170: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b180: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65  ion returns true
b190: 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20   if main-memory 
b1a0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69  should be used i
b1b0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74  nstead of.** a t
b1c0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f  emporary file fo
b1d0: 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65  r transient page
b1e0: 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74  r files and stat
b1f0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a  ement journals..
b200: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
b210: 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e  urned depends on
b220: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62   the value of db
b230: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75  ->temp_store (ru
b240: 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74  ntime.** paramet
b250: 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  er) and the comp
b260: 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f  ile time value o
b270: 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
b280: 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c  ORE. The.** foll
b290: 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
b2a0: 72 69 62 65 73 20 74 68 65 20 72 65 6c 61 74 69  ribes the relati
b2b0: 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 74  onship between t
b2c0: 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a  hese two values.
b2d0: 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ** and this func
b2e0: 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c  tions return val
b2f0: 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49  ue..**.**   SQLI
b300: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20  TE_TEMP_STORE   
b310: 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65    db->temp_store
b320: 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66       Location of
b330: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
b340: 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ase.**   -------
b350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
b360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
b370: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
b380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b390: 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20              any 
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
b3c0: 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
b3d0: 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   0).**   1      
b3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b400: 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
b410: 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20  urn 0).**   1   
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b430: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
b440: 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
b450: 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31  return 1).**   1
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
b480: 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
b490: 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
b4a0: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
b4b0: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
b4c0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
b4d0: 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
b4e0: 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
b4f0: 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
b510: 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
b520: 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  1).**   2       
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b550: 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
b560: 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20  rn 1).**   3    
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b580: 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
b590: 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
b5a0: 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20  eturn 1).*/.int 
b5b0: 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
b5c0: 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65  ory(const sqlite
b5d0: 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49  3 *db){.#if SQLI
b5e0: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31  TE_TEMP_STORE==1
b5f0: 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e  .  return ( db->
b600: 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b  temp_store==2 );
b610: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
b620: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32  TE_TEMP_STORE==2
b630: 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e  .  return ( db->
b640: 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b  temp_store!=1 );
b650: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
b660: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33  TE_TEMP_STORE==3
b670: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
b680: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  dif.#if SQLITE_T
b690: 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53  EMP_STORE<1 || S
b6a0: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
b6b0: 3e 33 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  >3.  return 0;.#
b6c0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
b6d0: 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f  eturn UTF-8 enco
b6e0: 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67  ded English lang
b6f0: 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  uage explanation
b700: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
b710: 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f  ent.** error..*/
b720: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
b730: 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69  ite3_errmsg(sqli
b740: 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73  te3 *db){.  cons
b750: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28  t char *z;.  if(
b760: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
b770: 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  rn sqlite3ErrStr
b780: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  (SQLITE_NOMEM);.
b790: 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
b7a0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
b7b0: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
b7c0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
b7d0: 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53  rrStr(SQLITE_MIS
b7e0: 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20  USE_BKPT);.  }. 
b7f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
b800: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
b810: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
b820: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a  cFailed ){.    z
b830: 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72   = sqlite3ErrStr
b840: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  (SQLITE_NOMEM);.
b850: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d    }else{.    z =
b860: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
b870: 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70  value_text(db->p
b880: 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Err);.    assert
b890: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
b8a0: 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  led );.    if( z
b8b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  ==0 ){.      z =
b8c0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
b8d0: 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20  b->errCode);.   
b8e0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
b8f0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
b900: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
b910: 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n z;.}..#ifndef 
b920: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
b930: 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  6./*.** Return U
b940: 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e  TF-16 encoded En
b950: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
b960: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
b970: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
b980: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
b990: 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65   void *sqlite3_e
b9a0: 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20  rrmsg16(sqlite3 
b9b0: 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63  *db){.  static c
b9c0: 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65  onst u16 outOfMe
b9d0: 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c  m[] = {.    'o',
b9e0: 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
b9f0: 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27  'o', 'f', ' ', '
ba00: 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f  m', 'e', 'm', 'o
ba10: 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20  ', 'r', 'y', 0. 
ba20: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
ba30: 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20  st u16 misuse[] 
ba40: 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27  = {.    'l', 'i'
ba50: 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c  , 'b', 'r', 'a',
ba60: 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20   'r', 'y', ' ', 
ba70: 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27  .    'r', 'o', '
ba80: 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e  u', 't', 'i', 'n
ba90: 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'e', ' ', .  
baa0: 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c    'c', 'a', 'l',
bab0: 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20   'l', 'e', 'd', 
bac0: 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27  ' ', .    'o', '
bad0: 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20  u', 't', ' ', . 
bae0: 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27     'o', 'f', ' '
baf0: 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c  , .    's', 'e',
bb00: 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20   'q', 'u', 'e', 
bb10: 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30  'n', 'c', 'e', 0
bb20: 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76  .  };..  const v
bb30: 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64  oid *z;.  if( !d
bb40: 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
bb50: 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d  (void *)outOfMem
bb60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
bb70: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
bb80: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
bb90: 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
bba0: 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20  *)misuse;.  }.  
bbb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
bbc0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
bbd0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
bbe0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
bbf0: 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  = (void *)outOfM
bc00: 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  em;.  }else{.   
bc10: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
bc20: 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
bc30: 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  rr);.    if( z==
bc40: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
bc50: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
bc60: 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 73 71 6c 69  ->pErr, -1, sqli
bc70: 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72  te3ErrStr(db->er
bc80: 72 43 6f 64 65 29 2c 0a 20 20 20 20 20 20 20 20  rCode),.        
bc90: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
bca0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
bcb0: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
bcc0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64  3_value_text16(d
bcd0: 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a  b->pErr);.    }.
bce0: 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28      /* A malloc(
bcf0: 29 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65  ) may have faile
bd00: 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c  d within the cal
bd10: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c  l to sqlite3_val
bd20: 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20  ue_text16().    
bd30: 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69  ** above. If thi
bd40: 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
bd50: 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  hen the db->mall
bd60: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65  ocFailed flag ne
bd70: 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
bd80: 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
bd90: 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68  returning. Do th
bda0: 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73  is directly, ins
bdb0: 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20  tead of via.    
bdc0: 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  ** sqlite3ApiExi
bdd0: 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65  t(), to avoid se
bde0: 74 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  tting the databa
bdf0: 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20  se handle error 
be00: 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  message..    */.
be10: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
be20: 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  iled = 0;.  }.  
be30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
be40: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
be50: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65    return z;.}.#e
be60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
be70: 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
be80: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
be90: 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72  ost recent error
bea0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
beb0: 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75  by an SQLite rou
bec0: 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73  tine. If NULL is
bed0: 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68  .** passed to th
bee0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20  is function, we 
bef0: 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28  assume a malloc(
bf00: 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20  ) failed during 
bf10: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a  sqlite3_open()..
bf20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  */.int sqlite3_e
bf30: 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a  rrcode(sqlite3 *
bf40: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26  db){.  if( db &&
bf50: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
bf60: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
bf70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
bf80: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
bf90: 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62  T;.  }.  if( !db
bfa0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
bfb0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
bfc0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
bfd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62  .  }.  return db
bfe0: 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e  ->errCode & db->
bff0: 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73  errMask;.}.int s
c000: 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
c010: 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20  errcode(sqlite3 
c020: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26  *db){.  if( db &
c030: 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  & !sqlite3Safety
c040: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
c050: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
c060: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
c070: 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  PT;.  }.  if( !d
c080: 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
c090: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
c0a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
c0b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
c0c0: 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f  b->errCode;.}../
c0d0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
c0e0: 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  w collating func
c0f0: 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73  tion for databas
c100: 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d  e "db".  The nam
c110: 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e  e is zName.** an
c120: 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69  d the encoding i
c130: 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  s enc..*/.static
c140: 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61   int createColla
c150: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a  tion(.  sqlite3*
c160: 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   db,.  const cha
c170: 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20  r *zName, .  u8 
c180: 65 6e 63 2c 0a 20 20 75 38 20 63 6f 6c 6c 54 79  enc,.  u8 collTy
c190: 70 65 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  pe,.  void* pCtx
c1a0: 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
c1b0: 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
c1c0: 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
c1d0: 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
c1e0: 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
c1f0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
c200: 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b  oll;.  int enc2;
c210: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
c220: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
c230: 4e 61 6d 65 29 3b 0a 20 20 0a 20 20 61 73 73 65  Name);.  .  asse
c240: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
c250: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
c260: 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51  ) );..  /* If SQ
c270: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70  LITE_UTF16 is sp
c280: 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65  ecified as the e
c290: 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72  ncoding type, tr
c2a0: 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a  ansform this.  *
c2b0: 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49  * to one of SQLI
c2c0: 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51  TE_UTF16LE or SQ
c2d0: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69  LITE_UTF16BE usi
c2e0: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ng the.  ** SQLI
c2f0: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d  TE_UTF16NATIVE m
c300: 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46  acro. SQLITE_UTF
c310: 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  16 is not used i
c320: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
c330: 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20    enc2 = enc;.  
c340: 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
c350: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a  SQLITE_UTF16 );.
c360: 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
c370: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  ==SQLITE_UTF16_A
c380: 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20  LIGNED );.  if( 
c390: 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
c3a0: 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49  16 || enc2==SQLI
c3b0: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
c3c0: 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53   ){.    enc2 = S
c3d0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
c3e0: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63  E;.  }.  if( enc
c3f0: 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  2<SQLITE_UTF8 ||
c400: 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46   enc2>SQLITE_UTF
c410: 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75  16BE ){.    retu
c420: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
c430: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
c440: 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63   Check if this c
c450: 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20  all is removing 
c460: 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20  or replacing an 
c470: 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69  existing collati
c480: 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  on .  ** sequenc
c490: 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68  e. If so, and th
c4a0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
c4b0: 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e  Ms, return busy.
c4c0: 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61   If there.  ** a
c4d0: 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
c4e0: 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  , invalidate any
c4f0: 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
c500: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
c510: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
c520: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
c530: 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
c540: 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   0);.  if( pColl
c550: 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   && pColl->xCmp 
c560: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  ){.    if( db->a
c570: 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a  ctiveVdbeCnt ){.
c580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
c590: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
c5a0: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
c5b0: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
c5c0: 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  odify collation 
c5d0: 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20  sequence due to 
c5e0: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
c5f0: 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
c600: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
c610: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
c620: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
c630: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20  atements(db);.. 
c640: 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69     /* If collati
c650: 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
c660: 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69  l was created di
c670: 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c  rectly by a call
c680: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
c690: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
c6a0: 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e  ion, and not gen
c6b0: 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43  erated by synthC
c6c0: 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a  ollSeq(),.    **
c6d0: 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73   then any copies
c6e0: 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f   made by synthCo
c6f0: 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20  llSeq() need to 
c700: 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  be invalidated..
c710: 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c      ** Also, col
c720: 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f  lation destructo
c730: 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c  r - CollSeq.xDel
c740: 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61  () - function ma
c750: 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  y need.    ** to
c760: 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20   be called..    
c770: 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f  */ .    if( (pCo
c780: 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54  ll->enc & ~SQLIT
c790: 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
c7a0: 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20  ==enc2 ){.      
c7b0: 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d  CollSeq *aColl =
c7c0: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
c7d0: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
c7e0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
c7f0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
c800: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
c810: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
c820: 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c  llSeq *p = &aCol
c830: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
c840: 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  ( p->enc==pColl-
c850: 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  >enc ){.        
c860: 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b    if( p->xDel ){
c870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
c880: 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a  xDel(p->pUser);.
c890: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c8a0: 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20        p->xCmp = 
c8b0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
c8c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
c8d0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
c8e0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
c8f0: 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
c900: 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 1);.  if( pCol
c910: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
c920: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 43  LITE_NOMEM;.  pC
c930: 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d  oll->xCmp = xCom
c940: 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70  pare;.  pColl->p
c950: 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70  User = pCtx;.  p
c960: 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65  Coll->xDel = xDe
c970: 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20  l;.  pColl->enc 
c980: 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65  = (u8)(enc2 | (e
c990: 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31  nc & SQLITE_UTF1
c9a0: 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 70  6_ALIGNED));.  p
c9b0: 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d 20 63 6f 6c  Coll->type = col
c9c0: 6c 54 79 70 65 3b 0a 20 20 73 71 6c 69 74 65 33  lType;.  sqlite3
c9d0: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
c9e0: 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  _OK, 0);.  retur
c9f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ca00: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61  ./*.** This arra
ca10: 79 20 64 65 66 69 6e 65 73 20 68 61 72 64 20 75  y defines hard u
ca20: 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c  pper bounds on l
ca30: 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68  imit values.  Th
ca40: 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72  e.** initializer
ca50: 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e   must be kept in
ca60: 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 53   sync with the S
ca70: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a  QLITE_LIMIT_*.**
ca80: 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c   #defines in sql
ca90: 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69  ite3.h..*/.stati
caa0: 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72  c const int aHar
cab0: 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53  dLimit[] = {.  S
cac0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
cad0: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ,.  SQLITE_MAX_S
cae0: 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  QL_LENGTH,.  SQL
caf0: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a  ITE_MAX_COLUMN,.
cb00: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50    SQLITE_MAX_EXP
cb10: 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54  R_DEPTH,.  SQLIT
cb20: 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
cb30: 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f  ELECT,.  SQLITE_
cb40: 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53  MAX_VDBE_OP,.  S
cb50: 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
cb60: 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45  ON_ARG,.  SQLITE
cb70: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20  _MAX_ATTACHED,. 
cb80: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
cb90: 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c  _PATTERN_LENGTH,
cba0: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41  .  SQLITE_MAX_VA
cbb0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a 20  RIABLE_NUMBER,. 
cbc0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
cbd0: 47 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a 0a 2f  GER_DEPTH,.};../
cbe0: 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
cbf0: 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61  he hard limits a
cc00: 72 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e  re set to reason
cc10: 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23  able values.*/.#
cc20: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  if SQLITE_MAX_LE
cc30: 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72  NGTH<100.# error
cc40: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
cc50: 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
cc60: 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23  ast 100.#endif.#
cc70: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  if SQLITE_MAX_SQ
cc80: 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65  L_LENGTH<100.# e
cc90: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
cca0: 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  SQL_LENGTH must 
ccb0: 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a  be at least 100.
ccc0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
ccd0: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
cce0: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47  >SQLITE_MAX_LENG
ccf0: 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  TH.# error SQLIT
cd00: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
cd10: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65   must not be gre
cd20: 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ater than SQLITE
cd30: 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64  _MAX_LENGTH.#end
cd40: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
cd50: 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
cd60: 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  T<2.# error SQLI
cd70: 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
cd80: 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61  SELECT must be a
cd90: 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66  t least 2.#endif
cda0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
cdb0: 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72  VDBE_OP<40.# err
cdc0: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  or SQLITE_MAX_VD
cdd0: 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74  BE_OP must be at
cde0: 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66   least 40.#endif
cdf0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
ce00: 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c  FUNCTION_ARG<0 |
ce10: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  | SQLITE_MAX_FUN
ce20: 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a 23  CTION_ARG>1000.#
ce30: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
ce40: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d  X_FUNCTION_ARG m
ce50: 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30  ust be between 0
ce60: 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64 69 66   and 1000.#endif
ce70: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
ce80: 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51  ATTACHED<0 || SQ
ce90: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
cea0: 44 3e 36 32 0a 23 20 65 72 72 6f 72 20 53 51 4c  D>62.# error SQL
ceb0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
cec0: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
ced0: 20 30 20 61 6e 64 20 36 32 0a 23 65 6e 64 69 66   0 and 62.#endif
cee0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
cef0: 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
cf00: 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51  GTH<1.# error SQ
cf10: 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
cf20: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73  TTERN_LENGTH mus
cf30: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a  t be at least 1.
cf40: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
cf50: 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37  E_MAX_COLUMN>327
cf60: 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  67.# error SQLIT
cf70: 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73  E_MAX_COLUMN mus
cf80: 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37  t not exceed 327
cf90: 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  67.#endif.#if SQ
cfa0: 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
cfb0: 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72  _DEPTH<1.# error
cfc0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
cfd0: 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62  GER_DEPTH must b
cfe0: 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e  e at least 1.#en
cff0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
d000: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
d010: 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74  a limit.  Report
d020: 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a   the old value..
d030: 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64  ** If an invalid
d040: 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20   limit index is 
d050: 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74  supplied, report
d060: 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20   -1..** Make no 
d070: 63 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c  changes but stil
d080: 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64  l report the old
d090: 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a   value if the.**
d0a0: 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65   new limit is ne
d0b0: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  gative..**.** A 
d0c0: 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  new lower limit 
d0d0: 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20  does not shrink 
d0e0: 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75  existing constru
d0f0: 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c  cts..** It merel
d100: 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63  y prevents new c
d110: 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65  onstructs that e
d120: 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a  xceed the limit.
d130: 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e  ** from forming.
d140: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
d150: 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  limit(sqlite3 *d
d160: 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20  b, int limitId, 
d170: 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20  int newLimit){. 
d180: 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a   int oldLimit;..
d190: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
d1a0: 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37  F: R-30189-54097
d1b0: 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20   For each limit 
d1c0: 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f  category SQLITE_
d1d0: 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20  LIMIT_NAME.  ** 
d1e0: 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20  there is a hard 
d1f0: 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20  upper bound set 
d200: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
d210: 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73  by a C preproces
d220: 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63  sor.  ** macro c
d230: 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58  alled SQLITE_MAX
d240: 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49  _NAME. (The "_LI
d250: 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d  MIT_" in the nam
d260: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a  e is changed to.
d270: 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20    ** "_MAX_".). 
d280: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48   */.  assert( aH
d290: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
d2a0: 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53  LIMIT_LENGTH]==S
d2b0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
d2c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
d2d0: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
d2e0: 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
d2f0: 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  ]==SQLITE_MAX_SQ
d300: 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  L_LENGTH );.  as
d310: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
d320: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
d330: 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LUMN]==SQLITE_MA
d340: 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73  X_COLUMN );.  as
d350: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
d360: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58  [SQLITE_LIMIT_EX
d370: 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54  PR_DEPTH]==SQLIT
d380: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
d390: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
d3a0: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
d3b0: 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
d3c0: 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ELECT]==SQLITE_M
d3d0: 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
d3e0: 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  CT);.  assert( a
d3f0: 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
d400: 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d  _LIMIT_VDBE_OP]=
d410: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45  =SQLITE_MAX_VDBE
d420: 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OP );.  assert(
d430: 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
d440: 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
d450: 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d  N_ARG]==SQLITE_M
d460: 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
d470: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
d480: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
d490: 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d  IMIT_ATTACHED]==
d4a0: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
d4b0: 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  HED );.  assert(
d4c0: 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
d4d0: 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41  TE_LIMIT_LIKE_PA
d4e0: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a  TTERN_LENGTH]==.
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
d520: 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
d530: 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b  ATTERN_LENGTH );
d540: 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
d550: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
d560: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
d570: 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ER]==SQLITE_MAX_
d580: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29  VARIABLE_NUMBER)
d590: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
d5a0: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
d5b0: 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
d5c0: 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54  H]==SQLITE_MAX_T
d5d0: 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a  RIGGER_DEPTH );.
d5e0: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
d5f0: 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
d600: 45 50 54 48 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f  EPTH==(SQLITE_N_
d610: 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20  LIMIT-1) );...  
d620: 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c  if( limitId<0 ||
d630: 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45   limitId>=SQLITE
d640: 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  _N_LIMIT ){.    
d650: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
d660: 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e   oldLimit = db->
d670: 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  aLimit[limitId];
d680: 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e  .  if( newLimit>
d690: 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
d6a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
d6b0: 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f  R-52476-28732 */
d6c0: 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  .    if( newLimi
d6d0: 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  t>aHardLimit[lim
d6e0: 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e  itId] ){.      n
d6f0: 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c  ewLimit = aHardL
d700: 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20  imit[limitId];  
d710: 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d  /* IMP: R-51463-
d720: 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20  25634 */.    }. 
d730: 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69     db->aLimit[li
d740: 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69  mitId] = newLimi
d750: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
d760: 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  oldLimit;       
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d780: 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35   IMP: R-53341-35
d790: 34 31 39 20 2a 2f 0a 7d 0a 23 69 66 20 64 65 66  419 */.}.#if def
d7a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
d7b0: 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49 4c 45 29  LE_AUTO_PROFILE)
d7c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 6f  .static void pro
d7d0: 66 69 6c 65 5f 73 71 6c 28 76 6f 69 64 20 2a 61  file_sql(void *a
d7e0: 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ux, const char *
d7f0: 73 71 6c 2c 20 75 36 34 20 6e 73 29 20 7b 0a 23  sql, u64 ns) {.#
d800: 70 72 61 67 6d 61 20 75 6e 75 73 65 64 28 61 75  pragma unused(au
d810: 78 29 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65  x)..fprintf(stde
d820: 72 72 2c 20 22 51 75 65 72 79 3a 20 25 73 5c 6e  rr, "Query: %s\n
d830: 20 45 78 65 63 75 74 69 6f 6e 20 54 69 6d 65 3a   Execution Time:
d840: 20 25 6c 6c 75 20 6d 73 5c 6e 22 2c 20 73 71 6c   %llu ms\n", sql
d850: 2c 20 6e 73 20 2f 20 31 30 30 30 30 30 30 29 3b  , ns / 1000000);
d860: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
d870: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
d880: 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20  s used to parse 
d890: 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f  both URIs and no
d8a0: 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20  n-URI filenames 
d8b0: 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a  passed by the.**
d8c0: 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e   user to API fun
d8d0: 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f  ctions sqlite3_o
d8e0: 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33  pen() or sqlite3
d8f0: 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20  _open_v2(), and 
d900: 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  for database.** 
d910: 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61  URIs specified a
d920: 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48  s part of ATTACH
d930: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
d940: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
d950: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
d960: 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61  nction is the na
d970: 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
d980: 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55   use (or.** a NU
d990: 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  LL to signify th
d9a0: 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69  e default VFS) i
d9b0: 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e  f the URI does n
d9c0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66  ot contain a "vf
d9d0: 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20  s=xxx".** query 
d9e0: 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73  parameter. The s
d9f0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
da00: 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20  ontains the URI 
da10: 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65  (or non-URI file
da20: 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e  name).** itself.
da30: 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
da40: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ion is called th
da50: 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62  e *pFlags variab
da60: 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  le should contai
da70: 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  n.** the default
da80: 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74   flags to open t
da90: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
daa0: 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c  le with. The val
dab0: 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
dac0: 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75  *pFlags may be u
dad0: 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65  pdated before re
dae0: 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55  turning if the U
daf0: 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74  RI filename cont
db00: 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d  ains .** "cache=
db10: 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78  xxx" or "mode=xx
db20: 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  x" query paramet
db30: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ers..**.** If su
db40: 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
db50: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
db60: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70   In this case *p
db70: 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70  pVfs is set to p
db80: 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56  oint to.** the V
db90: 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  FS that should b
dba0: 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74  e used to open t
dbb0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
dbc0: 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74  . *pzFile is set
dbd0: 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20   to.** point to 
dbe0: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
dbf0: 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
dc00: 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  the file to open
dc10: 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
dc20: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
dc30: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
dc40: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20  eventually call 
dc50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74  sqlite3_free() t
dc60: 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  o release.** thi
dc70: 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  s buffer..**.** 
dc80: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
dc90: 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69  rs, then an SQLi
dca0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
dcb0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
dcc0: 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62  zErrMsg.** may b
dcd0: 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
dce0: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
dcf0: 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68  ining an English
dd00: 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20   language error 
dd10: 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20  .** message. It 
dd20: 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
dd30: 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
dd40: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
dd50: 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  y release.** thi
dd60: 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c  s buffer by call
dd70: 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
dd80: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
dd90: 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f  e3ParseUri(.  co
dda0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75  nst char *zDefau
ddb0: 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a  ltVfs,        /*
ddc0: 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e   VFS to use if n
ddd0: 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72  o "vfs=xxx" quer
dde0: 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  y option */.  co
ddf0: 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20  nst char *zUri, 
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
de10: 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   Nul-terminated 
de20: 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a  URI to parse */.
de30: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a    unsigned int *
de40: 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  pFlags,         
de50: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c    /* IN/OUT: SQL
de60: 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61  ITE_OPEN_XXX fla
de70: 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  gs */.  sqlite3_
de80: 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20  vfs **ppVfs,    
de90: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
dea0: 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20  VFS to use */ . 
deb0: 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20   char **pzFile, 
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ded0: 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d   /* OUT: Filenam
dee0: 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55  e component of U
def0: 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  RI */.  char **p
df00: 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20  zErrMsg         
df10: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
df20: 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69  Error message (i
df30: 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  f rc!=SQLITE_OK)
df40: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
df50: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
df60: 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67  nsigned int flag
df70: 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63  s = *pFlags;.  c
df80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
df90: 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20  = zDefaultVfs;. 
dfa0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
dfb0: 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55  char c;.  int nU
dfc0: 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  ri = sqlite3Strl
dfd0: 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61  en30(zUri);..  a
dfe0: 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67  ssert( *pzErrMsg
dff0: 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28  ==0 );..  if( ((
e000: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
e010: 50 45 4e 5f 55 52 49 29 20 7c 7c 20 73 71 6c 69  PEN_URI) || sqli
e020: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
e030: 62 4f 70 65 6e 55 72 69 29 20 0a 20 20 20 26 26  bOpenUri) .   &&
e040: 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63   nUri>=5 && memc
e050: 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22  mp(zUri, "file:"
e060: 2c 20 35 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20  , 5)==0 .  ){.  
e070: 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20    char *zOpt;.  
e080: 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20    int eState;   
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0a0: 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20  /* Parser state 
e0b0: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49  when parsing URI
e0c0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b   */.    int iIn;
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0e0: 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63        /* Input c
e0f0: 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
e100: 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d  /.    int iOut =
e110: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e120: 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68      /* Output ch
e130: 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
e140: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
e150: 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20   nUri+2;        
e160: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
e170: 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
e180: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65   */..    /* Make
e190: 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45   sure the SQLITE
e1a0: 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69  _OPEN_URI flag i
e1b0: 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74  s set to indicat
e1c0: 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70  e to the VFS xOp
e1d0: 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  en .    ** metho
e1e0: 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79  d that there may
e1f0: 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65   be extra parame
e200: 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ters following t
e210: 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a  he file-name.  *
e220: 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  /.    flags |= S
e230: 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
e240: 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20  .    for(iIn=0; 
e250: 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29  iIn<nUri; iIn++)
e260: 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b   nByte += (zUri[
e270: 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20  iIn]=='&');.    
e280: 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
e290: 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  malloc(nByte);. 
e2a0: 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20     if( !zFile ) 
e2b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e2c0: 4d 45 4d 3b 0a 0a 20 20 20 20 2f 2a 20 44 69 73  MEM;..    /* Dis
e2d0: 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20  card the scheme 
e2e0: 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65  and authority se
e2f0: 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52  gments of the UR
e300: 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55  I. */.    if( zU
e310: 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55  ri[5]=='/' && zU
e320: 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  ri[6]=='/' ){.  
e330: 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20      iIn = 7;.   
e340: 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69     while( zUri[i
e350: 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d  In] && zUri[iIn]
e360: 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 0a  !='/' ) iIn++;..
e370: 20 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37        if( iIn!=7
e380: 20 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20   && (iIn!=16 || 
e390: 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73  memcmp("localhos
e3a0: 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29  t", &zUri[7], 9)
e3b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  ) ){.        *pz
e3c0: 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
e3d0: 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69  _mprintf("invali
e3e0: 64 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a  d uri authority:
e3f0: 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20   %.*s", .       
e400: 20 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72       iIn-7, &zUr
e410: 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  i[7]);.        r
e420: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
e430: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
e440: 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
e450: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
e460: 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a  .      iIn = 5;.
e470: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
e480: 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  py the filename 
e490: 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70 61  and any query pa
e4a0: 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68  rameters into th
e4b0: 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20  e zFile buffer. 
e4c0: 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25  .    ** Decode %
e4d0: 48 48 20 65 73 63 61 70 65 20 63 6f 64 65 73 20  HH escape codes 
e4e0: 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a  along the way. .
e4f0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69      **.    ** Wi
e500: 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20  thin this loop, 
e510: 76 61 72 69 61 62 6c 65 20 65 53 74 61 74 65 20  variable eState 
e520: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c  may be set to 0,
e530: 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69   1 or 2, dependi
e540: 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ng.    ** on the
e550: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
e560: 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  . As follows:.  
e570: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a    **.    **   0:
e580: 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61   Parsing file-na
e590: 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20  me..    **   1: 
e5a0: 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63  Parsing name sec
e5b0: 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76  tion of a name=v
e5c0: 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d  alue query param
e5d0: 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32  eter..    **   2
e5e0: 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20  : Parsing value 
e5f0: 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d  section of a nam
e600: 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61  e=value query pa
e610: 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a  rameter..    */.
e620: 20 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a      eState = 0;.
e630: 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
e640: 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26  zUri[iIn])!=0 &&
e650: 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20   c!='#' ){.     
e660: 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66   iIn++;.      if
e670: 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20  ( c=='%' .      
e680: 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
e690: 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a  git(zUri[iIn]) .
e6a0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
e6b0: 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69  3Isxdigit(zUri[i
e6c0: 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b  In+1]) .      ){
e6d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74  .        int oct
e6e0: 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78  et = (sqlite3Hex
e6f0: 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b  ToInt(zUri[iIn++
e700: 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20  ]) << 4);.      
e710: 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74    octet += sqlit
e720: 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b  e3HexToInt(zUri[
e730: 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20  iIn++]);..      
e740: 20 20 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e    assert( octet>
e750: 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20  =0 && octet<256 
e760: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  );.        if( o
e770: 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ctet==0 ){.     
e780: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
e790: 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
e7a0: 6e 20 22 25 30 30 22 20 61 70 70 65 61 72 73 20  n "%00" appears 
e7b0: 77 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20  within the URI. 
e7c0: 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  In this.        
e7d0: 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e    ** case we ign
e7e0: 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20  ore all text in 
e7f0: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
e800: 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20   the path, name 
e810: 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
e820: 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20  value currently 
e830: 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f  being parsed. So
e840: 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72   ignore the curr
e850: 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 20  ent character.  
e860: 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73          ** and s
e870: 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  kip to the next 
e880: 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c  "?", "=" or "&",
e890: 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
e8a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68   */.          wh
e8b0: 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69  ile( (c = zUri[i
e8c0: 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23  In])!=0 && c!='#
e8d0: 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
e8e0: 20 26 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c   && (eState!=0 |
e8f0: 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20  | c!='?').      
e900: 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
e910: 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27  te!=1 || (c!='='
e920: 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20   && c!='&')).   
e930: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
e940: 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27  State!=2 || c!='
e950: 26 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  &').          ){
e960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e  .            iIn
e970: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
e980: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
e990: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
e9a0: 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b        c = octet;
e9b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e9c0: 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63   eState==1 && (c
e9d0: 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29  =='&' || c=='=')
e9e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e9f0: 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30  zFile[iOut-1]==0
ea00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
ea10: 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e   An empty option
ea20: 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68   name. Ignore th
ea30: 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65  is option altoge
ea40: 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ther. */.       
ea50: 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69     while( zUri[i
ea60: 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d  In] && zUri[iIn]
ea70: 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49  !='#' && zUri[iI
ea80: 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b  n-1]!='&' ) iIn+
ea90: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  +;.          con
eaa0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
eab0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
eac0: 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '&' ){.         
ead0: 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
eae0: 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d   '\0';.        }
eaf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
eb00: 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20  eState = 2;.    
eb10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20      }.        c 
eb20: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
eb30: 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20   if( (eState==0 
eb40: 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65  && c=='?') || (e
eb50: 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27  State==2 && c=='
eb60: 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  &') ){.        c
eb70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53   = 0;.        eS
eb80: 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tate = 1;.      
eb90: 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f  }.      zFile[iO
eba0: 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d  ut++] = c;.    }
ebb0: 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 3d  .    if( eState=
ebc0: 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  =1 ) zFile[iOut+
ebd0: 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  +] = '\0';.    z
ebe0: 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
ebf0: 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69  \0';.    zFile[i
ec00: 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a  Out++] = '\0';..
ec10: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
ec20: 74 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f  there were any o
ec30: 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64  ptions specified
ec40: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
ec50: 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20 20  interpreted .   
ec60: 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e   ** here. Option
ec70: 73 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 72  s that are inter
ec80: 70 72 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c  preted here incl
ec90: 75 64 65 20 22 76 66 73 22 20 61 6e 64 20 74 68  ude "vfs" and th
eca0: 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ose that.    ** 
ecb0: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c  correspond to fl
ecc0: 61 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ags that may be 
ecd0: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71  passed to the sq
ece0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a  lite3_open_v2().
ecf0: 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a      ** method. *
ed00: 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46  /.    zOpt = &zF
ed10: 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ile[sqlite3Strle
ed20: 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20  n30(zFile)+1];. 
ed30: 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30     while( zOpt[0
ed40: 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ] ){.      int n
ed50: 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Opt = sqlite3Str
ed60: 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20  len30(zOpt);.   
ed70: 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20     char *zVal = 
ed80: 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20  &zOpt[nOpt+1];. 
ed90: 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20       int nVal = 
eda0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
edb0: 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66  zVal);..      if
edc0: 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d  ( nOpt==3 && mem
edd0: 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c  cmp("vfs", zOpt,
ede0: 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   3)==0 ){.      
edf0: 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20    zVfs = zVal;. 
ee00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ee10: 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d      struct OpenM
ee20: 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ode {.          
ee30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
ee40: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64           int mod
ee50: 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d  e;.        } *aM
ee60: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
ee70: 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65   char *zModeType
ee80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
ee90: 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  t mask = 0;.    
eea0: 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20      int limit = 
eeb0: 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  0;..        if( 
eec0: 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d  nOpt==5 && memcm
eed0: 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c  p("cache", zOpt,
eee0: 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   5)==0 ){.      
eef0: 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63      static struc
ef00: 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68  t OpenMode aCach
ef10: 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  eMode[] = {.    
ef20: 20 20 20 20 20 20 20 20 7b 20 22 73 68 61 72 65          { "share
ef30: 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  d",  SQLITE_OPEN
ef40: 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a  _SHAREDCACHE },.
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 70              { "p
ef60: 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  rivate", SQLITE_
ef70: 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
ef80: 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
ef90: 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20   { 0, 0 }.      
efa0: 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20      };..        
efb0: 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f    mask = SQLITE_
efc0: 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
efd0: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49  |SQLITE_OPEN_PRI
efe0: 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20  VATECACHE;.     
eff0: 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61       aMode = aCa
f000: 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20  cheMode;.       
f010: 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b     limit = mask;
f020: 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65  .          zMode
f030: 54 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a  Type = "cache";.
f040: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f050: 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26    if( nOpt==4 &&
f060: 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20   memcmp("mode", 
f070: 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20  zOpt, 4)==0 ){. 
f080: 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
f090: 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
f0a0: 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a  aOpenMode[] = {.
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72              { "r
f0c0: 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  o",  SQLITE_OPEN
f0d0: 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20  _READONLY },.   
f0e0: 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c           { "rw",
f0f0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
f100: 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20  ADWRITE }, .    
f110: 20 20 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c          { "rwc",
f120: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
f130: 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
f140: 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20  OPEN_CREATE },. 
f150: 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20             { 0, 
f160: 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b  0 }.          };
f170: 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b  ..          mask
f180: 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
f190: 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
f1a0: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
f1b0: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
f1c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64  ;.          aMod
f1d0: 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20  e = aOpenMode;. 
f1e0: 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d           limit =
f1f0: 20 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20   mask & flags;. 
f200: 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79           zModeTy
f210: 70 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20  pe = "access";. 
f220: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
f230: 20 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20    if( aMode ){. 
f240: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
f250: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f            int mo
f260: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
f270: 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65    for(i=0; aMode
f280: 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20  [i].z; i++){.   
f290: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
f2a0: 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69  har *z = aMode[i
f2b0: 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ].z;.           
f2c0: 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74   if( nVal==sqlit
f2d0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26  e3Strlen30(z) &&
f2e0: 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c   0==memcmp(zVal,
f2f0: 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20   z, nVal) ){.   
f300: 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20             mode 
f310: 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b  = aMode[i].mode;
f320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
f330: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
f340: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
f350: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f            if( mo
f360: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  de==0 ){.       
f370: 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
f380: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
f390: 28 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64  ("no such %s mod
f3a0: 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70  e: %s", zModeTyp
f3b0: 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  e, zVal);.      
f3c0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f3d0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
f3e0: 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f       goto parse_
f3f0: 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  uri_out;.       
f400: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
f410: 66 28 20 6d 6f 64 65 3e 6c 69 6d 69 74 20 29 7b  f( mode>limit ){
f420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a  .            *pz
f430: 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
f440: 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64  _mprintf("%s mod
f450: 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25  e not allowed: %
f460: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
f470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f480: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64              zMod
f490: 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20  eType, zVal);.  
f4a0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
f4b0: 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
f4c0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
f4d0: 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20  se_uri_out;.    
f4e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f4f0: 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73    flags = (flags
f500: 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65   & ~mask) | mode
f510: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f520: 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20    }..      zOpt 
f530: 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b  = &zVal[nVal+1];
f540: 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
f550: 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c  .    zFile = sql
f560: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69  ite3_malloc(nUri
f570: 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46  +2);.    if( !zF
f580: 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ile ) return SQL
f590: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d  ITE_NOMEM;.    m
f5a0: 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72  emcpy(zFile, zUr
f5b0: 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a 46  i, nUri);.    zF
f5c0: 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27  ile[nUri] = '\0'
f5d0: 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69  ;.    zFile[nUri
f5e0: 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a  +1] = '\0';.  }.
f5f0: 0a 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69  .  *ppVfs = sqli
f600: 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66  te3_vfs_find(zVf
f610: 73 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73  s);.  if( *ppVfs
f620: 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72  ==0 ){.    *pzEr
f630: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
f640: 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20  printf("no such 
f650: 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b  vfs: %s", zVfs);
f660: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
f670: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72  _ERROR;.  }. par
f680: 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66  se_uri_out:.  if
f690: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f6a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
f6b0: 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20  ree(zFile);.    
f6c0: 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zFile = 0;.  }. 
f6d0: 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73   *pFlags = flags
f6e0: 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46  ;.  *pzFile = zF
f6f0: 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ile;.  return rc
f700: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
f710: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
f720: 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e  e work of openin
f730: 67 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20  g a database on 
f740: 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c  behalf of.** sql
f750: 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20  ite3_open() and 
f760: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29  sqlite3_open16()
f770: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  . The database f
f780: 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61  ilename "zFilena
f790: 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d  me"  .** is UTF-
f7a0: 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74  8 encoded..*/.st
f7b0: 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74  atic int openDat
f7c0: 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63  abase(.  const c
f7d0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
f7e0: 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
f7f0: 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64  name UTF-8 encod
f800: 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
f810: 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f  **ppDb,        /
f820: 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20  * OUT: Returned 
f830: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
f840: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
f850: 74 20 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f  t flags,    /* O
f860: 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73  perational flags
f870: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
f880: 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20   *zVfs       /* 
f890: 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  Name of the VFS 
f8a0: 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73  to use */.){.  s
f8b0: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f8d0: 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65  * Store allocate
f8e0: 64 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  d handle here */
f8f0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f910: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
f920: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68 72  e */.  int isThr
f930: 65 61 64 73 61 66 65 3b 20 20 20 20 20 20 20 20  eadsafe;        
f940: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
f950: 6f 72 20 74 68 72 65 61 64 73 61 66 65 20 63 6f  or threadsafe co
f960: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63  nnections */.  c
f970: 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20  har *zOpen = 0; 
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f990: 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d  * Filename argum
f9a0: 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 42  ent to pass to B
f9b0: 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  treeOpen() */.  
f9c0: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
f9d0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
f9e0: 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  /* Error message
f9f0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 50 61 72   from sqlite3Par
fa00: 73 65 55 72 69 28 29 20 2a 2f 0a 0a 20 20 2a 70  seUri() */..  *p
fa10: 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  pDb = 0;.#ifndef
fa20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
fa30: 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c  OINIT.  rc = sql
fa40: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
fa50: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
fa60: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
fa70: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77  .  /* Only allow
fa80: 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e   sensible combin
fa90: 61 74 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69  ations of bits i
faa0: 6e 20 74 68 65 20 66 6c 61 67 73 20 61 72 67 75  n the flags argu
fab0: 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72  ment.  .  ** Thr
fac0: 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  ow an error if a
fad0: 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d  ny non-sense com
fae0: 62 69 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64  bination is used
faf0: 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f  .  If we.  ** do
fb00: 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67   not block illeg
fb10: 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  al combinations 
fb20: 68 65 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74  here, it could t
fb30: 72 69 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65  rigger.  ** asse
fb40: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
fb50: 69 6e 20 64 65 65 70 65 72 20 6c 61 79 65 72 73  in deeper layers
fb60: 2e 20 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62  .  Sensible comb
fb70: 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72  inations.  ** ar
fb80: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a  e:.  **.  **  1:
fb90: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
fba0: 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20  ADONLY.  **  2: 
fbb0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
fbc0: 44 57 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20  DWRITE.  **  6: 
fbd0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
fbe0: 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
fbf0: 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f  OPEN_CREATE.  */
fc00: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
fc10: 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
fc20: 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73   == 0x01 );.  as
fc30: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
fc40: 4e 5f 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30  N_READWRITE == 0
fc50: 78 30 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  x02 );.  assert(
fc60: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
fc70: 41 54 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29  ATE    == 0x04 )
fc80: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31  ;.  testcase( (1
fc90: 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78  <<(flags&7))==0x
fca0: 30 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c  02 ); /* READONL
fcb0: 59 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  Y */.  testcase(
fcc0: 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d   (1<<(flags&7))=
fcd0: 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44  =0x04 ); /* READ
fce0: 57 52 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63  WRITE */.  testc
fcf0: 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
fd00: 37 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20  7))==0x40 ); /* 
fd10: 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
fd20: 54 45 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c  TE */.  if( ((1<
fd30: 3c 28 66 6c 61 67 73 26 37 29 29 20 26 20 30 78  <(flags&7)) & 0x
fd40: 34 36 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  46)==0 ) return 
fd50: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
fd60: 50 54 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  PT;..  if( sqlit
fd70: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
fd80: 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a  CoreMutex==0 ){.
fd90: 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
fda0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
fdb0: 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
fdc0: 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b  _OPEN_NOMUTEX ){
fdd0: 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
fde0: 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
fdf0: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
fe00: 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
fe10: 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64   ){.    isThread
fe20: 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  safe = 1;.  }els
fe30: 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  e{.    isThreads
fe40: 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  afe = sqlite3Glo
fe50: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
fe60: 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  utex;.  }.  if( 
fe70: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
fe80: 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
fe90: 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d   ){.    flags &=
fea0: 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48   ~SQLITE_OPEN_SH
feb0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c  AREDCACHE;.  }el
fec0: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  se if( sqlite3Gl
fed0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65  obalConfig.share
fee0: 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b  dCacheEnabled ){
fef0: 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
ff00: 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
ff10: 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  CACHE;.  }..  /*
ff20: 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20   Remove harmful 
ff30: 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c  bits from the fl
ff40: 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20  ags parameter.  
ff50: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49  **.  ** The SQLI
ff60: 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
ff70: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  and SQLITE_OPEN_
ff80: 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20  FULLMUTEX flags 
ff90: 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20  were.  ** dealt 
ffa0: 77 69 74 68 20 69 6e 20 74 68 65 20 70 72 65 76  with in the prev
ffb0: 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e  ious code block.
ffc0: 20 20 42 65 73 69 64 65 73 20 74 68 65 73 65 2c    Besides these,
ffd0: 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76   the only.  ** v
ffe0: 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73  alid input flags
fff0: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65   for sqlite3_ope
10000 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c 49 54  n_v2() are SQLIT
10010 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c  E_OPEN_READONLY,
10020 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45  .  ** SQLITE_OPE
10030 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53 51 4c  N_READWRITE, SQL
10040 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
10050 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
10060 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53  REDCACHE,.  ** S
10070 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
10080 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d  TECACHE, and som
10090 65 20 72 65 73 65 72 76 65 64 20 62 69 74 73 2e  e reserved bits.
100a0 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a    Silently mask.
100b0 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68    ** off all oth
100c0 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20  er flags..  */. 
100d0 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51   flags &=  ~( SQ
100e0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
100f0 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20  ONCLOSE |.      
10100 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
10110 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
10120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10130 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
10140 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20  _DB |.          
10150 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
10160 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20  _TEMP_DB | .    
10170 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
10180 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
10190 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20  _DB | .         
101a0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
101b0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
101c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
101d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
101e0 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  P_JOURNAL | .   
101f0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
10200 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
10210 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  AL | .          
10220 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
10230 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
10240 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
10250 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
10260 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20  UTEX |.         
10270 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
10280 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20  N_FULLMUTEX |.  
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
102a0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20  ITE_OPEN_WAL.   
102b0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20            );..  
102c0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
102d0 73 71 6c 69 74 65 20 64 61 74 61 20 73 74 72 75  sqlite data stru
102e0 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20  cture */.  db = 
102f0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
10300 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  o( sizeof(sqlite
10310 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d  3) );.  if( db==
10320 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f  0 ) goto opendb_
10330 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72  out;.  if( isThr
10340 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64  eadsafe ){.    d
10350 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  b->mutex = sqlit
10360 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
10370 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53  ITE_MUTEX_RECURS
10380 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62  IVE);.    if( db
10390 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
103a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
103b0 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d  (db);.      db =
103c0 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f   0;.      goto o
103d0 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d  pendb_out;.    }
103e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
103f0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
10400 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72  utex);.  db->err
10410 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64  Mask = 0xff;.  d
10420 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62  b->nDb = 2;.  db
10430 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
10440 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64  _MAGIC_BUSY;.  d
10450 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  b->aDb = db->aDb
10460 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65 72  Static;..  asser
10470 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c  t( sizeof(db->aL
10480 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48  imit)==sizeof(aH
10490 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d  ardLimit) );.  m
104a0 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74  emcpy(db->aLimit
104b0 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69  , aHardLimit, si
104c0 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29  zeof(db->aLimit)
104d0 29 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  );.  db->autoCom
104e0 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e  mit = 1;.  db->n
104f0 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b  extAutovac = -1;
10500 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  .  db->nextPages
10510 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66  ize = 0;.  db->f
10520 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
10530 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53  hortColNames | S
10540 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 20  QLITE_AutoIndex 
10550 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54  | SQLITE_EnableT
10560 72 69 67 67 65 72 0a 23 69 66 20 53 51 4c 49 54  rigger.#if SQLIT
10570 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46  E_DEFAULT_FILE_F
10580 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20  ORMAT<4.        
10590 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
105a0 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a  E_LegacyFileFmt.
105b0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
105c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  LITE_ENABLE_LOAD
105d0 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20  _EXTENSION.     
105e0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
105f0 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69  LITE_LoadExtensi
10600 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  on.#endif.#if SQ
10610 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43  LITE_DEFAULT_REC
10620 55 52 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a  URSIVE_TRIGGERS.
10630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10640 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69   | SQLITE_RecTri
10650 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66  ggers.#endif.#if
10660 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
10670 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
10680 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f  KEYS) && SQLITE_
10690 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
106a0 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20 20 20  KEYS.           
106b0 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46        | SQLITE_F
106c0 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69  oreignKeys.#endi
106d0 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69  f.      ;.  sqli
106e0 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
106f0 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e  >aCollSeq);.#ifn
10700 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10710 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
10720 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
10730 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65  db->aModule);.#e
10740 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74  ndif..  /* Add t
10750 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
10760 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49  tion sequence BI
10770 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72  NARY. BINARY wor
10780 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d  ks for both UTF-
10790 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31  8.  ** and UTF-1
107a0 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72 73  6, so add a vers
107b0 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20  ion for each to 
107c0 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65  avoid any unnece
107d0 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65  ssary.  ** conve
107e0 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79  rsions. The only
107f0 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20   error that can 
10800 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61 20  occur here is a 
10810 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
10820 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43  ..  */.  createC
10830 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49  ollation(db, "BI
10840 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54  NARY", SQLITE_UT
10850 46 38 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f  F8, SQLITE_COLL_
10860 42 49 4e 41 52 59 2c 20 30 2c 0a 20 20 20 20 20  BINARY, 0,.     
10870 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e               bin
10880 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
10890 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
108a0 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51  db, "BINARY", SQ
108b0 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 53 51  LITE_UTF16BE, SQ
108c0 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59  LITE_COLL_BINARY
108d0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
108e0 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46 75         binCollFu
108f0 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
10900 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42  Collation(db, "B
10910 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55  INARY", SQLITE_U
10920 54 46 31 36 4c 45 2c 20 53 51 4c 49 54 45 5f 43  TF16LE, SQLITE_C
10930 4f 4c 4c 5f 42 49 4e 41 52 59 2c 20 30 2c 0a 20  OLL_BINARY, 0,. 
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10950 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
10960 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
10970 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c  ion(db, "RTRIM",
10980 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
10990 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20  LITE_COLL_USER, 
109a0 28 76 6f 69 64 2a 29 31 2c 0a 20 20 20 20 20 20  (void*)1,.      
109b0 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 43              binC
109c0 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69  ollFunc, 0);.  i
109d0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
109e0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
109f0 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
10a00 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20    db->pDfltColl 
10a10 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
10a20 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f  lSeq(db, SQLITE_
10a30 55 54 46 38 2c 20 22 42 49 4e 41 52 59 22 2c 20  UTF8, "BINARY", 
10a40 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  0);.  assert( db
10a50 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29  ->pDfltColl!=0 )
10a60 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64  ;..  /* Also add
10a70 20 61 20 55 54 46 2d 38 20 63 61 73 65 2d 69 6e   a UTF-8 case-in
10a80 73 65 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61 74  sensitive collat
10a90 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f  ion sequence. */
10aa0 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
10ab0 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c  on(db, "NOCASE",
10ac0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
10ad0 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45  LITE_COLL_NOCASE
10ae0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
10af0 20 20 20 20 20 20 20 6e 6f 63 61 73 65 43 6f 6c         nocaseCol
10b00 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a  latingFunc, 0);.
10b10 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20  .  /* Parse the 
10b20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72 67  filename/URI arg
10b30 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64 62 2d 3e  ument. */.  db->
10b40 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67  openFlags = flag
10b50 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  s;.  rc = sqlite
10b60 33 50 61 72 73 65 55 72 69 28 7a 56 66 73 2c 20  3ParseUri(zVfs, 
10b70 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61 67  zFilename, &flag
10b80 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20 26 7a  s, &db->pVfs, &z
10b90 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29 3b  Open, &zErrMsg);
10ba0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10bb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
10bc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
10bd0 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   ) db->mallocFai
10be0 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  led = 1;.    sql
10bf0 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
10c00 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  , zErrMsg ? "%s"
10c10 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a   : 0, zErrMsg);.
10c20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10c30 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67  (zErrMsg);.    g
10c40 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
10c50 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74    }..  /* Open t
10c60 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62  he backend datab
10c70 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20  ase driver */.  
10c80 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
10c90 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20  eOpen(db->pVfs, 
10ca0 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e  zOpen, db, &db->
10cb0 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20  aDb[0].pBt, 0,. 
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cd0 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53         flags | S
10ce0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
10cf0 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  DB);.  if( rc!=S
10d00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10d10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
10d20 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  OERR_NOMEM ){.  
10d30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10d40 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
10d50 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
10d60 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 67 6f  , rc, 0);.    go
10d70 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
10d80 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e   }.  db->aDb[0].
10d90 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
10da0 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 64  3SchemaGet(db, d
10db0 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
10dc0 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63    db->aDb[1].pSc
10dd0 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63  hema = sqlite3Sc
10de0 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a  hemaGet(db, 0);.
10df0 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75  ..  /* The defau
10e00 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  lt safety_level 
10e10 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
10e20 61 62 61 73 65 20 69 73 20 27 66 75 6c 6c 27 3b  abase is 'full';
10e30 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20   for the temp.  
10e40 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74 20 69  ** database it i
10e50 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d  s 'NONE'. This m
10e60 61 74 63 68 65 73 20 74 68 65 20 70 61 67 65 72  atches the pager
10e70 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73 2e   layer defaults.
10e80 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44    .  */.  db->aD
10e90 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61  b[0].zName = "ma
10ea0 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30  in";.  db->aDb[0
10eb0 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ].safety_level =
10ec0 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d   3;.  db->aDb[1]
10ed0 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b  .zName = "temp";
10ee0 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61  .  db->aDb[1].sa
10ef0 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a  fety_level = 1;.
10f00 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
10f10 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
10f20 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
10f30 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
10f40 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
10f50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73  .  }..  /* Regis
10f60 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e  ter all built-in
10f70 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20   functions, but 
10f80 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  do not attempt t
10f90 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20  o read the.  ** 
10fa0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
10fb0 79 65 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c  yet. This is del
10fc0 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66  ayed until the f
10fd0 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 64 61  irst time the da
10fe0 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61  tabase.  ** is a
10ff0 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ccessed..  */.  
11000 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
11010 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
11020 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65    sqlite3Registe
11030 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e  rBuiltinFunction
11040 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61  s(db);..  /* Loa
11050 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65  d automatic exte
11060 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69  nsions - extensi
11070 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 62 65  ons that have be
11080 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20 20  en registered.  
11090 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
110a0 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65  ite3_automatic_e
110b0 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a  xtension() API..
110c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 41 75    */.  sqlite3Au
110d0 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73  toLoadExtensions
110e0 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (db);.  rc = sql
110f0 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
11100 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
11110 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
11120 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
11130 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
11140 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69  _ENABLE_FTS1.  i
11150 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
11160 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65  iled ){.    exte
11170 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  rn int sqlite3Ft
11180 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29  s1Init(sqlite3*)
11190 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
111a0 65 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a  e3Fts1Init(db);.
111b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
111c0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
111d0 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d  _FTS2.  if( !db-
111e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
111f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11200 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
11210 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74   sqlite3Fts2Init
11220 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
11230 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32  rc = sqlite3Fts2
11240 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
11250 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
11260 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a  ITE_ENABLE_FTS3.
11270 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
11280 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
11290 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
112a0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
112b0 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
112c0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
112d0 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20  ITE_ENABLE_ICU. 
112e0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
112f0 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
11300 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
11310 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e  c = sqlite3IcuIn
11320 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
11330 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
11340 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20  E_ENABLE_RTREE. 
11350 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
11360 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
11370 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63  LITE_OK){.    rc
11380 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65 49   = sqlite3RtreeI
11390 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
113a0 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72  dif..  sqlite3Er
113b0 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a  ror(db, rc, 0);.
113c0 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44  .  /* -DSQLITE_D
113d0 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
113e0 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c  ODE=1 makes EXCL
113f0 55 53 49 56 45 20 74 68 65 20 64 65 66 61 75 6c  USIVE the defaul
11400 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d  t locking.  ** m
11410 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44  ode.  -DSQLITE_D
11420 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
11430 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41  ODE=0 make NORMA
11440 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  L the default lo
11450 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e  cking.  ** mode.
11460 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20    Doing nothing 
11470 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65  at all also make
11480 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  s NORMAL the def
11490 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ault..  */.#ifde
114a0 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
114b0 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20  _LOCKING_MODE.  
114c0 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65  db->dfltLockMode
114d0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
114e0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a  T_LOCKING_MODE;.
114f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f    sqlite3PagerLo
11500 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65  ckingMode(sqlite
11510 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e  3BtreePager(db->
11520 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20  aDb[0].pBt),.   
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11540 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
11550 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
11560 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  DE);.#endif..  /
11570 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f  * Enable the loo
11580 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75  kaside-malloc su
11590 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74  bsystem */.  set
115a0 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20  upLookaside(db, 
115b0 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  0, sqlite3Global
115c0 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69  Config.szLookasi
115d0 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
115e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
115f0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
11600 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20  nLookaside);..  
11610 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
11620 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53  checkpoint(db, S
11630 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41  QLITE_DEFAULT_WA
11640 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54  L_AUTOCHECKPOINT
11650 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a  );..opendb_out:.
11660 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
11670 4f 70 65 6e 29 3b 0a 20 20 69 66 28 20 64 62 20  Open);.  if( db 
11680 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
11690 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69  b->mutex!=0 || i
116a0 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30 20 7c  sThreadsafe==0 |
116b0 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  | sqlite3GlobalC
116c0 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
116d0 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
116e0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
116f0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20  b->mutex);.  }. 
11700 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
11710 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28  rcode(db);.  if(
11720 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
11730 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  M ){.    sqlite3
11740 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20  _close(db);.    
11750 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  db = 0;.  }else 
11760 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11770 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  K ){.    db->mag
11780 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
11790 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 23 69 66 20  C_SICK;.  }.#if 
117a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
117b0 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49  NABLE_AUTO_PROFI
117c0 4c 45 29 0a 20 20 69 66 28 20 64 62 20 26 26 20  LE).  if( db && 
117d0 21 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20  !rc ){.    char 
117e0 2a 65 6e 76 70 72 6f 66 69 6c 65 20 3d 20 67 65  *envprofile = ge
117f0 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 41 55 54  tenv("SQLITE_AUT
11800 4f 5f 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20 20  O_PROFILE");.   
11810 20 0a 20 20 20 20 69 66 28 20 65 6e 76 70 72 6f   .    if( envpro
11820 66 69 6c 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  file!=NULL ){.  
11830 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66      sqlite3_prof
11840 69 6c 65 28 64 62 2c 20 70 72 6f 66 69 6c 65 5f  ile(db, profile_
11850 73 71 6c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  sql, NULL);.    
11860 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  }.  }.#endif.  *
11870 70 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65  ppDb = db;.#ifde
11880 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11890 53 51 4c 52 52 0a 20 20 53 52 52 65 63 4f 70 65  SQLRR.  SRRecOpe
118a0 6e 28 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  n(db, zFilename,
118b0 20 66 6c 61 67 73 29 3b 0a 23 65 6e 64 69 66 0a   flags);.#endif.
118c0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
118d0 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a  ApiExit(0, rc);.
118e0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
118f0 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e  new database han
11900 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
11910 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73  te3_open(.  cons
11920 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
11930 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a  e, .  sqlite3 **
11940 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72  ppDb .){.  retur
11950 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  n openDatabase(z
11960 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a  Filename, ppDb,.
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
11990 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
119a0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
119b0 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
119c0 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63  te3_open_v2(.  c
119d0 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
119e0 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61  ame,   /* Databa
119f0 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46  se filename (UTF
11a00 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -8) */.  sqlite3
11a10 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20   **ppDb,        
11a20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20   /* OUT: SQLite 
11a30 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
11a40 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
11a50 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
11a60 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
11a70 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20  *zVfs        /* 
11a80 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75  Name of VFS modu
11a90 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  le to use */.){.
11aa0 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
11ab0 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20  abase(filename, 
11ac0 70 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20  ppDb, (unsigned 
11ad0 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29  int)flags, zVfs)
11ae0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
11af0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
11b00 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
11b10 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
11b20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
11b30 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20  open16(.  const 
11b40 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  void *zFilename,
11b50 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
11b60 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  Db.){.  char con
11b70 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20  st *zFilename8; 
11b80 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65    /* zFilename e
11b90 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20  ncoded in UTF-8 
11ba0 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31  instead of UTF-1
11bb0 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  6 */.  sqlite3_v
11bc0 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
11bd0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
11be0 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20   zFilename );.  
11bf0 61 73 73 65 72 74 28 20 70 70 44 62 20 29 3b 0a  assert( ppDb );.
11c00 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
11c10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11c20 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
11c30 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
11c40 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
11c50 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
11c60 64 69 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  dif.  pVal = sql
11c70 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
11c80 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
11c90 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
11ca0 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54  zFilename, SQLIT
11cb0 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53  E_UTF16NATIVE, S
11cc0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
11cd0 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71   zFilename8 = sq
11ce0 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70  lite3ValueText(p
11cf0 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Val, SQLITE_UTF8
11d00 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
11d10 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
11d20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
11d30 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20  lename8, ppDb,. 
11d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d50 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
11d60 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
11d70 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
11d80 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
11d90 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51   *ppDb || rc==SQ
11da0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
11db0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11dc0 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f  _OK && !DbHasPro
11dd0 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20  perty(*ppDb, 0, 
11de0 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
11df0 20 29 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a 70   ){.      ENC(*p
11e00 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54  pDb) = SQLITE_UT
11e10 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d  F16NATIVE;.    }
11e20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
11e30 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
11e40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61  .  }.  sqlite3Va
11e50 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a  lueFree(pVal);..
11e60 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
11e70 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a  ApiExit(0, rc);.
11e80 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11e90 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
11ea0 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
11eb0 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
11ec0 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
11ed0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
11ee0 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
11ef0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
11f00 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
11f10 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
11f20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
11f30 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
11f40 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
11f50 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
11f60 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
11f70 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  nt,const void*).
11f80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
11f90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
11fa0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
11fb0 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
11fc0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
11fd0 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
11fe0 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
11ff0 28 75 38 29 65 6e 63 2c 20 53 51 4c 49 54 45 5f  (u8)enc, SQLITE_
12000 43 4f 4c 4c 5f 55 53 45 52 2c 20 70 43 74 78 2c  COLL_USER, pCtx,
12010 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20   xCompare, 0);. 
12020 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
12030 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
12040 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
12050 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
12060 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12070 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
12080 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
12090 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
120a0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
120b0 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
120c0 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
120d0 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74  tion_v2(.  sqlit
120e0 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
120f0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
12100 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69   int enc, .  voi
12110 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
12120 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
12130 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
12140 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
12150 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28  ,.  void(*xDel)(
12160 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
12170 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rc;.  sqlite3_mu
12180 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
12190 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
121a0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
121b0 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61  d );.  rc = crea
121c0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
121d0 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20  zName, (u8)enc, 
121e0 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45 52  SQLITE_COLL_USER
121f0 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
12200 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20  , xDel);.  rc = 
12210 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
12220 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
12230 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
12240 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
12250 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
12260 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
12270 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  F16./*.** Regist
12280 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  er a new collati
12290 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68  on sequence with
122a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
122b0 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
122c0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
122d0 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73 71  ollation16(.  sq
122e0 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
122f0 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c  nst void *zName,
12300 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76  .  int enc, .  v
12310 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
12320 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
12330 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
12340 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
12350 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *).){.  int rc =
12360 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68   SQLITE_OK;.  ch
12370 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20 20 73 71  ar *zName8;.  sq
12380 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
12390 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
123a0 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
123b0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
123c0 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 55  Name8 = sqlite3U
123d0 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d  tf16to8(db, zNam
123e0 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
123f0 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 69 66  F16NATIVE);.  if
12400 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20  ( zName8 ){.    
12410 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
12420 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c  tion(db, zName8,
12430 20 28 75 38 29 65 6e 63 2c 20 53 51 4c 49 54 45   (u8)enc, SQLITE
12440 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20 70 43 74 78  _COLL_USER, pCtx
12450 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a  , xCompare, 0);.
12460 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
12470 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20  e(db, zName8);. 
12480 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
12490 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
124a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
124b0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
124c0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
124d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
124e0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
124f0 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
12500 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  r a collation se
12510 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63  quence factory c
12520 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
12530 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
12540 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20  .** db. Replace 
12550 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69  any previously i
12560 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69  nstalled collati
12570 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
12580 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ory..*/.int sqli
12590 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
125a0 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33 20  eded(.  sqlite3 
125b0 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
125c0 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
125d0 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
125e0 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65  ed)(void*,sqlite
125f0 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c  3*,int eTextRep,
12600 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a  const char*).){.
12610 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12620 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
12630 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
12640 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65  ded = xCollNeede
12650 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  d;.  db->xCollNe
12660 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62  eded16 = 0;.  db
12670 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
12680 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72   = pCollNeededAr
12690 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
126a0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
126b0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
126c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
126d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
126e0 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69  UTF16./*.** Regi
126f0 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  ster a collation
12700 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
12710 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  y callback with 
12720 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
12730 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61  dle.** db. Repla
12740 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c  ce any previousl
12750 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c  y installed coll
12760 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
12770 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73  actory..*/.int s
12780 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
12790 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c  _needed16(.  sql
127a0 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
127b0 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
127c0 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
127d0 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a  lNeeded16)(void*
127e0 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54  ,sqlite3*,int eT
127f0 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69  extRep,const voi
12800 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  d*).){.  sqlite3
12810 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
12820 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78  >mutex);.  db->x
12830 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a  CollNeeded = 0;.
12840 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
12850 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65  d16 = xCollNeede
12860 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c  d16;.  db->pColl
12870 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c  NeededArg = pCol
12880 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71  lNeededArg;.  sq
12890 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
128a0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
128b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
128c0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
128d0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
128e0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
128f0 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
12900 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ED./*.** This fu
12910 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e  nction is now an
12920 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74   anachronism. It
12930 20 75 73 65 64 20 74 6f 20 62 65 20 75 73 65 64   used to be used
12940 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d   to recover from
12950 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66   a.** malloc() f
12960 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69  ailure, but SQLi
12970 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73  te now does this
12980 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a   automatically..
12990 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67  */.int sqlite3_g
129a0 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f  lobal_recover(vo
129b0 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  id){.  return SQ
129c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
129d0 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f  f../*.** Test to
129e0 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20   see whether or 
129f0 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
12a00 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69   connection is i
12a10 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20  n autocommit.** 
12a20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52  mode.  Return TR
12a30 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20  UE if it is and 
12a40 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41  FALSE if not.  A
12a50 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69  utocommit mode i
12a60 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75  s on.** by defau
12a70 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20  lt.  Autocommit 
12a80 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61  is disabled by a
12a90 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74   BEGIN statement
12aa0 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a   and reenabled.*
12ab0 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f  * by the next CO
12ac0 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  MMIT or ROLLBACK
12ad0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48 49  ..**.******* THI
12ae0 53 20 49 53 20 41 4e 20 45 58 50 45 52 49 4d 45  S IS AN EXPERIME
12af0 4e 54 41 4c 20 41 50 49 20 41 4e 44 20 49 53 20  NTAL API AND IS 
12b00 53 55 42 4a 45 43 54 20 54 4f 20 43 48 41 4e 47  SUBJECT TO CHANG
12b10 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20  E ******.*/.int 
12b20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
12b30 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  commit(sqlite3 *
12b40 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
12b50 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a  ->autoCommit;.}.
12b60 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
12b70 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
12b80 65 20 73 75 62 74 69 74 75 74 65 73 20 66 6f 72  e subtitutes for
12b90 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54   constants SQLIT
12ba0 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51  E_CORRUPT,.** SQ
12bb0 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c  LITE_MISUSE, SQL
12bc0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51  ITE_CANTOPEN, SQ
12bd0 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20 70  LITE_IOERR and p
12be0 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72  ossibly other er
12bf0 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  ror.** constants
12c00 2e 20 20 54 68 65 79 20 73 65 72 76 65 72 20 74  .  They server t
12c10 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a  wo purposes:.**.
12c20 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20 61  **   1.  Serve a
12c30 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  s a convenient p
12c40 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
12c50 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65  eakpoint in a de
12c60 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20  bugger.**       
12c70 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 76  to detect when v
12c80 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e  ersion error con
12c90 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a  ditions occurs..
12ca0 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f  **.**   2.  Invo
12cb0 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ke sqlite3_log()
12cc0 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
12cd0 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61  source code loca
12ce0 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20  tion where.**   
12cf0 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20      a low-level 
12d00 65 72 72 6f 72 20 69 73 20 66 69 72 73 74 20 64  error is first d
12d10 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  etected..*/.int 
12d20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72  sqlite3CorruptEr
12d30 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
12d40 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
12d50 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
12d60 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
12d70 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
12d80 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20 20  _CORRUPT,.      
12d90 20 20 20 20 20 20 20 20 22 64 61 74 61 62 61 73          "databas
12da0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74 20  e corruption at 
12db0 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
12dc0 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
12dd0 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
12de0 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
12df0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12e00 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e  TE_CORRUPT;.}.in
12e10 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45  t sqlite3MisuseE
12e20 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
12e30 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
12e40 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
12e50 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
12e60 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
12e70 45 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20 20 20  E_MISUSE, .     
12e80 20 20 20 20 20 20 20 20 20 22 6d 69 73 75 73 65           "misuse
12e90 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
12ea0 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
12eb0 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32         lineno, 2
12ec0 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  0+sqlite3_source
12ed0 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
12ee0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d  SQLITE_MISUSE;.}
12ef0 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74  .int sqlite3Cant
12f00 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69  openError(int li
12f10 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
12f20 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
12f30 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
12f40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
12f50 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
12f60 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
12f70 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
12f80 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  e at line %d of 
12f90 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
12fa0 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20          lineno, 
12fb0 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  20+sqlite3_sourc
12fc0 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e  eid());.  return
12fd0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
12fe0 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
12ff0 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
13000 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ATED./*.** This 
13010 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  is a convenience
13020 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61   routine that ma
13030 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61 6c  kes sure that al
13040 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  l thread-specifi
13050 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68  c.** data for th
13060 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62 65  is thread has be
13070 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a  en deallocated..
13080 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20  **.** SQLite no 
13090 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72 65  longer uses thre
130a0 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61  ad-specific data
130b0 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
130c0 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d   is now a.** no-
130d0 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61 69  op.  It is retai
130e0 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ned for historic
130f0 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  al compatibility
13100 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13110 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
13120 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66  (void){.}.#endif
13130 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d  ../*.** Return m
13140 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
13150 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 69 63  about a specific
13160 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74   column of a dat
13170 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
13180 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73  See comment in s
13190 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65  qlite3.h (sqlite
131a0 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69  .h.in) for detai
131b0 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ls..*/.#ifdef SQ
131c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
131d0 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 69 6e 74 20  MN_METADATA.int 
131e0 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
131f0 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20  lumn_metadata(. 
13200 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
13210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13220 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  Connection handl
13230 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
13240 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20  r *zDbName,     
13250 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
13260 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ame or NULL */. 
13270 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
13280 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  bleName,     /* 
13290 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  Table name */.  
132a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
132b0 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43  umnName,    /* C
132c0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
132d0 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44  char const **pzD
132e0 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f  ataType,    /* O
132f0 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20  UTPUT: Declared 
13300 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63  data type */.  c
13310 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f  har const **pzCo
13320 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55  llSeq,     /* OU
13330 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20  TPUT: Collation 
13340 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f  sequence name */
13350 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c  .  int *pNotNull
13360 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
13370 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
13380 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  f NOT NULL const
13390 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a  raint exists */.
133a0 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b    int *pPrimaryK
133b0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
133c0 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
133d0 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20   column part of 
133e0 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75  PK */.  int *pAu
133f0 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20 20  toinc           
13400 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
13410 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73  rue if column is
13420 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20   auto-increment 
13430 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
13440 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
13450 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  = 0;.  Table *pT
13460 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e  ab = 0;.  Column
13470 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pCol = 0;.  in
13480 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68 61 72 20  t iCol;..  char 
13490 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65  const *zDataType
134a0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
134b0 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30  st *zCollSeq = 0
134c0 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20  ;.  int notnull 
134d0 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61  = 0;.  int prima
134e0 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  rykey = 0;.  int
134f0 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20   autoinc = 0;.. 
13500 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64   /* Ensure the d
13510 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68  atabase schema h
13520 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a  as been loaded *
13530 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
13540 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
13550 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
13560 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
13570 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e    rc = sqlite3In
13580 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29  it(db, &zErrMsg)
13590 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
135a0 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74  K!=rc ){.    got
135b0 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
135c0 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
135d0 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74  e table in quest
135e0 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  ion */.  pTab = 
135f0 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
13600 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c  (db, zTableName,
13610 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28   zDbName);.  if(
13620 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e   !pTab || pTab->
13630 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70  pSelect ){.    p
13640 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  Tab = 0;.    got
13650 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
13660 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
13670 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68  column for which
13680 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74   info is request
13690 65 64 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  ed */.  if( sqli
136a0 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75  te3IsRowid(zColu
136b0 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 69  mnName) ){.    i
136c0 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
136d0 79 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  y;.    if( iCol>
136e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  =0 ){.      pCol
136f0 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = &pTab->aCol[i
13700 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Col];.    }.  }e
13710 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f  lse{.    for(iCo
13720 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
13730 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
13740 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61       pCol = &pTa
13750 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
13760 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
13770 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
13780 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e  >zName, zColumnN
13790 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
137a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
137b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
137c0 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  l==pTab->nCol ){
137d0 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b  .      pTab = 0;
137e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  .      goto erro
137f0 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  r_out;.    }.  }
13800 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
13810 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65  wing block store
13820 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72  s the meta infor
13830 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  mation that will
13840 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a   be returned.  *
13850 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  * to the caller 
13860 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  in local variabl
13870 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43  es zDataType, zC
13880 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c  ollSeq, notnull,
13890 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a   primarykey.  **
138a0 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74   and autoinc. At
138b0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
138c0 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62  e are two possib
138d0 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20  ilities:.  ** . 
138e0 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73   **     1. The s
138f0 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20  pecified column 
13900 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c  name was rowid",
13910 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69   "oid" or "_rowi
13920 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  d_" .  **       
13930 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
13940 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c   explicitly decl
13950 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e  ared IPK column.
13960 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20   .  **.  **     
13970 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  2. The table is 
13980 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74  not a view and t
13990 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
139a0 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20  dentified an .  
139b0 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63  **        explic
139c0 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f  itly declared co
139d0 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20  lumn. Copy meta 
139e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
139f0 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20   *pCol..  */ .  
13a00 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20  if( pCol ){.    
13a10 7a 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f 6c  zDataType = pCol
13a20 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f  ->zType;.    zCo
13a30 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43  llSeq = pCol->zC
13a40 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c  oll;.    notnull
13a50 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c   = pCol->notNull
13a60 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  !=0;.    primary
13a70 6b 65 79 20 20 3d 20 70 43 6f 6c 2d 3e 69 73 50  key  = pCol->isP
13a80 72 69 6d 4b 65 79 21 3d 30 3b 0a 20 20 20 20 61  rimKey!=0;.    a
13a90 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69  utoinc = pTab->i
13aa0 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70  PKey==iCol && (p
13ab0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
13ac0 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
13ad0 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )!=0;.  }else{. 
13ae0 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22     zDataType = "
13af0 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72  INTEGER";.    pr
13b00 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20  imarykey = 1;.  
13b10 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65  }.  if( !zCollSe
13b20 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65  q ){.    zCollSe
13b30 71 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  q = "BINARY";.  
13b40 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20  }..error_out:.  
13b50 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13b60 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eAll(db);..  /* 
13b70 57 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63  Whether the func
13b80 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65  tion call succee
13b90 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73  ded or failed, s
13ba0 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 61  et the output pa
13bb0 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f  rameters.  ** to
13bc0 20 77 68 61 74 65 76 65 72 20 74 68 65 69 72 20   whatever their 
13bd0 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72  local counterpar
13be0 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61  ts contain. If a
13bf0 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
13c00 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73  r,.  ** this has
13c10 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a   the effect of z
13c20 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75  eroing all outpu
13c30 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20  t parameters..  
13c40 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54  */.  if( pzDataT
13c50 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70  ype ) *pzDataTyp
13c60 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20  e = zDataType;. 
13c70 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29   if( pzCollSeq )
13c80 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43   *pzCollSeq = zC
13c90 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e  ollSeq;.  if( pN
13ca0 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75  otNull ) *pNotNu
13cb0 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20  ll = notnull;.  
13cc0 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20  if( pPrimaryKey 
13cd0 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d  ) *pPrimaryKey =
13ce0 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69   primarykey;.  i
13cf0 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70  f( pAutoinc ) *p
13d00 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e  Autoinc = autoin
13d10 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  c;..  if( SQLITE
13d20 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62  _OK==rc && !pTab
13d30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
13d40 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
13d50 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20  g);.    zErrMsg 
13d60 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
13d70 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  (db, "no such ta
13d80 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25  ble column: %s.%
13d90 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a  s", zTableName,.
13da0 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e          zColumnN
13db0 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ame);.    rc = S
13dc0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
13dd0 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
13de0 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67  db, rc, (zErrMsg
13df0 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73  ?"%s":0), zErrMs
13e00 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
13e10 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
13e20 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
13e30 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
13e40 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13e50 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
13e60 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
13e70 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
13e80 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
13e90 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
13ea0 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
13eb0 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69  time slept..*/.i
13ec0 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70  nt sqlite3_sleep
13ed0 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69  (int ms){.  sqli
13ee0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20  te3_vfs *pVfs;. 
13ef0 20 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20   int rc;.  pVfs 
13f00 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
13f10 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66  nd(0);.  if( pVf
13f20 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  s==0 ) return 0;
13f30 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
13f40 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69  tion works in mi
13f50 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20  lliseconds, but 
13f60 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f  the underlying O
13f70 73 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41  sSleep() .  ** A
13f80 50 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63  PI uses microsec
13f90 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20  onds. Hence the 
13fa0 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72  1000's..  */.  r
13fb0 63 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c  c = (sqlite3OsSl
13fc0 65 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d  eep(pVfs, 1000*m
13fd0 73 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75  s)/1000);.  retu
13fe0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13ff0 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
14000 65 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72  e the extended r
14010 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a  esult codes..*/.
14020 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65  int sqlite3_exte
14030 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
14040 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
14050 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71 6c  nt onoff){.  sql
14060 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14070 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
14080 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f  b->errMask = ono
14090 66 66 20 3f 20 30 78 66 66 66 66 66 66 66 66 20  ff ? 0xffffffff 
140a0 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65  : 0xff;.  sqlite
140b0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
140c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
140d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
140e0 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
140f0 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d  e xFileControl m
14100 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69  ethod on a parti
14110 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a  cular database..
14120 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  */.int sqlite3_f
14130 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69  ile_control(sqli
14140 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
14150 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e  har *zDbName, in
14160 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
14170 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
14180 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69 6e  LITE_ERROR;.  in
14190 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33  t iDb;.  sqlite3
141a0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
141b0 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
141c0 44 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  DbName==0 ){.   
141d0 20 69 44 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   iDb = 0;.  }els
141e0 65 7b 0a 20 20 20 20 66 6f 72 28 69 44 62 3d 30  e{.    for(iDb=0
141f0 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
14200 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  Db++){.      if(
14210 20 73 74 72 63 6d 70 28 64 62 2d 3e 61 44 62 5b   strcmp(db->aDb[
14220 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 4e  iDb].zName, zDbN
14230 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
14240 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
14250 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 7b 0a   iDb<db->nDb ){.
14260 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 72 65      Btree *pBtre
14270 65 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  e = db->aDb[iDb]
14280 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
14290 74 72 65 65 20 29 7b 0a 20 20 20 20 20 20 50 61  tree ){.      Pa
142a0 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
142b0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
142c0 2a 66 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  *fd;.      sqlit
142d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
142e0 72 65 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ree);.      pPag
142f0 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
14300 65 50 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a  ePager(pBtree);.
14310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
14320 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  ager!=0 );.     
14330 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67   fd = sqlite3Pag
14340 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a  erFile(pPager);.
14350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 64        assert( fd
14360 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
14370 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54   op==SQLITE_FCNT
14380 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29  L_FILE_POINTER )
14390 7b 0a 20 20 20 20 20 20 20 20 2a 28 73 71 6c 69  {.        *(sqli
143a0 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20  te3_file**)pArg 
143b0 3d 20 66 64 3b 0a 20 20 20 20 20 20 20 20 72 63  = fd;.        rc
143c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
143d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 64      }else if( fd
143e0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
143f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14400 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
14410 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20  fd, op, pArg);. 
14420 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14430 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14440 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 20 20  NOTFOUND;.      
14450 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
14460 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
14470 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
14480 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14490 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
144a0 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 0a 7d   return rc;   .}
144b0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ../*.** Interfac
144c0 65 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67  e to the testing
144d0 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73   logic..*/.int s
144e0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
144f0 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  rol(int op, ...)
14500 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
14510 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14520 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54  MIT_BUILTIN_TEST
14530 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
14540 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70   va_start(ap, op
14550 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  );.  switch( op 
14560 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  ){..    /*.    *
14570 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
14580 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
14590 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  PRNG..    */.   
145a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
145b0 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a  TCTRL_PRNG_SAVE:
145c0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
145d0 50 72 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b  PrngSaveState();
145e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
145f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
14600 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 73  ** Restore the s
14610 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47  tate of the PRNG
14620 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61   to the last sta
14630 74 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20  te saved using. 
14640 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e     ** PRNG_SAVE.
14650 20 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68    If PRNG_SAVE h
14660 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20  as never before 
14670 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65  been called, the
14680 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65  n.    ** this ve
14690 72 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e  rb acts like PRN
146a0 47 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a  G_RESET..    */.
146b0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
146c0 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
146d0 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73  STORE: {.      s
146e0 71 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72  qlite3PrngRestor
146f0 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  eState();.      
14700 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
14710 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65    /*.    ** Rese
14720 74 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20  t the PRNG back 
14730 74 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c  to its uninitial
14740 69 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68 65  ized state.  The
14750 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a   next call.    *
14760 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e  * to sqlite3_ran
14770 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72  domness() will r
14780 65 73 65 65 64 20 74 68 65 20 50 52 4e 47 20 75  eseed the PRNG u
14790 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61  sing a single ca
147a0 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  ll.    ** to the
147b0 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74   xRandomness met
147c0 68 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61 75  hod of the defau
147d0 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20  lt VFS..    */. 
147e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
147f0 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
14800 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ET: {.      sqli
14810 74 65 33 50 72 6e 67 52 65 73 65 74 53 74 61 74  te3PrngResetStat
14820 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
14830 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
14840 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
14850 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54  test_control(BIT
14860 56 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20  VEC_TEST, size, 
14870 70 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a  program).    **.
14880 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73      ** Run a tes
14890 74 20 61 67 61 69 6e 73 74 20 61 20 42 69 74 76  t against a Bitv
148a0 65 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a  ec object of siz
148b0 65 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20  e.  The program 
148c0 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20  argument.    ** 
148d0 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69  is an array of i
148e0 6e 74 65 67 65 72 73 20 74 68 61 74 20 64 65 66  ntegers that def
148f0 69 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20 20  ines the test.  
14900 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20  Return -1 on a. 
14910 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c     ** memory all
14920 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30  ocation error, 0
14930 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20   on success, or 
14940 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20  non-zero for an 
14950 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65  error..    ** Se
14960 65 20 74 68 65 20 73 71 6c 69 74 65 33 42 69 74  e the sqlite3Bit
14970 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29  vecBuiltinTest()
14980 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
14990 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
149a0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
149b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54  ITE_TESTCTRL_BIT
149c0 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20  VEC_TEST: {.    
149d0 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72    int sz = va_ar
149e0 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
149f0 20 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76    int *aProg = v
14a00 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b  a_arg(ap, int*);
14a10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14a20 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e  te3BitvecBuiltin
14a30 54 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b  Test(sz, aProg);
14a40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14a50 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
14a60 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
14a70 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f  _control(BENIGN_
14a80 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42  MALLOC_HOOKS, xB
14a90 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20  egin, xEnd).    
14aa0 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74  **.    ** Regist
14ab0 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c  er hooks to call
14ac0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69   to indicate whi
14ad0 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  ch malloc() fail
14ae0 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65  ures .    ** are
14af0 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a   benign..    */.
14b00 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
14b10 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f  TESTCTRL_BENIGN_
14b20 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a  MALLOC_HOOKS: {.
14b30 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
14b40 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69  id (*void_functi
14b50 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20  on)(void);.     
14b60 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78   void_function x
14b70 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20  BenignBegin;.   
14b80 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e     void_function
14b90 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20   xBenignEnd;.   
14ba0 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20     xBenignBegin 
14bb0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
14bc0 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20  d_function);.   
14bd0 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20     xBenignEnd = 
14be0 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f  va_arg(ap, void_
14bf0 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  function);.     
14c00 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61   sqlite3BenignMa
14c10 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67  llocHooks(xBenig
14c20 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45  nBegin, xBenignE
14c30 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nd);.      break
14c40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
14c50 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
14c60 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
14c70 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e  ITE_TESTCTRL_PEN
14c80 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67  DING_BYTE, unsig
14c90 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  ned int X).    *
14ca0 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
14cb0 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f   PENDING byte to
14cc0 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
14cd0 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58  e argument, if X
14ce0 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20  >0..    ** Make 
14cf0 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d  no changes if X=
14d00 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  =0.  Return the 
14d10 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e  value of the pen
14d20 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a  ding byte.    **
14d30 20 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20   as it existing 
14d40 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
14d50 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ine was called..
14d60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d      **.    ** IM
14d70 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69  PORTANT:  Changi
14d80 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  ng the PENDING b
14d90 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30  yte from 0x40000
14da0 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20  000 results in. 
14db0 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61     ** an incompa
14dc0 74 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66  tible database f
14dd0 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61  ile format.  Cha
14de0 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e  nging the PENDIN
14df0 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68  G byte.    ** wh
14e00 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65  ile any database
14e10 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
14e20 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75  pen results in u
14e30 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20  ndefined and.   
14e40 20 2a 2a 20 64 69 6c 65 74 65 72 69 6f 75 73 20   ** dileterious 
14e50 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f  behavior..    */
14e60 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
14e70 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
14e80 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20  G_BYTE: {.      
14e90 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rc = PENDING_BYT
14ea0 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  E;.#ifndef SQLIT
14eb0 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20  E_OMIT_WSD.     
14ec0 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67   {.        unsig
14ed0 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d  ned int newVal =
14ee0 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69   va_arg(ap, unsi
14ef0 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20  gned int);.     
14f00 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20     if( newVal ) 
14f10 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79  sqlite3PendingBy
14f20 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20  te = newVal;.   
14f30 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
14f40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
14f50 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
14f60 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
14f70 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
14f80 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20  TRL_ASSERT, int 
14f90 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
14fa0 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f   This action pro
14fb0 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65  vides a run-time
14fc0 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   test to see whe
14fd0 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20  ther or not.    
14fe0 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20  ** assert() was 
14ff0 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
15000 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69  le-time.  If X i
15010 73 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72  s true and asser
15020 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e  t().    ** is en
15030 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
15040 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
15050 74 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74  true.  If X is t
15060 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  rue and.    ** a
15070 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
15080 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
15090 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
150a0 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20  ro.  If X is.   
150b0 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73   ** false and as
150c0 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65  sert() is enable
150d0 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65  d, then the asse
150e0 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20  rtion fires and 
150f0 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
15100 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58  ss aborts.  If X
15110 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73   is false and as
15120 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
15130 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ed, then the.   
15140 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
15150 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   is zero..    */
15160 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
15170 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
15180 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69  : {.      volati
15190 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20  le int x = 0;.  
151a0 20 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d      assert( (x =
151b0 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29   va_arg(ap,int))
151c0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  !=0 );.      rc 
151d0 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = x;.      break
151e0 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
151f0 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
15200 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
15210 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
15220 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20  WAYS, int X).   
15230 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
15240 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
15250 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
15260 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41  to see how the A
15270 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a  LWAYS and.    **
15280 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65   NEVER macros we
15290 72 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f  re defined at co
152a0 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20  mpile-time..    
152b0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
152c0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c  turn value is AL
152d0 57 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a  WAYS(X).  .    *
152e0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  *.    ** The rec
152f0 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73  ommended test is
15300 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72   X==2.  If the r
15310 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32  eturn value is 2
15320 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20  , that means.   
15330 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64   ** ALWAYS() and
15340 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74   NEVER() are bot
15350 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  h no-op pass-thr
15360 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69  ough macros, whi
15370 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ch is the.    **
15380 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
15390 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
153a0 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65   value is 1, the
153b0 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69  n ALWAYS() is ei
153c0 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64  ther.    ** hard
153d0 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f  -coded to true o
153e0 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74  r else it assert
153f0 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e  s if its argumen
15400 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  t is false..    
15410 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68  ** The first beh
15420 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65  avior (hard-code
15430 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68  d to true) is th
15440 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
15450 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
15460 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
15470 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64  at assert() is d
15480 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  isabled and the 
15490 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65  second.    ** be
154a0 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69  havior (assert i
154b0 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
154c0 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61  o ALWAYS() is fa
154d0 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65  lse) is the case
154e0 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
154f0 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
15500 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
15510 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
15520 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
15530 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  The run-time tes
15540 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68  t procedure migh
15550 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67  t look something
15560 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
15570 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28  **.    **    if(
15580 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
15590 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
155a0 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29  TCTRL_ALWAYS, 2)
155b0 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20  ==2 ){.    **   
155c0 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61     // ALWAYS() a
155d0 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e  nd NEVER() are n
155e0 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67  o-op pass-throug
155f0 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20  h macros.    ** 
15600 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
15610 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
15620 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
15630 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a  L_ASSERT, 1) ){.
15640 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
15650 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73  LWAYS(x) asserts
15660 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e   that x is true.
15670 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74   NEVER(x) assert
15680 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  s x is false..  
15690 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    **    }else{. 
156a0 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
156b0 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e  WAYS(x) is a con
156c0 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28  stant 1.  NEVER(
156d0 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
156e0 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a   0..    **    }.
156f0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
15700 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
15710 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20  ALWAYS: {.      
15720 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
15730 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  p,int);.      rc
15740 20 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20   = ALWAYS(x);.  
15750 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15760 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
15770 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
15780 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
15790 52 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33  RESERVE, sqlite3
157a0 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20   *db, int N).   
157b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74   **.    ** Set t
157c0 68 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65  he nReserve size
157d0 20 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61   to N for the ma
157e0 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74  in database on t
157f0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
15800 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ** connection db
15810 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
15820 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
15830 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20  L_RESERVE: {.   
15840 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
15850 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
15860 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  te3*);.      int
15870 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69   x = va_arg(ap,i
15880 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
15890 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
158a0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
158b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
158c0 50 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62  PageSize(db->aDb
158d0 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30  [0].pBt, 0, x, 0
158e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
158f0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
15900 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62  >mutex);.      b
15910 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
15920 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   /*  sqlite3_tes
15930 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
15940 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
15950 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33  ZATIONS, sqlite3
15960 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20   *db, int N).   
15970 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c   **.    ** Enabl
15980 65 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72  e or disable var
15990 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ious optimizatio
159a0 6e 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  ns for testing p
159b0 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20  urposes.  The . 
159c0 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e     ** argument N
159d0 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
159e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74   optimizations t
159f0 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20  o be disabled.  
15a00 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a  For normal.    *
15a10 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68  * operation N sh
15a20 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
15a30 69 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74  idea is that a t
15a40 65 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b  est program (lik
15a50 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c  e the.    ** SQL
15a60 20 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53   Logic Test or S
15a70 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20  LT test module) 
15a80 63 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65  can run the same
15a90 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69   SQL multiple ti
15aa0 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  mes.    ** with 
15ab0 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61  various optimiza
15ac0 74 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74  tions disabled t
15ad0 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
15ae0 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20  e same answer.  
15af0 20 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64    ** is obtained
15b00 20 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a   in every case..
15b10 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
15b20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
15b30 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b  OPTIMIZATIONS: {
15b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
15b50 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
15b60 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
15b70 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28   int x = va_arg(
15b80 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 64  ap,int);.      d
15b90 62 2d 3e 66 6c 61 67 73 20 3d 20 28 78 20 26 20  b->flags = (x & 
15ba0 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29 20  SQLITE_OptMask) 
15bb0 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 7e  | (db->flags & ~
15bc0 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29 3b  SQLITE_OptMask);
15bd0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15be0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
15bf0 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20  TE_N_KEYWORD.   
15c00 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
15c10 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
15c20 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f  TESTCTRL_ISKEYWO
15c30 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  RD, const char *
15c40 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20  zWord).    **.  
15c50 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73    ** If zWord is
15c60 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67   a keyword recog
15c70 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61 72  nized by the par
15c80 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ser, then return
15c90 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62   the.    ** numb
15ca0 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20  er of keywords. 
15cb0 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20   Or if zWord is 
15cc0 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72  not a keyword, r
15cd0 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20  eturn 0..    ** 
15ce0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73  .    ** This tes
15cf0 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c  t feature is onl
15d00 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  y available in t
15d10 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20  he amalgamation 
15d20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65  since.    ** the
15d30 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
15d40 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64  D macro is not d
15d50 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66  efined in this f
15d60 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20  ile if SQLite.  
15d70 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73    ** is built us
15d80 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f 75  ing separate sou
15d90 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a  rce files..    *
15da0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
15db0 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59  E_TESTCTRL_ISKEY
15dc0 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f  WORD: {.      co
15dd0 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20  nst char *zWord 
15de0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e  = va_arg(ap, con
15df0 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
15e00 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
15e10 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b  Strlen30(zWord);
15e20 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c  .      rc = (sql
15e30 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28  ite3KeywordCode(
15e40 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d  (u8*)zWord, n)!=
15e50 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f  TK_ID) ? SQLITE_
15e60 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20  N_KEYWORD : 0;. 
15e70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15e80 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f  }.#endif ..    /
15e90 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
15ea0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
15eb0 53 54 43 54 52 4c 5f 50 47 48 44 52 53 5a 29 0a  STCTRL_PGHDRSZ).
15ec0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65      **.    ** Re
15ed0 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
15ee0 20 61 20 70 63 61 63 68 65 20 68 65 61 64 65 72   a pcache header
15ef0 20 69 6e 20 62 79 74 65 73 2e 0a 20 20 20 20 2a   in bytes..    *
15f00 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
15f10 45 5f 54 45 53 54 43 54 52 4c 5f 50 47 48 44 52  E_TESTCTRL_PGHDR
15f20 53 5a 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  SZ: {.      rc =
15f30 20 73 69 7a 65 6f 66 28 50 67 48 64 72 29 3b 0a   sizeof(PgHdr);.
15f40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15f50 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74   }..    /* sqlit
15f60 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
15f70 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
15f80 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 2c 20 73  SCRATCHMALLOC, s
15f90 7a 2c 20 26 70 4e 65 77 2c 20 70 46 72 65 65 29  z, &pNew, pFree)
15fa0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
15fb0 50 61 73 73 20 70 46 72 65 65 20 69 6e 74 6f 20  Pass pFree into 
15fc0 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
15fd0 65 65 28 29 2e 20 0a 20 20 20 20 2a 2a 20 49 66  ee(). .    ** If
15fe0 20 73 7a 3e 30 20 74 68 65 6e 20 61 6c 6c 6f 63   sz>0 then alloc
15ff0 61 74 65 20 61 20 73 63 72 61 74 63 68 20 62 75  ate a scratch bu
16000 66 66 65 72 20 69 6e 74 6f 20 70 4e 65 77 2e 20  ffer into pNew. 
16010 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73   .    */.    cas
16020 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
16030 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 3a  L_SCRATCHMALLOC:
16040 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
16050 46 72 65 65 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20  Free, **ppNew;. 
16060 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20       int sz;.   
16070 20 20 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61     sz = va_arg(a
16080 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 70  p, int);.      p
16090 70 4e 65 77 20 3d 20 76 61 5f 61 72 67 28 61 70  pNew = va_arg(ap
160a0 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20 20 20 20 20  , void**);.     
160b0 20 70 46 72 65 65 20 3d 20 76 61 5f 61 72 67 28   pFree = va_arg(
160c0 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
160d0 20 20 69 66 28 20 73 7a 20 29 20 2a 70 70 4e 65    if( sz ) *ppNe
160e0 77 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74  w = sqlite3Scrat
160f0 63 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20  chMalloc(sz);.  
16100 20 20 20 20 73 71 6c 69 74 65 33 53 63 72 61 74      sqlite3Scrat
16110 63 68 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20  chFree(pFree);. 
16120 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16130 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
16140 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
16150 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
16160 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
16170 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20  , int onoff);.  
16180 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70    **.    ** If p
16190 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69  arameter onoff i
161a0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66  s non-zero, conf
161b0 69 67 75 72 65 20 74 68 65 20 77 72 61 70 70 65  igure the wrappe
161c0 72 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a 20  rs so that all. 
161d0 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74     ** subsequent
161e0 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74   calls to localt
161f0 69 6d 65 28 29 20 61 6e 64 20 76 61 72 69 61 6e  ime() and varian
16200 74 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66  ts fail. If onof
16210 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20 2a  f is zero,.    *
16220 2a 20 75 6e 64 6f 20 74 68 69 73 20 73 65 74 74  * undo this sett
16230 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
16240 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
16250 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
16260 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  AULT: {.      sq
16270 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16280 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c  g.bLocaltimeFaul
16290 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
162a0 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
162b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 76  ;.    }..  }.  v
162c0 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69  a_end(ap);.#endi
162d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
162e0 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f  _BUILTIN_TEST */
162f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16300 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
16310 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65   utility routine
16320 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20  , useful to VFS 
16330 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c  implementations,
16340 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20   that checks.** 
16350 74 6f 20 73 65 65 20 69 66 20 61 20 64 61 74 61  to see if a data
16360 62 61 73 65 20 66 69 6c 65 20 77 61 73 20 61 20  base file was a 
16370 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  URI that contain
16380 65 64 20 61 20 73 70 65 63 69 66 69 63 20 71 75  ed a specific qu
16390 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ery .** paramete
163a0 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74  r, and if so obt
163b0 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  ains the value o
163c0 66 20 74 68 65 20 71 75 65 72 79 20 70 61 72 61  f the query para
163d0 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  meter..**.** The
163e0 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d   zFilename argum
163f0 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e  ent is the filen
16400 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73  ame pointer pass
16410 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65  ed into the xOpe
16420 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66  n().** method of
16430 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74   a VFS implement
16440 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72  ation.  The zPar
16450 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  am argument is t
16460 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a  he name of the.*
16470 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  * query paramete
16480 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73  r we seek.  This
16490 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
164a0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
164b0 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61  e zParam.** para
164c0 6d 65 74 65 72 20 69 66 20 69 74 20 65 78 69 73  meter if it exis
164d0 74 73 2e 20 20 49 66 20 74 68 65 20 70 61 72 61  ts.  If the para
164e0 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65  meter does not e
164f0 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  xist, this routi
16500 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  ne.** returns a 
16510 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  NULL pointer..*/
16520 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
16530 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
16540 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
16550 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20  Filename, const 
16560 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20  char *zParam){. 
16570 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
16580 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
16590 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
165a0 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65  while( zFilename
165b0 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78  [0] ){.    int x
165c0 20 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e   = strcmp(zFilen
165d0 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20  ame, zParam);.  
165e0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
165f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
16600 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
16610 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65     if( x==0 ) re
16620 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
16630 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d      zFilename +=
16640 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
16650 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b  (zFilename) + 1;
16660 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
16670 0a 7d 0a                                         .}.