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

Artifact 242eaa584e256364f81f2aef97d3eca283d94073:


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 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
21c0: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
21d0: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
21e0: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
21f0: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2200: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2210: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2220: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2230: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2240: 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 47  E_OK && sqlite3G
2250: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
2260: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 53 51  it ){.    int SQ
2270: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28  LITE_EXTRA_INIT(
2280: 76 6f 69 64 29 3b 0a 20 20 20 20 72 63 20 3d 20  void);.    rc = 
2290: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
22a0: 54 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  T();.  }.#endif.
22b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22c0: 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65 20  ./*.** Undo the 
22d0: 65 66 66 65 63 74 73 20 6f 66 20 73 71 6c 69 74  effects of sqlit
22e0: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e  e3_initialize().
22f0: 20 20 4d 75 73 74 20 6e 6f 74 20 62 65 20 63 61    Must not be ca
2300: 6c 6c 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74 68  lled while.** th
2310: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
2320: 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ing database con
2330: 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f  nections or memo
2340: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f  ry allocations o
2350: 72 0a 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 70  r.** while any p
2360: 61 72 74 20 6f 66 20 53 51 4c 69 74 65 20 69 73  art of SQLite is
2370: 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75 73   otherwise in us
2380: 65 20 69 6e 20 61 6e 79 20 74 68 72 65 61 64 2e  e in any thread.
2390: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
23a0: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
23b0: 61 66 65 2e 20 20 42 75 74 20 69 74 20 69 73 20  afe.  But it is 
23c0: 73 61 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74  safe to invoke t
23d0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f  his routine.** o
23e0: 6e 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73  n when SQLite is
23f0: 20 61 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f   already shut do
2400: 77 6e 2e 20 20 49 66 20 53 51 4c 69 74 65 20 69  wn.  If SQLite i
2410: 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20 64  s already shut d
2420: 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  own.** when this
2430: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
2440: 6b 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ked, then this r
2450: 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d  outine is a harm
2460: 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  less no-op..*/.i
2470: 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  nt sqlite3_shutd
2480: 6f 77 6e 28 76 6f 69 64 29 7b 0a 20 20 69 66 28  own(void){.  if(
2490: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
24a0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a 20  nfig.isInit ){. 
24b0: 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e     sqlite3_os_en
24c0: 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d();.    sqlite3
24d0: 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74 65  _reset_auto_exte
24e0: 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71 6c  nsion();.    sql
24f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2500: 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  .isInit = 0;.  }
2510: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
2520: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61  obalConfig.isPCa
2530: 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  cheInit ){.    s
2540: 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75 74  qlite3PcacheShut
2550: 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69  down();.    sqli
2560: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2570: 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 30  isPCacheInit = 0
2580: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2590: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
25a0: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a  isMallocInit ){.
25b0: 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f      sqlite3Mallo
25c0: 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69  cEnd();.    sqli
25d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
25e0: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30  isMallocInit = 0
25f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2600: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2610: 69 73 4d 75 74 65 78 49 6e 69 74 20 29 7b 0a 20  isMutexInit ){. 
2620: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 45     sqlite3MutexE
2630: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2640: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
2650: 4d 75 74 65 78 49 6e 69 74 20 3d 20 30 3b 0a 20  MutexInit = 0;. 
2660: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
2670: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2680: 20 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77 73   This API allows
2690: 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f   applications to
26a0: 20 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f 62   modify the glob
26b0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
26c0: 20 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74   of.** the SQLit
26d0: 65 20 6c 69 62 72 61 72 79 20 61 74 20 72 75 6e  e library at run
26e0: 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -time..**.** Thi
26f0: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
2700: 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
2710: 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e  when there are n
2720: 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a  o outstanding.**
2730: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2740: 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20  tions or memory 
2750: 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68  allocations.  Th
2760: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
2770: 74 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65 2e  t.** threadsafe.
2780: 20 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65 65    Failure to hee
2790: 64 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67 73  d these warnings
27a0: 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70   can lead to unp
27b0: 72 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65  redictable.** be
27c0: 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73  havior..*/.int s
27d0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e  qlite3_config(in
27e0: 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  t op, ...){.  va
27f0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20  _list ap;.  int 
2800: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2810: 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  /* sqlite3_co
2820: 6e 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65 74  nfig() shall ret
2830: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
2840: 45 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f 6b  E if it is invok
2850: 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68  ed while.  ** th
2860: 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  e SQLite library
2870: 20 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20   is in use. */. 
2880: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
2890: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
28a0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
28b0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20  MISUSE_BKPT;..  
28c0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29  va_start(ap, op)
28d0: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
28e0: 7b 0a 0a 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  {..    /* Mutex 
28f0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70  configuration op
2900: 74 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20 61  tions are only a
2910: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 20 74 68  vailable in a th
2920: 72 65 61 64 73 61 66 65 0a 20 20 20 20 2a 2a 20  readsafe.    ** 
2930: 63 6f 6d 70 69 6c 65 2e 20 0a 20 20 20 20 2a 2f  compile. .    */
2940: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2950: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20  ITE_THREADSAFE) 
2960: 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
2970: 53 41 46 45 3e 30 0a 20 20 20 20 63 61 73 65 20  SAFE>0.    case 
2980: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49  SQLITE_CONFIG_SI
2990: 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20 20  NGLETHREAD: {.  
29a0: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 61      /* Disable a
29b0: 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20  ll mutexing */. 
29c0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
29d0: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
29e0: 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  tex = 0;.      s
29f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2a00: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
2a10: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
2a20: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2a30: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c  QLITE_CONFIG_MUL
2a40: 54 49 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20  TITHREAD: {.    
2a50: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74    /* Disable mut
2a60: 65 78 69 6e 67 20 6f 66 20 64 61 74 61 62 61 73  exing of databas
2a70: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  e connections */
2a80: 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65  .      /* Enable
2a90: 20 6d 75 74 65 78 69 6e 67 20 6f 66 20 63 6f 72   mutexing of cor
2aa0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
2ab0: 73 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  s */.      sqlit
2ac0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2ad0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 0a 20  CoreMutex = 1;. 
2ae0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2af0: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
2b00: 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  tex = 0;.      b
2b10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2b20: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2b30: 49 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b  IG_SERIALIZED: {
2b40: 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65  .      /* Enable
2b50: 20 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f   all mutexing */
2b60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2b70: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
2b80: 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Mutex = 1;.     
2b90: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2ba0: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
2bb0: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
2bc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2bd0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
2be0: 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  UTEX: {.      /*
2bf0: 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65   Specify an alte
2c00: 72 6e 61 74 69 76 65 20 6d 75 74 65 78 20 69 6d  rnative mutex im
2c10: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
2c20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2c30: 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 20  balConfig.mutex 
2c40: 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71  = *va_arg(ap, sq
2c50: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68  lite3_mutex_meth
2c60: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
2c70: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
2c80: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
2c90: 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20  _GETMUTEX: {.   
2ca0: 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20 74     /* Retrieve t
2cb0: 68 65 20 63 75 72 72 65 6e 74 20 6d 75 74 65 78  he current mutex
2cc0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2cd0: 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67  */.      *va_arg
2ce0: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74  (ap, sqlite3_mut
2cf0: 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73  ex_methods*) = s
2d00: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2d10: 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20 20 20 20  ig.mutex;.      
2d20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
2d30: 64 69 66 0a 0a 0a 20 20 20 20 63 61 73 65 20 53  dif...    case S
2d40: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
2d50: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
2d60: 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72  Specify an alter
2d70: 6e 61 74 69 76 65 20 6d 61 6c 6c 6f 63 20 69 6d  native malloc im
2d80: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
2d90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2da0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76  balConfig.m = *v
2db0: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
2dc0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b  3_mem_methods*);
2dd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2de0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2df0: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41  ITE_CONFIG_GETMA
2e00: 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LLOC: {.      /*
2e10: 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75   Retrieve the cu
2e20: 72 72 65 6e 74 20 6d 61 6c 6c 6f 63 28 29 20 69  rrent malloc() i
2e30: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  mplementation */
2e40: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2e50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
2e60: 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71  .xMalloc==0 ) sq
2e70: 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75  lite3MemSetDefau
2e80: 6c 74 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f  lt();.      *va_
2e90: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
2ea0: 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20  mem_methods*) = 
2eb0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2ec0: 66 69 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65  fig.m;.      bre
2ed0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
2ee0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
2ef0: 5f 4d 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20  _MEMSTATUS: {.  
2f00: 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6f 72      /* Enable or
2f10: 20 64 69 73 61 62 6c 65 20 74 68 65 20 6d 61 6c   disable the mal
2f20: 6c 6f 63 20 73 74 61 74 75 73 20 63 6f 6c 6c 65  loc status colle
2f30: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73  ction */.      s
2f40: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2f50: 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20 76 61  ig.bMemstat = va
2f60: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
2f70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f80: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2f90: 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48  E_CONFIG_SCRATCH
2fa0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73  : {.      /* Des
2fb0: 69 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20  ignate a buffer 
2fc0: 66 6f 72 20 73 63 72 61 74 63 68 20 6d 65 6d 6f  for scratch memo
2fd0: 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  ry space */.    
2fe0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2ff0: 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68 20 3d  onfig.pScratch =
3000: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
3010: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
3020: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
3030: 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67  Scratch = va_arg
3040: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3050: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3060: 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 20 3d 20  nfig.nScratch = 
3070: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3080: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3090: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
30a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43  ITE_CONFIG_PAGEC
30b0: 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ACHE: {.      /*
30c0: 20 44 65 73 69 67 6e 61 74 65 20 61 20 62 75 66   Designate a buf
30d0: 66 65 72 20 66 6f 72 20 70 61 67 65 20 63 61 63  fer for page cac
30e0: 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  he memory space 
30f0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3100: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61  GlobalConfig.pPa
3110: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
3120: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
3130: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3140: 67 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f 61 72  g.szPage = va_ar
3150: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3160: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3170: 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76 61  onfig.nPage = va
3180: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3190: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
31a0: 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  }..    case SQLI
31b0: 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45  TE_CONFIG_PCACHE
31c0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65  : {.      /* Spe
31d0: 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74  cify an alternat
31e0: 69 76 65 20 70 61 67 65 20 63 61 63 68 65 20 69  ive page cache i
31f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  mplementation */
3200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3210: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
3220: 65 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  e = *va_arg(ap, 
3230: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
3240: 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20  ethods*);.      
3250: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
3260: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3270: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20  NFIG_GETPCACHE: 
3280: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
3290: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
32a0: 70 63 61 63 68 65 2e 78 49 6e 69 74 3d 3d 30 20  pcache.xInit==0 
32b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
32c0: 65 33 50 43 61 63 68 65 53 65 74 44 65 66 61 75  e3PCacheSetDefau
32d0: 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lt();.      }.  
32e0: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
32f0: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
3300: 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74  ethods*) = sqlit
3310: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
3320: 63 61 63 68 65 3b 0a 20 20 20 20 20 20 62 72 65  cache;.      bre
3330: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64  ak;.    }..#if d
3340: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
3350: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c  ABLE_MEMSYS3) ||
3360: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3370: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a  ENABLE_MEMSYS5).
3380: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3390: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20  CONFIG_HEAP: {. 
33a0: 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74       /* Designat
33b0: 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 68  e a buffer for h
33c0: 65 61 70 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  eap memory space
33d0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
33e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
33f0: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
3400: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73   void*);.      s
3410: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3420: 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72  ig.nHeap = va_ar
3430: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3440: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3450: 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61  onfig.mnReq = va
3460: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a  _arg(ap, int);..
3470: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
3480: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
3490: 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20  Req<1 ){.       
34a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
34b0: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a  nfig.mnReq = 1;.
34c0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
34d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
34e0: 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32  fig.mnReq>(1<<12
34f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
3500: 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20  cap min request 
3510: 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a  size at 2^12 */.
3520: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
3530: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65  lobalConfig.mnRe
3540: 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20  q = (1<<12);.   
3550: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
3560: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3570: 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a  fig.pHeap==0 ){.
3580: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
3590: 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69  e heap pointer i
35a0: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 72 65 73  s NULL, then res
35b0: 74 6f 72 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20  tore the malloc 
35c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20  implementation. 
35d0: 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74         ** back t
35e0: 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20  o NULL pointers 
35f0: 74 6f 6f 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  too.  This will 
3600: 63 61 75 73 65 20 74 68 65 20 6d 61 6c 6c 6f 63  cause the malloc
3610: 20 74 6f 20 67 6f 0a 20 20 20 20 20 20 20 20 2a   to go.        *
3620: 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20 64 65  * back to its de
3630: 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61  fault implementa
3640: 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65  tion when sqlite
3650: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69  3_initialize() i
3660: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6e  s.        ** run
3670: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
3680: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c       memset(&sql
3690: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
36a0: 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71  .m, 0, sizeof(sq
36b0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
36c0: 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  g.m));.      }el
36d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
36e0: 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20  he heap pointer 
36f0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
3700: 6e 20 69 6e 73 74 61 6c 6c 20 6f 6e 65 20 6f 66  n install one of
3710: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
3720: 6d 65 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65  mem5.c/mem3.c me
3730: 74 68 6f 64 73 2e 20 49 66 20 6e 65 69 74 68 65  thods. If neithe
3740: 72 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  r ENABLE_MEMSYS3
3750: 20 6e 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   nor.        ** 
3760: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 69  ENABLE_MEMSYS5 i
3770: 73 20 64 65 66 69 6e 65 64 2c 20 72 65 74 75 72  s defined, retur
3780: 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  n an error..    
3790: 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
37a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
37b0: 59 53 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69  YS3.        sqli
37c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
37d0: 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  m = *sqlite3MemG
37e0: 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e  etMemsys3();.#en
37f0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
3800: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
3810: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3820: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
3830: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d   *sqlite3MemGetM
3840: 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64 69 66  emsys5();.#endif
3850: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
3860: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3870: 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  if..    case SQL
3880: 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41  ITE_CONFIG_LOOKA
3890: 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SIDE: {.      sq
38a0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
38b0: 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  g.szLookaside = 
38c0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
38d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
38e0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b  obalConfig.nLook
38f0: 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61  aside = va_arg(a
3900: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3910: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3920: 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 61  .    /* Record a
3930: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3940: 6c 6f 67 67 65 72 20 66 75 6e 63 63 74 69 6f 6e  logger funcction
3950: 20 61 6e 64 20 69 74 73 20 66 69 72 73 74 20 61   and its first a
3960: 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a 20  rgument..    ** 
3970: 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 4e  The default is N
3980: 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69 73  ULL.  Logging is
3990: 20 64 69 73 61 62 6c 65 64 20 69 66 20 74 68 65   disabled if the
39a0: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
39b0: 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c  r is.    ** NULL
39c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
39d0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
39e0: 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOG: {.      /* 
39f0: 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20 61 62  MSVC is picky ab
3a00: 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63  out pulling func
3a10: 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69   ptrs from va li
3a20: 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74  sts..      ** ht
3a30: 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63  tp://support.mic
3a40: 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37  rosoft.com/kb/47
3a50: 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  961.      ** sql
3a60: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3a70: 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  .xLog = va_arg(a
3a80: 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a  p, void(*)(void*
3a90: 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a  ,int,const char*
3aa0: 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ));.      */.   
3ab0: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
3ac0: 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64  *LOGFUNC_t)(void
3ad0: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
3ae0: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
3af0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
3b00: 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  og = va_arg(ap, 
3b10: 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20  LOGFUNC_t);.    
3b20: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3b30: 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d 20  onfig.pLogArg = 
3b40: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
3b50: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3b60: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
3b70: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
3b80: 49 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  I: {.      sqlit
3b90: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
3ba0: 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61 72 67  OpenUri = va_arg
3bb0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3bc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
3bd0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
3be0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3bf0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
3c00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
3c10: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
3c20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3c30: 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f  * Set up the loo
3c40: 6b 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66  kaside buffers f
3c50: 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
3c60: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74  nnection..** Ret
3c70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
3c80: 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49   success.  .** I
3c90: 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61  f lookaside is a
3ca0: 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72  lready active, r
3cb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
3cc0: 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20  Y..**.** The sz 
3cd0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
3ce0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
3cf0: 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69   in each lookasi
3d00: 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20  de slot..** The 
3d10: 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  cnt parameter is
3d20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
3d30: 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74  lots.  If pStart
3d40: 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20   is NULL the.** 
3d50: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f  space for the lo
3d60: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69  okaside memory i
3d70: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
3d80: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
3d90: 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69  ..** If pStart i
3da0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
3db0: 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74  it is sz*cnt byt
3dc0: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  es of memory to 
3dd0: 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c  use for.** the l
3de0: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e  ookaside memory.
3df0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
3e00: 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71  etupLookaside(sq
3e10: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
3e20: 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69  *pBuf, int sz, i
3e30: 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20  nt cnt){.  void 
3e40: 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64  *pStart;.  if( d
3e50: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75  b->lookaside.nOu
3e60: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
3e70: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
3e80: 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65  .  /* Free any e
3e90: 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64  xisting lookasid
3ea0: 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 69  e buffer for thi
3eb0: 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a  s handle before.
3ec0: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20    ** allocating 
3ed0: 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20  a new one so we 
3ee0: 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61  don't have to ha
3ef0: 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20  ve space for .  
3f00: 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65 20 73  ** both at the s
3f10: 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20  ame time..  */. 
3f20: 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   if( db->lookasi
3f30: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a  de.bMalloced ){.
3f40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3f50: 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70  (db->lookaside.p
3f60: 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Start);.  }.  /*
3f70: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c   The size of a l
3f80: 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20 6e 65  ookaside slot ne
3f90: 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65 72  eds to be larger
3fa0: 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 0a   than a pointer.
3fb0: 20 20 2a 2a 20 74 6f 20 62 65 20 75 73 65 66 75    ** to be usefu
3fc0: 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a  l..  */.  if( sz
3fd0: 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f  <=(int)sizeof(Lo
3fe0: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 20  okasideSlot*) ) 
3ff0: 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 6e  sz = 0;.  if( cn
4000: 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b 0a 20  t<0 ) cnt = 0;. 
4010: 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e   if( sz==0 || cn
4020: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d  t==0 ){.    sz =
4030: 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d   0;.    pStart =
4040: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
4050: 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pBuf==0 ){.    s
4060: 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73  z = ROUNDDOWN8(s
4070: 7a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33  z); /* IMP: R-33
4080: 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 20  038-09382 */.   
4090: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
40a0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
40b0: 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   pStart = sqlite
40c0: 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20  3Malloc( sz*cnt 
40d0: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31  );  /* IMP: R-61
40e0: 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20  949-35727 */.   
40f0: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
4100: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 65 6c  nMalloc();.  }el
4110: 73 65 7b 0a 20 20 20 20 73 7a 20 3d 20 52 4f 55  se{.    sz = ROU
4120: 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20 2f 2a 20  NDDOWN8(sz); /* 
4130: 49 4d 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33  IMP: R-33038-093
4140: 38 32 20 2a 2f 0a 20 20 20 20 70 53 74 61 72 74  82 */.    pStart
4150: 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20 20 64   = pBuf;.  }.  d
4160: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
4170: 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  art = pStart;.  
4180: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46  db->lookaside.pF
4190: 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c  ree = 0;.  db->l
41a0: 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28 75  ookaside.sz = (u
41b0: 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53 74  16)sz;.  if( pSt
41c0: 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  art ){.    int i
41d0: 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53  ;.    LookasideS
41e0: 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73 65  lot *p;.    asse
41f0: 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73 69  rt( sz > (int)si
4200: 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  zeof(LookasideSl
4210: 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  ot*) );.    p = 
4220: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
4230: 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72 28  pStart;.    for(
4240: 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69  i=cnt-1; i>=0; i
4250: 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e  --){.      p->pN
4260: 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ext = db->lookas
4270: 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20 20 20  ide.pFree;.     
4280: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
4290: 46 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20 20  Free = p;.      
42a0: 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  p = (LookasideSl
42b0: 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73 7a  ot*)&((u8*)p)[sz
42c0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  ];.    }.    db-
42d0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20  >lookaside.pEnd 
42e0: 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = p;.    db->loo
42f0: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
4300: 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = 1;.    db->loo
4310: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
4320: 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b   = pBuf==0 ?1:0;
4330: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
4340: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
4350: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 0;.    db->lo
4360: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
4370: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 0;.    db->lo
4380: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
4390: 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  d = 0;.  }.  ret
43a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
43b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
43c0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
43d0: 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
43e0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
43f0: 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  */.sqlite3_mutex
4400: 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74   *sqlite3_db_mut
4410: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ex(sqlite3 *db){
4420: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75  .  return db->mu
4430: 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  tex;.}../*.** Co
4440: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74  nfiguration sett
4450: 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e 64 69  ings for an indi
4460: 76 69 64 75 61 6c 20 64 61 74 61 62 61 73 65 20  vidual database 
4470: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e  connection.*/.in
4480: 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  t sqlite3_db_con
4490: 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  fig(sqlite3 *db,
44a0: 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20   int op, ...){. 
44b0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
44c0: 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72  nt rc;.  va_star
44d0: 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
44e0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
44f0: 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  ase SQLITE_DBCON
4500: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
4510: 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75  .      void *pBu
4520: 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  f = va_arg(ap, v
4530: 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52  oid*); /* IMP: R
4540: 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a  -26835-10964 */.
4550: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
4560: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
4570: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
4580: 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20  47871-25994 */. 
4590: 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76       int cnt = v
45a0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
45b0: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30       /* IMP: R-0
45c0: 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20  4460-53386 */.  
45d0: 20 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f      rc = setupLo
45e0: 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75 66  okaside(db, pBuf
45f0: 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20  , sz, cnt);.    
4600: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4610: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4620: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
4630: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
4640: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f    int op;      /
4650: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a  * The opcode */.
4660: 20 20 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b          u32 mask
4670: 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
4680: 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74  the bit in sqlit
4690: 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f  e3.flags to set/
46a0: 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d  clear */.      }
46b0: 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20   aFlagOp[] = {. 
46c0: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
46d0: 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
46e0: 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54 45 5f  FKEY,    SQLITE_
46f0: 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d  ForeignKeys    }
4700: 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  ,.        { SQLI
4710: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
4720: 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51 4c 49  LE_TRIGGER, SQLI
4730: 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
4740: 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20    },.      };.  
4750: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
4760: 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   i;.      rc = S
4770: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
4780: 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33  IMP: R-42790-233
4790: 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  72 */.      for(
47a0: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
47b0: 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b  (aFlagOp); i++){
47c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 6c  .        if( aFl
47d0: 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29  agOp[i].op==op )
47e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
47f0: 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61  onoff = va_arg(a
4800: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  p, int);.       
4810: 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76     int *pRes = v
4820: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b  a_arg(ap, int*);
4830: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
4840: 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  ldFlags = db->fl
4850: 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ags;.          i
4860: 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20  f( onoff>0 ){.  
4870: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
4880: 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69  ags |= aFlagOp[i
4890: 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  ].mask;.        
48a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66    }else if( onof
48b0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
48c0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
48d0: 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73   ~aFlagOp[i].mas
48e0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
48f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64           if( old
4900: 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73  Flags!=db->flags
4910: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4920: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
4930: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
4940: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  db);.          }
4950: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
4960: 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Res ){.         
4970: 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e     *pRes = (db->
4980: 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b  flags & aFlagOp[
4990: 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20  i].mask)!=0;.   
49a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
49b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
49c0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  K;.          bre
49d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
49e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
49f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
4a00: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
4a10: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
4a20: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
4a30: 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e   the buffer z[0.
4a40: 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61  .n-1] contains a
4a50: 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74  ll spaces..*/.st
4a60: 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63  atic int allSpac
4a70: 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  es(const char *z
4a80: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c  , int n){.  whil
4a90: 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d  e( n>0 && z[n-1]
4aa0: 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  ==' ' ){ n--; }.
4ab0: 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d    return n==0;.}
4ac0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
4ad0: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
4ae0: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  ating function n
4af0: 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68  amed "BINARY" wh
4b00: 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ich is always.**
4b10: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
4b20: 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c 61 67  * If the padFlag
4b30: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
4b40: 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65   NULL then space
4b50: 20 70 61 64 64 69 6e 67 20 61 74 20 74 68 65 20   padding at the 
4b60: 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67  end.** of string
4b70: 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54  s is ignored.  T
4b80: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  his implements t
4b90: 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69  he RTRIM collati
4ba0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
4bb0: 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20  t binCollFunc(. 
4bc0: 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a   void *padFlag,.
4bd0: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
4be0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
4bf0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
4c00: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
4c10: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20  {.  int rc, n;. 
4c20: 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32   n = nKey1<nKey2
4c30: 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32   ? nKey1 : nKey2
4c40: 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28  ;.  rc = memcmp(
4c50: 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29  pKey1, pKey2, n)
4c60: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
4c70: 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c 61 67  .    if( padFlag
4c80: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
4c90: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31  es(((char*)pKey1
4ca0: 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20  )+n, nKey1-n).  
4cb0: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
4cc0: 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e  ((char*)pKey2)+n
4cd0: 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29  , nKey2-n).    )
4ce0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65  {.      /* Leave
4cf0: 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20 61 74   rc unchanged at
4d00: 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b   0 */.    }else{
4d10: 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79  .      rc = nKey
4d20: 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d  1 - nKey2;.    }
4d30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
4d40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68  ;.}../*.** Anoth
4d50: 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  er built-in coll
4d60: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20  ating sequence: 
4d70: 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54  NOCASE. .**.** T
4d80: 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  his collating se
4d90: 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64  quence is intend
4da0: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ed to be used fo
4db0: 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64  r "case independ
4dc0: 61 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ant.** compariso
4dd0: 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f  n". SQLite's kno
4de0: 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20  wledge of upper 
4df0: 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65  and lower case e
4e00: 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78  quivalents.** ex
4e10: 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68  tends only to th
4e20: 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20  e 26 characters 
4e30: 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c  used in the Engl
4e40: 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  ish language..**
4e50: 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e  .** At the momen
4e60: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
4e70: 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e  a UTF-8 implemen
4e80: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tation..*/.stati
4e90: 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c  c int nocaseColl
4ea0: 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69  atingFunc(.  voi
4eb0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
4ec0: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
4ed0: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
4ee0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
4ef0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
4f00: 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53  int r = sqlite3S
4f10: 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28  trNICmp(.      (
4f20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
4f30: 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y1, (const char 
4f40: 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c  *)pKey2, (nKey1<
4f50: 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65  nKey2)?nKey1:nKe
4f60: 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  y2);.  UNUSED_PA
4f70: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
4f80: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
4f90: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
4fa0: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
4fb0: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
4fc0: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
4fd0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
4fe0: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
4ff0: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
5000: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
5010: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
5020: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61  .  return db->la
5030: 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  stRowid;.}../*.*
5040: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
5050: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69  ber of changes i
5060: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
5070: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
5080: 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74  3_exec()..*/.int
5090: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
50a0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
50b0: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61   return db->nCha
50c0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nge;.}../*.** Re
50d0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
50e0: 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65  of changes since
50f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
5100: 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e  ndle was opened.
5110: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
5120: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71  total_changes(sq
5130: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
5140: 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  turn db->nTotalC
5150: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
5160: 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73  Close all open s
5170: 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73 20  avepoints. This 
5180: 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61  function only ma
5190: 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64 73  nipulates fields
51a0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
51b0: 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63  ase handle objec
51c0: 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63  t, it does not c
51d0: 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f 69  lose any savepoi
51e0: 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  nts that may be 
51f0: 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62  open.** at the b
5200: 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76 65  -tree/pager leve
5210: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
5220: 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
5230: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
5240: 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61    while( db->pSa
5250: 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53  vepoint ){.    S
5260: 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d  avepoint *pTmp =
5270: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
5280: 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f  .    db->pSavepo
5290: 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78  int = pTmp->pNex
52a0: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  t;.    sqlite3Db
52b0: 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a  Free(db, pTmp);.
52c0: 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70    }.  db->nSavep
52d0: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  oint = 0;.  db->
52e0: 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
52f0: 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74    db->isTransact
5300: 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ionSavepoint = 0
5310: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
5320: 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
5330: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69   function associ
5340: 61 74 65 64 20 77 69 74 68 20 46 75 6e 63 44 65  ated with FuncDe
5350: 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78 63  f p, if any. Exc
5360: 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20  ept,.** if this 
5370: 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20  is not the last 
5380: 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e 63  copy of the func
5390: 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76  tion, do not inv
53a0: 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65  oke it. Multiple
53b0: 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61 20  .** copies of a 
53c0: 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20  single function 
53d0: 61 72 65 20 63 72 65 61 74 65 64 20 77 68 65 6e  are created when
53e0: 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e   create_function
53f0: 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  () is called.** 
5400: 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59 20  with SQLITE_ANY 
5410: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e  as the encoding.
5420: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5430: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
5440: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
5450: 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63  cDef *p){.  Func
5460: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73  Destructor *pDes
5470: 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70 44 65  tructor = p->pDe
5480: 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20  structor;.  if( 
5490: 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  pDestructor ){. 
54a0: 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e     pDestructor->
54b0: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
54c0: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
54d0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44  f==0 ){.      pD
54e0: 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74  estructor->xDest
54f0: 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d  roy(pDestructor-
5500: 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20  >pUserData);.   
5510: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5520: 28 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72  (db, pDestructor
5530: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
5540: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65  /*.** Close an e
5550: 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64  xisting SQLite d
5560: 61 74 61 62 61 73 65 0a 2a 2f 0a 69 6e 74 20 73  atabase.*/.int s
5570: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c  qlite3_close(sql
5580: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73  ite3 *db){.  Has
5590: 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20  hElem *i;       
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
55b0: 48 61 73 68 20 74 61 62 6c 65 20 69 74 65 72 61  Hash table itera
55c0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a  tor */.  int j;.
55d0: 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20  .  if( !db ){.  
55e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
55f0: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  OK;.  }.  if( !s
5600: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
5610: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
5620: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5630: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
5640: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
5650: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
5660: 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72 63  tex);..  /* Forc
5670: 65 20 78 44 65 73 74 72 6f 79 20 63 61 6c 6c 73  e xDestroy calls
5680: 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20   on all virtual 
5690: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69  tables */.  sqli
56a0: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
56b0: 53 63 68 65 6d 61 28 64 62 2c 20 2d 31 29 3b 0a  Schema(db, -1);.
56c0: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
56d0: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
56e0: 74 68 65 20 52 65 73 65 74 49 6e 74 65 72 6e 61  the ResetInterna
56f0: 6c 53 63 68 65 6d 61 28 29 20 63 61 6c 6c 20 61  lSchema() call a
5700: 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  bove.  ** will n
5710: 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74  ot have called t
5720: 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29  he xDisconnect()
5730: 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76   method on any v
5740: 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c  irtual.  ** tabl
5750: 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56  es in the db->aV
5760: 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54  Trans[] array. T
5770: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c  he following sql
5780: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
5790: 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  ().  ** call wil
57a0: 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64  l do so. We need
57b0: 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f   to do this befo
57c0: 72 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72  re the check for
57d0: 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c   active.  ** SQL
57e0: 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f   statements belo
57f0: 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c  w, as the v-tabl
5800: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
5810: 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a   may be storing.
5820: 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72    ** some prepar
5830: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ed statements in
5840: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20  ternally..  */. 
5850: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
5860: 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  back(db);..  /* 
5870: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
5880: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 56 4d 73   outstanding VMs
5890: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
58a0: 42 55 53 59 2e 20 2a 2f 0a 20 20 69 66 28 20 64  BUSY. */.  if( d
58b0: 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  b->pVdbe ){.    
58c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
58d0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
58e0: 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
58f0: 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75  o close due to u
5900: 6e 66 69 6e 61 6c 69 73 65 64 20 73 74 61 74 65  nfinalised state
5910: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 73 71 6c  ments");.    sql
5920: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
5930: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
5940: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
5950: 55 53 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  USY;.  }.  asser
5960: 74 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79  t( sqlite3Safety
5970: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
5980: 29 20 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  ) );..  for(j=0;
5990: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
59a0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
59b0: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42   = db->aDb[j].pB
59c0: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  t;.    if( pBt &
59d0: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
59e0: 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29 7b  InBackup(pBt) ){
59f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
5a00: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  ror(db, SQLITE_B
5a10: 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 20 20  USY, .          
5a20: 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65  "unable to close
5a30: 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 69 73 68   due to unfinish
5a40: 65 64 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74  ed backup operat
5a50: 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c  ion");.      sql
5a60: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
5a70: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
5a80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5a90: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BUSY;.    }.  }
5aa0: 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
5ab0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65  outstanding Save
5ac0: 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 73  point structures
5ad0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c  . */.  sqlite3Cl
5ae0: 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
5af0: 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  );..  for(j=0; j
5b00: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
5b10: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
5b20: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d  Db = &db->aDb[j]
5b30: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
5b40: 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Bt ){.      sqli
5b50: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44  te3BtreeClose(pD
5b60: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70  b->pBt);.      p
5b70: 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20  Db->pBt = 0;.   
5b80: 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20     if( j!=1 ){. 
5b90: 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68         pDb->pSch
5ba0: 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ema = 0;.      }
5bb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
5bc0: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
5bd0: 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d 31 29 3b  lSchema(db, -1);
5be0: 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20  ..  /* Tell the 
5bf0: 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63  code in notify.c
5c00: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63   that the connec
5c10: 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68  tion no longer h
5c20: 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f  olds any.  ** lo
5c30: 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  cks and does not
5c40: 20 72 65 71 75 69 72 65 20 61 6e 79 20 66 75 72   require any fur
5c50: 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69  ther unlock-noti
5c60: 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20  fy callbacks..  
5c70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  */.  sqlite3Conn
5c80: 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29  ectionClosed(db)
5c90: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  ;..  assert( db-
5ca0: 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73  >nDb<=2 );.  ass
5cb0: 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62  ert( db->aDb==db
5cc0: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a 20  ->aDbStatic );. 
5cd0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61   for(j=0; j<Arra
5ce0: 79 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e  ySize(db->aFunc.
5cf0: 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75  a); j++){.    Fu
5d00: 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70  ncDef *pNext, *p
5d10: 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f  Hash, *p;.    fo
5d20: 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b  r(p=db->aFunc.a[
5d30: 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68 29 7b  j]; p; p=pHash){
5d40: 0a 20 20 20 20 20 20 70 48 61 73 68 20 3d 20 70  .      pHash = p
5d50: 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 20 20 77  ->pHash;.      w
5d60: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 20  hile( p ){.     
5d70: 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72     functionDestr
5d80: 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  oy(db, p);.     
5d90: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
5da0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ext;.        sql
5db0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5dc0: 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70  );.        p = p
5dd0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
5de0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
5df0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
5e00: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20  &db->aCollSeq); 
5e10: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
5e20: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c  ext(i)){.    Col
5e30: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43  lSeq *pColl = (C
5e40: 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48  ollSeq *)sqliteH
5e50: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
5e60: 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65  /* Invoke any de
5e70: 73 74 72 75 63 74 6f 72 73 20 72 65 67 69 73 74  structors regist
5e80: 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69  ered for collati
5e90: 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 72  on sequence user
5ea0: 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f   data. */.    fo
5eb0: 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
5ec0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  {.      if( pCol
5ed0: 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20  l[j].xDel ){.   
5ee0: 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44       pColl[j].xD
5ef0: 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65  el(pColl[j].pUse
5f00: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
5f10: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
5f20: 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a  ree(db, pColl);.
5f30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
5f40: 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c  hClear(&db->aCol
5f50: 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53  lSeq);.#ifndef S
5f60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
5f70: 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d  ALTABLE.  for(i=
5f80: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
5f90: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69  &db->aModule); i
5fa0: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
5fb0: 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75  xt(i)){.    Modu
5fc0: 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  le *pMod = (Modu
5fd0: 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  le *)sqliteHashD
5fe0: 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
5ff0: 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20 29  pMod->xDestroy )
6000: 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44  {.      pMod->xD
6010: 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75  estroy(pMod->pAu
6020: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  x);.    }.    sq
6030: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
6040: 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pMod);.  }.  sql
6050: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
6060: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
6070: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72  dif..  sqlite3Er
6080: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
6090: 4b 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f  K, 0); /* Deallo
60a0: 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64  cates any cached
60b0: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20   error strings. 
60c0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 45 72  */.  if( db->pEr
60d0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
60e0: 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45  ValueFree(db->pE
60f0: 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  rr);.  }.  sqlit
6100: 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e  e3CloseExtension
6110: 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61  s(db);..  db->ma
6120: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
6130: 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20  IC_ERROR;..  /* 
6140: 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73  The temp-databas
6150: 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f  e schema is allo
6160: 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c  cated differentl
6170: 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  y from the other
6180: 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a   schema.  ** obj
6190: 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69  ects (using sqli
61a0: 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63  teMalloc() direc
61b0: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
61c0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
61d0: 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69  ma())..  ** So i
61e0: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
61f0: 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20  eed here. Todo: 
6200: 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65  Why not roll the
6210: 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74   temp schema int
6220: 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20  o.  ** the same 
6230: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
6240: 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61  s the one that a
6250: 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61 74  llocates the dat
6260: 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75  abase .  ** stru
6270: 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71  cture?.  */.  sq
6280: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
6290: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
62a0: 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ma);.  sqlite3_m
62b0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
62c0: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67  utex);.  db->mag
62d0: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
62e0: 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69  C_CLOSED;.  sqli
62f0: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64  te3_mutex_free(d
6300: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
6310: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
6320: 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f  de.nOut==0 );  /
6330: 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f  * Fails on a loo
6340: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65  kaside memory le
6350: 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  ak */.  if( db->
6360: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
6370: 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ced ){.    sqlit
6380: 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b  e3_free(db->look
6390: 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20  aside.pStart);. 
63a0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
63b0: 5f 45 4e 41 42 4c 45 5f 53 51 4c 52 52 0a 20 20  _ENABLE_SQLRR.  
63c0: 53 52 52 65 63 43 6c 6f 73 65 28 64 62 29 3b 0a  SRRecClose(db);.
63d0: 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 71 6c 69  #endif.  .  sqli
63e0: 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20  te3_free(db);.  
63f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6400: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
6410: 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ack all database
6420: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20   files..*/.void 
6430: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
6440: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ll(sqlite3 *db){
6450: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
6460: 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 61  inTrans = 0;.  a
6470: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6480: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
6490: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
64a0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
64b0: 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  oc();.  for(i=0;
64c0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
64d0: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44  {.    if( db->aD
64e0: 62 5b 69 5d 2e 70 42 74 20 29 7b 0a 20 20 20 20  b[i].pBt ){.    
64f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
6500: 65 65 49 73 49 6e 54 72 61 6e 73 28 64 62 2d 3e  eeIsInTrans(db->
6510: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20  aDb[i].pBt) ){. 
6520: 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d         inTrans =
6530: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
6540: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
6550: 6c 6c 62 61 63 6b 28 64 62 2d 3e 61 44 62 5b 69  llback(db->aDb[i
6560: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20 20 64 62  ].pBt);.      db
6570: 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72 61 6e 73  ->aDb[i].inTrans
6580: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
6590: 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c    sqlite3VtabRol
65a0: 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c  lback(db);.  sql
65b0: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
65c0: 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 64 62  loc();..  if( db
65d0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49  ->flags&SQLITE_I
65e0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a  nternChanges ){.
65f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
6600: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
6610: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  nts(db);.    sql
6620: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
6630: 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d 31 29 3b  lSchema(db, -1);
6640: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 79 20 64  .  }..  /* Any d
6650: 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
6660: 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61  nt violations ha
6670: 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f  ve now been reso
6680: 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e  lved. */.  db->n
6690: 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
66a0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68  ;..  /* If one h
66b0: 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  as been configur
66c0: 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72  ed, invoke the r
66d0: 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c  ollback-hook cal
66e0: 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64  lback */.  if( d
66f0: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
6700: 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73  back && (inTrans
6710: 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d   || !db->autoCom
6720: 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e  mit) ){.    db->
6730: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
6740: 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41  k(db->pRollbackA
6750: 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  rg);.  }.}../*.*
6760: 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69  * Return a stati
6770: 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  c string that de
6780: 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64  scribes the kind
6790: 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66   of error specif
67a0: 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ied in the.** ar
67b0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74  gument..*/.const
67c0: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72   char *sqlite3Er
67d0: 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20  rStr(int rc){.  
67e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
67f0: 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20  r* const aMsg[] 
6800: 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  = {.    /* SQLIT
6810: 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f  E_OK          */
6820: 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c   "not an error",
6830: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
6840: 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53  RROR       */ "S
6850: 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f  QL logic error o
6860: 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61  r missing databa
6870: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
6880: 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a  TE_INTERNAL    *
6890: 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  / 0,.    /* SQLI
68a0: 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a  TE_PERM        *
68b0: 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73  / "access permis
68c0: 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  sion denied",.  
68d0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52    /* SQLITE_ABOR
68e0: 54 20 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c  T       */ "call
68f0: 62 61 63 6b 20 72 65 71 75 65 73 74 65 64 20 71  back requested q
6900: 75 65 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20  uery abort",.   
6910: 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20   /* SQLITE_BUSY 
6920: 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62         */ "datab
6930: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ase is locked",.
6940: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f      /* SQLITE_LO
6950: 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61  CKED      */ "da
6960: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
6970: 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20  locked",.    /* 
6980: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20  SQLITE_NOMEM    
6990: 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65     */ "out of me
69a0: 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51  mory",.    /* SQ
69b0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20  LITE_READONLY   
69c0: 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20   */ "attempt to 
69d0: 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79  write a readonly
69e0: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
69f0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  /* SQLITE_INTERR
6a00: 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72  UPT   */ "interr
6a10: 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  upted",.    /* S
6a20: 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20  QLITE_IOERR     
6a30: 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65    */ "disk I/O e
6a40: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
6a50: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20  LITE_CORRUPT    
6a60: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69   */ "database di
6a70: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
6a80: 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ormed",.    /* S
6a90: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20  QLITE_NOTFOUND  
6aa0: 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70    */ "unknown op
6ab0: 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a  eration",.    /*
6ac0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20   SQLITE_FULL    
6ad0: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
6ae0: 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c   or disk is full
6af0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6b00: 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20  _CANTOPEN    */ 
6b10: 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
6b20: 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a  database file",.
6b30: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52      /* SQLITE_PR
6b40: 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f  OTOCOL    */ "lo
6b50: 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c  cking protocol",
6b60: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
6b70: 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74  MPTY       */ "t
6b80: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  able contains no
6b90: 20 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53   data",.    /* S
6ba0: 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20  QLITE_SCHEMA    
6bb0: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73    */ "database s
6bc0: 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65  chema has change
6bd0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
6be0: 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f  E_TOOBIG      */
6bf0: 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62   "string or blob
6c00: 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f   too big",.    /
6c10: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
6c20: 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61  INT  */ "constra
6c30: 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20  int failed",.   
6c40: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41   /* SQLITE_MISMA
6c50: 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74  TCH    */ "datat
6c60: 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20  ype mismatch",. 
6c70: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53     /* SQLITE_MIS
6c80: 55 53 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62  USE      */ "lib
6c90: 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c  rary routine cal
6ca0: 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65  led out of seque
6cb0: 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  nce",.    /* SQL
6cc0: 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20  ITE_NOLFS       
6cd0: 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73  */ "large file s
6ce0: 75 70 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c  upport is disabl
6cf0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
6d00: 54 45 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a  TE_AUTH        *
6d10: 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  / "authorization
6d20: 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a   denied",.    /*
6d30: 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20   SQLITE_FORMAT  
6d40: 20 20 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72      */ "auxiliar
6d50: 79 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61  y database forma
6d60: 74 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  t error",.    /*
6d70: 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20   SQLITE_RANGE   
6d80: 20 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20      */ "bind or 
6d90: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74  column index out
6da0: 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20   of range",.    
6db0: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  /* SQLITE_NOTADB
6dc0: 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69        */ "file i
6dd0: 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69  s encrypted or i
6de0: 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65  s not a database
6df0: 22 2c 0a 20 20 7d 3b 0a 20 20 72 63 20 26 3d 20  ",.  };.  rc &= 
6e00: 30 78 66 66 3b 0a 20 20 69 66 28 20 41 4c 57 41  0xff;.  if( ALWA
6e10: 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c  YS(rc>=0) && rc<
6e20: 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 61 4d 73  (int)(sizeof(aMs
6e30: 67 29 2f 73 69 7a 65 6f 66 28 61 4d 73 67 5b 30  g)/sizeof(aMsg[0
6e40: 5d 29 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21  ])) && aMsg[rc]!
6e50: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6e60: 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 7d 65 6c   aMsg[rc];.  }el
6e70: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22  se{.    return "
6e80: 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a  unknown error";.
6e90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
6ea0: 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
6eb0: 65 6e 74 73 20 61 20 62 75 73 79 20 63 61 6c 6c  ents a busy call
6ec0: 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65 70 73  back that sleeps
6ed0: 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61 67   and tries.** ag
6ee0: 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d 65  ain until a time
6ef0: 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72 65 61  out value is rea
6f00: 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d 65 6f  ched.  The timeo
6f10: 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  ut value is.** a
6f20: 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
6f30: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
6f40: 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 74 68   passed in as th
6f50: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
6f60: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
6f70: 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74  nt sqliteDefault
6f80: 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76  BusyCallback(. v
6f90: 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20 20 20  oid *ptr,       
6fa0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
6fb0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
6fc0: 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20 20 20  /. int count    
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6fe0: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
6ff0: 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62 75  able has been bu
7000: 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c  sy */.){.#if SQL
7010: 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 28 64  ITE_OS_WIN || (d
7020: 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45  efined(HAVE_USLE
7030: 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45  EP) && HAVE_USLE
7040: 45 50 29 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  EP).  static con
7050: 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d  st u8 delays[] =
7060: 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c  .     { 1, 2, 5,
7070: 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c   10, 15, 20, 25,
7080: 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20   25,  25,  50,  
7090: 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61  50, 100 };.  sta
70a0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74  tic const u8 tot
70b0: 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30  als[] =.     { 0
70c0: 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20  , 1, 3,  8, 18, 
70d0: 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c  33, 53, 78, 103,
70e0: 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d   128, 178, 228 }
70f0: 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41  ;.# define NDELA
7100: 59 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61  Y ArraySize(dela
7110: 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ys).  sqlite3 *d
7120: 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70  b = (sqlite3 *)p
7130: 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75  tr;.  int timeou
7140: 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  t = db->busyTime
7150: 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79  out;.  int delay
7160: 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65  , prior;..  asse
7170: 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a  rt( count>=0 );.
7180: 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44    if( count < ND
7190: 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c 61  ELAY ){.    dela
71a0: 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74  y = delays[count
71b0: 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74  ];.    prior = t
71c0: 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  otals[count];.  
71d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61 79  }else{.    delay
71e0: 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59   = delays[NDELAY
71f0: 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  -1];.    prior =
7200: 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31   totals[NDELAY-1
7210: 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74  ] + delay*(count
7220: 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20  -(NDELAY-1));.  
7230: 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b 20  }.  if( prior + 
7240: 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74 20  delay > timeout 
7250: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74  ){.    delay = t
7260: 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a  imeout - prior;.
7270: 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30      if( delay<=0
7280: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
7290: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
72a0: 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61  p(db->pVfs, dela
72b0: 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  y*1000);.  retur
72c0: 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  n 1;.#else.  sql
72d0: 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69  ite3 *db = (sqli
72e0: 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74  te3 *)ptr;.  int
72f0: 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c   timeout = ((sql
7300: 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75 73  ite3 *)ptr)->bus
7310: 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20  yTimeout;.  if( 
7320: 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e  (count+1)*1000 >
7330: 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20   timeout ){.    
7340: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7350: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64  sqlite3OsSleep(d
7360: 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30 30  b->pVfs, 1000000
7370: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  );.  return 1;.#
7380: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  endif.}../*.** I
7390: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
73a0: 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a  busy handler..**
73b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
73c0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
73d0: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  an operation fai
73e0: 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e  led with a lock.
73f0: 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74  .** If this rout
7400: 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ine returns non-
7410: 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
7420: 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20 69  s retried.  If i
7430: 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20  t.** returns 0, 
7440: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62  the operation ab
7450: 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c  orts with an SQL
7460: 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a  ITE_BUSY error..
7470: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
7480: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
7490: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b  BusyHandler *p){
74a0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
74b0: 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20   NEVER(p==0) || 
74c0: 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70  p->xFunc==0 || p
74d0: 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75  ->nBusy<0 ) retu
74e0: 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e  rn 0;.  rc = p->
74f0: 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70  xFunc(p->pArg, p
7500: 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28 20  ->nBusy);.  if( 
7510: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  rc==0 ){.    p->
7520: 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65  nBusy = -1;.  }e
7530: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73  lse{.    p->nBus
7540: 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  y++;.  }.  retur
7550: 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n rc; .}../*.** 
7560: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
7570: 73 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  s the busy callb
7580: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
7590: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
75a0: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
75b0: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
75c0: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
75d0: 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
75e0: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
75f0: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
7600: 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29  ,.  int (*xBusy)
7610: 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76  (void*,int),.  v
7620: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73  oid *pArg.){.  s
7630: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
7640: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
7650: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
7660: 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a  .xFunc = xBusy;.
7670: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
7680: 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  r.pArg = pArg;. 
7690: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
76a0: 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 73 71  .nBusy = 0;.  sq
76b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
76c0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
76d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
76e0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
76f0: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
7700: 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a  S_CALLBACK./*.**
7710: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
7720: 74 73 20 74 68 65 20 70 72 6f 67 72 65 73 73 20  ts the progress 
7730: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20  callback for an 
7740: 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20  Sqlite database 
7750: 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20  to the.** given 
7760: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
7770: 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  n with the given
7780: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 70   argument. The p
7790: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
77a0: 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f   will.** be invo
77b0: 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20 6f  ked every nOps o
77c0: 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  pcodes..*/.void 
77d0: 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
77e0: 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69  _handler(.  sqli
77f0: 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20  te3 *db, .  int 
7800: 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50  nOps,.  int (*xP
7810: 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29 2c  rogress)(void*),
7820: 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29   .  void *pArg.)
7830: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
7840: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
7850: 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30  x);.  if( nOps>0
7860: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f   ){.    db->xPro
7870: 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65 73  gress = xProgres
7880: 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67  s;.    db->nProg
7890: 72 65 73 73 4f 70 73 20 3d 20 6e 4f 70 73 3b 0a  ressOps = nOps;.
78a0: 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73      db->pProgres
78b0: 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d  sArg = pArg;.  }
78c0: 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50  else{.    db->xP
78d0: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
78e0: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
78f0: 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70  s = 0;.    db->p
7900: 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 30 3b  ProgressArg = 0;
7910: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
7920: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
7930: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
7940: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
7950: 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61 20  tine installs a 
7960: 64 65 66 61 75 6c 74 20 62 75 73 79 20 68 61 6e  default busy han
7970: 64 6c 65 72 20 74 68 61 74 20 77 61 69 74 73 20  dler that waits 
7980: 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  for the.** speci
7990: 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d  fied number of m
79a0: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f  illiseconds befo
79b0: 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a  re returning 0..
79c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  */.int sqlite3_b
79d0: 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69  usy_timeout(sqli
79e0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29  te3 *db, int ms)
79f0: 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a  {.  if( ms>0 ){.
7a00: 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65      db->busyTime
7a10: 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 20 20 73 71  out = ms;.    sq
7a20: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
7a30: 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65 66  er(db, sqliteDef
7a40: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
7a50: 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20  , (void*)db);.  
7a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
7a70: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
7a80: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  db, 0, 0);.  }. 
7a90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7aa0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73  K;.}../*.** Caus
7ab0: 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70  e any pending op
7ac0: 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20  eration to stop 
7ad0: 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20  at its earliest 
7ae0: 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a  opportunity..*/.
7af0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74  void sqlite3_int
7b00: 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a  errupt(sqlite3 *
7b10: 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31 2e 69 73  db){.  db->u1.is
7b20: 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31 3b  Interrupted = 1;
7b30: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
7b40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 61 63  function is exac
7b50: 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73 20  tly the same as 
7b60: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7b70: 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63 65 70  unction(), excep
7b80: 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20  t.** that it is 
7b90: 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65 20 63  designed to be c
7ba0: 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72 6e 61  alled by interna
7bb0: 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69 66 66  l code. The diff
7bc0: 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61  erence is.** tha
7bd0: 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  t if a malloc() 
7be0: 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74 65 33  fails in sqlite3
7bf0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7c00: 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  (), an error cod
7c10: 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  e.** is returned
7c20: 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46   and the mallocF
7c30: 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65 61 72  ailed flag clear
7c40: 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ed. .*/.int sqli
7c50: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 0a 20  te3CreateFunc(. 
7c60: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
7c70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
7c80: 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  ctionName,.  int
7c90: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
7ca0: 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44  ,.  void *pUserD
7cb0: 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  ata,.  void (*xF
7cc0: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
7cd0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
7ce0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
7cf0: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
7d00: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
7d10: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
7d20: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
7d30: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
7d40: 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e 63 44  ntext*),.  FuncD
7d50: 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74  estructor *pDest
7d60: 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e 63  ructor.){.  Func
7d70: 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e  Def *p;.  int nN
7d80: 61 6d 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ame;..  assert( 
7d90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7da0: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
7db0: 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e  .  if( zFunction
7dc0: 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20  Name==0 ||.     
7dd0: 20 28 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e   (xFunc && (xFin
7de0: 61 6c 20 7c 7c 20 78 53 74 65 70 29 29 20 7c 7c  al || xStep)) ||
7df0: 20 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20   .      (!xFunc 
7e00: 26 26 20 28 78 46 69 6e 61 6c 20 26 26 20 21 78  && (xFinal && !x
7e10: 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20  Step)) ||.      
7e20: 28 21 78 46 75 6e 63 20 26 26 20 28 21 78 46 69  (!xFunc && (!xFi
7e30: 6e 61 6c 20 26 26 20 78 53 74 65 70 29 29 20 7c  nal && xStep)) |
7e40: 7c 0a 20 20 20 20 20 20 28 6e 41 72 67 3c 2d 31  |.      (nArg<-1
7e50: 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f   || nArg>SQLITE_
7e60: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
7e70: 29 20 7c 7c 0a 20 20 20 20 20 20 28 32 35 35 3c  ) ||.      (255<
7e80: 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  (nName = sqlite3
7e90: 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74  Strlen30( zFunct
7ea0: 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20  ionName))) ){.  
7eb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7ec0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
7ed0: 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .  .#ifndef SQLI
7ee0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
7ef0: 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46  /* If SQLITE_UTF
7f00: 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20  16 is specified 
7f10: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  as the encoding 
7f20: 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20  type, transform 
7f30: 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65  this.  ** to one
7f40: 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   of SQLITE_UTF16
7f50: 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46  LE or SQLITE_UTF
7f60: 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20  16BE using the. 
7f70: 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   ** SQLITE_UTF16
7f80: 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51  NATIVE macro. SQ
7f90: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f  LITE_UTF16 is no
7fa0: 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  t used internall
7fb0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  y..  **.  ** If 
7fc0: 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70  SQLITE_ANY is sp
7fd0: 65 63 69 66 69 65 64 2c 20 61 64 64 20 74 68 72  ecified, add thr
7fe0: 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  ee versions of t
7ff0: 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  he function.  **
8000: 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62   to the hash tab
8010: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
8020: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
8030: 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51   ){.    enc = SQ
8040: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
8050: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e  ;.  }else if( en
8060: 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b  c==SQLITE_ANY ){
8070: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
8080: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
8090: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
80a0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
80b0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
80c0: 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61         pUserData
80d0: 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20  , xFunc, xStep, 
80e0: 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63  xFinal, pDestruc
80f0: 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tor);.    if( rc
8100: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8110: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
8120: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
8130: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
8140: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  Arg, SQLITE_UTF1
8150: 36 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20 70  6LE,.          p
8160: 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c  UserData, xFunc,
8170: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20   xStep, xFinal, 
8180: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
8190: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
81a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
81b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
81c0: 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51    }.    enc = SQ
81d0: 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20  LITE_UTF16BE;.  
81e0: 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20  }.#else.  enc = 
81f0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e  SQLITE_UTF8;.#en
8200: 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63  dif.  .  /* Chec
8210: 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  k if an existing
8220: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
8230: 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72  ng overridden or
8240: 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c   deleted. If so,
8250: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20  .  ** and there 
8260: 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20  are active VMs, 
8270: 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49  then return SQLI
8280: 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75  TE_BUSY. If a fu
8290: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62  nction.  ** is b
82a0: 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f  eing overridden/
82b0: 64 65 6c 65 74 65 64 20 62 75 74 20 74 68 65 72  deleted but ther
82c0: 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  e are no active 
82d0: 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20  VMs, allow the. 
82e0: 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f   ** operation to
82f0: 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e   continue but in
8300: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
8310: 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
8320: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  nts..  */.  p = 
8330: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
8340: 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  ion(db, zFunctio
8350: 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41  nName, nName, nA
8360: 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29 3b  rg, (u8)enc, 0);
8370: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69  .  if( p && p->i
8380: 50 72 65 66 45 6e 63 3d 3d 65 6e 63 20 26 26 20  PrefEnc==enc && 
8390: 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b  p->nArg==nArg ){
83a0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 63 74  .    if( db->act
83b0: 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a 20 20  iveVdbeCnt ){.  
83c0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
83d0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
83e0: 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62  , .        "unab
83f0: 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64  le to delete/mod
8400: 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69 6f  ify user-functio
8410: 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20  n due to active 
8420: 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20  statements");.  
8430: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
8440: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
8450: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8460: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
8470: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
8480: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
8490: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
84a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20  .    }.  }..  p 
84b0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
84c0: 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74  ction(db, zFunct
84d0: 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  ionName, nName, 
84e0: 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31  nArg, (u8)enc, 1
84f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c  );.  assert(p ||
8500: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
8510: 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  d);.  if( !p ){.
8520: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8530: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
8540: 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72 20 76  /* If an older v
8550: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 75  ersion of the fu
8560: 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20 63 6f  nction with a co
8570: 6e 66 69 67 75 72 65 64 20 64 65 73 74 72 75 63  nfigured destruc
8580: 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e  tor is.  ** bein
8590: 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76 6f 6b  g replaced invok
85a0: 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
85b0: 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20   function here. 
85c0: 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44 65 73  */.  functionDes
85d0: 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a 20 20  troy(db, p);..  
85e0: 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20  if( pDestructor 
85f0: 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74  ){.    pDestruct
8600: 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  or->nRef++;.  }.
8610: 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72    p->pDestructor
8620: 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72 3b 0a   = pDestructor;.
8630: 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a    p->flags = 0;.
8640: 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75    p->xFunc = xFu
8650: 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70 20 3d  nc;.  p->xStep =
8660: 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69   xStep;.  p->xFi
8670: 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b  nalize = xFinal;
8680: 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20  .  p->pUserData 
8690: 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70  = pUserData;.  p
86a0: 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e 41  ->nArg = (u16)nA
86b0: 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  rg;.  return SQL
86c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
86d0: 20 43 72 65 61 74 65 20 6e 65 77 20 75 73 65 72   Create new user
86e0: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69   functions..*/.i
86f0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
8700: 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  e_function(.  sq
8710: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
8720: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a  st char *zFunc,.
8730: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
8740: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
8750: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63  ,.  void (*xFunc
8760: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
8770: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
8780: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
8790: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
87a0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
87b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
87c0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
87d0: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
87e0: 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e  xt*).){.  return
87f0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
8800: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
8810: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
8820: 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  , p, xFunc, xSte
8830: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
8840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8850: 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30         xFinal, 0
8860: 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  );.}..int sqlite
8870: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
8880: 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20  n_v2(.  sqlite3 
8890: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
88a0: 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20  r *zFunc,.  int 
88b0: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
88c0: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
88d0: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
88e0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
88f0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
8900: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
8910: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
8920: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
8930: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
8940: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
8950: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a  ite3_context*),.
8960: 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f    void (*xDestro
8970: 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20  y)(void *).){.  
8980: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8990: 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65 73  ERROR;.  FuncDes
89a0: 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20 3d 20  tructor *pArg = 
89b0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
89c0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
89d0: 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73 74  ex);.  if( xDest
89e0: 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67 20  roy ){.    pArg 
89f0: 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f  = (FuncDestructo
8a00: 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  r *)sqlite3DbMal
8a10: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
8a20: 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f  of(FuncDestructo
8a30: 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 41  r));.    if( !pA
8a40: 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44 65 73  rg ){.      xDes
8a50: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20 67  troy(p);.      g
8a60: 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  oto out;.    }. 
8a70: 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74 72 6f     pArg->xDestro
8a80: 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20 20  y = xDestroy;.  
8a90: 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44 61 74    pArg->pUserDat
8aa0: 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 63 20  a = p;.  }.  rc 
8ab0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
8ac0: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e  unc(db, zFunc, n
8ad0: 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75  Arg, enc, p, xFu
8ae0: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
8af0: 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20  l, pArg);.  if( 
8b00: 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6e 52  pArg && pArg->nR
8b10: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ef==0 ){.    ass
8b20: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
8b30: 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73 74 72  OK );.    xDestr
8b40: 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  oy(p);.    sqlit
8b50: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 41 72  e3DbFree(db, pAr
8b60: 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20  g);.  }.. out:. 
8b70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
8b80: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
8b90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
8ba0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
8bb0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8bc0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8bd0: 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71  MIT_UTF16.int sq
8be0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
8bf0: 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74  ction16(.  sqlit
8c00: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
8c10: 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  void *zFunctionN
8c20: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  ame,.  int nArg,
8c30: 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c  .  int eTextRep,
8c40: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
8c50: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
8c60: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
8c70: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
8c80: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
8c90: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
8ca0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
8cb0: 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64  value**),.  void
8cc0: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
8cd0: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a  e3_context*).){.
8ce0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
8cf0: 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71 6c 69   *zFunc8;.  sqli
8d00: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
8d10: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
8d20: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
8d30: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75  cFailed );.  zFu
8d40: 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66  nc8 = sqlite3Utf
8d50: 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74  16to8(db, zFunct
8d60: 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  ionName, -1, SQL
8d70: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
8d80: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8d90: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
8da0: 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54 65  Func8, nArg, eTe
8db0: 78 74 52 65 70 2c 20 70 2c 20 78 46 75 6e 63 2c  xtRep, p, xFunc,
8dc0: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 30   xStep, xFinal,0
8dd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
8de0: 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a  ee(db, zFunc8);.
8df0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
8e00: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
8e10: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
8e20: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
8e30: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8e40: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
8e50: 65 63 6c 61 72 65 20 74 68 61 74 20 61 20 66 75  eclare that a fu
8e60: 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  nction has been 
8e70: 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20  overloaded by a 
8e80: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
8e90: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63  *.** If the func
8ea0: 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69  tion already exi
8eb0: 73 74 73 20 61 73 20 61 20 72 65 67 75 6c 61 72  sts as a regular
8ec0: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
8ed0: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
8ee0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
8ef0: 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63 74  p.  If the funct
8f00: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
8f10: 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a  st, then create.
8f20: 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61  ** a new one tha
8f30: 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20  t always throws 
8f40: 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72  a run-time error
8f50: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76  .  .**.** When v
8f60: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e  irtual tables in
8f70: 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20  tend to provide 
8f80: 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75  an overloaded fu
8f90: 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20  nction, they.** 
8fa0: 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73  should call this
8fb0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65   routine to make
8fc0: 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c   sure the global
8fd0: 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
8fe0: 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75  ..** A global fu
8ff0: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73  nction must exis
9000: 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e  t in order for n
9010: 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74  ame resolution t
9020: 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72  o work.** proper
9030: 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
9040: 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63  e3_overload_func
9050: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  tion(.  sqlite3 
9060: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
9070: 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  r *zName,.  int 
9080: 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e  nArg.){.  int nN
9090: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
90a0: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
90b0: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
90c0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
90d0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
90e0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
90f0: 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  ion(db, zName, n
9100: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
9110: 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29  TE_UTF8, 0)==0 )
9120: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
9130: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e 61 6d  ateFunc(db, zNam
9140: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
9150: 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 20  UTF8,.          
9160: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
9170: 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e  qlite3InvalidFun
9180: 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b  ction, 0, 0, 0);
9190: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
91a0: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 53  te3ApiExit(db, S
91b0: 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c  QLITE_OK);.  sql
91c0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
91d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
91e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
91f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9200: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67  _TRACE./*.** Reg
9210: 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66 75  ister a trace fu
9220: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72  nction.  The pAr
9230: 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  g from the previ
9240: 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
9250: 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65 74   trace.** is ret
9260: 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  urned.  .**.** A
9270: 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e 63   NULL trace func
9280: 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  tion means that 
9290: 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65 78  no tracing is ex
92a0: 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e  ecutes.  A non-N
92b0: 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73 20  ULL.** trace is 
92c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
92d0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
92e0: 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 73  invoked at the s
92f0: 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  tart of each.** 
9300: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
9310: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
9320: 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a 64  trace(sqlite3 *d
9330: 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63 65  b, void (*xTrace
9340: 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
9350: 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67  ar*), void *pArg
9360: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
9370: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9380: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
9390: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
93a0: 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d  pTraceArg;.  db-
93b0: 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63 65  >xTrace = xTrace
93c0: 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72  ;.  db->pTraceAr
93d0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
93e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
93f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
9400: 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a  turn pOld;.}./*.
9410: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70 72  ** Register a pr
9420: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20  ofile function. 
9430: 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74   The pArg from t
9440: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  he previously re
9450: 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f  gistered .** pro
9460: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  file function is
9470: 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a   returned.  .**.
9480: 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c  ** A NULL profil
9490: 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73  e function means
94a0: 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69   that no profili
94b0: 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20  ng is executes. 
94c0: 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70   A non-NULL.** p
94d0: 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69 6e  rofile is a poin
94e0: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
94f0: 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65  n that is invoke
9500: 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  d at the conclus
9510: 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53  ion of.** each S
9520: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  QL statement tha
9530: 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69  t is run..*/.voi
9540: 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66 69  d *sqlite3_profi
9550: 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  le(.  sqlite3 *d
9560: 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72 6f  b,.  void (*xPro
9570: 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  file)(void*,cons
9580: 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75  t char*,sqlite_u
9590: 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a  int64),.  void *
95a0: 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  pArg.){.  void *
95b0: 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pOld;.  sqlite3_
95c0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
95d0: 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d  mutex);.  pOld =
95e0: 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67   db->pProfileArg
95f0: 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65  ;.  db->xProfile
9600: 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64   = xProfile;.  d
9610: 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20 3d  b->pProfileArg =
9620: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
9630: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
9640: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
9650: 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66  n pOld;.}.#endif
9660: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
9670: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 20 45  TRACE */../*** E
9680: 58 50 45 52 49 4d 45 4e 54 41 4c 20 2a 2a 2a 0a  XPERIMENTAL ***.
9690: 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  **.** Register a
96a0: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
96b0: 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74  invoked when a t
96c0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 65  ransaction comme
96d0: 6e 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  nts..** If the i
96e0: 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20  nvoked function 
96f0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
9700: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69  , then the commi
9710: 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72  t becomes a.** r
9720: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  ollback..*/.void
9730: 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74   *sqlite3_commit
9740: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
9750: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
9760: 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
9770: 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
9780: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
9790: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
97a0: 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f  d*),  /* Functio
97b0: 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65  n to invoke on e
97c0: 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  ach commit */.  
97d0: 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
97e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
97f0: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
9800: 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
9810: 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69  id *pOld;.  sqli
9820: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
9830: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
9840: 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74  ld = db->pCommit
9850: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d  Arg;.  db->xComm
9860: 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  itCallback = xCa
9870: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43  llback;.  db->pC
9880: 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b  ommitArg = pArg;
9890: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
98a0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
98b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
98c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
98d0: 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
98e0: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
98f0: 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20  h time a row is 
9900: 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65  updated,.** inse
9910: 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  rted or deleted 
9920: 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62  using this datab
9930: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
9940: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
9950: 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20  _update_hook(.  
9960: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
9970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
9980: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
9990: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
99a0: 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62  .  void (*xCallb
99b0: 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  ack)(void*,int,c
99c0: 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72  har const *,char
99d0: 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f   const *,sqlite_
99e0: 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a  int64),.  void *
99f0: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
9a00: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
9a10: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
9a20: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
9a30: 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  et;.  sqlite3_mu
9a40: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
9a50: 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
9a60: 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20  b->pUpdateArg;. 
9a70: 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c   db->xUpdateCall
9a80: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
9a90: 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41  ;.  db->pUpdateA
9aa0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
9ab0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9ac0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
9ad0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
9ae0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
9af0: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
9b00: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
9b10: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
9b20: 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  s rolled.** back
9b30: 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
9b40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
9b50: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72  .void *sqlite3_r
9b60: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20  ollback_hook(.  
9b70: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
9b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
9b90: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
9ba0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
9bb0: 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62  .  void (*xCallb
9bc0: 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20  ack)(void*), /* 
9bd0: 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  Callback functio
9be0: 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  n */.  void *pAr
9bf0: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
9c00: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
9c10: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
9c20: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b  ){.  void *pRet;
9c30: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9c40: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
9c50: 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
9c60: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20  pRollbackArg;.  
9c70: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
9c80: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
9c90: 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61  k;.  db->pRollba
9ca0: 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ckArg = pArg;.  
9cb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
9cc0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
9cd0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
9ce0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9cf0: 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
9d00: 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  The sqlite3_wal_
9d10: 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20  hook() callback 
9d20: 72 65 67 69 73 74 65 72 65 64 20 62 79 20 73 71  registered by sq
9d30: 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
9d40: 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49  eckpoint()..** I
9d50: 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77 61  nvoke sqlite3_wa
9d60: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20  l_checkpoint if 
9d70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
9d80: 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20  ames in the log 
9d90: 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
9da0: 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33 2e  er than sqlite3.
9db0: 70 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f 20  pWalArg cast to 
9dc0: 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65 20  an integer (the 
9dd0: 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64  value configured
9de0: 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63   by.** wal_autoc
9df0: 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  heckpoint())..*/
9e00: 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c   .int sqlite3Wal
9e10: 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76  DefaultHook(.  v
9e20: 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61  oid *pClientData
9e30: 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e  ,     /* Argumen
9e40: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
9e50: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db,           /*
9e60: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   Connection */. 
9e70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
9e80: 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ,       /* Datab
9e90: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ase */.  int nFr
9ea0: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
9eb0: 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a  /* Size of WAL *
9ec0: 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d  /.){.  if( nFram
9ed0: 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  e>=SQLITE_PTR_TO
9ee0: 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74 61  _INT(pClientData
9ef0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
9f00: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
9f10: 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c();.    sqlite3
9f20: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
9f30: 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73 71  db, zDb);.    sq
9f40: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
9f50: 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65  lloc();.  }.  re
9f60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9f70: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9f80: 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
9f90: 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
9fa0: 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  an sqlite3_wal_h
9fb0: 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 74  ook() callback t
9fc0: 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  o automatically 
9fd0: 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20  checkpoint.** a 
9fe0: 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 63  database after c
9ff0: 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
a000: 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65  saction if there
a010: 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a   are nFrame or.*
a020: 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69 6e  * more frames in
a030: 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50   the log file. P
a040: 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61  assing zero or a
a050: 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20   negative value 
a060: 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65  as the.** nFrame
a070: 20 70 61 72 61 6d 65 74 65 72 20 64 69 73 61 62   parameter disab
a080: 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63 68  les automatic ch
a090: 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65  eckpoints entire
a0a0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ly..**.** The ca
a0b0: 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65  llback registere
a0c0: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
a0d0: 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79 20  on replaces any 
a0e0: 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61 63  existing callbac
a0f0: 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20  k.** registered 
a100: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61  using sqlite3_wa
a110: 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69  l_hook(). Likewi
a120: 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67 20  se, registering 
a130: 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73  a callback.** us
a140: 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ing sqlite3_wal_
a150: 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73 20  hook() disables 
a160: 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63 68  the automatic ch
a170: 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69  eckpoint mechani
a180: 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  sm.** configured
a190: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
a1a0: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
a1b0: 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
a1c0: 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  oint(sqlite3 *db
a1d0: 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23  , int nFrame){.#
a1e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
a1f0: 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50  T_WAL.  UNUSED_P
a200: 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20  ARAMETER(db);.  
a210: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
a220: 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a  (nFrame);.#else.
a230: 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29    if( nFrame>0 )
a240: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  {.    sqlite3_wa
a250: 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74  l_hook(db, sqlit
a260: 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b  e3WalDefaultHook
a270: 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  , SQLITE_INT_TO_
a280: 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20  PTR(nFrame));.  
a290: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
a2a0: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20  e3_wal_hook(db, 
a2b0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
a2c0: 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
a2d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
a2e0: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
a2f0: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
a300: 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
a310: 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74  nsaction is writ
a320: 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  ten.** into the 
a330: 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20  write-ahead-log 
a340: 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
a350: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
a360: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61  void *sqlite3_wa
a370: 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  l_hook(.  sqlite
a380: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
a390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
a3a0: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
a3b0: 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a  this db handle *
a3c0: 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61  /.  int(*xCallba
a3d0: 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69  ck)(void *, sqli
a3e0: 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  te3*, const char
a3f0: 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  *, int),.  void 
a400: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
a410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
a420: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
a430: 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b  sed to xCallback
a440: 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  () */.){.#ifndef
a450: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
a460: 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20  .  void *pRet;. 
a470: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
a480: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
a490: 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 57  .  pRet = db->pW
a4a0: 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61  alArg;.  db->xWa
a4b0: 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  lCallback = xCal
a4c0: 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61  lback;.  db->pWa
a4d0: 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  lArg = pArg;.  s
a4e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
a4f0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
a500: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23 65   return pRet;.#e
a510: 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  lse.  return 0;.
a520: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
a530: 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62  Checkpoint datab
a540: 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20  ase zDb..*/.int 
a550: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
a560: 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c  kpoint_v2(.  sql
a570: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
a580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a590: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
a5a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
a5b0: 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *zDb,           
a5c0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
a5d0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
a5e0: 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  e (or NULL) */. 
a5f0: 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20 20   int eMode,     
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a610: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
a620: 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f  POINT_* value */
a630: 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20  .  int *pnLog,  
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20     /* OUT: Size 
a660: 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72  of WAL log in fr
a670: 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ames */.  int *p
a680: 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20 20 20  nCkpt           
a690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
a6a0: 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  : Total number o
a6b0: 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70 6f  f frames checkpo
a6c0: 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64  inted */.){.#ifd
a6d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
a6e0: 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  AL.  return SQLI
a6f0: 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69  TE_OK;.#else.  i
a700: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a720: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
a730: 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51 4c  .  int iDb = SQL
a740: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
a750: 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44  ;  /* sqlite3.aD
a760: 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62 20  b[] index of db 
a770: 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  to checkpoint */
a780: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
a790: 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  e the output var
a7a0: 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20  iables to -1 in 
a7b0: 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
a7c0: 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70  curs. */.  if( p
a7d0: 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20  nLog ) *pnLog = 
a7e0: 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70 74  -1;.  if( pnCkpt
a7f0: 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b   ) *pnCkpt = -1;
a800: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
a810: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55  TE_CHECKPOINT_FU
a820: 4c 4c 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  LL>SQLITE_CHECKP
a830: 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 29 3b 0a  OINT_PASSIVE );.
a840: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
a850: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c  _CHECKPOINT_FULL
a860: 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  <SQLITE_CHECKPOI
a870: 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20  NT_RESTART );.  
a880: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
a890: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
a8a0: 45 2b 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43  E+2==SQLITE_CHEC
a8b0: 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29  KPOINT_RESTART )
a8c0: 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53 51  ;.  if( eMode<SQ
a8d0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
a8e0: 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65  PASSIVE || eMode
a8f0: 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  >SQLITE_CHECKPOI
a900: 4e 54 5f 52 45 53 54 41 52 54 20 29 7b 0a 20 20  NT_RESTART ){.  
a910: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a920: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73  MISUSE;.  }..  s
a930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
a940: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
a950: 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b   if( zDb && zDb[
a960: 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20  0] ){.    iDb = 
a970: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
a980: 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a  e(db, zDb);.  }.
a990: 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20    if( iDb<0 ){. 
a9a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
a9b0: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
a9c0: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
a9d0: 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77  E_ERROR, "unknow
a9e0: 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c  n database: %s",
a9f0: 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   zDb);.  }else{.
aa00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
aa10: 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69  Checkpoint(db, i
aa20: 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67  Db, eMode, pnLog
aa30: 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73  , pnCkpt);.    s
aa40: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
aa50: 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63  rc, 0);.  }.  rc
aa60: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
aa70: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
aa80: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
aa90: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
aaa0: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
aab0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .}.../*.** Check
aac0: 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a  point database z
aad0: 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55  Db. If zDb is NU
aae0: 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75  LL, or if the bu
aaf0: 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a  ffer zDb points.
ab00: 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61  ** to contains a
ab10: 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72   zero-length str
ab20: 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65  ing, all attache
ab30: 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  d databases are 
ab40: 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  .** checkpointed
ab50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ab60: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
ab70: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
ab80: 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
ab90: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
aba0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
abb0: 32 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54  2(db, zDb, SQLIT
abc0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
abd0: 53 49 56 45 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  SIVE, 0, 0);.}..
abe0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
abf0: 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75  MIT_WAL./*.** Ru
ac00: 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f  n a checkpoint o
ac10: 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20  n database iDb. 
ac20: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
ac30: 69 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20  if database iDb 
ac40: 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e  is.** not curren
ac50: 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20  tly open in WAL 
ac60: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  mode..**.** If a
ac70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
ac80: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
ac90: 62 61 73 65 20 62 65 69 6e 67 20 63 68 65 63 6b  base being check
aca0: 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a  pointed, this .*
acb0: 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
acc0: 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  ns SQLITE_LOCKED
acd0: 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e   and a checkpoin
ace0: 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  t is not attempt
acf0: 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72  ed. If .** an er
ad00: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
ad10: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65   running the che
ad20: 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69  ckpoint, an SQLi
ad30: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
ad40: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 69   .** returned (i
ad50: 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .e. SQLITE_IOERR
ad60: 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  ). Otherwise, SQ
ad70: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54  LITE_OK..**.** T
ad80: 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61  he mutex on data
ad90: 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73  base handle db s
ada0: 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79  hould be held by
adb0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65   the caller. The
adc0: 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69   mutex.** associ
add0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73 70  ated with the sp
ade0: 65 63 69 66 69 63 20 62 2d 74 72 65 65 20 62 65  ecific b-tree be
adf0: 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  ing checkpointed
ae00: 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20   is taken by.** 
ae10: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68  this function wh
ae20: 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ile the checkpoi
ae30: 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a  nt is running..*
ae40: 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20 70  *.** If iDb is p
ae50: 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41 58  assed SQLITE_MAX
ae60: 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e 20  _ATTACHED, then 
ae70: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
ae80: 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63 68  abases are.** ch
ae90: 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20 61  eckpointed. If a
aea0: 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
aeb0: 6e 74 65 72 65 64 20 69 74 20 69 73 20 72 65 74  ntered it is ret
aec0: 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  urned immediatel
aed0: 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70  y -.** no attemp
aee0: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65  t is made to che
aef0: 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61  ckpoint any rema
af00: 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73 2e  ining databases.
af10: 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
af20: 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66   eMode is one of
af30: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
af40: 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c  NT_PASSIVE, FULL
af50: 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f 0a   or RESTART..*/.
af60: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
af70: 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
af80: 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
af90: 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f  eMode, int *pnLo
afa0: 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b  g, int *pnCkpt){
afb0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
afc0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
afd0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
afe0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b000: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
b010: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
b020: 68 20 61 74 74 61 63 68 65 64 20 64 62 73 20 2a  h attached dbs *
b030: 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d 20  /.  int bBusy = 
b040: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
b050: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 53      /* True if S
b060: 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20 62  QLITE_BUSY has b
b070: 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  een encountered 
b080: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
b090: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b0a0: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
b0b0: 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67 20   assert( !pnLog 
b0c0: 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b  || *pnLog==-1 );
b0d0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 43 6b  .  assert( !pnCk
b0e0: 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d  pt || *pnCkpt==-
b0f0: 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  1 );..  for(i=0;
b100: 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72 63   i<db->nDb && rc
b110: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
b120: 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 44  ){.    if( i==iD
b130: 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45  b || iDb==SQLITE
b140: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 7b  _MAX_ATTACHED ){
b150: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
b160: 74 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f 69  te3BtreeCheckpoi
b170: 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  nt(db->aDb[i].pB
b180: 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c  t, eMode, pnLog,
b190: 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20 20   pnCkpt);.      
b1a0: 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20  pnLog = 0;.     
b1b0: 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20   pnCkpt = 0;.   
b1c0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b1d0: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
b1e0: 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20 20    bBusy = 1;.   
b1f0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
b200: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
b210: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
b220: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
b230: 26 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c 49  && bBusy) ? SQLI
b240: 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a  TE_BUSY : rc;.}.
b250: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b260: 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
b270: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b280: 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  n returns true i
b290: 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68  f main-memory sh
b2a0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e 73  ould be used ins
b2b0: 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d  tead of.** a tem
b2c0: 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72 20  porary file for 
b2d0: 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72 20  transient pager 
b2e0: 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65 6d  files and statem
b2f0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a  ent journals..**
b300: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
b310: 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ned depends on t
b320: 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e  he value of db->
b330: 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e 74  temp_store (runt
b340: 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ime.** parameter
b350: 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  ) and the compil
b360: 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20  e time value of 
b370: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
b380: 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  E. The.** follow
b390: 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69  ing table descri
b3a0: 62 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f 6e  bes the relation
b3b0: 73 68 69 70 20 62 65 74 77 65 65 6e 20 74 68 65  ship between the
b3c0: 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a  se two values.**
b3d0: 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
b3e0: 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75 65  ons return value
b3f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  ..**.**   SQLITE
b400: 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20  _TEMP_STORE     
b410: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20  db->temp_store  
b420: 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74     Location of t
b430: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
b440: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
b450: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
b460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
b470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
b490: 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
b4a0: 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20            any   
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
b4c0: 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
b4d0: 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b500: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
b510: 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 0).**   1     
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
b540: 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
b550: 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20  turn 1).**   1  
b560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b570: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
b580: 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
b590: 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
b5a0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
b5b0: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
b5c0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
b5d0: 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
b5e0: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
b5f0: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
b600: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
b610: 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
b620: 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
b630: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
b650: 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
b660: 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20 20   1).**   3      
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
b680: 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
b690: 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
b6a0: 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71  urn 1).*/.int sq
b6b0: 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
b6c0: 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20  y(const sqlite3 
b6d0: 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  *db){.#if SQLITE
b6e0: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20  _TEMP_STORE==1. 
b6f0: 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65   return ( db->te
b700: 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23  mp_store==2 );.#
b710: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
b720: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20  _TEMP_STORE==2. 
b730: 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65   return ( db->te
b740: 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23  mp_store!=1 );.#
b750: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
b760: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20  _TEMP_STORE==3. 
b770: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
b780: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
b790: 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c  P_STORE<1 || SQL
b7a0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33  ITE_TEMP_STORE>3
b7b0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
b7c0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
b7d0: 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  urn UTF-8 encode
b7e0: 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
b7f0: 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ge explanation o
b800: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
b810: 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  t.** error..*/.c
b820: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
b830: 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65  e3_errmsg(sqlite
b840: 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20  3 *db){.  const 
b850: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21  char *z;.  if( !
b860: 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
b870: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
b880: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
b890: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
b8a0: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
b8b0: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
b8c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
b8d0: 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53  Str(SQLITE_MISUS
b8e0: 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73  E_BKPT);.  }.  s
b8f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
b900: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
b910: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
b920: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d  ailed ){.    z =
b930: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
b940: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
b950: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 28  }else{.    z = (
b960: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
b970: 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72  lue_text(db->pEr
b980: 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
b990: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
b9a0: 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  d );.    if( z==
b9b0: 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  0 ){.      z = s
b9c0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d  qlite3ErrStr(db-
b9d0: 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d  >errCode);.    }
b9e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
b9f0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
ba00: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
ba10: 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  z;.}..#ifndef SQ
ba20: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
ba30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46  /*.** Return UTF
ba40: 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  -16 encoded Engl
ba50: 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
ba60: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
ba70: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
ba80: 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  rror..*/.const v
ba90: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  oid *sqlite3_err
baa0: 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64  msg16(sqlite3 *d
bab0: 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  b){.  static con
bac0: 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b  st u16 outOfMem[
bad0: 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27  ] = {.    'o', '
bae0: 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f  u', 't', ' ', 'o
baf0: 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27  ', 'f', ' ', 'm'
bb00: 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c  , 'e', 'm', 'o',
bb10: 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d   'r', 'y', 0.  }
bb20: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
bb30: 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20   u16 misuse[] = 
bb40: 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27 2c 20  {.    'l', 'i', 
bb50: 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27  'b', 'r', 'a', '
bb60: 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a 20  r', 'y', ' ', . 
bb70: 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27 75 27     'r', 'o', 'u'
bb80: 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c  , 't', 'i', 'n',
bb90: 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   'e', ' ', .    
bba0: 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27  'c', 'a', 'l', '
bbb0: 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20 27 20  l', 'e', 'd', ' 
bbc0: 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 75 27  ', .    'o', 'u'
bbd0: 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 't', ' ', .   
bbe0: 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20   'o', 'f', ' ', 
bbf0: 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c 20 27  .    's', 'e', '
bc00: 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20 27 6e  q', 'u', 'e', 'n
bc10: 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30 0a 20  ', 'c', 'e', 0. 
bc20: 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69   };..  const voi
bc30: 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20  d *z;.  if( !db 
bc40: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76  ){.    return (v
bc50: 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a  oid *)outOfMem;.
bc60: 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
bc70: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
bc80: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
bc90: 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29   return (void *)
bca0: 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71  misuse;.  }.  sq
bcb0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
bcc0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
bcd0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
bce0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20  iled ){.    z = 
bcf0: 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d  (void *)outOfMem
bd00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
bd10: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
bd20: 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72  _text16(db->pErr
bd30: 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
bd40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
bd50: 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e  ValueSetStr(db->
bd60: 70 45 72 72 2c 20 2d 31 2c 20 73 71 6c 69 74 65  pErr, -1, sqlite
bd70: 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43  3ErrStr(db->errC
bd80: 6f 64 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ode),.          
bd90: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
bda0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
bdb0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
bdc0: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d  value_text16(db-
bdd0: 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  >pErr);.    }.  
bde0: 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20    /* A malloc() 
bdf0: 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20  may have failed 
be00: 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20  within the call 
be10: 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  to sqlite3_value
be20: 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a  _text16().    **
be30: 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20   above. If this 
be40: 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
be50: 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63  n the db->malloc
be60: 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64  Failed flag need
be70: 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63  s to.    ** be c
be80: 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 72 65  leared before re
be90: 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73  turning. Do this
bea0: 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65   directly, inste
beb0: 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a  ad of via.    **
bec0: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
bed0: 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74  ), to avoid sett
bee0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
bef0: 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65   handle error me
bf00: 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssage..    */.  
bf10: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
bf20: 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  ed = 0;.  }.  sq
bf30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
bf40: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
bf50: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64  return z;.}.#end
bf60: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
bf70: 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
bf80: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * Return the mos
bf90: 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63  t recent error c
bfa0: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
bfb0: 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69   an SQLite routi
bfc0: 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a  ne. If NULL is.*
bfd0: 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  * passed to this
bfe0: 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73   function, we as
bff0: 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20  sume a malloc() 
c000: 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71  failed during sq
c010: 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f  lite3_open()..*/
c020: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72  .int sqlite3_err
c030: 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  code(sqlite3 *db
c040: 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  ){.  if( db && !
c050: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
c060: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
c070: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c080: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
c090: 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c  .  }.  if( !db |
c0a0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
c0b0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
c0c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
c0d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
c0e0: 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72  errCode & db->er
c0f0: 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rMask;.}.int sql
c100: 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
c110: 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
c120: 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
c130: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
c140: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
c150: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c160: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
c170: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20  ;.  }.  if( !db 
c180: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
c190: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
c1a0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
c1b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d    }.  return db-
c1c0: 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a  >errCode;.}../*.
c1d0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
c1e0: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
c1f0: 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  on for database 
c200: 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20  "db".  The name 
c210: 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20  is zName.** and 
c220: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  the encoding is 
c230: 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  enc..*/.static i
c240: 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  nt createCollati
c250: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  on(.  sqlite3* d
c260: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
c270: 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e  *zName, .  u8 en
c280: 63 2c 0a 20 20 75 38 20 63 6f 6c 6c 54 79 70 65  c,.  u8 collType
c290: 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a  ,.  void* pCtx,.
c2a0: 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
c2b0: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
c2c0: 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
c2d0: 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28   void*),.  void(
c2e0: 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b  *xDel)(void*).){
c2f0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
c300: 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20  l;.  int enc2;. 
c310: 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c   int nName = sql
c320: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
c330: 6d 65 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  me);.  .  assert
c340: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
c350: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
c360: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49  );..  /* If SQLI
c370: 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63  TE_UTF16 is spec
c380: 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63  ified as the enc
c390: 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e  oding type, tran
c3a0: 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20  sform this.  ** 
c3b0: 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  to one of SQLITE
c3c0: 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49  _UTF16LE or SQLI
c3d0: 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67  TE_UTF16BE using
c3e0: 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
c3f0: 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63  _UTF16NATIVE mac
c400: 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ro. SQLITE_UTF16
c410: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
c420: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
c430: 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65  enc2 = enc;.  te
c440: 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51  stcase( enc2==SQ
c450: 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20  LITE_UTF16 );.  
c460: 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
c470: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
c480: 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e  GNED );.  if( en
c490: 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
c4a0: 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45   || enc2==SQLITE
c4b0: 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29  _UTF16_ALIGNED )
c4c0: 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c  {.    enc2 = SQL
c4d0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
c4e0: 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c  .  }.  if( enc2<
c4f0: 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65  SQLITE_UTF8 || e
c500: 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36  nc2>SQLITE_UTF16
c510: 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  BE ){.    return
c520: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
c530: 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
c540: 68 65 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c  heck if this cal
c550: 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72  l is removing or
c560: 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78   replacing an ex
c570: 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e  isting collation
c580: 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e   .  ** sequence.
c590: 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72   If so, and ther
c5a0: 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
c5b0: 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49  , return busy. I
c5c0: 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65  f there.  ** are
c5d0: 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
c5e0: 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70  invalidate any p
c5f0: 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  re-compiled stat
c600: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
c610: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
c620: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75  ndCollSeq(db, (u
c630: 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30  8)enc2, zName, 0
c640: 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26  );.  if( pColl &
c650: 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b  & pColl->xCmp ){
c660: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 63 74  .    if( db->act
c670: 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a 20 20  iveVdbeCnt ){.  
c680: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c690: 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
c6a0: 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62  , .        "unab
c6b0: 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64  le to delete/mod
c6c0: 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ify collation se
c6d0: 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20 61 63  quence due to ac
c6e0: 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22  tive statements"
c6f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
c700: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
c710: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
c720: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
c730: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20  ements(db);..   
c740: 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e   /* If collation
c750: 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20   sequence pColl 
c760: 77 61 73 20 63 72 65 61 74 65 64 20 64 69 72 65  was created dire
c770: 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c 20 74  ctly by a call t
c780: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
c790: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
c7a0: 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72  n, and not gener
c7b0: 61 74 65 64 20 62 79 20 73 79 6e 74 68 43 6f 6c  ated by synthCol
c7c0: 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74  lSeq(),.    ** t
c7d0: 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73 20 6d  hen any copies m
c7e0: 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c  ade by synthColl
c7f0: 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20 62 65  Seq() need to be
c800: 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20 20   invalidated..  
c810: 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61    ** Also, colla
c820: 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f 72 20  tion destructor 
c830: 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29  - CollSeq.xDel()
c840: 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20   - function may 
c850: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62  need.    ** to b
c860: 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f  e called..    */
c870: 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c 6c   .    if( (pColl
c880: 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f  ->enc & ~SQLITE_
c890: 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d  UTF16_ALIGNED)==
c8a0: 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20 43 6f  enc2 ){.      Co
c8b0: 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73  llSeq *aColl = s
c8c0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
c8d0: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e  db->aCollSeq, zN
c8e0: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
c8f0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
c900: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b  for(j=0; j<3; j+
c910: 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
c920: 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b  Seq *p = &aColl[
c930: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  j];.        if( 
c940: 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65  p->enc==pColl->e
c950: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
c960: 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20  if( p->xDel ){. 
c970: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 44             p->xD
c980: 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20  el(p->pUser);.  
c990: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c9a0: 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b      p->xCmp = 0;
c9b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c9c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
c9d0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
c9e0: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28  indCollSeq(db, (
c9f0: 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20  u8)enc2, zName, 
ca00: 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d  1);.  if( pColl=
ca10: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
ca20: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f 6c  TE_NOMEM;.  pCol
ca30: 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61  l->xCmp = xCompa
ca40: 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73  re;.  pColl->pUs
ca50: 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f  er = pCtx;.  pCo
ca60: 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b  ll->xDel = xDel;
ca70: 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20  .  pColl->enc = 
ca80: 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65 6e 63  (u8)(enc2 | (enc
ca90: 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f   & SQLITE_UTF16_
caa0: 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 70 43 6f  ALIGNED));.  pCo
cab0: 6c 6c 2d 3e 74 79 70 65 20 3d 20 63 6f 6c 6c 54  ll->type = collT
cac0: 79 70 65 3b 0a 20 20 73 71 6c 69 74 65 33 45 72  ype;.  sqlite3Er
cad0: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
cae0: 4b 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  K, 0);.  return 
caf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
cb00: 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20  *.** This array 
cb10: 64 65 66 69 6e 65 73 20 68 61 72 64 20 75 70 70  defines hard upp
cb20: 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d  er bounds on lim
cb30: 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65 0a  it values.  The.
cb40: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d  ** initializer m
cb50: 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20 73  ust be kept in s
cb60: 79 6e 63 20 77 69 74 68 20 74 68 65 20 53 51 4c  ync with the SQL
cb70: 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23  ITE_LIMIT_*.** #
cb80: 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69 74  defines in sqlit
cb90: 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e3.h..*/.static 
cba0: 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64 4c  const int aHardL
cbb0: 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c  imit[] = {.  SQL
cbc0: 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a  ITE_MAX_LENGTH,.
cbd0: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c    SQLITE_MAX_SQL
cbe0: 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
cbf0: 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20  E_MAX_COLUMN,.  
cc00: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
cc10: 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  DEPTH,.  SQLITE_
cc20: 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
cc30: 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  ECT,.  SQLITE_MA
cc40: 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c  X_VDBE_OP,.  SQL
cc50: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
cc60: 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  _ARG,.  SQLITE_M
cc70: 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20 53  AX_ATTACHED,.  S
cc80: 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
cc90: 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20  ATTERN_LENGTH,. 
cca0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49   SQLITE_MAX_VARI
ccb0: 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a 20 20 53  ABLE_NUMBER,.  S
ccc0: 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
ccd0: 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a 0a  R_DEPTH,.};../*.
cce0: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
ccf0: 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72 65   hard limits are
cd00: 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61 62   set to reasonab
cd10: 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66  le values.*/.#if
cd20: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
cd30: 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53  TH<100.# error S
cd40: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
cd50: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
cd60: 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66  t 100.#endif.#if
cd70: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
cd80: 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72  LENGTH<100.# err
cd90: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  or SQLITE_MAX_SQ
cda0: 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  L_LENGTH must be
cdb0: 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65   at least 100.#e
cdc0: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
cdd0: 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53  MAX_SQL_LENGTH>S
cde0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
cdf0: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
ce00: 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d  MAX_SQL_LENGTH m
ce10: 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61 74  ust not be great
ce20: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d  er than SQLITE_M
ce30: 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66  AX_LENGTH.#endif
ce40: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
ce50: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c  COMPOUND_SELECT<
ce60: 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  2.# error SQLITE
ce70: 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
ce80: 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61 74 20  LECT must be at 
ce90: 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a 23  least 2.#endif.#
cea0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  if SQLITE_MAX_VD
ceb0: 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72  BE_OP<40.# error
cec0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
ced0: 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20 6c  _OP must be at l
cee0: 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a 23  east 40.#endif.#
cef0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  if SQLITE_MAX_FU
cf00: 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20  NCTION_ARG<0 || 
cf10: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
cf20: 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a 23 20 65  ION_ARG>1000.# e
cf30: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
cf40: 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73  FUNCTION_ARG mus
cf50: 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  t be between 0 a
cf60: 6e 64 20 31 30 30 30 0a 23 65 6e 64 69 66 0a 23  nd 1000.#endif.#
cf70: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  if SQLITE_MAX_AT
cf80: 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49  TACHED<0 || SQLI
cf90: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3e  TE_MAX_ATTACHED>
cfa0: 36 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  62.# error SQLIT
cfb0: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 6d  E_MAX_ATTACHED m
cfc0: 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30  ust be between 0
cfd0: 20 61 6e 64 20 36 32 0a 23 65 6e 64 69 66 0a 23   and 62.#endif.#
cfe0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  if SQLITE_MAX_LI
cff0: 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
d000: 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  H<1.# error SQLI
d010: 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
d020: 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  ERN_LENGTH must 
d030: 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65  be at least 1.#e
d040: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
d050: 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37  MAX_COLUMN>32767
d060: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
d070: 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20  MAX_COLUMN must 
d080: 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37 36 37  not exceed 32767
d090: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
d0a0: 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
d0b0: 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53  EPTH<1.# error S
d0c0: 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
d0d0: 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65 20  R_DEPTH must be 
d0e0: 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69  at least 1.#endi
d0f0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  f.../*.** Change
d100: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
d110: 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20 74  limit.  Report t
d120: 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a  he old value..**
d130: 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c   If an invalid l
d140: 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73 75  imit index is su
d150: 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20 2d  pplied, report -
d160: 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  1..** Make no ch
d170: 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c 20  anges but still 
d180: 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  report the old v
d190: 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e  alue if the.** n
d1a0: 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61  ew limit is nega
d1b0: 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  tive..**.** A ne
d1c0: 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f  w lower limit do
d1d0: 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78  es not shrink ex
d1e0: 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63 74  isting construct
d1f0: 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20  s..** It merely 
d200: 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e  prevents new con
d210: 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78 63  structs that exc
d220: 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a  eed the limit.**
d230: 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a   from forming..*
d240: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69  /.int sqlite3_li
d250: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
d260: 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e   int limitId, in
d270: 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69  t newLimit){.  i
d280: 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 0a 20  nt oldLimit;... 
d290: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
d2a0: 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20 46   R-30189-54097 F
d2b0: 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63 61  or each limit ca
d2c0: 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c 49  tegory SQLITE_LI
d2d0: 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74 68  MIT_NAME.  ** th
d2e0: 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75 70  ere is a hard up
d2f0: 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61 74  per bound set at
d300: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79   compile-time by
d310: 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73 6f   a C preprocesso
d320: 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61 6c  r.  ** macro cal
d330: 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4e  led SQLITE_MAX_N
d340: 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d 49  AME. (The "_LIMI
d350: 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  T_" in the name 
d360: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20 20  is changed to.  
d370: 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a  ** "_MAX_".).  *
d380: 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  /.  assert( aHar
d390: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
d3a0: 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c  MIT_LENGTH]==SQL
d3b0: 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29  ITE_MAX_LENGTH )
d3c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
d3d0: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
d3e0: 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d  MIT_SQL_LENGTH]=
d3f0: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f  =SQLITE_MAX_SQL_
d400: 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65  LENGTH );.  asse
d410: 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
d420: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
d430: 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  MN]==SQLITE_MAX_
d440: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73 65  COLUMN );.  asse
d450: 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
d460: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
d470: 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  _DEPTH]==SQLITE_
d480: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20 29  MAX_EXPR_DEPTH )
d490: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
d4a0: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
d4b0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
d4c0: 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  ECT]==SQLITE_MAX
d4d0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
d4e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
d4f0: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
d500: 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53  IMIT_VDBE_OP]==S
d510: 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
d520: 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  P );.  assert( a
d530: 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
d540: 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f  _LIMIT_FUNCTION_
d550: 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  ARG]==SQLITE_MAX
d560: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29 3b  _FUNCTION_ARG );
d570: 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
d580: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
d590: 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53 51  IT_ATTACHED]==SQ
d5a0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
d5b0: 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
d5c0: 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
d5d0: 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
d5e0: 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20  ERN_LENGTH]==.  
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
d620: 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
d630: 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  TERN_LENGTH );. 
d640: 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
d650: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
d660: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
d670: 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41  ]==SQLITE_MAX_VA
d680: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a  RIABLE_NUMBER);.
d690: 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
d6a0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
d6b0: 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 5d  T_TRIGGER_DEPTH]
d6c0: 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  ==SQLITE_MAX_TRI
d6d0: 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20 20  GGER_DEPTH );.  
d6e0: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4c  assert( SQLITE_L
d6f0: 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
d700: 54 48 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c 49  TH==(SQLITE_N_LI
d710: 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69 66  MIT-1) );...  if
d720: 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c  ( limitId<0 || l
d730: 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e  imitId>=SQLITE_N
d740: 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72 65  _LIMIT ){.    re
d750: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f  turn -1;.  }.  o
d760: 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c  ldLimit = db->aL
d770: 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20  imit[limitId];. 
d780: 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30   if( newLimit>=0
d790: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
d7a0: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
d7b0: 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a 20  52476-28732 */. 
d7c0: 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
d7d0: 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74  aHardLimit[limit
d7e0: 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  Id] ){.      new
d7f0: 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c 69 6d  Limit = aHardLim
d800: 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f 2a  it[limitId];  /*
d810: 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32 35   IMP: R-51463-25
d820: 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  634 */.    }.   
d830: 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69   db->aLimit[limi
d840: 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  tId] = newLimit;
d850: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c  .  }.  return ol
d860: 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  dLimit;         
d870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
d880: 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35 34 31  MP: R-53341-3541
d890: 39 20 2a 2f 0a 7d 0a 23 69 66 20 64 65 66 69 6e  9 */.}.#if defin
d8a0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
d8b0: 5f 41 55 54 4f 5f 50 52 4f 46 49 4c 45 29 0a 76  _AUTO_PROFILE).v
d8c0: 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f  oid _sqlite_auto
d8d0: 5f 70 72 6f 66 69 6c 65 28 76 6f 69 64 20 2a 61  _profile(void *a
d8e0: 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ux, const char *
d8f0: 73 71 6c 2c 20 75 36 34 20 6e 73 29 3b 0a 76 6f  sql, u64 ns);.vo
d900: 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f  id _sqlite_auto_
d910: 74 72 61 63 65 28 76 6f 69 64 20 2a 61 75 78 2c  trace(void *aux,
d920: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
d930: 29 3b 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f  );.void _sqlite_
d940: 61 75 74 6f 5f 70 72 6f 66 69 6c 65 28 76 6f 69  auto_profile(voi
d950: 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68  d *aux, const ch
d960: 61 72 20 2a 73 71 6c 2c 20 75 36 34 20 6e 73 29  ar *sql, u64 ns)
d970: 20 7b 0a 23 70 72 61 67 6d 61 20 75 6e 75 73 65   {.#pragma unuse
d980: 64 28 61 75 78 29 0a 09 66 70 72 69 6e 74 66 28  d(aux)..fprintf(
d990: 73 74 64 65 72 72 2c 20 22 51 75 65 72 79 3a 20  stderr, "Query: 
d9a0: 25 73 5c 6e 20 45 78 65 63 75 74 69 6f 6e 20 54  %s\n Execution T
d9b0: 69 6d 65 3a 20 25 6c 6c 75 20 6d 73 5c 6e 22 2c  ime: %llu ms\n",
d9c0: 20 73 71 6c 2c 20 6e 73 20 2f 20 31 30 30 30 30   sql, ns / 10000
d9d0: 30 30 29 3b 0a 7d 0a 76 6f 69 64 20 5f 73 71 6c  00);.}.void _sql
d9e0: 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 28 76  ite_auto_trace(v
d9f0: 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20  oid *aux, const 
da00: 63 68 61 72 20 2a 73 71 6c 29 20 7b 0a 09 66 70  char *sql) {..fp
da10: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 54  rintf(stderr, "T
da20: 72 61 63 65 53 51 4c 28 25 70 29 3a 20 25 73 5c  raceSQL(%p): %s\
da30: 6e 22 2c 20 61 75 78 2c 20 73 71 6c 29 3b 0a 7d  n", aux, sql);.}
da40: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
da50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
da60: 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62 6f  used to parse bo
da70: 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e 2d  th URIs and non-
da80: 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70 61  URI filenames pa
da90: 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 75  ssed by the.** u
daa0: 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63 74  ser to API funct
dab0: 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70 65  ions sqlite3_ope
dac0: 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  n() or sqlite3_o
dad0: 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66 6f  pen_v2(), and fo
dae0: 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55 52  r database.** UR
daf0: 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  Is specified as 
db00: 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20 73  part of ATTACH s
db10: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  tatements..**.**
db20: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
db30: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
db40: 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  tion is the name
db50: 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75   of the VFS to u
db60: 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c  se (or.** a NULL
db70: 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65 20   to signify the 
db80: 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66 20  default VFS) if 
db90: 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f 74  the URI does not
dba0: 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73 3d   contain a "vfs=
dbb0: 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70 61  xxx".** query pa
dbc0: 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65 63  rameter. The sec
dbd0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e  ond argument con
dbe0: 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28 6f  tains the URI (o
dbf0: 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61  r non-URI filena
dc00: 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20 57  me).** itself. W
dc10: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
dc20: 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  n is called the 
dc30: 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c 65  *pFlags variable
dc40: 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a   should contain.
dc50: 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 66  ** the default f
dc60: 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68 65  lags to open the
dc70: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
dc80: 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75 65   with. The value
dc90: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a 70   stored in.** *p
dca0: 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70 64  Flags may be upd
dcb0: 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  ated before retu
dcc0: 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52 49  rning if the URI
dcd0: 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61 69   filename contai
dce0: 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78 78  ns .** "cache=xx
dcf0: 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78 22  x" or "mode=xxx"
dd00: 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
dd10: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  s..**.** If succ
dd20: 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
dd30: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
dd40: 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70 56  n this case *ppV
dd50: 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  fs is set to poi
dd60: 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46 53  nt to.** the VFS
dd70: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
dd80: 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  used to open the
dd90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
dda0: 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20 74  *pzFile is set t
ddb0: 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  o.** point to a 
ddc0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
ddd0: 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  g the name of th
dde0: 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 20  e file to open. 
ddf0: 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
de00: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
de10: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
de20: 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73 71  entually call sq
de30: 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f 20  lite3_free() to 
de40: 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20  release.** this 
de50: 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  buffer..**.** If
de60: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
de70: 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74 65  , then an SQLite
de80: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
de90: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a 45  eturned and *pzE
dea0: 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20  rrMsg.** may be 
deb0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
dec0: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
ded0: 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c  ing an English l
dee0: 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a 2a  anguage error .*
def0: 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73  * message. It is
df00: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
df10: 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
df20: 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
df30: 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20  release.** this 
df40: 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69 6e  buffer by callin
df50: 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
df60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
df70: 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e 73  ParseUri(.  cons
df80: 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74  t char *zDefault
df90: 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 56  Vfs,        /* V
dfa0: 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f 20  FS to use if no 
dfb0: 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79 20  "vfs=xxx" query 
dfc0: 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  option */.  cons
dfd0: 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20 20  t char *zUri,   
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
dff0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 52  ul-terminated UR
e000: 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20  I to parse */.  
e010: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70 46  unsigned int *pF
e020: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
e030: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49 54  /* IN/OUT: SQLIT
e040: 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73  E_OPEN_XXX flags
e050: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
e060: 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20 20  s **ppVfs,      
e070: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 46        /* OUT: VF
e080: 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20 63  S to use */ .  c
e090: 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20 20  har **pzFile,   
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e0b0: 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65 20  * OUT: Filename 
e0c0: 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52 49  component of URI
e0d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
e0e0: 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20  rrMsg           
e0f0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72        /* OUT: Er
e100: 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66 20  ror message (if 
e110: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 2a  rc!=SQLITE_OK) *
e120: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
e130: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73  SQLITE_OK;.  uns
e140: 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 20  igned int flags 
e150: 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f 6e  = *pFlags;.  con
e160: 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20  st char *zVfs = 
e170: 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20 63  zDefaultVfs;.  c
e180: 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68  har *zFile;.  ch
e190: 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72 69  ar c;.  int nUri
e1a0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
e1b0: 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73 73  30(zUri);..  ass
e1c0: 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d 3d  ert( *pzErrMsg==
e1d0: 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66 6c  0 );..  if( ((fl
e1e0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
e1f0: 4e 5f 55 52 49 29 20 7c 7c 20 73 71 6c 69 74 65  N_URI) || sqlite
e200: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f  3GlobalConfig.bO
e210: 70 65 6e 55 72 69 29 20 0a 20 20 20 26 26 20 6e  penUri) .   && n
e220: 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Uri>=5 && memcmp
e230: 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20  (zUri, "file:", 
e240: 35 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20  5)==0 .  ){.    
e250: 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20  char *zOpt;.    
e260: 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20  int eState;     
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e280: 20 50 61 72 73 65 72 20 73 74 61 74 65 20 77 68   Parser state wh
e290: 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20 2a  en parsing URI *
e2a0: 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20 20  /.    int iIn;  
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2c0: 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61      /* Input cha
e2d0: 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a  racter index */.
e2e0: 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30      int iOut = 0
e2f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e300: 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61 72    /* Output char
e310: 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20  acter index */. 
e320: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e     int nByte = n
e330: 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20 20  Uri+2;          
e340: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
e350: 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ce to allocate *
e360: 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  /..    /* Make s
e370: 75 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4f  ure the SQLITE_O
e380: 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73 20  PEN_URI flag is 
e390: 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20  set to indicate 
e3a0: 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65 6e  to the VFS xOpen
e3b0: 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20   .    ** method 
e3c0: 74 68 61 74 20 74 68 65 72 65 20 6d 61 79 20 62  that there may b
e3d0: 65 20 65 78 74 72 61 20 70 61 72 61 6d 65 74 65  e extra paramete
e3e0: 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  rs following the
e3f0: 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a   file-name.  */.
e400: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
e410: 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20  ITE_OPEN_URI;.. 
e420: 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69 49     for(iIn=0; iI
e430: 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20 6e  n<nUri; iIn++) n
e440: 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69 49  Byte += (zUri[iI
e450: 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a 46  n]=='&');.    zF
e460: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
e470: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20  lloc(nByte);.   
e480: 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65   if( !zFile ) re
e490: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e4a0: 4d 3b 0a 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  M;..    /* Disca
e4b0: 72 64 20 74 68 65 20 73 63 68 65 6d 65 20 61 6e  rd the scheme an
e4c0: 64 20 61 75 74 68 6f 72 69 74 79 20 73 65 67 6d  d authority segm
e4d0: 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52 49 2e  ents of the URI.
e4e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55 72 69   */.    if( zUri
e4f0: 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72 69  [5]=='/' && zUri
e500: 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [6]=='/' ){.    
e510: 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20 20    iIn = 7;.     
e520: 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e   while( zUri[iIn
e530: 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d  ] && zUri[iIn]!=
e540: 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 0a 20 20  '/' ) iIn++;..  
e550: 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20 26      if( iIn!=7 &
e560: 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d 65  & (iIn!=16 || me
e570: 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74 22  mcmp("localhost"
e580: 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29 20  , &zUri[7], 9)) 
e590: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
e5a0: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
e5b0: 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20  printf("invalid 
e5c0: 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20 25  uri authority: %
e5d0: 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  .*s", .         
e5e0: 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69 5b     iIn-7, &zUri[
e5f0: 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  7]);.        rc 
e600: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
e610: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
e620: 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20  se_uri_out;.    
e630: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
e640: 20 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 20 20       iIn = 5;.  
e650: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
e660: 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e   the filename an
e670: 64 20 61 6e 79 20 71 75 65 72 79 20 70 61 72 61  d any query para
e680: 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20  meters into the 
e690: 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20  zFile buffer. . 
e6a0: 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48     ** Decode %HH
e6b0: 20 65 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c   escape codes al
e6c0: 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20  ong the way. .  
e6d0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68    **.    ** With
e6e0: 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61  in this loop, va
e6f0: 72 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61  riable eState ma
e700: 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31  y be set to 0, 1
e710: 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67   or 2, depending
e720: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70  .    ** on the p
e730: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20  arsing context. 
e740: 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  As follows:.    
e750: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50  **.    **   0: P
e760: 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65  arsing file-name
e770: 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61  ..    **   1: Pa
e780: 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69  rsing name secti
e790: 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c  on of a name=val
e7a0: 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ue query paramet
e7b0: 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20  er..    **   2: 
e7c0: 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65  Parsing value se
e7d0: 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d  ction of a name=
e7e0: 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61  value query para
e7f0: 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  meter..    */.  
e800: 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20    eState = 0;.  
e810: 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55    while( (c = zU
e820: 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63  ri[iIn])!=0 && c
e830: 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69  !='#' ){.      i
e840: 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  In++;.      if( 
e850: 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26  c=='%' .       &
e860: 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69  & sqlite3Isxdigi
e870: 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20  t(zUri[iIn]) .  
e880: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49       && sqlite3I
e890: 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e  sxdigit(zUri[iIn
e8a0: 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  +1]) .      ){. 
e8b0: 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74         int octet
e8c0: 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f   = (sqlite3HexTo
e8d0: 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29  Int(zUri[iIn++])
e8e0: 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20   << 4);.        
e8f0: 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33  octet += sqlite3
e900: 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49  HexToInt(zUri[iI
e910: 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20  n++]);..        
e920: 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30  assert( octet>=0
e930: 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b   && octet<256 );
e940: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 63 74  .        if( oct
e950: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  et==0 ){.       
e960: 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
e970: 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
e980: 22 25 30 30 22 20 61 70 70 65 61 72 73 20 77 69  "%00" appears wi
e990: 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49 6e  thin the URI. In
e9a0: 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
e9b0: 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f 72  ** case we ignor
e9c0: 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74 68  e all text in th
e9d0: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
e9e0: 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72  he path, name or
e9f0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61  .          ** va
ea00: 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  lue currently be
ea10: 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20 69  ing parsed. So i
ea20: 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  gnore the curren
ea30: 74 20 63 68 61 72 61 63 74 65 72 0a 20 20 20 20  t character.    
ea40: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69        ** and ski
ea50: 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22 3f  p to the next "?
ea60: 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20 61  ", "=" or "&", a
ea70: 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 2a  s appropriate. *
ea80: 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  /.          whil
ea90: 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e  e( (c = zUri[iIn
eaa0: 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20  ])!=0 && c!='#' 
eab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
eac0: 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c 20  & (eState!=0 || 
ead0: 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20 20  c!='?').        
eae0: 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
eaf0: 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26  !=1 || (c!='=' &
eb00: 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20 20  & c!='&')).     
eb10: 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74           && (eSt
eb20: 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27  ate!=2 || c!='&'
eb30: 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
eb40: 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b 2b             iIn++
eb50: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
eb60: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
eb70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
eb80: 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20      c = octet;. 
eb90: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
eba0: 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d  State==1 && (c==
ebb0: 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29  '&' || c=='=') )
ebc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  {.        if( zF
ebd0: 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29  ile[iOut-1]==0 )
ebe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
ebf0: 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e  n empty option n
ec00: 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73  ame. Ignore this
ec10: 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68   option altogeth
ec20: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  er. */.         
ec30: 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e   while( zUri[iIn
ec40: 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d  ] && zUri[iIn]!=
ec50: 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d  '#' && zUri[iIn-
ec60: 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b  1]!='&' ) iIn++;
ec70: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
ec80: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
ec90: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26         if( c=='&
eca0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
ecb0: 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
ecc0: 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  \0';.        }el
ecd0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53  se{.          eS
ece0: 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20  tate = 2;.      
ecf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20    }.        c = 
ed00: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
ed10: 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26  f( (eState==0 &&
ed20: 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74   c=='?') || (eSt
ed30: 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27  ate==2 && c=='&'
ed40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ) ){.        c =
ed50: 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61   0;.        eSta
ed60: 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  te = 1;.      }.
ed70: 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74        zFile[iOut
ed80: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20  ++] = c;.    }. 
ed90: 20 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31     if( eState==1
eda0: 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d   ) zFile[iOut++]
edb0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69   = '\0';.    zFi
edc0: 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
edd0: 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  ';.    zFile[iOu
ede0: 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  t++] = '\0';..  
edf0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
ee00: 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74  ere were any opt
ee10: 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20 74  ions specified t
ee20: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  hat should be in
ee30: 74 65 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a  terpreted .    *
ee40: 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20  * here. Options 
ee50: 74 68 61 74 20 61 72 65 20 69 6e 74 65 72 70 72  that are interpr
ee60: 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64  eted here includ
ee70: 65 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73  e "vfs" and thos
ee80: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f  e that.    ** co
ee90: 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67  rrespond to flag
eea0: 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 61  s that may be pa
eeb0: 73 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69  ssed to the sqli
eec0: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20  te3_open_v2().  
eed0: 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a    ** method. */.
eee0: 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c      zOpt = &zFil
eef0: 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  e[sqlite3Strlen3
ef00: 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20  0(zFile)+1];.   
ef10: 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20   while( zOpt[0] 
ef20: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70  ){.      int nOp
ef30: 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  t = sqlite3Strle
ef40: 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20  n30(zOpt);.     
ef50: 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a   char *zVal = &z
ef60: 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20  Opt[nOpt+1];.   
ef70: 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71     int nVal = sq
ef80: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56  lite3Strlen30(zV
ef90: 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  al);..      if( 
efa0: 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d  nOpt==3 && memcm
efb0: 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33  p("vfs", zOpt, 3
efc0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
efd0: 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20  zVfs = zVal;.   
efe0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
eff0: 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64    struct OpenMod
f000: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  e {.          co
f010: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
f020: 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b         int mode;
f030: 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64  .        } *aMod
f040: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  e = 0;.        c
f050: 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d  har *zModeType =
f060: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
f070: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  mask = 0;.      
f080: 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b    int limit = 0;
f090: 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f  ..        if( nO
f0a0: 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28  pt==5 && memcmp(
f0b0: 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35  "cache", zOpt, 5
f0c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
f0d0: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
f0e0: 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d  OpenMode aCacheM
f0f0: 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
f100: 20 20 20 20 20 20 7b 20 22 73 68 61 72 65 64 22        { "shared"
f110: 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  ,  SQLITE_OPEN_S
f120: 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20  HAREDCACHE },.  
f130: 20 20 20 20 20 20 20 20 20 20 7b 20 22 70 72 69            { "pri
f140: 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50  vate", SQLITE_OP
f150: 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20  EN_PRIVATECACHE 
f160: 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
f170: 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20   0, 0 }.        
f180: 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20    };..          
f190: 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50  mask = SQLITE_OP
f1a0: 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53  EN_SHAREDCACHE|S
f1b0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
f1c0: 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20  TECACHE;.       
f1d0: 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68     aMode = aCach
f1e0: 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  eMode;.         
f1f0: 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20   limit = mask;. 
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 63 61 63 68 65 22 3b 0a 20 20  pe = "cache";.  
f220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f230: 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d  if( nOpt==4 && m
f240: 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f  emcmp("mode", zO
f250: 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20  pt, 4)==0 ){.   
f260: 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74         static st
f270: 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f  ruct OpenMode aO
f280: 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20  penMode[] = {.  
f290: 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22            { "ro"
f2a0: 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ,  SQLITE_OPEN_R
f2b0: 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20  EADONLY },.     
f2c0: 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20         { "rw",  
f2d0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
f2e0: 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20  WRITE }, .      
f2f0: 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53        { "rwc", S
f300: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
f310: 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
f320: 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20  EN_CREATE },.   
f330: 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20           { 0, 0 
f340: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a  }.          };..
f350: 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d            mask =
f360: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
f370: 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
f380: 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
f390: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a  TE_OPEN_CREATE;.
f3a0: 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20            aMode 
f3b0: 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20  = aOpenMode;.   
f3c0: 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d         limit = m
f3d0: 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20 20  ask & flags;.   
f3e0: 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65         zModeType
f3f0: 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20 20 20   = "access";.   
f400: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
f410: 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20  if( aMode ){.   
f420: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
f430: 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65          int mode
f440: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
f450: 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69  for(i=0; aMode[i
f460: 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ].z; i++){.     
f470: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
f480: 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e  r *z = aMode[i].
f490: 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  z;.            i
f4a0: 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33  f( nVal==sqlite3
f4b0: 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26 20 30  Strlen30(z) && 0
f4c0: 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a  ==memcmp(zVal, z
f4d0: 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20  , nVal) ){.     
f4e0: 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20 3d 20           mode = 
f4f0: 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20  aMode[i].mode;. 
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
f510: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
f520: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
f530: 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f 64 65          if( mode
f540: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
f550: 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
f560: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
f570: 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64 65 3a  no such %s mode:
f580: 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c   %s", zModeType,
f590: 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   zVal);.        
f5a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f5b0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
f5c0: 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
f5d0: 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  i_out;.         
f5e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
f5f0: 20 6d 6f 64 65 3e 6c 69 6d 69 74 20 29 7b 0a 20   mode>limit ){. 
f600: 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72             *pzEr
f610: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
f620: 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20  printf("%s mode 
f630: 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22  not allowed: %s"
f640: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f660: 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
f670: 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20  ype, zVal);.    
f680: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
f690: 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20  ITE_PERM;.      
f6a0: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
f6b0: 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20  _uri_out;.      
f6c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f6d0: 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26  flags = (flags &
f6e0: 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a   ~mask) | mode;.
f6f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f700: 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20  }..      zOpt = 
f710: 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20  &zVal[nVal+1];. 
f720: 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20     }..  }else{. 
f730: 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74     zFile = sqlit
f740: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b 32  e3_malloc(nUri+2
f750: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c  );.    if( !zFil
f760: 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
f770: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d  E_NOMEM;.    mem
f780: 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c  cpy(zFile, zUri,
f790: 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c   nUri);.    zFil
f7a0: 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a  e[nUri] = '\0';.
f7b0: 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31      zFile[nUri+1
f7c0: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 0a 20  ] = '\0';.  }.. 
f7d0: 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65   *ppVfs = sqlite
f7e0: 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29  3_vfs_find(zVfs)
f7f0: 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d  ;.  if( *ppVfs==
f800: 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d  0 ){.    *pzErrM
f810: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
f820: 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66  intf("no such vf
f830: 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20  s: %s", zVfs);. 
f840: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
f850: 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65  RROR;.  }. parse
f860: 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20  _uri_out:.  if( 
f870: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f880: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
f890: 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46  e(zFile);.    zF
f8a0: 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a  ile = 0;.  }.  *
f8b0: 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  pFlags = flags;.
f8c0: 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c    *pzFile = zFil
f8d0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
f8e0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
f8f0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
f900: 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20  work of opening 
f910: 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65  a database on be
f920: 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  half of.** sqlit
f930: 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71  e3_open() and sq
f940: 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20  lite3_open16(). 
f950: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
f960: 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65  ename "zFilename
f970: 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20  "  .** is UTF-8 
f980: 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74  encoded..*/.stat
f990: 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62  ic int openDatab
f9a0: 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ase(.  const cha
f9b0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a  r *zFilename, /*
f9c0: 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
f9d0: 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  me UTF-8 encoded
f9e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
f9f0: 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20  ppDb,        /* 
fa00: 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61  OUT: Returned da
fa10: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
fa20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
fa30: 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65  flags,    /* Ope
fa40: 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a  rational flags *
fa50: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
fa60: 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61  zVfs       /* Na
fa70: 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
fa80: 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c   use */.){.  sql
fa90: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fab0: 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  Store allocated 
fac0: 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
fad0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faf0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
fb00: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61  */.  int isThrea
fb10: 64 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20  dsafe;          
fb20: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
fb30: 20 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e   threadsafe conn
fb40: 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  ections */.  cha
fb50: 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20  r *zOpen = 0;   
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb70: 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
fb80: 74 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72  t to pass to Btr
fb90: 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68  eeOpen() */.  ch
fba0: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fbc0: 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   Error message f
fbd0: 72 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65  rom sqlite3Parse
fbe0: 55 72 69 28 29 20 2a 2f 0a 0a 20 20 2a 70 70 44  Uri() */..  *ppD
fbf0: 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
fc00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
fc10: 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  NIT.  rc = sqlit
fc20: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
fc30: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
fc40: 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20  rn rc;.#endif.. 
fc50: 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73   /* Only allow s
fc60: 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74  ensible combinat
fc70: 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20  ions of bits in 
fc80: 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  the flags argume
fc90: 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77  nt.  .  ** Throw
fca0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
fcb0: 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69   non-sense combi
fcc0: 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  nation is used. 
fcd0: 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e   If we.  ** do n
fce0: 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c  ot block illegal
fcf0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65   combinations he
fd00: 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69  re, it could tri
fd10: 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74  gger.  ** assert
fd20: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  () statements in
fd30: 20 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20   deeper layers. 
fd40: 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e   Sensible combin
fd50: 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a  ations.  ** are:
fd60: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20  .  **.  **  1:  
fd70: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
fd80: 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53  ONLY.  **  2:  S
fd90: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
fda0: 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53  RITE.  **  6:  S
fdb0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
fdc0: 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
fdd0: 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20  EN_CREATE.  */. 
fde0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
fdf0: 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d  OPEN_READONLY  =
fe00: 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65  = 0x01 );.  asse
fe10: 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
fe20: 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30  READWRITE == 0x0
fe30: 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
fe40: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
fe50: 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a  E    == 0x04 );.
fe60: 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
fe70: 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32  (flags&7))==0x02
fe80: 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20   ); /* READONLY 
fe90: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
fea0: 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
feb0: 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x04 ); /* READWR
fec0: 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ITE */.  testcas
fed0: 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
fee0: 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45  )==0x40 ); /* RE
fef0: 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
ff00: 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28   */.  if( ((1<<(
ff10: 66 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36  flags&7)) & 0x46
ff20: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  )==0 ) return SQ
ff30: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
ff40: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
ff50: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
ff60: 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  reMutex==0 ){.  
ff70: 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
ff80: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
ff90: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
ffa0: 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20  PEN_NOMUTEX ){. 
ffb0: 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
ffc0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
ffd0: 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
ffe0: 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29  OPEN_FULLMUTEX )
fff0: 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
10000 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  fe = 1;.  }else{
10010 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
10020 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  e = sqlite3Globa
10030 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
10040 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c  ex;.  }.  if( fl
10050 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
10060 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 29  N_PRIVATECACHE )
10070 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e  {.    flags &= ~
10080 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
10090 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65  EDCACHE;.  }else
100a0 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
100b0 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
100c0 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20  acheEnabled ){. 
100d0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
100e0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
100f0 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  CHE;.  }..  /* R
10100 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69  emove harmful bi
10110 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67  ts from the flag
10120 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a  s parameter.  **
10130 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  .  ** The SQLITE
10140 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e  _OPEN_NOMUTEX an
10150 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  d SQLITE_OPEN_FU
10160 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65  LLMUTEX flags we
10170 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69  re.  ** dealt wi
10180 74 68 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  th in the previo
10190 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20  us code block.  
101a0 42 65 73 69 64 65 73 20 74 68 65 73 65 2c 20 74  Besides these, t
101b0 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c  he only.  ** val
101c0 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66  id input flags f
101d0 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  or sqlite3_open_
101e0 76 32 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f  v2() are SQLITE_
101f0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20  OPEN_READONLY,. 
10200 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
10210 52 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54  READWRITE, SQLIT
10220 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53  E_OPEN_CREATE, S
10230 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
10240 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c  DCACHE,.  ** SQL
10250 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
10260 43 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20  CACHE, and some 
10270 72 65 73 65 72 76 65 64 20 62 69 74 73 2e 20 20  reserved bits.  
10280 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20  Silently mask.  
10290 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72  ** off all other
102a0 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66   flags..  */.  f
102b0 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49  lags &=  ~( SQLI
102c0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
102d0 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
102e0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
102f0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
10310 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
10320 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  B |.            
10330 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
10340 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20  EMP_DB | .      
10350 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
10360 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
10370 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  B | .           
10380 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
10390 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a  MAIN_JOURNAL | .
103a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
103b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
103c0 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
103d0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
103e0 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
103f0 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
10400 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
10410 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a  ASTER_JOURNAL |.
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
10430 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
10440 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EX |.           
10450 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
10460 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20  FULLMUTEX |.    
10470 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
10480 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20  E_OPEN_WAL.     
10490 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a          );..  /*
104a0 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
104b0 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74  lite data struct
104c0 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71  ure */.  db = sq
104d0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
104e0 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29   sizeof(sqlite3)
104f0 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20   );.  if( db==0 
10500 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75  ) goto opendb_ou
10510 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61  t;.  if( isThrea
10520 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d  dsafe ){.    db-
10530 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
10540 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
10550 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56  E_MUTEX_RECURSIV
10560 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  E);.    if( db->
10570 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
10580 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
10590 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30  b);.      db = 0
105a0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
105b0 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ndb_out;.    }. 
105c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
105d0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
105e0 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
105f0 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d  sk = 0xff;.  db-
10600 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e  >nDb = 2;.  db->
10610 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
10620 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d  AGIC_BUSY;.  db-
10630 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
10640 61 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  atic;..  assert(
10650 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d   sizeof(db->aLim
10660 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72  it)==sizeof(aHar
10670 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d  dLimit) );.  mem
10680 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20  cpy(db->aLimit, 
10690 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65  aHardLimit, size
106a0 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b  of(db->aLimit));
106b0 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  .  db->autoCommi
106c0 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78  t = 1;.  db->nex
106d0 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20  tAutovac = -1;. 
106e0 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
106f0 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61  e = 0;.  db->fla
10700 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
10710 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c  rtColNames | SQL
10720 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 20 7c 20  ITE_AutoIndex | 
10730 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69  SQLITE_EnableTri
10740 67 67 65 72 0a 23 69 66 20 53 51 4c 49 54 45 5f  gger.#if SQLITE_
10750 44 45 46 41 55 4c 54 5f 43 4b 50 54 46 55 4c 4c  DEFAULT_CKPTFULL
10760 46 53 59 4e 43 0a 20 20 20 20 20 20 20 20 20 20  FSYNC.          
10770 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
10780 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63 0a 23 65  CkptFullFSync.#e
10790 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
107a0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52  DEFAULT_FILE_FOR
107b0 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20  MAT<4.          
107c0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
107d0 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65  LegacyFileFmt.#e
107e0 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
107f0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45  TE_ENABLE_LOAD_E
10800 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20  XTENSION.       
10810 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
10820 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  TE_LoadExtension
10830 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
10840 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52  TE_DEFAULT_RECUR
10850 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20  SIVE_TRIGGERS.  
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
10870 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67   SQLITE_RecTrigg
10880 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ers.#endif.#if d
10890 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
108a0 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
108b0 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45  YS) && SQLITE_DE
108c0 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
108d0 59 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  YS.             
108e0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72      | SQLITE_For
108f0 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a  eignKeys.#endif.
10900 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65        ;.  sqlite
10910 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61  3HashInit(&db->a
10920 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65  CollSeq);.#ifnde
10930 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10940 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c  RTUALTABLE.  sql
10950 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62  ite3HashInit(&db
10960 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64  ->aModule);.#end
10970 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  if..  /* Add the
10980 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
10990 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41  on sequence BINA
109a0 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73  RY. BINARY works
109b0 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a   for both UTF-8.
109c0 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c    ** and UTF-16,
109d0 20 73 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f   so add a versio
109e0 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76  n for each to av
109f0 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73  oid any unnecess
10a00 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73  ary.  ** convers
10a10 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65  ions. The only e
10a20 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63  rror that can oc
10a30 63 75 72 20 68 65 72 65 20 69 73 20 61 20 6d 61  cur here is a ma
10a40 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a  lloc() failure..
10a50 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c    */.  createCol
10a60 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41  lation(db, "BINA
10a70 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  RY", SQLITE_UTF8
10a80 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49  , SQLITE_COLL_BI
10a90 4e 41 52 59 2c 20 30 2c 0a 20 20 20 20 20 20 20  NARY, 0,.       
10aa0 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 43 6f             binCo
10ab0 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
10ac0 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
10ad0 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
10ae0 54 45 5f 55 54 46 31 36 42 45 2c 20 53 51 4c 49  TE_UTF16BE, SQLI
10af0 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 2c 20  TE_COLL_BINARY, 
10b00 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
10b10 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46 75 6e 63       binCollFunc
10b20 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
10b30 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e  llation(db, "BIN
10b40 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ARY", SQLITE_UTF
10b50 31 36 4c 45 2c 20 53 51 4c 49 54 45 5f 43 4f 4c  16LE, SQLITE_COL
10b60 4c 5f 42 49 4e 41 52 59 2c 20 30 2c 0a 20 20 20  L_BINARY, 0,.   
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
10b80 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
10b90 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
10ba0 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53  n(db, "RTRIM", S
10bb0 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
10bc0 54 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20 28 76  TE_COLL_USER, (v
10bd0 6f 69 64 2a 29 31 2c 0a 20 20 20 20 20 20 20 20  oid*)1,.        
10be0 20 20 20 20 20 20 20 20 20 20 62 69 6e 43 6f 6c            binCol
10bf0 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28  lFunc, 0);.  if(
10c00 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
10c10 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
10c20 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  endb_out;.  }.  
10c30 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20  db->pDfltColl = 
10c40 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
10c50 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54  eq(db, SQLITE_UT
10c60 46 38 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29  F8, "BINARY", 0)
10c70 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
10c80 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a  pDfltColl!=0 );.
10c90 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61  .  /* Also add a
10ca0 20 55 54 46 2d 38 20 63 61 73 65 2d 69 6e 73 65   UTF-8 case-inse
10cb0 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f  nsitive collatio
10cc0 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20  n sequence. */. 
10cd0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
10ce0 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53  (db, "NOCASE", S
10cf0 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
10d00 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 2c 20  TE_COLL_NOCASE, 
10d10 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
10d20 20 20 20 20 20 6e 6f 63 61 73 65 43 6f 6c 6c 61       nocaseColla
10d30 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 0a 20  tingFunc, 0);.. 
10d40 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66 69   /* Parse the fi
10d50 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72 67 75 6d  lename/URI argum
10d60 65 6e 74 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70  ent. */.  db->op
10d70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  enFlags = flags;
10d80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
10d90 61 72 73 65 55 72 69 28 7a 56 66 73 2c 20 7a 46  arseUri(zVfs, zF
10da0 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61 67 73 2c  ilename, &flags,
10db0 20 26 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70   &db->pVfs, &zOp
10dc0 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  en, &zErrMsg);. 
10dd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10de0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
10df0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
10e00 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
10e10 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  d = 1;.    sqlit
10e20 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
10e30 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a  zErrMsg ? "%s" :
10e40 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20   0, zErrMsg);.  
10e50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
10e60 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f 74  ErrMsg);.    got
10e70 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
10e80 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  }..  /* Open the
10e90 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61 73   backend databas
10ea0 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72 63  e driver */.  rc
10eb0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
10ec0 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a 4f  pen(db->pVfs, zO
10ed0 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44  pen, db, &db->aD
10ee0 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20 20  b[0].pBt, 0,.   
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f00 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51 4c       flags | SQL
10f10 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
10f20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10f30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
10f40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
10f50 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  RR_NOMEM ){.    
10f60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
10f70 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  MEM;.    }.    s
10f80 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
10f90 72 63 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  rc, 0);.    goto
10fa0 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
10fb0 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53  .  db->aDb[0].pS
10fc0 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53  chema = sqlite3S
10fd0 63 68 65 6d 61 47 65 74 28 64 62 2c 20 64 62 2d  chemaGet(db, db-
10fe0 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
10ff0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
11000 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  ma = sqlite3Sche
11010 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 0a  maGet(db, 0);...
11020 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
11030 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f   safety_level fo
11040 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
11050 61 73 65 20 69 73 20 27 66 75 6c 6c 27 3b 20 66  ase is 'full'; f
11060 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a  or the temp.  **
11070 20 64 61 74 61 62 61 73 65 20 69 74 20 69 73 20   database it is 
11080 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d 61 74  'NONE'. This mat
11090 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 6c  ches the pager l
110a0 61 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20  ayer defaults.  
110b0 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b  .  */.  db->aDb[
110c0 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e  0].zName = "main
110d0 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  ";.  db->aDb[0].
110e0 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 33  safety_level = 3
110f0 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a  ;.  db->aDb[1].z
11100 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20  Name = "temp";. 
11110 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65   db->aDb[1].safe
11120 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a 20  ty_level = 1;.. 
11130 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
11140 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a  ITE_MAGIC_OPEN;.
11150 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
11160 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
11170 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
11180 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
11190 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66  r all built-in f
111a0 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f  unctions, but do
111b0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
111c0 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61  read the.  ** da
111d0 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 79 65  tabase schema ye
111e0 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61 79  t. This is delay
111f0 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  ed until the fir
11200 73 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61  st time the data
11210 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63  base.  ** is acc
11220 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  essed..  */.  sq
11230 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
11240 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
11250 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 42  sqlite3RegisterB
11260 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28  uiltinFunctions(
11270 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  db);..  /* Load 
11280 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73  automatic extens
11290 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e  ions - extension
112a0 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  s that have been
112b0 20 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a   registered.  **
112c0 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
112d0 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74  e3_automatic_ext
112e0 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20  ension() API..  
112f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 41 75 74 6f  */.  sqlite3Auto
11300 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64  LoadExtensions(d
11310 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  b);.  rc = sqlit
11320 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
11330 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11340 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
11350 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
11360 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11370 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28  NABLE_FTS1.  if(
11380 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
11390 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  ed ){.    extern
113a0 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31   int sqlite3Fts1
113b0 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a  Init(sqlite3*);.
113c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
113d0 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts1Init(db);.  
113e0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
113f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
11400 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS2.  if( !db->m
11410 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
11420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11430 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
11440 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 73  qlite3Fts2Init(s
11450 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63  qlite3*);.    rc
11460 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e   = sqlite3Fts2In
11470 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
11480 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
11490 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20  E_ENABLE_FTS3.  
114a0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
114b0 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
114c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
114d0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e   = sqlite3Fts3In
114e0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
114f0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
11500 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69  E_ENABLE_ICU.  i
11510 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
11520 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
11530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
11540 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74  = sqlite3IcuInit
11550 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
11560 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11570 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69  ENABLE_RTREE.  i
11580 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
11590 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
115a0 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d  TE_OK){.    rc =
115b0 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69   sqlite3RtreeIni
115c0 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
115d0 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  f..  sqlite3Erro
115e0 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 0a 20  r(db, rc, 0);.. 
115f0 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46   /* -DSQLITE_DEF
11600 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
11610 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53  E=1 makes EXCLUS
11620 49 56 45 20 74 68 65 20 64 65 66 61 75 6c 74 20  IVE the default 
11630 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64  locking.  ** mod
11640 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46  e.  -DSQLITE_DEF
11650 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
11660 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20  E=0 make NORMAL 
11670 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  the default lock
11680 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20  ing.  ** mode.  
11690 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74  Doing nothing at
116a0 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20   all also makes 
116b0 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75  NORMAL the defau
116c0 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  lt..  */.#ifdef 
116d0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
116e0 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62  OCKING_MODE.  db
116f0 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d  ->dfltLockMode =
11700 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
11710 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20  LOCKING_MODE;.  
11720 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b  sqlite3PagerLock
11730 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42  ingMode(sqlite3B
11740 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44  treePager(db->aD
11750 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20  b[0].pBt),.     
11760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11770 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41       SQLITE_DEFA
11780 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
11790 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
117a0 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61  Enable the looka
117b0 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73  side-malloc subs
117c0 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70  ystem */.  setup
117d0 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c  Lookaside(db, 0,
117e0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
117f0 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65  nfig.szLookaside
11800 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11810 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11820 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c  3GlobalConfig.nL
11830 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71  ookaside);..  sq
11840 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
11850 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c  eckpoint(db, SQL
11860 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
11870 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b  AUTOCHECKPOINT);
11880 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20  ..opendb_out:.  
11890 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70  sqlite3_free(zOp
118a0 65 6e 29 3b 0a 20 20 69 66 28 20 64 62 20 29 7b  en);.  if( db ){
118b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
118c0 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73 54  >mutex!=0 || isT
118d0 68 72 65 61 64 73 61 66 65 3d 3d 30 20 7c 7c 20  hreadsafe==0 || 
118e0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
118f0 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d  fig.bFullMutex==
11900 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
11910 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
11920 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72  >mutex);.  }.  r
11930 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
11940 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72  ode(db);.  if( r
11950 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11960 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
11970 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62  lose(db);.    db
11980 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
11990 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
119a0 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
119b0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
119c0 53 49 43 4b 3b 0a 20 20 7d 0a 23 69 66 20 64 65  SICK;.  }.#if de
119d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
119e0 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49 4c 45  BLE_AUTO_PROFILE
119f0 29 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 72  ).  if( db && !r
11a00 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65  c ){.    char *e
11a10 6e 76 70 72 6f 66 69 6c 65 20 3d 20 67 65 74 65  nvprofile = gete
11a20 6e 76 28 22 53 51 4c 49 54 45 5f 41 55 54 4f 5f  nv("SQLITE_AUTO_
11a30 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20 63  PROFILE");.    c
11a40 68 61 72 20 2a 65 6e 76 74 72 61 63 65 20 3d 20  har *envtrace = 
11a50 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 41  getenv("SQLITE_A
11a60 55 54 4f 5f 54 52 41 43 45 22 29 3b 0a 20 20 20  UTO_TRACE");.   
11a70 20 0a 20 20 20 20 69 66 28 20 65 6e 76 70 72 6f   .    if( envpro
11a80 66 69 6c 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  file!=NULL ){.  
11a90 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66      sqlite3_prof
11aa0 69 6c 65 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f  ile(db, _sqlite_
11ab0 61 75 74 6f 5f 70 72 6f 66 69 6c 65 2c 20 64 62  auto_profile, db
11ac0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
11ad0 20 65 6e 76 74 72 61 63 65 21 3d 4e 55 4c 4c 20   envtrace!=NULL 
11ae0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11af0 5f 74 72 61 63 65 28 64 62 2c 20 5f 73 71 6c 69  _trace(db, _sqli
11b00 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 2c 20 64  te_auto_trace, d
11b10 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  b);.    }.  }.#e
11b20 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 64  ndif.  *ppDb = d
11b30 62 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  b;.#ifdef SQLITE
11b40 5f 45 4e 41 42 4c 45 5f 53 51 4c 52 52 0a 20 20  _ENABLE_SQLRR.  
11b50 53 52 52 65 63 4f 70 65 6e 28 64 62 2c 20 7a 46  SRRecOpen(db, zF
11b60 69 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73 29 3b  ilename, flags);
11b70 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
11b80 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
11b90 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  0, rc);.}../*.**
11ba0 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
11bb0 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
11bc0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
11bd0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
11be0 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71  zFilename, .  sq
11bf0 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b  lite3 **ppDb .){
11c00 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61  .  return openDa
11c10 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65  tabase(zFilename
11c20 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
11c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
11c40 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
11c50 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
11c60 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a  N_CREATE, 0);.}.
11c70 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
11c80 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  _v2(.  const cha
11c90 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f  r *filename,   /
11ca0 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
11cb0 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ame (UTF-8) */. 
11cc0 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c   sqlite3 **ppDb,
11cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
11ce0 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c   SQLite db handl
11cf0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
11d00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
11d10 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e  * Flags */.  con
11d20 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20  st char *zVfs   
11d30 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
11d40 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73  VFS module to us
11d50 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  e */.){.  return
11d60 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69   openDatabase(fi
11d70 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75  lename, ppDb, (u
11d80 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67  nsigned int)flag
11d90 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66  s, zVfs);.}..#if
11da0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11db0 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65  _UTF16./*.** Ope
11dc0 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
11dd0 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
11de0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a  sqlite3_open16(.
11df0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
11e00 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
11e10 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20  te3 **ppDb.){.  
11e20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
11e30 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69  ename8;   /* zFi
11e40 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69  lename encoded i
11e50 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20  n UTF-8 instead 
11e60 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73  of UTF-16 */.  s
11e70 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
11e80 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  al;.  int rc;.. 
11e90 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
11ea0 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  me );.  assert( 
11eb0 70 70 44 62 20 29 3b 0a 20 20 2a 70 70 44 62 20  ppDb );.  *ppDb 
11ec0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
11ed0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
11ee0 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  T.  rc = sqlite3
11ef0 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
11f00 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
11f10 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56   rc;.#endif.  pV
11f20 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
11f30 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74  eNew(0);.  sqlit
11f40 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
11f50 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  al, -1, zFilenam
11f60 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  e, SQLITE_UTF16N
11f70 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54  ATIVE, SQLITE_ST
11f80 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61  ATIC);.  zFilena
11f90 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  me8 = sqlite3Val
11fa0 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c  ueText(pVal, SQL
11fb0 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28  ITE_UTF8);.  if(
11fc0 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20   zFilename8 ){. 
11fd0 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61     rc = openData
11fe0 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c  base(zFilename8,
11ff0 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
12000 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
12010 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
12020 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
12030 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20  _CREATE, 0);.   
12040 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c   assert( *ppDb |
12050 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
12060 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  EM );.    if( rc
12070 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
12080 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70  DbHasProperty(*p
12090 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d  pDb, 0, DB_Schem
120a0 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20  aLoaded) ){.    
120b0 20 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53    ENC(*ppDb) = S
120c0 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
120d0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  E;.    }.  }else
120e0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
120f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73  E_NOMEM;.  }.  s
12100 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
12110 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pVal);..  return
12120 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
12130 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66  0, rc);.}.#endif
12140 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12150 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
12160 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
12170 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
12180 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
12190 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
121a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
121b0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  eate_collation(.
121c0 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
121d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
121e0 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
121f0 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
12200 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
12210 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
12220 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
12230 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74   void*).){.  int
12240 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d   rc;.  sqlite3_m
12250 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
12260 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
12270 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
12280 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65  ed );.  rc = cre
12290 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
122a0 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c   zName, (u8)enc,
122b0 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45   SQLITE_COLL_USE
122c0 52 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  R, pCtx, xCompar
122d0 65 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  e, 0);.  rc = sq
122e0 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
122f0 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
12300 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
12310 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
12320 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
12330 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
12340 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
12350 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
12360 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
12370 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
12380 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
12390 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
123a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
123b0 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
123c0 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
123d0 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
123e0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
123f0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
12400 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
12410 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
12420 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
12430 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
12440 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
12450 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
12460 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
12470 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
12480 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  ion(db, zName, (
12490 75 38 29 65 6e 63 2c 20 53 51 4c 49 54 45 5f 43  u8)enc, SQLITE_C
124a0 4f 4c 4c 5f 55 53 45 52 2c 20 70 43 74 78 2c 20  OLL_USER, pCtx, 
124b0 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b  xCompare, xDel);
124c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
124d0 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
124e0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
124f0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
12500 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12510 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12520 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
12530 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
12540 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
12550 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
12560 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
12570 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
12580 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
12590 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  16(.  sqlite3* d
125a0 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  b, .  const void
125b0 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65   *zName,.  int e
125c0 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
125d0 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
125e0 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
125f0 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
12600 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
12610 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12620 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  OK;.  char *zNam
12630 65 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e8;.  sqlite3_mu
12640 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
12650 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
12660 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
12670 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20  d );.  zName8 = 
12680 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28  sqlite3Utf16to8(
12690 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53  db, zName, -1, S
126a0 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
126b0 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38  E);.  if( zName8
126c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65   ){.    rc = cre
126d0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
126e0 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63   zName8, (u8)enc
126f0 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53  , SQLITE_COLL_US
12700 45 52 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  ER, pCtx, xCompa
12710 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  re, 0);.    sqli
12720 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
12730 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20  ame8);.  }.  rc 
12740 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
12750 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
12760 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
12770 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
12780 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
12790 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
127a0 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
127b0 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
127c0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
127d0 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
127e0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
127f0 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
12800 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
12810 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
12820 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
12830 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
12840 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
12850 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20  ation_needed(.  
12860 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
12870 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
12880 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
12890 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64  CollNeeded)(void
128a0 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
128b0 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68  TextRep,const ch
128c0 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ar*).){.  sqlite
128d0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
128e0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
128f0 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43  xCollNeeded = xC
12900 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d  ollNeeded;.  db-
12910 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
12920 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e   0;.  db->pCollN
12930 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
12940 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
12950 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
12960 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
12970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12980 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
12990 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
129a0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
129b0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
129c0 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
129d0 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
129e0 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
129f0 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
12a00 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
12a10 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
12a20 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
12a30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
12a40 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
12a50 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
12a60 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
12a70 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
12a80 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31  id(*xCollNeeded1
12a90 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  6)(void*,sqlite3
12aa0 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
12ab0 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
12ac0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
12ad0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
12ae0 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
12af0 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43  ed = 0;.  db->xC
12b00 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43  ollNeeded16 = xC
12b10 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64  ollNeeded16;.  d
12b20 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
12b30 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
12b40 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
12b50 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
12b60 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
12b70 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
12b80 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
12b90 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e  T_UTF16 */..#ifn
12ba0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12bb0 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
12bc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12bd0 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f  s now an anachro
12be0 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f  nism. It used to
12bf0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f   be used to reco
12c00 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61  ver from a.** ma
12c10 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20  lloc() failure, 
12c20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64  but SQLite now d
12c30 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74  oes this automat
12c40 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  ically..*/.int s
12c50 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65  qlite3_global_re
12c60 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72  cover(void){.  r
12c70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12c80 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
12c90 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   Test to see whe
12ca0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
12cb0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12cc0 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  ion is in autoco
12cd0 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52  mmit.** mode.  R
12ce0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
12cf0 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66   is and FALSE if
12d00 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69   not.  Autocommi
12d10 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20  t mode is on.** 
12d20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74  by default.  Aut
12d30 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62  ocommit is disab
12d40 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e 20 73  led by a BEGIN s
12d50 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65  tatement and ree
12d60 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65  nabled.** by the
12d70 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20   next COMMIT or 
12d80 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 2a  ROLLBACK..**.***
12d90 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20 41 4e 20  **** THIS IS AN 
12da0 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 41 50 49  EXPERIMENTAL API
12db0 20 41 4e 44 20 49 53 20 53 55 42 4a 45 43 54 20   AND IS SUBJECT 
12dc0 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a 2a 2a 2a  TO CHANGE ******
12dd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
12de0 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73  get_autocommit(s
12df0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
12e00 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f  eturn db->autoCo
12e10 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  mmit;.}../*.** T
12e20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
12e30 74 69 6e 65 73 20 61 72 65 20 73 75 62 74 69 74  tines are subtit
12e40 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74 61 6e  utes for constan
12e50 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ts SQLITE_CORRUP
12e60 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53  T,.** SQLITE_MIS
12e70 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  USE, SQLITE_CANT
12e80 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49 4f 45  OPEN, SQLITE_IOE
12e90 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  RR and possibly 
12ea0 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63  other error.** c
12eb0 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 79 20  onstants.  They 
12ec0 73 65 72 76 65 72 20 74 77 6f 20 70 75 72 70 6f  server two purpo
12ed0 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20  ses:.**.**   1. 
12ee0 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e 76   Serve as a conv
12ef0 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20  enient place to 
12f00 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
12f10 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a 2a   in a debugger.*
12f20 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65 63  *       to detec
12f30 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20 65  t when version e
12f40 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  rror conditions 
12f50 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  occurs..**.**   
12f60 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74  2.  Invoke sqlit
12f70 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f 76  e3_log() to prov
12f80 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20 63  ide the source c
12f90 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65  ode location whe
12fa0 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c 6f  re.**       a lo
12fb0 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69 73  w-level error is
12fc0 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64 2e   first detected.
12fd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
12fe0 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74 20  orruptError(int 
12ff0 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63  lineno){.  testc
13000 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
13010 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
13020 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   );.  sqlite3_lo
13030 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  g(SQLITE_CORRUPT
13040 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13050 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70  "database corrup
13060 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25 64 20  tion at line %d 
13070 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
13080 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e             linen
13090 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f  o, 20+sqlite3_so
130a0 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74  urceid());.  ret
130b0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
130c0 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  PT;.}.int sqlite
130d0 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e 74  3MisuseError(int
130e0 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
130f0 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
13100 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
13110 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
13120 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  og(SQLITE_MISUSE
13130 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
13140 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69 6e 65   "misuse at line
13150 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c   %d of [%.10s]",
13160 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
13170 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65  ineno, 20+sqlite
13180 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
13190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
131a0 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73 71 6c  ISUSE;.}.int sql
131b0 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f  ite3CantopenErro
131c0 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
131d0 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
131e0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
131f0 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Log!=0 );.  sqli
13200 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43  te3_log(SQLITE_C
13210 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20 20 20  ANTOPEN, .      
13220 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
13230 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c 69 6e  open file at lin
13240 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
13250 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13260 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
13270 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
13280 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13290 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23 69  CANTOPEN;.}...#i
132a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
132b0 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
132c0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e  ** This is a con
132d0 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65  venience routine
132e0 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
132f0 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64   that all thread
13300 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74  -specific.** dat
13310 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65 61  a for this threa
13320 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c  d has been deall
13330 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ocated..**.** SQ
13340 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75  Lite no longer u
13350 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63 69  ses thread-speci
13360 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69 73  fic data so this
13370 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20   routine is now 
13380 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20  a.** no-op.  It 
13390 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20  is retained for 
133a0 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61  historical compa
133b0 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69  tibility..*/.voi
133c0 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  d sqlite3_thread
133d0 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a  _cleanup(void){.
133e0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
133f0 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f  Return meta info
13400 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20  rmation about a 
13410 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20  specific column 
13420 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74 61  of a database ta
13430 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d  ble..** See comm
13440 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  ent in sqlite3.h
13450 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66   (sqlite.h.in) f
13460 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23  or details..*/.#
13470 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
13480 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
13490 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ATA.int sqlite3_
134a0 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
134b0 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33  adata(.  sqlite3
134c0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
134d0 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
134e0 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  on handle */.  c
134f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
13500 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61  me,        /* Da
13510 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e  tabase name or N
13520 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
13530 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c  har *zTableName,
13540 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61       /* Table na
13550 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  me */.  const ch
13560 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  ar *zColumnName,
13570 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
13580 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  me */.  char con
13590 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c  st **pzDataType,
135a0 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44      /* OUTPUT: D
135b0 65 63 6c 61 72 65 64 20 64 61 74 61 20 74 79 70  eclared data typ
135c0 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  e */.  char cons
135d0 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20  t **pzCollSeq,  
135e0 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f     /* OUTPUT: Co
135f0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
13600 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   name */.  int *
13610 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20  pNotNull,       
13620 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
13630 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55  : True if NOT NU
13640 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  LL constraint ex
13650 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ists */.  int *p
13660 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20  PrimaryKey,     
13670 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
13680 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20   True if column 
13690 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20  part of PK */.  
136a0 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20  int *pAutoinc   
136b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
136c0 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
136d0 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e  olumn is auto-in
136e0 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  crement */.){.  
136f0 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
13700 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54  zErrMsg = 0;.  T
13710 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a  able *pTab = 0;.
13720 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
13730 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a   0;.  int iCol;.
13740 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
13750 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20  DataType = 0;.  
13760 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
13770 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lSeq = 0;.  int 
13780 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69  notnull = 0;.  i
13790 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20  nt primarykey = 
137a0 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63  0;.  int autoinc
137b0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75   = 0;..  /* Ensu
137c0 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
137d0 73 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20  schema has been 
137e0 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  loaded */.  sqli
137f0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
13800 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
13810 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
13820 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73  ll(db);.  rc = s
13830 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26  qlite3Init(db, &
13840 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
13850 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
13860 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
13870 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  out;.  }..  /* L
13880 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
13890 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20  in question */. 
138a0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
138b0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61  indTable(db, zTa
138c0 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65  bleName, zDbName
138d0 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c  );.  if( !pTab |
138e0 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
138f0 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b  ){.    pTab = 0;
13900 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
13910 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  out;.  }..  /* F
13920 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66  ind the column f
13930 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73  or which info is
13940 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
13950 69 66 28 20 73 71 6c 69 74 65 33 49 73 52 6f 77  if( sqlite3IsRow
13960 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  id(zColumnName) 
13970 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
13980 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 69  ab->iPKey;.    i
13990 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
139a0 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
139b0 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
139c0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
139d0 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
139e0 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
139f0 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f  ol++){.      pCo
13a00 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
13a10 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28  iCol];.      if(
13a20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
13a30 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  mp(pCol->zName, 
13a40 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
13a50 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13a60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13a70 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d   if( iCol==pTab-
13a80 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70  >nCol ){.      p
13a90 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67  Tab = 0;.      g
13aa0 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
13ab0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
13ac0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
13ad0 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65  ck stores the me
13ae0 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ta information t
13af0 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
13b00 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65  rned.  ** to the
13b10 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c   caller in local
13b20 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61   variables zData
13b30 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20  Type, zCollSeq, 
13b40 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79  notnull, primary
13b50 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74  key.  ** and aut
13b60 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f  oinc. At this po
13b70 69 6e 74 20 74 68 65 72 65 20 61 72 65 20 74 77  int there are tw
13b80 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a  o possibilities:
13b90 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
13ba0 31 2e 20 54 68 65 20 73 70 65 63 69 66 69 65 64  1. The specified
13bb0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73   column name was
13bc0 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f   rowid", "oid" o
13bd0 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a  r "_rowid_" .  *
13be0 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65  *        and the
13bf0 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69  re is no explici
13c00 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b  tly declared IPK
13c10 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20   column. .  **. 
13c20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74   **     2. The t
13c30 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69  able is not a vi
13c40 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d  ew and the colum
13c50 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65  n name identifie
13c60 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20  d an .  **      
13c70 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63    explicitly dec
13c80 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f  lared column. Co
13c90 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  py meta informat
13ca0 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a  ion from *pCol..
13cb0 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c    */ .  if( pCol
13cc0 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70   ){.    zDataTyp
13cd0 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b  e = pCol->zType;
13ce0 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20  .    zCollSeq = 
13cf0 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20  pCol->zColl;.   
13d00 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d   notnull = pCol-
13d10 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20  >notNull!=0;.   
13d20 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 70   primarykey  = p
13d30 43 6f 6c 2d 3e 69 73 50 72 69 6d 4b 65 79 21 3d  Col->isPrimKey!=
13d40 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d  0;.    autoinc =
13d50 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43   pTab->iPKey==iC
13d60 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62  ol && (pTab->tab
13d70 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
13d80 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20  ncrement)!=0;.  
13d90 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61  }else{.    zData
13da0 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
13db0 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79  ;.    primarykey
13dc0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
13dd0 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  !zCollSeq ){.   
13de0 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e   zCollSeq = "BIN
13df0 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72  ARY";.  }..error
13e00 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42  _out:.  sqlite3B
13e10 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
13e20 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20  ;..  /* Whether 
13e30 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  the function cal
13e40 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72 20 66  l succeeded or f
13e50 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f  ailed, set the o
13e60 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
13e70 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65  .  ** to whateve
13e80 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f  r their local co
13e90 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61  unterparts conta
13ea0 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  in. If an error 
13eb0 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20  did occur,.  ** 
13ec0 74 68 69 73 20 68 61 73 20 74 68 65 20 65 66 66  this has the eff
13ed0 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61  ect of zeroing a
13ee0 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  ll output parame
13ef0 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ters..  */.  if(
13f00 20 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70   pzDataType ) *p
13f10 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74  zDataType = zDat
13f20 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43  aType;.  if( pzC
13f30 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c  ollSeq ) *pzColl
13f40 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a  Seq = zCollSeq;.
13f50 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29    if( pNotNull )
13f60 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74   *pNotNull = not
13f70 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69  null;.  if( pPri
13f80 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d  maryKey ) *pPrim
13f90 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79  aryKey = primary
13fa0 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f  key;.  if( pAuto
13fb0 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20  inc ) *pAutoinc 
13fc0 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66  = autoinc;..  if
13fd0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20  ( SQLITE_OK==rc 
13fe0 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
13ff0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14000 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
14010 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
14020 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f  3MPrintf(db, "no
14030 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75   such table colu
14040 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62  mn: %s.%s", zTab
14050 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  leName,.        
14060 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20  zColumnName);.  
14070 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
14080 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
14090 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
140a0 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29  (zErrMsg?"%s":0)
140b0 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71  , zErrMsg);.  sq
140c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
140d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d  zErrMsg);.  rc =
140e0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
140f0 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
14100 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
14110 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
14120 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
14130 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
14140 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
14150 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
14160 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
14170 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pt..*/.int sqlit
14180 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29  e3_sleep(int ms)
14190 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
141a0 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  *pVfs;.  int rc;
141b0 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65  .  pVfs = sqlite
141c0 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
141d0 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72   if( pVfs==0 ) r
141e0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54  eturn 0;..  /* T
141f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  his function wor
14200 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e  ks in millisecon
14210 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65  ds, but the unde
14220 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29  rlying OsSleep()
14230 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20   .  ** API uses 
14240 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65  microseconds. He
14250 6e 63 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a  nce the 1000's..
14260 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c    */.  rc = (sql
14270 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73  ite3OsSleep(pVfs
14280 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29  , 1000*ms)/1000)
14290 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
142a0 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f  ../*.** Enable o
142b0 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 65 78  r disable the ex
142c0 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f  tended result co
142d0 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  des..*/.int sqli
142e0 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  te3_extended_res
142f0 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65  ult_codes(sqlite
14300 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66  3 *db, int onoff
14310 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
14320 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
14330 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
14340 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66  sk = onoff ? 0xf
14350 66 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a  fffffff : 0xff;.
14360 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14370 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
14380 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14390 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
143a0 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43  nvoke the xFileC
143b0 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e  ontrol method on
143c0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
143d0 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
143e0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
143f0 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  rol(sqlite3 *db,
14400 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
14410 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f  Name, int op, vo
14420 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74  id *pArg){.  int
14430 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
14440 4f 52 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20  OR;.  int iDb;. 
14450 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
14460 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
14470 0a 20 20 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d  .  if( zDbName==
14480 30 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 30  0 ){.    iDb = 0
14490 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
144a0 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62  or(iDb=0; iDb<db
144b0 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20  ->nDb; iDb++){. 
144c0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
144d0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
144e0 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3d 3d 30 20  me, zDbName)==0 
144f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
14500 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 64 62 2d   }.  if( iDb<db-
14510 3e 6e 44 62 20 29 7b 0a 20 20 20 20 42 74 72 65  >nDb ){.    Btre
14520 65 20 2a 70 42 74 72 65 65 20 3d 20 64 62 2d 3e  e *pBtree = db->
14530 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20  aDb[iDb].pBt;.  
14540 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
14550 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61        Pager *pPa
14560 67 65 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ger;.      sqlit
14570 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20  e3_file *fd;.   
14580 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
14590 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
145a0 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
145b0 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
145c0 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20 61 73  Btree);.      as
145d0 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
145e0 29 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 73 71  );.      fd = sq
145f0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
14600 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
14610 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20  sert( fd!=0 );. 
14620 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c       if( op==SQL
14630 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50  ITE_FCNTL_FILE_P
14640 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20  OINTER ){.      
14650 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65    *(sqlite3_file
14660 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20 20  **)pArg = fd;.  
14670 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14680 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  E_OK;.      }els
14690 65 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f  e if( fd->pMetho
146a0 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ds ){.        rc
146b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
146c0 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20  Control(fd, op, 
146d0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pArg);.      }el
146e0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
146f0 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
14700 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14710 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14720 65 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 7d  e(pBtree);.    }
14730 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
14740 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
14750 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
14760 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rc;   .}../*.** 
14770 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65  Interface to the
14780 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a   testing logic..
14790 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
147a0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20  est_control(int 
147b0 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20  op, ...){.  int 
147c0 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  rc = 0;.#ifndef 
147d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c  SQLITE_OMIT_BUIL
147e0 54 49 4e 5f 54 45 53 54 0a 20 20 76 61 5f 6c 69  TIN_TEST.  va_li
147f0 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72  st ap;.  va_star
14800 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
14810 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20  tch( op ){..    
14820 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74  /*.    ** Save t
14830 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
14840 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20   of the PRNG..  
14850 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
14860 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
14870 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20  NG_SAVE: {.     
14880 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65   sqlite3PrngSave
14890 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
148a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
148b0 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f   /*.    ** Resto
148c0 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  re the state of 
148d0 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20  the PRNG to the 
148e0 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65 64  last state saved
148f0 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52   using.    ** PR
14900 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e  NG_SAVE.  If PRN
14910 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65 72  G_SAVE has never
14920 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c   before been cal
14930 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  led, then.    **
14940 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73 20   this verb acts 
14950 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e  like PRNG_RESET.
14960 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
14970 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
14980 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b  _PRNG_RESTORE: {
14990 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
149a0 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28 29  ngRestoreState()
149b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
149c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
149d0 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50 52   ** Reset the PR
149e0 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75  NG back to its u
149f0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61  ninitialized sta
14a00 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61  te.  The next ca
14a10 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
14a20 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
14a30 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68  ) will reseed th
14a40 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73  e PRNG using a s
14a50 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a  ingle call.    *
14a60 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d  * to the xRandom
14a70 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74  ness method of t
14a80 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a  he default VFS..
14a90 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
14aa0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
14ab0 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20  PRNG_RESET: {.  
14ac0 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52      sqlite3PrngR
14ad0 65 73 65 74 53 74 61 74 65 28 29 3b 0a 20 20 20  esetState();.   
14ae0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14af0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
14b00 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
14b10 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54  trol(BITVEC_TEST
14b20 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29  , size, program)
14b30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
14b40 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e 73  un a test agains
14b50 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63  t a Bitvec objec
14b60 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20  t of size.  The 
14b70 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74  program argument
14b80 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72  .    ** is an ar
14b90 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20  ray of integers 
14ba0 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
14bb0 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d   test.  Return -
14bc0 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65  1 on a.    ** me
14bd0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
14be0 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63  error, 0 on succ
14bf0 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  ess, or non-zero
14c00 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20   for an error.. 
14c10 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71     ** See the sq
14c20 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74  lite3BitvecBuilt
14c30 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64 64  inTest() for add
14c40 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
14c50 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
14c60 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
14c70 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54  CTRL_BITVEC_TEST
14c80 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  : {.      int sz
14c90 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
14ca0 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  t);.      int *a
14cb0 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  Prog = va_arg(ap
14cc0 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72  , int*);.      r
14cd0 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
14ce0 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c  cBuiltinTest(sz,
14cf0 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62   aProg);.      b
14d00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
14d10 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
14d20 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
14d30 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48  (BENIGN_MALLOC_H
14d40 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78 45  OOKS, xBegin, xE
14d50 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  nd).    **.    *
14d60 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b 73  * Register hooks
14d70 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69   to call to indi
14d80 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f  cate which mallo
14d90 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a 20 20  c() failures .  
14da0 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e    ** are benign.
14db0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
14dc0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
14dd0 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48  _BENIGN_MALLOC_H
14de0 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74 79  OOKS: {.      ty
14df0 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76 6f 69  pedef void (*voi
14e00 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64  d_function)(void
14e10 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75  );.      void_fu
14e20 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65  nction xBenignBe
14e30 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f  gin;.      void_
14e40 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e  function xBenign
14e50 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65 6e 69  End;.      xBeni
14e60 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61 72 67  gnBegin = va_arg
14e70 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69  (ap, void_functi
14e80 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65 6e 69  on);.      xBeni
14e90 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67 28 61  gnEnd = va_arg(a
14ea0 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e  p, void_function
14eb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14ec0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b  BenignMallocHook
14ed0 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20  s(xBenignBegin, 
14ee0 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20  xBenignEnd);.   
14ef0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14f00 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
14f10 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
14f20 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
14f30 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
14f40 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  E, unsigned int 
14f50 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
14f60 20 53 65 74 20 74 68 65 20 50 45 4e 44 49 4e 47   Set the PENDING
14f70 20 62 79 74 65 20 74 6f 20 74 68 65 20 76 61 6c   byte to the val
14f80 75 65 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ue in the argume
14f90 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20 20  nt, if X>0..    
14fa0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
14fb0 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52 65 74  es if X==0.  Ret
14fc0 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
14fd0 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74   the pending byt
14fe0 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74 20 65  e.    ** as it e
14ff0 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65 20 74  xisting before t
15000 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
15010 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  called..    **. 
15020 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a     ** IMPORTANT:
15030 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50    Changing the P
15040 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72 6f 6d  ENDING byte from
15050 20 30 78 34 30 30 30 30 30 30 30 20 72 65 73 75   0x40000000 resu
15060 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e  lts in.    ** an
15070 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64 61   incompatible da
15080 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 6d  tabase file form
15090 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68  at.  Changing th
150a0 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 0a 20  e PENDING byte. 
150b0 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20     ** while any 
150c0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
150d0 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65 73 75  ion is open resu
150e0 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e 65 64  lts in undefined
150f0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 69 6c 65   and.    ** dile
15100 74 65 72 69 6f 75 73 20 62 65 68 61 76 69 6f 72  terious behavior
15110 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
15120 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
15130 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20  L_PENDING_BYTE: 
15140 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 50 45 4e  {.      rc = PEN
15150 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64  DING_BYTE;.#ifnd
15160 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
15170 53 44 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  SD.      {.     
15180 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
15190 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72 67 28  newVal = va_arg(
151a0 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ap, unsigned int
151b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
151c0 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65 33 50  ewVal ) sqlite3P
151d0 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e 65 77  endingByte = new
151e0 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  Val;.      }.#en
151f0 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  dif.      break;
15200 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
15210 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
15220 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
15230 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
15240 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  RT, int X).    *
15250 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63  *.    ** This ac
15260 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20  tion provides a 
15270 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f  run-time test to
15280 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20   see whether or 
15290 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73 65 72  not.    ** asser
152a0 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65 64 20  t() was enabled 
152b0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
152c0 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61    If X is true a
152d0 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20 20 20  nd assert().    
152e0 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  ** is enabled, t
152f0 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
15300 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20 20 49  alue is true.  I
15310 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 0a  f X is true and.
15320 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20      ** assert() 
15330 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65  is disabled, the
15340 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
15350 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49 66 20  ue is zero.  If 
15360 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73  X is.    ** fals
15370 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69  e and assert() i
15380 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
15390 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20 66 69  the assertion fi
153a0 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20  res and the.    
153b0 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f 72 74  ** process abort
153c0 73 2e 20 20 49 66 20 58 20 69 73 20 66 61 6c 73  s.  If X is fals
153d0 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69  e and assert() i
153e0 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  s disabled, then
153f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75   the.    ** retu
15400 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  rn value is zero
15410 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
15420 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
15430 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20 20 20  L_ASSERT: {.    
15440 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78    volatile int x
15450 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
15460 72 74 28 20 28 78 20 3d 20 76 61 5f 61 72 67 28  rt( (x = va_arg(
15470 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20  ap,int))!=0 );. 
15480 20 20 20 20 20 72 63 20 3d 20 78 3b 0a 20 20 20       rc = x;.   
15490 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
154a0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
154b0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
154c0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
154d0 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e  TCTRL_ALWAYS, in
154e0 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
154f0 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70  ** This action p
15500 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69  rovides a run-ti
15510 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 68  me test to see h
15520 6f 77 20 74 68 65 20 41 4c 57 41 59 53 20 61 6e  ow the ALWAYS an
15530 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d  d.    ** NEVER m
15540 61 63 72 6f 73 20 77 65 72 65 20 64 65 66 69 6e  acros were defin
15550 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
15560 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  me..    **.    *
15570 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
15580 75 65 20 69 73 20 41 4c 57 41 59 53 28 58 29 2e  ue is ALWAYS(X).
15590 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a    .    **.    **
155a0 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64   The recommended
155b0 20 74 65 73 74 20 69 73 20 58 3d 3d 32 2e 20 20   test is X==2.  
155c0 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
155d0 6c 75 65 20 69 73 20 32 2c 20 74 68 61 74 20 6d  lue is 2, that m
155e0 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41  eans.    ** ALWA
155f0 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29  YS() and NEVER()
15600 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20   are both no-op 
15610 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63  pass-through mac
15620 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 74 68  ros, which is th
15630 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74  e.    ** default
15640 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20 74 68   setting.  If th
15650 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
15660 73 20 31 2c 20 74 68 65 6e 20 41 4c 57 41 59 53  s 1, then ALWAYS
15670 28 29 20 69 73 20 65 69 74 68 65 72 0a 20 20 20  () is either.   
15680 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64 20 74   ** hard-coded t
15690 6f 20 74 72 75 65 20 6f 72 20 65 6c 73 65 20 69  o true or else i
156a0 74 20 61 73 73 65 72 74 73 20 69 66 20 69 74 73  t asserts if its
156b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c   argument is fal
156c0 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66  se..    ** The f
156d0 69 72 73 74 20 62 65 68 61 76 69 6f 72 20 28 68  irst behavior (h
156e0 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75  ard-coded to tru
156f0 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69  e) is the case i
15700 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  f.    ** SQLITE_
15710 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20  TESTCTRL_ASSERT 
15720 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72  shows that asser
15730 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 20  t() is disabled 
15740 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 20  and the second. 
15750 20 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 20 28     ** behavior (
15760 61 73 73 65 72 74 20 69 66 20 74 68 65 20 61 72  assert if the ar
15770 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59 53  gument to ALWAYS
15780 28 29 20 69 73 20 66 61 6c 73 65 29 20 69 73 20  () is false) is 
15790 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20  the case if.    
157a0 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ** SQLITE_TESTCT
157b0 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20  RL_ASSERT shows 
157c0 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73  that assert() is
157d0 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a   enabled..    **
157e0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d  .    ** The run-
157f0 74 69 6d 65 20 74 65 73 74 20 70 72 6f 63 65 64  time test proced
15800 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73  ure might look s
15810 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68  omething like th
15820 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
15830 2a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  *    if( sqlite3
15840 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
15850 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
15860 57 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20  WAYS, 2)==2 ){. 
15870 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
15880 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52  WAYS() and NEVER
15890 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73  () are no-op pas
158a0 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73  s-through macros
158b0 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65  .    **    }else
158c0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73   if( sqlite3_tes
158d0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
158e0 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
158f0 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20  , 1) ){.    **  
15900 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29      // ALWAYS(x)
15910 20 61 73 73 65 72 74 73 20 74 68 61 74 20 78 20   asserts that x 
15920 69 73 20 74 72 75 65 2e 20 4e 45 56 45 52 28 78  is true. NEVER(x
15930 29 20 61 73 73 65 72 74 73 20 78 20 69 73 20 66  ) asserts x is f
15940 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20  alse..    **    
15950 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20  }else{.    **   
15960 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20     // ALWAYS(x) 
15970 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e  is a constant 1.
15980 20 20 4e 45 56 45 52 28 78 29 20 69 73 20 61 20    NEVER(x) is a 
15990 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20 20  constant 0..    
159a0 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20  **    }.    */. 
159b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
159c0 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20  ESTCTRL_ALWAYS: 
159d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  {.      int x = 
159e0 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
159f0 20 20 20 20 20 20 72 63 20 3d 20 41 4c 57 41 59        rc = ALWAY
15a00 53 28 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  S(x);.      brea
15a10 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
15a20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
15a30 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
15a40 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c  ESTCTRL_RESERVE,
15a50 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e   sqlite3 *db, in
15a60 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t N).    **.    
15a70 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73 65  ** Set the nRese
15a80 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f  rve size to N fo
15a90 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
15aa0 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ase on the datab
15ab0 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65  ase.    ** conne
15ac0 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f  ction db..    */
15ad0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
15ae0 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
15af0 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
15b00 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
15b10 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
15b20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
15b30 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
15b40 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
15b50 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
15b60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15b70 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
15b80 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  (db->aDb[0].pBt,
15b90 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20   0, x, 0);.     
15ba0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
15bb0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
15bc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15bd0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c    }..    /*  sql
15be0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
15bf0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
15c00 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
15c10 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e   sqlite3 *db, in
15c20 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t N).    **.    
15c30 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  ** Enable or dis
15c40 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74  able various opt
15c50 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74  imizations for t
15c60 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
15c70 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72    The .    ** ar
15c80 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69  gument N is a bi
15c90 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a  tmask of optimiz
15ca0 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73  ations to be dis
15cb0 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d  abled.  For norm
15cc0 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  al.    ** operat
15cd0 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20  ion N should be 
15ce0 30 2e 20 20 54 68 65 20 69 64 65 61 20 69 73 20  0.  The idea is 
15cf0 74 68 61 74 20 61 20 74 65 73 74 20 70 72 6f 67  that a test prog
15d00 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20  ram (like the.  
15d10 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54    ** SQL Logic T
15d20 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20  est or SLT test 
15d30 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20  module) can run 
15d40 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c  the same SQL mul
15d50 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20  tiple times.    
15d60 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73 20  ** with various 
15d70 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69  optimizations di
15d80 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79  sabled to verify
15d90 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 61   that the same a
15da0 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20  nswer.    ** is 
15db0 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72  obtained in ever
15dc0 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  y case..    */. 
15dd0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
15de0 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
15df0 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73  TIONS: {.      s
15e00 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
15e10 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
15e20 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d  );.      int x =
15e30 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
15e40 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
15e50 20 3d 20 28 78 20 26 20 53 51 4c 49 54 45 5f 4f   = (x & SQLITE_O
15e60 70 74 4d 61 73 6b 29 20 7c 20 28 64 62 2d 3e 66  ptMask) | (db->f
15e70 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f  lags & ~SQLITE_O
15e80 70 74 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 62  ptMask);.      b
15e90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
15ea0 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59  def SQLITE_N_KEY
15eb0 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69  WORD.    /* sqli
15ec0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
15ed0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
15ee0 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73  _ISKEYWORD, cons
15ef0 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20  t char *zWord). 
15f00 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
15f10 7a 57 6f 72 64 20 69 73 20 61 20 6b 65 79 77 6f  zWord is a keywo
15f20 72 64 20 72 65 63 6f 67 6e 69 7a 65 64 20 62 79  rd recognized by
15f30 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
15f40 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 20 20 20  n return the.   
15f50 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65   ** number of ke
15f60 79 77 6f 72 64 73 2e 20 20 4f 72 20 69 66 20 7a  ywords.  Or if z
15f70 57 6f 72 64 20 69 73 20 6e 6f 74 20 61 20 6b 65  Word is not a ke
15f80 79 77 6f 72 64 2c 20 72 65 74 75 72 6e 20 30 2e  yword, return 0.
15f90 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
15fa0 54 68 69 73 20 74 65 73 74 20 66 65 61 74 75 72  This test featur
15fb0 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  e is only availa
15fc0 62 6c 65 20 69 6e 20 74 68 65 20 61 6d 61 6c 67  ble in the amalg
15fd0 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20  amation since.  
15fe0 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f    ** the SQLITE_
15ff0 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f 20  N_KEYWORD macro 
16000 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 69  is not defined i
16010 6e 20 74 68 69 73 20 66 69 6c 65 20 69 66 20 53  n this file if S
16020 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69 73 20  QLite.    ** is 
16030 62 75 69 6c 74 20 75 73 69 6e 67 20 73 65 70 61  built using sepa
16040 72 61 74 65 20 73 6f 75 72 63 65 20 66 69 6c 65  rate source file
16050 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
16060 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
16070 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a  RL_ISKEYWORD: {.
16080 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
16090 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72 67   *zWord = va_arg
160a0 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
160b0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  );.      int n =
160c0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
160d0 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 72  (zWord);.      r
160e0 63 20 3d 20 28 73 71 6c 69 74 65 33 4b 65 79 77  c = (sqlite3Keyw
160f0 6f 72 64 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f  ordCode((u8*)zWo
16100 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f  rd, n)!=TK_ID) ?
16110 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
16120 44 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65  D : 0;.      bre
16130 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
16140 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65   ..    /* sqlite
16150 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
16160 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
16170 47 48 44 52 53 5a 29 0a 20 20 20 20 2a 2a 0a 20  GHDRSZ).    **. 
16180 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65     ** Return the
16190 20 73 69 7a 65 20 6f 66 20 61 20 70 63 61 63 68   size of a pcach
161a0 65 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65  e header in byte
161b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
161c0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
161d0 52 4c 5f 50 47 48 44 52 53 5a 3a 20 7b 0a 20 20  RL_PGHDRSZ: {.  
161e0 20 20 20 20 72 63 20 3d 20 73 69 7a 65 6f 66 28      rc = sizeof(
161f0 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 62 72  PgHdr);.      br
16200 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
16210 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
16220 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
16230 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d  ESTCTRL_SCRATCHM
16240 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77  ALLOC, sz, &pNew
16250 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a  , pFree);.    **
16260 0a 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72  .    ** Pass pFr
16270 65 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53  ee into sqlite3S
16280 63 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20  cratchFree(). . 
16290 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68     ** If sz>0 th
162a0 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63  en allocate a sc
162b0 72 61 74 63 68 20 62 75 66 66 65 72 20 69 6e 74  ratch buffer int
162c0 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f  o pNew.  .    */
162d0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
162e0 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43  _TESTCTRL_SCRATC
162f0 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  HMALLOC: {.     
16300 20 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a   void *pFree, **
16310 70 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74  ppNew;.      int
16320 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20   sz;.      sz = 
16330 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
16340 0a 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76  .      ppNew = v
16350 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a  a_arg(ap, void**
16360 29 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d  );.      pFree =
16370 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
16380 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  *);.      if( sz
16390 20 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69   ) *ppNew = sqli
163a0 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
163b0 28 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  (sz);.      sqli
163c0 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 70  te3ScratchFree(p
163d0 46 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Free);.      bre
163e0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
163f0 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
16400 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
16410 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
16420 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e  ME_FAULT, int on
16430 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  off);.    **.   
16440 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72   ** If parameter
16450 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65   onoff is non-ze
16460 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68  ro, configure th
16470 65 20 77 72 61 70 70 65 72 73 20 73 6f 20 74 68  e wrappers so th
16480 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75  at all.    ** su
16490 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
164a0 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e  o localtime() an
164b0 64 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e  d variants fail.
164c0 20 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72   If onoff is zer
164d0 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74  o,.    ** undo t
164e0 68 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20  his setting..   
164f0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
16500 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
16510 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a  ALTIME_FAULT: {.
16520 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
16530 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c  balConfig.bLocal
16540 74 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61  timeFault = va_a
16550 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
16560 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16570 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
16580 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
16590 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
165a0 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74 75 72  _TEST */.  retur
165b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
165c0 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
165d0 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75 6c   routine, useful
165e0 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e   to VFS implemen
165f0 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63 68  tations, that ch
16600 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69  ecks.** to see i
16610 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
16620 65 20 77 61 73 20 61 20 55 52 49 20 74 68 61 74  e was a URI that
16630 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70 65   contained a spe
16640 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a 20  cific query .** 
16650 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20 69  parameter, and i
16660 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68 65  f so obtains the
16670 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71 75   value of the qu
16680 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
16690 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
166a0 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
166b0 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e  he filename poin
166c0 74 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ter passed into 
166d0 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d  the xOpen().** m
166e0 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20 69  ethod of a VFS i
166f0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
16700 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75 6d  The zParam argum
16710 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
16720 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20  of the.** query 
16730 70 61 72 61 6d 65 74 65 72 20 77 65 20 73 65 65  parameter we see
16740 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  k.  This routine
16750 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
16760 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61 6d  ue of the zParam
16770 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 66  .** parameter if
16780 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66 20   it exists.  If 
16790 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 64 6f  the parameter do
167a0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
167b0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
167c0 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69  turns a NULL poi
167d0 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  nter..*/.const c
167e0 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72 69  har *sqlite3_uri
167f0 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74  _parameter(const
16800 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
16810 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
16820 61 72 61 6d 29 7b 0a 20 20 7a 46 69 6c 65 6e 61  aram){.  zFilena
16830 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  me += sqlite3Str
16840 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
16850 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a   + 1;.  while( z
16860 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
16870 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63 6d     int x = strcm
16880 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  p(zFilename, zPa
16890 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  ram);.    zFilen
168a0 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  ame += sqlite3St
168b0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
168c0 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 78  ) + 1;.    if( x
168d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46 69  ==0 ) return zFi
168e0 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c  lename;.    zFil
168f0 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33  ename += sqlite3
16900 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
16910 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72  me) + 1;.  }.  r
16920 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 20  eturn 0;.}..#if 
16930 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
16940 50 50 4c 45 5f 53 50 49 3e 30 29 0a 23 64 65 66  PPLE_SPI>0).#def
16950 69 6e 65 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f  ine SQLITE_FILE_
16960 48 45 41 44 45 52 5f 4c 45 4e 20 31 36 0a 23 69  HEADER_LEN 16.#i
16970 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e  nclude <fcntl.h>
16980 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
16990 65 33 5f 70 72 69 76 61 74 65 2e 68 22 0a 23 69  e3_private.h".#i
169a0 6e 63 6c 75 64 65 20 22 62 74 72 65 65 49 6e 74  nclude "btreeInt
169b0 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72  .h".#include <er
169c0 72 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  rno.h>.#include 
169d0 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 0a 2f  <sys/param.h>../
169e0 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 63 6f  * Check for a co
169f0 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20  nflicting lock. 
16a00 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64   If one is found
16a10 2c 20 70 72 69 6e 74 20 61 6e 20 74 68 69 73 0a  , print an this.
16a20 20 2a 2a 20 6f 6e 20 73 74 61 6e 64 61 72 64 20   ** on standard 
16a30 6f 75 74 70 75 74 20 75 73 69 6e 67 20 74 68 65  output using the
16a40 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 67   format string g
16a50 69 76 65 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  iven and return 
16a60 31 2e 0a 20 2a 2a 20 49 66 20 74 68 65 72 65 20  1.. ** If there 
16a70 61 72 65 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 69  are no conflicti
16a80 6e 67 20 6c 6f 63 6b 73 2c 20 72 65 74 75 72 6e  ng locks, return
16a90 20 30 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69   0.. */.static i
16aa0 6e 74 20 69 73 4c 6f 63 6b 65 64 28 0a 20 20 70  nt isLocked(.  p
16ab0 69 64 5f 74 20 70 69 64 2c 20 20 20 20 20 20 20  id_t pid,       
16ac0 20 20 20 20 20 2f 2a 20 50 49 44 20 74 6f 20 74       /* PID to t
16ad0 65 73 74 20 66 6f 72 20 6c 6f 63 6b 20 6f 77 6e  est for lock own
16ae0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20  er */.  int h,  
16af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16b00 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
16b10 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
16b20 6e 74 20 74 79 70 65 2c 20 20 20 20 20 20 20 20  nt type,        
16b30 20 20 20 20 20 2f 2a 20 46 5f 52 44 4c 43 4b 20       /* F_RDLCK 
16b40 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  or F_WRLCK */.  
16b50 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4f 66  unsigned int iOf
16b60 73 74 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 62  st,   /* First b
16b70 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  yte of the lock 
16b80 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
16b90 74 20 69 43 6e 74 2c 20 20 20 20 2f 2a 20 4e 75  t iCnt,    /* Nu
16ba0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
16bb0 20 74 68 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20   the lock range 
16bc0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
16bd0 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 54 79  *zType     /* Ty
16be0 70 65 20 6f 66 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  pe of lock */.){
16bf0 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
16c00 6c 6b 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20  lk;.  int err;. 
16c10 20 0a 20 20 6d 65 6d 73 65 74 28 26 6c 6b 2c 20   .  memset(&lk, 
16c20 30 2c 20 73 69 7a 65 6f 66 28 6c 6b 29 29 3b 0a  0, sizeof(lk));.
16c30 20 20 6c 6b 2e 6c 5f 74 79 70 65 20 3d 20 74 79    lk.l_type = ty
16c40 70 65 3b 0a 20 20 6c 6b 2e 6c 5f 77 68 65 6e 63  pe;.  lk.l_whenc
16c50 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
16c60 6c 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 69 4f 66  lk.l_start = iOf
16c70 73 74 3b 0a 20 20 6c 6b 2e 6c 5f 6c 65 6e 20 3d  st;.  lk.l_len =
16c80 20 69 43 6e 74 3b 0a 0a 20 20 69 66 28 20 70 69   iCnt;..  if( pi
16c90 64 21 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54  d!=SQLITE_LOCKST
16ca0 41 54 45 5f 41 4e 59 50 49 44 20 29 7b 0a 23 69  ATE_ANYPID ){.#i
16cb0 66 6e 64 65 66 20 46 5f 47 45 54 4c 4b 50 49 44  fndef F_GETLKPID
16cc0 0a 23 20 77 61 72 6e 69 6e 67 20 46 5f 47 45 54  .# warning F_GET
16cd0 4c 4b 50 49 44 20 75 6e 64 65 66 69 6e 65 64 2c  LKPID undefined,
16ce0 20 5f 73 71 6c 69 74 65 33 5f 6c 6f 63 6b 73 74   _sqlite3_lockst
16cf0 61 74 65 20 66 61 6c 6c 69 6e 67 20 62 61 63 6b  ate falling back
16d00 20 74 6f 20 46 5f 47 45 54 4c 4b 0a 20 20 20 20   to F_GETLK.    
16d10 65 72 72 20 3d 20 66 63 6e 74 6c 28 68 2c 20 46  err = fcntl(h, F
16d20 5f 47 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a 23 65  _GETLK, &lk);.#e
16d30 6c 73 65 0a 20 20 20 20 6c 6b 2e 6c 5f 70 69 64  lse.    lk.l_pid
16d40 20 3d 20 70 69 64 3b 0a 20 20 20 20 65 72 72 20   = pid;.    err 
16d50 3d 20 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54  = fcntl(h, F_GET
16d60 4c 4b 50 49 44 2c 20 26 6c 6b 29 3b 0a 23 65 6e  LKPID, &lk);.#en
16d70 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
16d80 20 65 72 72 20 3d 20 66 63 6e 74 6c 28 68 2c 20   err = fcntl(h, 
16d90 46 5f 47 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a 20  F_GETLK, &lk);. 
16da0 20 7d 0a 0a 20 20 69 66 28 20 65 72 72 3d 3d 28   }..  if( err==(
16db0 2d 31 29 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  -1) ){.    fprin
16dc0 74 66 28 73 74 64 65 72 72 2c 20 22 66 63 6e 74  tf(stderr, "fcnt
16dd0 6c 28 25 64 29 20 66 61 69 6c 65 64 3a 20 65 72  l(%d) failed: er
16de0 72 6e 6f 3d 25 64 5c 6e 22 2c 20 68 2c 20 65 72  rno=%d\n", h, er
16df0 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rno);.    return
16e00 20 2d 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66   -1;.  }.  .  if
16e10 28 20 6c 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55  ( lk.l_type!=F_U
16e20 4e 4c 43 4b 20 26 26 20 28 70 69 64 3d 3d 53 51  NLCK && (pid==SQ
16e30 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 41  LITE_LOCKSTATE_A
16e40 4e 59 50 49 44 20 7c 7c 20 6c 6b 2e 6c 5f 70 69  NYPID || lk.l_pi
16e50 64 3d 3d 70 69 64 29 20 29 7b 0a 23 69 66 64 65  d==pid) ){.#ifde
16e60 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
16e70 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
16e80 72 2c 20 22 25 73 20 6c 6f 63 6b 20 68 65 6c 64  r, "%s lock held
16e90 20 62 79 20 25 64 5c 6e 22 2c 20 7a 54 79 70 65   by %d\n", zType
16ea0 2c 20 28 69 6e 74 29 6c 6b 2e 6c 5f 70 69 64 29  , (int)lk.l_pid)
16eb0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
16ec0 75 72 6e 20 31 3b 0a 20 20 7d 20 0a 20 20 72 65  urn 1;.  } .  re
16ed0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  turn 0;.}../*. *
16ee0 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 6c 6f  * Location of lo
16ef0 63 6b 69 6e 67 20 62 79 74 65 73 20 69 6e 20 74  cking bytes in t
16f00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16f10 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 50 45 4e  . */.#ifndef PEN
16f20 44 49 4e 47 5f 42 59 54 45 0a 23 20 64 65 66 69  DING_BYTE.# defi
16f30 6e 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  ne PENDING_BYTE 
16f40 20 20 20 20 20 28 30 78 34 30 30 30 30 30 30 30       (0x40000000
16f50 29 0a 23 20 64 65 66 69 6e 65 20 52 45 53 45 52  ).# define RESER
16f60 56 45 44 5f 42 59 54 45 20 20 20 20 20 28 50 45  VED_BYTE     (PE
16f70 4e 44 49 4e 47 5f 42 59 54 45 2b 31 29 0a 23 20  NDING_BYTE+1).# 
16f80 64 65 66 69 6e 65 20 53 48 41 52 45 44 5f 46 49  define SHARED_FI
16f90 52 53 54 20 20 20 20 20 20 28 50 45 4e 44 49 4e  RST      (PENDIN
16fa0 47 5f 42 59 54 45 2b 32 29 0a 23 20 64 65 66 69  G_BYTE+2).# defi
16fb0 6e 65 20 53 48 41 52 45 44 5f 53 49 5a 45 20 20  ne SHARED_SIZE  
16fc0 20 20 20 20 20 35 31 30 0a 23 65 6e 64 69 66 20       510.#endif 
16fd0 2f 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  /* PENDING_BYTE 
16fe0 2a 2f 0a 0a 2f 2a 0a 20 2a 2a 20 4c 6f 63 6b 20  */../*. ** Lock 
16ff0 6c 6f 63 61 74 69 6f 6e 73 20 66 6f 72 20 73 68  locations for sh
17000 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6c 6f 63 6b  ared-memory lock
17010 73 20 75 73 65 64 20 62 79 20 57 41 4c 20 6d 6f  s used by WAL mo
17020 64 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  de.. */.#ifndef 
17030 53 48 4d 5f 42 41 53 45 0a 23 20 64 65 66 69 6e  SHM_BASE.# defin
17040 65 20 53 48 4d 5f 42 41 53 45 20 20 20 20 20 20  e SHM_BASE      
17050 20 20 20 20 31 32 30 0a 23 20 64 65 66 69 6e 65      120.# define
17060 20 53 48 4d 5f 57 52 49 54 45 20 20 20 20 20 20   SHM_WRITE      
17070 20 20 20 53 48 4d 5f 42 41 53 45 0a 23 20 64 65     SHM_BASE.# de
17080 66 69 6e 65 20 53 48 4d 5f 43 48 45 43 4b 50 4f  fine SHM_CHECKPO
17090 49 4e 54 20 20 20 20 28 53 48 4d 5f 42 41 53 45  INT    (SHM_BASE
170a0 2b 31 29 0a 23 20 64 65 66 69 6e 65 20 53 48 4d  +1).# define SHM
170b0 5f 52 45 43 4f 56 45 52 20 20 20 20 20 20 20 28  _RECOVER       (
170c0 53 48 4d 5f 42 41 53 45 2b 32 29 0a 23 20 64 65  SHM_BASE+2).# de
170d0 66 69 6e 65 20 53 48 4d 5f 52 45 41 44 5f 46 49  fine SHM_READ_FI
170e0 52 53 54 20 20 20 20 28 53 48 4d 5f 42 41 53 45  RST    (SHM_BASE
170f0 2b 33 29 0a 23 20 64 65 66 69 6e 65 20 53 48 4d  +3).# define SHM
17100 5f 52 45 41 44 5f 53 49 5a 45 20 20 20 20 20 35  _READ_SIZE     5
17110 0a 23 65 6e 64 69 66 20 2f 2a 20 53 48 4d 5f 42  .#endif /* SHM_B
17120 41 53 45 20 2a 2f 0a 0a 2f 2a 20 0a 2a 2a 20 54  ASE */../* .** T
17130 65 73 74 69 6e 67 20 61 20 66 69 6c 65 20 70 61  esting a file pa
17140 74 68 20 66 6f 72 20 73 71 6c 69 74 65 20 6c 6f  th for sqlite lo
17150 63 6b 73 20 68 65 6c 64 20 62 79 20 61 20 70 72  cks held by a pr
17160 6f 63 65 73 73 20 49 44 2e 20 0a 2a 2a 20 52 65  ocess ID. .** Re
17170 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43  turns SQLITE_LOC
17180 4b 53 54 41 54 45 5f 4f 4e 20 69 66 20 6c 6f 63  KSTATE_ON if loc
17190 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74 20 6f  ks are present o
171a0 6e 20 70 61 74 68 0a 2a 2a 20 74 68 61 74 20 77  n path.** that w
171b0 6f 75 6c 64 20 70 72 65 76 65 6e 74 20 77 72 69  ould prevent wri
171c0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
171d0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  base..**.** This
171e0 20 74 65 73 74 20 6f 6e 6c 79 20 77 6f 72 6b 73   test only works
171f0 20 66 6f 72 20 6c 6f 63 6b 20 74 65 73 74 69 6e   for lock testin
17200 67 20 6f 6e 20 75 6e 69 78 2f 70 6f 73 69 78 20  g on unix/posix 
17210 56 46 53 2e 0a 2a 2a 20 41 64 61 70 74 65 64 20  VFS..** Adapted 
17220 66 72 6f 6d 20 74 6f 6f 6c 2f 67 65 74 6c 6f 63  from tool/getloc
17230 6b 2e 63 20 66 34 63 33 39 62 36 35 31 33 37 30  k.c f4c39b651370
17240 31 35 36 63 61 65 39 37 39 35 30 31 61 37 62 31  156cae979501a7b1
17250 35 36 62 64 62 61 35 30 65 37 63 65 0a 2a 2f 0a  56bdba50e7ce.*/.
17260 69 6e 74 20 5f 73 71 6c 69 74 65 33 5f 6c 6f 63  int _sqlite3_loc
17270 6b 73 74 61 74 65 28 63 6f 6e 73 74 20 63 68 61  kstate(const cha
17280 72 20 2a 70 61 74 68 2c 20 70 69 64 5f 74 20 70  r *path, pid_t p
17290 69 64 29 7b 0a 20 20 69 6e 74 20 68 44 62 3b 20  id){.  int hDb; 
172a0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
172b0 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
172c0 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
172d0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 53  file */.  int hS
172e0 68 6d 3b 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  hm;       /* Fil
172f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
17300 20 57 41 4c 20 73 68 61 72 65 64 2d 6d 65 6d 6f   WAL shared-memo
17310 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 73 73 69  ry file */.  ssi
17320 7a 65 5f 74 20 67 6f 74 3b 20 20 20 20 2f 2a 20  ze_t got;    /* 
17330 42 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20  Bytes read from 
17340 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
17350 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  isWal;          
17360 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
17370 66 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 2a 2f  f in WAL mode */
17380 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 20 3d 20 30  .  int nLock = 0
17390 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
173a0 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   Number of locks
173b0 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67   held */.  unsig
173c0 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b 31 30  ned char aHdr[10
173d0 30 5d 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73  0];   /* Databas
173e0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 0a 20  e header */.  . 
173f0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c   /* Open the fil
17400 65 20 61 74 20 70 61 74 68 20 61 6e 64 20 6d 61  e at path and ma
17410 6b 65 20 73 75 72 65 20 77 65 20 61 72 65 20 64  ke sure we are d
17420 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 64 61  ealing with a da
17430 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
17440 20 68 44 62 20 3d 20 6f 70 65 6e 28 70 61 74 68   hDb = open(path
17450 2c 20 4f 5f 52 44 4f 4e 4c 59 20 7c 20 4f 5f 4e  , O_RDONLY | O_N
17460 4f 43 54 54 59 29 3b 0a 20 20 69 66 28 20 68 44  OCTTY);.  if( hD
17470 62 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  b<0 ){.    retur
17480 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41  n SQLITE_LOCKSTA
17490 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
174a0 61 73 73 65 72 74 28 20 28 73 74 72 6c 65 6e 28  assert( (strlen(
174b0 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44  SQLITE_FILE_HEAD
174c0 45 52 29 2b 31 29 3d 3d 53 51 4c 49 54 45 5f 46  ER)+1)==SQLITE_F
174d0 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e 20 29  ILE_HEADER_LEN )
174e0 3b 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28  ;.  got = pread(
174f0 68 44 62 2c 20 61 48 64 72 2c 20 31 30 30 2c 20  hDb, aHdr, 100, 
17500 30 29 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20  0);.  if( got<0 
17510 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 68 44 62  ){.    close(hDb
17520 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
17530 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 45  LITE_LOCKSTATE_E
17540 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
17550 67 6f 74 21 3d 31 30 30 20 7c 7c 20 6d 65 6d 63  got!=100 || memc
17560 6d 70 28 61 48 64 72 2c 20 53 51 4c 49 54 45 5f  mp(aHdr, SQLITE_
17570 46 49 4c 45 5f 48 45 41 44 45 52 2c 20 53 51 4c  FILE_HEADER, SQL
17580 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f  ITE_FILE_HEADER_
17590 4c 45 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 63  LEN)!=0 ){.    c
175a0 6c 6f 73 65 28 68 44 62 29 3b 0a 20 20 20 20 72  lose(hDb);.    r
175b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
175c0 4b 53 54 41 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  KSTATE_NOTADB;. 
175d0 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 72 73 74   }.  .  /* First
175e0 20 63 68 65 63 6b 20 66 6f 72 20 61 6e 20 65 78   check for an ex
175f0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
17600 20 20 6e 4c 6f 63 6b 20 2b 3d 20 69 73 4c 6f 63    nLock += isLoc
17610 6b 65 64 28 70 69 64 2c 20 68 44 62 2c 20 46 5f  ked(pid, hDb, F_
17620 52 44 4c 43 4b 2c 20 53 48 41 52 45 44 5f 46 49  RDLCK, SHARED_FI
17630 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  RST, SHARED_SIZE
17640 2c 20 22 45 58 43 4c 55 53 49 56 45 22 29 3b 0a  , "EXCLUSIVE");.
17650 20 20 69 73 57 61 6c 20 3d 20 61 48 64 72 5b 31    isWal = aHdr[1
17660 38 5d 3d 3d 32 3b 0a 20 20 69 66 28 20 6e 4c 6f  8]==2;.  if( nLo
17670 63 6b 3d 3d 30 20 26 26 20 69 73 57 61 6c 3d 3d  ck==0 && isWal==
17680 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c  0 ){.    /* Roll
17690 62 61 63 6b 20 6d 6f 64 65 20 2a 2f 0a 20 20 20  back mode */.   
176a0 20 6e 4c 6f 63 6b 20 2b 3d 20 69 73 4c 6f 63 6b   nLock += isLock
176b0 65 64 28 70 69 64 2c 20 68 44 62 2c 20 46 5f 57  ed(pid, hDb, F_W
176c0 52 4c 43 4b 2c 20 50 45 4e 44 49 4e 47 5f 42 59  RLCK, PENDING_BY
176d0 54 45 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2b  TE, SHARED_SIZE+
176e0 32 2c 20 22 50 45 4e 44 49 4e 47 7c 52 45 53 45  2, "PENDING|RESE
176f0 52 56 45 44 7c 53 48 41 52 45 44 22 29 3b 0a 20  RVED|SHARED");. 
17700 20 7d 0a 20 20 63 6c 6f 73 65 28 68 44 62 29 3b   }.  close(hDb);
17710 0a 20 20 69 66 28 20 6e 4c 6f 63 6b 3d 3d 30 20  .  if( nLock==0 
17720 26 26 20 69 73 57 61 6c 21 3d 30 20 29 7b 0a 20  && isWal!=0 ){. 
17730 20 20 20 63 68 61 72 20 7a 53 68 6d 5b 4d 41 58     char zShm[MAX
17740 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 0a 20  PATHLEN];.    . 
17750 20 20 20 63 6c 6f 73 65 28 68 44 62 29 3b 0a 20     close(hDb);. 
17760 20 20 20 2f 2a 20 57 41 4c 20 6d 6f 64 65 20 2a     /* WAL mode *
17770 2f 0a 20 20 20 20 73 74 72 6c 63 70 79 28 7a 53  /.    strlcpy(zS
17780 68 6d 2c 20 70 61 74 68 2c 20 4d 41 58 50 41 54  hm, path, MAXPAT
17790 48 4c 45 4e 29 3b 0a 20 20 20 20 73 74 72 6c 63  HLEN);.    strlc
177a0 61 74 28 7a 53 68 6d 2c 20 22 2d 73 68 6d 22 2c  at(zShm, "-shm",
177b0 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
177c0 20 20 68 53 68 6d 20 3d 20 6f 70 65 6e 28 7a 53    hShm = open(zS
177d0 68 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29  hm, O_RDONLY, 0)
177e0 3b 0a 20 20 20 20 69 66 28 20 68 53 68 6d 3c 30  ;.    if( hShm<0
177f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17800 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54   SQLITE_LOCKSTAT
17810 45 5f 4f 46 46 3b 0a 20 20 20 20 7d 0a 20 20 20  E_OFF;.    }.   
17820 20 69 66 28 20 69 73 4c 6f 63 6b 65 64 28 70 69   if( isLocked(pi
17830 64 2c 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b  d, hShm, F_RDLCK
17840 2c 20 53 48 4d 5f 52 45 43 4f 56 45 52 2c 20 31  , SHM_RECOVER, 1
17850 2c 20 22 57 41 4c 2d 52 45 43 4f 56 45 52 59 22  , "WAL-RECOVERY"
17860 29 20 7c 7c 0a 20 20 20 20 20 20 20 69 73 4c 6f  ) ||.       isLo
17870 63 6b 65 64 28 70 69 64 2c 20 68 53 68 6d 2c 20  cked(pid, hShm, 
17880 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 57 52 49  F_RDLCK, SHM_WRI
17890 54 45 2c 20 31 2c 20 22 57 41 4c 2d 57 52 49 54  TE, 1, "WAL-WRIT
178a0 45 22 29 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f  E") ){.      nLo
178b0 63 6b 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ck = 1;.    }.  
178c0 20 20 63 6c 6f 73 65 28 68 53 68 6d 29 3b 0a 20    close(hShm);. 
178d0 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 6b 3e 30   }.  if( nLock>0
178e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
178f0 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f  QLITE_LOCKSTATE_
17900 4f 4e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ON;.  }.  return
17910 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54   SQLITE_LOCKSTAT
17920 45 5f 4f 46 46 3b 0a 7d 0a 0a 23 65 6e 64 69 66  E_OFF;.}..#endif
17930 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
17940 45 5f 41 50 50 4c 45 5f 53 50 49 20 2a 2f 0a     E_APPLE_SPI */.