/ Hex Artifact Content
Login

Artifact f50e8d60c6ee3c5c1d450e922edb0b1981b76ae8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
0290: 51 4c 52 52 0a 23 20 69 6e 63 6c 75 64 65 20 22  QLRR.# include "
02a0: 73 71 6c 72 72 2e 68 22 0a 23 65 6e 64 69 66 20  sqlrr.h".#endif 
02b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
02c0: 4e 41 42 4c 45 5f 46 54 53 33 0a 23 20 69 6e 63  NABLE_FTS3.# inc
02d0: 6c 75 64 65 20 22 66 74 73 33 2e 68 22 0a 23 65  lude "fts3.h".#e
02e0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
02f0: 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a  TE_ENABLE_RTREE.
0300: 23 20 69 6e 63 6c 75 64 65 20 22 72 74 72 65 65  # include "rtree
0310: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0320: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0330: 49 43 55 0a 23 20 69 6e 63 6c 75 64 65 20 22 73  ICU.# include "s
0340: 71 6c 69 74 65 69 63 75 2e 68 22 0a 23 65 6e 64  qliteicu.h".#end
0350: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
0360: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a  TE_AMALGAMATION.
0370: 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  /* IMPLEMENTATIO
0380: 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36 2d 34 35  N-OF: R-46656-45
0390: 31 35 36 20 54 68 65 20 73 71 6c 69 74 65 33 5f  156 The sqlite3_
03a0: 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67  version[] string
03b0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 63 6f 6e   constant.** con
03c0: 74 61 69 6e 73 20 74 68 65 20 74 65 78 74 20 6f  tains the text o
03d0: 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  f SQLITE_VERSION
03e0: 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73   macro. .*/.cons
03f0: 74 20 63 68 61 72 20 73 71 6c 69 74 65 33 5f 76  t char sqlite3_v
0400: 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c 49 54  ersion[] = SQLIT
0410: 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e 64 69  E_VERSION;.#endi
0420: 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  f../* IMPLEMENTA
0430: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33 35 33 36  TION-OF: R-53536
0440: 2d 34 32 35 37 35 20 54 68 65 20 73 71 6c 69 74  -42575 The sqlit
0450: 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 20  e3_libversion() 
0460: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
0470: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
0480: 20 74 68 65 20 74 6f 20 74 68 65 20 73 71 6c 69   the to the sqli
0490: 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74  te3_version[] st
04a0: 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e 20 0a  ring constant. .
04b0: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
04c0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
04d0: 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  n(void){ return 
04e0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 3b  sqlite3_version;
04f0: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0500: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 36 33 31 32  ATION-OF: R-6312
0510: 34 2d 33 39 33 30 30 20 54 68 65 20 73 71 6c 69  4-39300 The sqli
0520: 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 20 66  te3_sourceid() f
0530: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
0540: 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
0550: 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e  a string constan
0560: 74 20 77 68 6f 73 65 20 76 61 6c 75 65 20 69 73  t whose value is
0570: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
0580: 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f 55 52 43  .** SQLITE_SOURC
0590: 45 5f 49 44 20 43 20 70 72 65 70 72 6f 63 65 73  E_ID C preproces
05a0: 73 6f 72 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63  sor macro. .*/.c
05b0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
05c0: 65 33 5f 73 6f 75 72 63 65 69 64 28 76 6f 69 64  e3_sourceid(void
05d0: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
05e0: 5f 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a 0a 2f  _SOURCE_ID; }../
05f0: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0600: 2d 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36 33 35  -OF: R-35210-635
0610: 30 38 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c  08 The sqlite3_l
0620: 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72  ibversion_number
0630: 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72  () function.** r
0640: 65 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65  eturns an intege
0650: 72 20 65 71 75 61 6c 20 74 6f 20 53 51 4c 49 54  r equal to SQLIT
0660: 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
0670: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0680: 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
0690: 65 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e  er(void){ return
06a0: 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
06b0: 4e 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 20 49 4d  NUMBER; }../* IM
06c0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
06d0: 20 52 2d 35 34 38 32 33 2d 34 31 33 34 33 20 54   R-54823-41343 T
06e0: 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  he sqlite3_threa
06f0: 64 73 61 66 65 28 29 20 66 75 6e 63 74 69 6f 6e  dsafe() function
0700: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f   returns.** zero
0710: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
0720: 53 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69  SQLite was compi
0730: 6c 65 64 20 6d 75 74 65 78 69 6e 67 20 63 6f 64  led mutexing cod
0740: 65 20 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f  e omitted due to
0750: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54  .** the SQLITE_T
0760: 48 52 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c  HREADSAFE compil
0770: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65  e-time option be
0780: 69 6e 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f  ing set to 0..*/
0790: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72  .int sqlite3_thr
07a0: 65 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72  eadsafe(void){ r
07b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52  eturn SQLITE_THR
07c0: 45 41 44 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20  EADSAFE; }..#if 
07d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
07e0: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
07f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0800: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a  ABLE_IOTRACE)./*
0810: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
0820: 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f  wing function po
0830: 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  inter is not NUL
0840: 4c 20 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49  L and if.** SQLI
0850: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
0860: 45 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  E is enabled, th
0870: 65 6e 20 6d 65 73 73 61 67 65 73 20 64 65 73 63  en messages desc
0880: 72 69 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63  ribing.** I/O ac
0890: 74 69 76 65 20 61 72 65 20 77 72 69 74 74 65 6e  tive are written
08a0: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
08b0: 74 69 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73  tion.  These mes
08c0: 73 61 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74  sages.** are int
08d0: 65 6e 64 65 64 20 66 6f 72 20 64 65 62 75 67 67  ended for debugg
08e0: 69 6e 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c  ing activity onl
08f0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c  y..*/.void (*sql
0900: 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e  ite3IoTrace)(con
0910: 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d  st char*, ...) =
0920: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
0930: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
0940: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
0950: 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73  le points to a s
0960: 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74  tring which is t
0970: 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20  he.** name of a 
0980: 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20  directory, then 
0990: 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77  that directory w
09a0: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73  ill be used to s
09b0: 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72  tore.** temporar
09c0: 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  y files..**.** S
09d0: 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41  ee also the "PRA
09e0: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  GMA temp_store_d
09f0: 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f  irectory" SQL co
0a00: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a  mmand..*/.char *
0a10: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
0a20: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a  ectory = 0;../*.
0a30: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 53 51  ** Initialize SQ
0a40: 4c 69 74 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  Lite.  .**.** Th
0a50: 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
0a60: 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 69  be called to ini
0a70: 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f  tialize the memo
0a80: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 0a 2a  ry allocation,.*
0a90: 2a 20 56 46 53 2c 20 61 6e 64 20 6d 75 74 65 78  * VFS, and mutex
0aa0: 20 73 75 62 73 79 73 74 65 6d 73 20 70 72 69 6f   subsystems prio
0ab0: 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 73  r to doing any s
0ac0: 65 72 69 6f 75 73 20 77 6f 72 6b 20 77 69 74 68  erious work with
0ad0: 0a 2a 2a 20 53 51 4c 69 74 65 2e 20 20 42 75 74  .** SQLite.  But
0ae0: 20 61 73 20 6c 6f 6e 67 20 61 73 20 79 6f 75 20   as long as you 
0af0: 64 6f 20 6e 6f 74 20 63 6f 6d 70 69 6c 65 20 77  do not compile w
0b00: 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ith SQLITE_OMIT_
0b10: 41 55 54 4f 49 4e 49 54 0a 2a 2a 20 74 68 69 73  AUTOINIT.** this
0b20: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
0b30: 20 63 61 6c 6c 65 64 20 61 75 74 6f 6d 61 74 69   called automati
0b40: 63 61 6c 6c 79 20 62 79 20 6b 65 79 20 72 6f 75  cally by key rou
0b50: 74 69 6e 65 73 20 73 75 63 68 20 61 73 0a 2a 2a  tines such as.**
0b60: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e   sqlite3_open().
0b70: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f    .**.** This ro
0b80: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
0b90: 20 65 78 63 65 70 74 20 6f 6e 20 69 74 73 20 76   except on its v
0ba0: 65 72 79 20 66 69 72 73 74 20 63 61 6c 6c 20 66  ery first call f
0bb0: 6f 72 20 74 68 65 20 70 72 6f 63 65 73 73 2c 0a  or the process,.
0bc0: 2a 2a 20 6f 72 20 66 6f 72 20 74 68 65 20 66 69  ** or for the fi
0bd0: 72 73 74 20 63 61 6c 6c 20 61 66 74 65 72 20 61  rst call after a
0be0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
0bf0: 5f 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a  _shutdown..**.**
0c00: 20 54 68 65 20 66 69 72 73 74 20 74 68 72 65 61   The first threa
0c10: 64 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 72  d to call this r
0c20: 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 68 65 20  outine runs the 
0c30: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
0c40: 6f 0a 2a 2a 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e  o.** completion.
0c50: 20 20 49 66 20 73 75 62 73 65 71 75 65 6e 74 20    If subsequent 
0c60: 74 68 72 65 61 64 73 20 63 61 6c 6c 20 74 68 69  threads call thi
0c70: 73 20 72 6f 75 74 69 6e 65 20 62 65 66 6f 72 65  s routine before
0c80: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 68   the first.** th
0c90: 72 65 61 64 20 68 61 73 20 66 69 6e 69 73 68 65  read has finishe
0ca0: 64 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  d the initializa
0cb0: 74 69 6f 6e 20 70 72 6f 63 65 73 73 2c 20 74 68  tion process, th
0cc0: 65 6e 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  en the subsequen
0cd0: 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 6d 75 73  t.** threads mus
0ce0: 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68  t block until th
0cf0: 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20 66  e first thread f
0d00: 69 6e 69 73 68 65 73 20 77 69 74 68 20 74 68 65  inishes with the
0d10: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e   initialization.
0d20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
0d30: 20 74 68 72 65 61 64 20 6d 69 67 68 74 20 63 61   thread might ca
0d40: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
0d50: 72 65 63 75 72 73 69 76 65 6c 79 2e 20 20 52 65  recursively.  Re
0d60: 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 73  cursive.** calls
0d70: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
0d80: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 6c 6f 63   should not bloc
0d90: 6b 2c 20 6f 66 20 63 6f 75 72 73 65 2e 20 20 4f  k, of course.  O
0da0: 74 68 65 72 77 69 73 65 20 74 68 65 0a 2a 2a 20  therwise the.** 
0db0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70  initialization p
0dc0: 72 6f 63 65 73 73 20 77 6f 75 6c 64 20 6e 65 76  rocess would nev
0dd0: 65 72 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2a 0a  er complete..**.
0de0: 2a 2a 20 4c 65 74 20 58 20 62 65 20 74 68 65 20  ** Let X be the 
0df0: 66 69 72 73 74 20 74 68 72 65 61 64 20 74 6f 20  first thread to 
0e00: 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  enter this routi
0e10: 6e 65 2e 20 20 4c 65 74 20 59 20 62 65 20 73 6f  ne.  Let Y be so
0e20: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 74 68 72 65  me other.** thre
0e30: 61 64 2e 20 20 54 68 65 6e 20 77 68 69 6c 65 20  ad.  Then while 
0e40: 74 68 65 20 69 6e 69 74 69 61 6c 20 69 6e 76 6f  the initial invo
0e50: 63 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 72  cation of this r
0e60: 6f 75 74 69 6e 65 20 62 79 20 58 20 69 73 0a 2a  outine by X is.*
0e70: 2a 20 69 6e 63 6f 6d 70 6c 65 74 65 2c 20 69 74  * incomplete, it
0e80: 20 69 73 20 72 65 71 75 69 72 65 64 20 74 68 61   is required tha
0e90: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43  t:.**.**    *  C
0ea0: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
0eb0: 74 69 6e 65 20 66 72 6f 6d 20 59 20 6d 75 73 74  tine from Y must
0ec0: 20 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65   block until the
0ed0: 20 6f 75 74 65 72 2d 6d 6f 73 74 0a 2a 2a 20 20   outer-most.**  
0ee0: 20 20 20 20 20 63 61 6c 6c 20 62 79 20 58 20 63       call by X c
0ef0: 6f 6d 70 6c 65 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ompletes..**.** 
0f00: 20 20 20 2a 20 20 52 65 63 75 72 73 69 76 65 20     *  Recursive 
0f10: 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f  calls to this ro
0f20: 75 74 69 6e 65 20 66 72 6f 6d 20 74 68 72 65 61  utine from threa
0f30: 64 20 58 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  d X return immed
0f40: 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20  iately.**       
0f50: 77 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67  without blocking
0f60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0f70: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 76 6f 69 64  _initialize(void
0f80: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
0f90: 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20  ex *pMaster;    
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73 74    /* The main st
0fc0: 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20  atic mutex */.  
0fd0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1000: 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a  Result code */..
1010: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
1020: 49 54 5f 57 53 44 0a 20 20 72 63 20 3d 20 73 71  IT_WSD.  rc = sq
1030: 6c 69 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34  lite3_wsd_init(4
1040: 30 39 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20  096, 24);.  if( 
1050: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1060: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1070: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1080: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c   If SQLite is al
1090: 72 65 61 64 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ready completely
10a0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68   initialized, th
10b0: 65 6e 20 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a  en this call.  *
10c0: 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 69 6e 69  * to sqlite3_ini
10d0: 74 69 61 6c 69 7a 65 28 29 20 73 68 6f 75 6c 64  tialize() should
10e0: 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75   be a no-op.  Bu
10f0: 74 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  t the initializa
1100: 74 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73 74 20 62  tion.  ** must b
1110: 65 20 63 6f 6d 70 6c 65 74 65 2e 20 20 53 6f 20  e complete.  So 
1120: 69 73 49 6e 69 74 20 6d 75 73 74 20 6e 6f 74 20  isInit must not 
1130: 62 65 20 73 65 74 20 75 6e 74 69 6c 20 74 68 65  be set until the
1140: 20 76 65 72 79 20 65 6e 64 0a 20 20 2a 2a 20 6f   very end.  ** o
1150: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  f this routine..
1160: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
1170: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1180: 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53  sInit ) return S
1190: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
11a0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6d 75  Make sure the mu
11b0: 74 65 78 20 73 75 62 73 79 73 74 65 6d 20 69 73  tex subsystem is
11c0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 49   initialized.  I
11d0: 66 20 75 6e 61 62 6c 65 20 74 6f 20 0a 20 20 2a  f unable to .  *
11e0: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * initialize the
11f0: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
1200: 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20 77  , return early w
1210: 69 74 68 20 74 68 65 20 65 72 72 6f 72 2e 0a 20  ith the error.. 
1220: 20 2a 2a 20 49 66 20 74 68 65 20 73 79 73 74 65   ** If the syste
1230: 6d 20 69 73 20 73 6f 20 73 69 63 6b 20 74 68 61  m is so sick tha
1240: 74 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  t we are unable 
1250: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 75  to allocate a mu
1260: 74 65 78 2c 0a 20 20 2a 2a 20 74 68 65 72 65 20  tex,.  ** there 
1270: 69 73 20 6e 6f 74 20 6d 75 63 68 20 53 51 4c 69  is not much SQLi
1280: 74 65 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 62  te is going to b
1290: 65 20 61 62 6c 65 20 74 6f 20 64 6f 2e 0a 20 20  e able to do..  
12a0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 75 74 65  **.  ** The mute
12b0: 78 20 73 75 62 73 79 73 74 65 6d 20 6d 75 73 74  x subsystem must
12c0: 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20 73 65   take care of se
12d0: 72 69 61 6c 69 7a 69 6e 67 20 69 74 73 20 6f 77  rializing its ow
12e0: 6e 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  n.  ** initializ
12f0: 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ation..  */.  rc
1300: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 49   = sqlite3MutexI
1310: 6e 69 74 28 29 3b 0a 20 20 69 66 28 20 72 63 20  nit();.  if( rc 
1320: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
1330: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1340: 65 20 6d 61 6c 6c 6f 63 28 29 20 73 79 73 74 65  e malloc() syste
1350: 6d 20 61 6e 64 20 74 68 65 20 72 65 63 75 72 73  m and the recurs
1360: 69 76 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d  ive pInitMutex m
1370: 75 74 65 78 2e 0a 20 20 2a 2a 20 54 68 69 73 20  utex..  ** This 
1380: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 72 6f  operation is pro
1390: 74 65 63 74 65 64 20 62 79 20 74 68 65 20 53 54  tected by the ST
13a0: 41 54 49 43 5f 4d 41 53 54 45 52 20 6d 75 74 65  ATIC_MASTER mute
13b0: 78 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  x.  Note that.  
13c0: 2a 2a 20 4d 75 74 65 78 41 6c 6c 6f 63 28 29 20  ** MutexAlloc() 
13d0: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  is called for a 
13e0: 73 74 61 74 69 63 20 6d 75 74 65 78 20 70 72 69  static mutex pri
13f0: 6f 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 69  or to initializi
1400: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6d 61 6c 6c  ng the.  ** mall
1410: 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2d 20 74  oc subsystem - t
1420: 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74  his implies that
1430: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
1440: 6f 66 20 61 20 73 74 61 74 69 63 0a 20 20 2a 2a  of a static.  **
1450: 20 6d 75 74 65 78 20 6d 75 73 74 20 6e 6f 74 20   mutex must not 
1460: 72 65 71 75 69 72 65 20 73 75 70 70 6f 72 74 20  require support 
1470: 66 72 6f 6d 20 74 68 65 20 6d 61 6c 6c 6f 63 20  from the malloc 
1480: 73 75 62 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a  subsystem..  */.
1490: 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    pMaster = sqli
14a0: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
14b0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
14c0: 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c  C_MASTER);.  sql
14d0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14e0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c  (pMaster);.  sql
14f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1500: 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d 20 31  .isMutexInit = 1
1510: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
1520: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
1530: 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20  allocInit ){.   
1540: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c   rc = sqlite3Mal
1550: 6c 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d 0a 20  locInit();.  }. 
1560: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1570: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1580: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1590: 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31 3b 0a  MallocInit = 1;.
15a0: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
15b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
15c0: 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  itMutex ){.     
15d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
15e0: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20  nfig.pInitMutex 
15f0: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  =.           sql
1600: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
1610: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55  QLITE_MUTEX_RECU
1620: 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20 69 66  RSIVE);.      if
1630: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1640: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
1650: 20 26 26 20 21 73 71 6c 69 74 65 33 47 6c 6f 62   && !sqlite3Glob
1660: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
1670: 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 72  tex ){.        r
1680: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16a0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
16b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
16c0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16d0: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
16e0: 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ++;.  }.  sqlite
16f0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
1700: 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66  aster);..  /* If
1710: 20 72 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54   rc is not SQLIT
1720: 45 5f 4f 4b 20 61 74 20 74 68 69 73 20 70 6f 69  E_OK at this poi
1730: 6e 74 2c 20 74 68 65 6e 20 65 69 74 68 65 72 20  nt, then either 
1740: 74 68 65 20 6d 61 6c 6c 6f 63 0a 20 20 2a 2a 20  the malloc.  ** 
1750: 73 75 62 73 79 73 74 65 6d 20 63 6f 75 6c 64 20  subsystem could 
1760: 6e 6f 74 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  not be initializ
1770: 65 64 20 6f 72 20 74 68 65 20 73 79 73 74 65 6d  ed or the system
1780: 20 66 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63   failed to alloc
1790: 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70 49 6e  ate.  ** the pIn
17a0: 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 20 52  itMutex mutex. R
17b0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
17c0: 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e 20 20  n either case.  
17d0: 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  */.  if( rc!=SQL
17e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
17f0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1800: 2f 2a 20 44 6f 20 74 68 65 20 72 65 73 74 20 6f  /* Do the rest o
1810: 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  f the initializa
1820: 74 69 6f 6e 20 75 6e 64 65 72 20 74 68 65 20 72  tion under the r
1830: 65 63 75 72 73 69 76 65 20 6d 75 74 65 78 20 73  ecursive mutex s
1840: 6f 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 77  o.  ** that we w
1850: 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 68  ill be able to h
1860: 61 6e 64 6c 65 20 72 65 63 75 72 73 69 76 65 20  andle recursive 
1870: 63 61 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a 2a 20  calls into.  ** 
1880: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
1890: 7a 65 28 29 2e 20 20 54 68 65 20 72 65 63 75 72  ze().  The recur
18a0: 73 69 76 65 20 63 61 6c 6c 73 20 6e 6f 72 6d 61  sive calls norma
18b0: 6c 6c 79 20 63 6f 6d 65 20 74 68 72 6f 75 67 68  lly come through
18c0: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 73  .  ** sqlite3_os
18d0: 5f 69 6e 69 74 28 29 20 77 68 65 6e 20 69 74 20  _init() when it 
18e0: 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f  invokes sqlite3_
18f0: 76 66 73 5f 72 65 67 69 73 74 65 72 28 29 2c 20  vfs_register(), 
1900: 62 75 74 20 6f 74 68 65 72 0a 20 20 2a 2a 20 72  but other.  ** r
1910: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6d  ecursive calls m
1920: 69 67 68 74 20 61 6c 73 6f 20 62 65 20 70 6f 73  ight also be pos
1930: 73 69 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  sible..  **.  **
1940: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
1950: 4f 46 3a 20 52 2d 30 30 31 34 30 2d 33 37 34 34  OF: R-00140-3744
1960: 35 20 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74  5 SQLite automat
1970: 69 63 61 6c 6c 79 20 73 65 72 69 61 6c 69 7a 65  ically serialize
1980: 73 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 74 6f 20  s calls.  ** to 
1990: 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64  the xInit method
19a0: 2c 20 73 6f 20 74 68 65 20 78 49 6e 69 74 20 6d  , so the xInit m
19b0: 65 74 68 6f 64 20 6e 65 65 64 20 6e 6f 74 20 62  ethod need not b
19c0: 65 20 74 68 72 65 61 64 73 61 66 65 2e 0a 20 20  e threadsafe..  
19d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  **.  ** The foll
19e0: 6f 77 69 6e 67 20 6d 75 74 65 78 20 69 73 20 77  owing mutex is w
19f0: 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 61  hat serializes a
1a00: 63 63 65 73 73 20 74 6f 20 74 68 65 20 61 70 70  ccess to the app
1a10: 64 65 66 20 70 63 61 63 68 65 20 78 49 6e 69 74  def pcache xInit
1a20: 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 73 2e 20 20  .  ** methods.  
1a30: 54 68 65 20 73 71 6c 69 74 65 33 5f 70 63 61 63  The sqlite3_pcac
1a40: 68 65 5f 6d 65 74 68 6f 64 73 2e 78 49 6e 69 74  he_methods.xInit
1a50: 28 29 20 61 6c 6c 20 69 73 20 65 6d 62 65 64 64  () all is embedd
1a60: 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63  ed in the.  ** c
1a70: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63  all to sqlite3Pc
1a80: 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29  acheInitialize()
1a90: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1aa0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
1ab0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ac0: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20  .pInitMutex);.  
1ad0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1ae0: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d  lConfig.isInit==
1af0: 30 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  0 && sqlite3Glob
1b00: 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72  alConfig.inProgr
1b10: 65 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20 46 75  ess==0 ){.    Fu
1b20: 6e 63 44 65 66 48 61 73 68 20 2a 70 48 61 73 68  ncDefHash *pHash
1b30: 20 3d 20 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44   = &GLOBAL(FuncD
1b40: 65 66 48 61 73 68 2c 20 73 71 6c 69 74 65 33 47  efHash, sqlite3G
1b50: 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29 3b  lobalFunctions);
1b60: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
1b70: 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72  alConfig.inProgr
1b80: 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  ess = 1;.    mem
1b90: 73 65 74 28 70 48 61 73 68 2c 20 30 2c 20 73 69  set(pHash, 0, si
1ba0: 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f 62  zeof(sqlite3Glob
1bb0: 61 6c 46 75 6e 63 74 69 6f 6e 73 29 29 3b 0a 20  alFunctions));. 
1bc0: 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74     sqlite3Regist
1bd0: 65 72 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e  erGlobalFunction
1be0: 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  s();.    if( sql
1bf0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1c00: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d 3d 30  .isPCacheInit==0
1c10: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1c20: 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74  qlite3PcacheInit
1c30: 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20 7d 0a  ialize();.    }.
1c40: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1c60: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1c70: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
1c80: 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 1;.      rc = 
1c90: 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28 29 3b  sqlite3OsInit();
1ca0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1cb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1cc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
1cd0: 63 68 65 42 75 66 66 65 72 53 65 74 75 70 28 20  cheBufferSetup( 
1ce0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1cf0: 66 69 67 2e 70 50 61 67 65 2c 20 0a 20 20 20 20  fig.pPage, .    
1d00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1d10: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65  balConfig.szPage
1d20: 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  , sqlite3GlobalC
1d30: 6f 6e 66 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20  onfig.nPage);.  
1d40: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1d50: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d  lConfig.isInit =
1d60: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   1;.    }.    sq
1d70: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1d80: 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30  g.inProgress = 0
1d90: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1da0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
1db0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1dc0: 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20  pInitMutex);..  
1dd0: 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72  /* Go back under
1de0: 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74 65   the static mute
1df0: 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74  x and clean up t
1e00: 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a  he recursive.  *
1e10: 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65  * mutex to preve
1e20: 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65  nt a resource le
1e30: 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ak..  */.  sqlit
1e40: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1e50: 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Master);.  sqlit
1e60: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
1e70: 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a  RefInitMutex--;.
1e80: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1e90: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
1ea0: 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20  itMutex<=0 ){.  
1eb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ec0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1ed0: 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29  efInitMutex==0 )
1ee0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
1ef0: 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33  tex_free(sqlite3
1f00: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1f10: 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71  itMutex);.    sq
1f20: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1f30: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30  g.pInitMutex = 0
1f40: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1f50: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
1f60: 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ter);..  /* The 
1f70: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73  following is jus
1f80: 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  t a sanity check
1f90: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51   to make sure SQ
1fa0: 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65  Lite has.  ** be
1fb0: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72  en compiled corr
1fc0: 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d  ectly.  It is im
1fd0: 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74  portant to run t
1fe0: 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20  his code, but.  
1ff0: 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
2000: 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f   to run it too o
2010: 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70  ften and soak up
2020: 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20   CPU cycles for 
2030: 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20  no.  ** reason. 
2040: 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e   So we run it on
2050: 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61  ce during initia
2060: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  lization..  */.#
2070: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69  ifndef NDEBUG.#i
2080: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2090: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
20a0: 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69  .  /* This secti
20b0: 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c  on of code's onl
20c0: 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76 69  y "output" is vi
20d0: 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  a assert() state
20e0: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28  ments. */.  if (
20f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2100: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2110: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2120: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2130: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
2140: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
2150: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
2160: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
2170: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
2180: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2190: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
21a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
21b0: 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
21c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68  }../*.** Undo th
21d0: 65 20 65 66 66 65 63 74 73 20 6f 66 20 73 71 6c  e effects of sql
21e0: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
21f0: 29 2e 20 20 4d 75 73 74 20 6e 6f 74 20 62 65 20  ).  Must not be 
2200: 63 61 6c 6c 65 64 20 77 68 69 6c 65 0a 2a 2a 20  called while.** 
2210: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
2220: 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 63  nding database c
2230: 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65  onnections or me
2240: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  mory allocations
2250: 20 6f 72 0a 2a 2a 20 77 68 69 6c 65 20 61 6e 79   or.** while any
2260: 20 70 61 72 74 20 6f 66 20 53 51 4c 69 74 65 20   part of SQLite 
2270: 69 73 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20  is otherwise in 
2280: 75 73 65 20 69 6e 20 61 6e 79 20 74 68 72 65 61  use in any threa
2290: 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
22a0: 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ine is not threa
22b0: 64 73 61 66 65 2e 20 20 42 75 74 20 69 74 20 69  dsafe.  But it i
22c0: 73 20 73 61 66 65 20 74 6f 20 69 6e 76 6f 6b 65  s safe to invoke
22d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
22e0: 20 6f 6e 20 77 68 65 6e 20 53 51 4c 69 74 65 20   on when SQLite 
22f0: 69 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20  is already shut 
2300: 64 6f 77 6e 2e 20 20 49 66 20 53 51 4c 69 74 65  down.  If SQLite
2310: 20 69 73 20 61 6c 72 65 61 64 79 20 73 68 75 74   is already shut
2320: 20 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20 74 68   down.** when th
2330: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
2340: 76 6f 6b 65 64 2c 20 74 68 65 6e 20 74 68 69 73  voked, then this
2350: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61   routine is a ha
2360: 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f  rmless no-op..*/
2370: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 75  .int sqlite3_shu
2380: 74 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 20 20 69  tdown(void){.  i
2390: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
23a0: 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 7b  Config.isInit ){
23b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .    sqlite3_os_
23c0: 65 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  end();.    sqlit
23d0: 65 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78  e3_reset_auto_ex
23e0: 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73  tension();.    s
23f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2400: 69 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  ig.isInit = 0;. 
2410: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
2420: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50  GlobalConfig.isP
2430: 43 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20  CacheInit ){.   
2440: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68   sqlite3PcacheSh
2450: 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71  utdown();.    sq
2460: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2470: 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d  g.isPCacheInit =
2480: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
2490: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
24a0: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29  g.isMallocInit )
24b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c  {.    sqlite3Mal
24c0: 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71  locEnd();.    sq
24d0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
24e0: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d  g.isMallocInit =
24f0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
2500: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2510: 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 29 7b  g.isMutexInit ){
2520: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65  .    sqlite3Mute
2530: 78 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69  xEnd();.    sqli
2540: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2550: 69 73 4d 75 74 65 78 49 6e 69 74 20 3d 20 30 3b  isMutexInit = 0;
2560: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
2570: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2580: 2a 2a 20 54 68 69 73 20 41 50 49 20 61 6c 6c 6f  ** This API allo
2590: 77 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20  ws applications 
25a0: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 67 6c  to modify the gl
25b0: 6f 62 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69  obal configurati
25c0: 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c  on of.** the SQL
25d0: 69 74 65 20 6c 69 62 72 61 72 79 20 61 74 20 72  ite library at r
25e0: 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54  un-time..**.** T
25f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
2600: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
2610: 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  d when there are
2620: 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a   no outstanding.
2630: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
2640: 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72  ections or memor
2650: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20  y allocations.  
2660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2670: 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 61 66  not.** threadsaf
2680: 65 2e 20 20 46 61 69 6c 75 72 65 20 74 6f 20 68  e.  Failure to h
2690: 65 65 64 20 74 68 65 73 65 20 77 61 72 6e 69 6e  eed these warnin
26a0: 67 73 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 75  gs can lead to u
26b0: 6e 70 72 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20  npredictable.** 
26c0: 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74  behavior..*/.int
26d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
26e0: 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20  int op, ...){.  
26f0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
2700: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2710: 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  ;..  /* sqlite3_
2720: 63 6f 6e 66 69 67 28 29 20 73 68 61 6c 6c 20 72  config() shall r
2730: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
2740: 55 53 45 20 69 66 20 69 74 20 69 73 20 69 6e 76  USE if it is inv
2750: 6f 6b 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20  oked while.  ** 
2760: 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61  the SQLite libra
2770: 72 79 20 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f  ry is in use. */
2780: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
2790: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69  obalConfig.isIni
27a0: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
27b0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a  E_MISUSE_BKPT;..
27c0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f    va_start(ap, o
27d0: 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p);.  switch( op
27e0: 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4d 75 74 65   ){..    /* Mute
27f0: 78 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  x configuration 
2800: 6f 70 74 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79  options are only
2810: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 20   available in a 
2820: 74 68 72 65 61 64 73 61 66 65 0a 20 20 20 20 2a  threadsafe.    *
2830: 2a 20 63 6f 6d 70 69 6c 65 2e 20 0a 20 20 20 20  * compile. .    
2840: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
2850: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
2860: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
2870: 41 44 53 41 46 45 3e 30 0a 20 20 20 20 63 61 73  ADSAFE>0.    cas
2880: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
2890: 53 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a  SINGLETHREAD: {.
28a0: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
28b0: 20 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f   all mutexing */
28c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
28d0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
28e0: 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Mutex = 0;.     
28f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2900: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
2910: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
2920: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2930: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
2940: 55 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a 20 20  ULTITHREAD: {.  
2950: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d      /* Disable m
2960: 75 74 65 78 69 6e 67 20 6f 66 20 64 61 74 61 62  utexing of datab
2970: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
2980: 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62  */.      /* Enab
2990: 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20 63  le mutexing of c
29a0: 6f 72 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ore data structu
29b0: 72 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  res */.      sql
29c0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
29d0: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b  .bCoreMutex = 1;
29e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
29f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
2a00: 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Mutex = 0;.     
2a10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2a20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2a30: 4e 46 49 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a  NFIG_SERIALIZED:
2a40: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62   {.      /* Enab
2a50: 6c 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20  le all mutexing 
2a60: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2a70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
2a80: 72 65 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20  reMutex = 1;.   
2a90: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2aa0: 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
2ab0: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  x = 1;.      bre
2ac0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
2ad0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
2ae0: 5f 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  _MUTEX: {.      
2af0: 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c  /* Specify an al
2b00: 74 65 72 6e 61 74 69 76 65 20 6d 75 74 65 78 20  ternative mutex 
2b10: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
2b20: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
2b30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65  lobalConfig.mute
2b40: 78 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  x = *va_arg(ap, 
2b50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65  sqlite3_mutex_me
2b60: 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62  thods*);.      b
2b70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2b80: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2b90: 49 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a 20  IG_GETMUTEX: {. 
2ba0: 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65       /* Retrieve
2bb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 75 74   the current mut
2bc0: 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ex implementatio
2bd0: 6e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61  n */.      *va_a
2be0: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d  rg(ap, sqlite3_m
2bf0: 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20 3d  utex_methods*) =
2c00: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2c10: 6e 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20 20  nfig.mutex;.    
2c20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
2c30: 65 6e 64 69 66 0a 0a 0a 20 20 20 20 63 61 73 65  endif...    case
2c40: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
2c50: 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f  ALLOC: {.      /
2c60: 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74  * Specify an alt
2c70: 65 72 6e 61 74 69 76 65 20 6d 61 6c 6c 6f 63 20  ernative malloc 
2c80: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
2c90: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
2ca0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20  lobalConfig.m = 
2cb0: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
2cc0: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a  te3_mem_methods*
2cd0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2ce0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2cf0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
2d00: 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
2d10: 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20  /* Retrieve the 
2d20: 63 75 72 72 65 6e 74 20 6d 61 6c 6c 6f 63 28 29  current malloc()
2d30: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2d40: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
2d50: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d60: 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20  .m.xMalloc==0 ) 
2d70: 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66  sqlite3MemSetDef
2d80: 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 2a 76  ault();.      *v
2d90: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
2da0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 20  3_mem_methods*) 
2db0: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
2dc0: 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20 20 20 62  onfig.m;.      b
2dd0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2de0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2df0: 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a 20 7b 0a  IG_MEMSTATUS: {.
2e00: 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20        /* Enable 
2e10: 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 6d  or disable the m
2e20: 61 6c 6c 6f 63 20 73 74 61 74 75 73 20 63 6f 6c  alloc status col
2e30: 6c 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  lection */.     
2e40: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2e50: 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20  nfig.bMemstat = 
2e60: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
2e70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2e80: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2e90: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54  ITE_CONFIG_SCRAT
2ea0: 43 48 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  CH: {.      /* D
2eb0: 65 73 69 67 6e 61 74 65 20 61 20 62 75 66 66 65  esignate a buffe
2ec0: 72 20 66 6f 72 20 73 63 72 61 74 63 68 20 6d 65  r for scratch me
2ed0: 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20  mory space */.  
2ee0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2ef0: 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68  lConfig.pScratch
2f00: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
2f10: 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  id*);.      sqli
2f20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2f30: 73 7a 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61  szScratch = va_a
2f40: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
2f50: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2f60: 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 20  Config.nScratch 
2f70: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
2f80: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2f90: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2fa0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47  QLITE_CONFIG_PAG
2fb0: 45 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20  ECACHE: {.      
2fc0: 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20 62  /* Designate a b
2fd0: 75 66 66 65 72 20 66 6f 72 20 70 61 67 65 20 63  uffer for page c
2fe0: 61 63 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63  ache memory spac
2ff0: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
3000: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
3010: 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70  Page = va_arg(ap
3020: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
3030: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3040: 66 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f  fig.szPage = va_
3050: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3060: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3070: 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20  lConfig.nPage = 
3080: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3090: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
30a0: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51    }..    case SQ
30b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43  LITE_CONFIG_PCAC
30c0: 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53  HE: {.      /* S
30d0: 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e  pecify an altern
30e0: 61 74 69 76 65 20 70 61 67 65 20 63 61 63 68 65  ative page cache
30f0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
3100: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3110: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61  GlobalConfig.pca
3120: 63 68 65 20 3d 20 2a 76 61 5f 61 72 67 28 61 70  che = *va_arg(ap
3130: 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  , sqlite3_pcache
3140: 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20  _methods*);.    
3150: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
3160: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3170: 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45  CONFIG_GETPCACHE
3180: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
3190: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
31a0: 67 2e 70 63 61 63 68 65 2e 78 49 6e 69 74 3d 3d  g.pcache.xInit==
31b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
31c0: 69 74 65 33 50 43 61 63 68 65 53 65 74 44 65 66  ite3PCacheSetDef
31d0: 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a  ault();.      }.
31e0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
31f0: 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  , sqlite3_pcache
3200: 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c  _methods*) = sql
3210: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3220: 2e 70 63 61 63 68 65 3b 0a 20 20 20 20 20 20 62  .pcache;.      b
3230: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
3240: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3250: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20  ENABLE_MEMSYS3) 
3260: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
3270: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
3280: 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
3290: 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b  E_CONFIG_HEAP: {
32a0: 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e  .      /* Design
32b0: 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72  ate a buffer for
32c0: 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 73 70 61   heap memory spa
32d0: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
32e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
32f0: 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61  pHeap = va_arg(a
3300: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
3310: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3320: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
3330: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3340: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3350: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
3360: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3370: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
3380: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3390: 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20  mnReq<1 ){.     
33a0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
33b0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31  Config.mnReq = 1
33c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
33d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
33e0: 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c  onfig.mnReq>(1<<
33f0: 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  12) ){.        /
3400: 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73  * cap min reques
3410: 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a  t size at 2^12 *
3420: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
3430: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
3440: 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20  Req = (1<<12);. 
3450: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
3460: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
3470: 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29  onfig.pHeap==0 )
3480: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
3490: 74 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72  the heap pointer
34a0: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 72   is NULL, then r
34b0: 65 73 74 6f 72 65 20 74 68 65 20 6d 61 6c 6c 6f  estore the mallo
34c0: 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  c implementation
34d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  .        ** back
34e0: 20 74 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72   to NULL pointer
34f0: 73 20 74 6f 6f 2e 20 20 54 68 69 73 20 77 69 6c  s too.  This wil
3500: 6c 20 63 61 75 73 65 20 74 68 65 20 6d 61 6c 6c  l cause the mall
3510: 6f 63 20 74 6f 20 67 6f 0a 20 20 20 20 20 20 20  oc to go.       
3520: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20   ** back to its 
3530: 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e  default implemen
3540: 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69  tation when sqli
3550: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
3560: 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72   is.        ** r
3570: 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  un..        */. 
3580: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73         memset(&s
3590: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
35a0: 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ig.m, 0, sizeof(
35b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
35c0: 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d  fig.m));.      }
35d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
35e0: 20 54 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65   The heap pointe
35f0: 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  r is not NULL, t
3600: 68 65 6e 20 69 6e 73 74 61 6c 6c 20 6f 6e 65 20  hen install one 
3610: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
3620: 2a 20 6d 65 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20  * mem5.c/mem3.c 
3630: 6d 65 74 68 6f 64 73 2e 20 49 66 20 6e 65 69 74  methods. If neit
3640: 68 65 72 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  her ENABLE_MEMSY
3650: 53 33 20 6e 6f 72 0a 20 20 20 20 20 20 20 20 2a  S3 nor.        *
3660: 2a 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  * ENABLE_MEMSYS5
3670: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 72 65 74   is defined, ret
3680: 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  urn an error..  
3690: 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20        */.#ifdef 
36a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
36b0: 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20 73 71  MSYS3.        sq
36c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
36d0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
36e0: 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23  mGetMemsys3();.#
36f0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
3700: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
3710: 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  S5.        sqlit
3720: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3730: 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65   = *sqlite3MemGe
3740: 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64  tMemsys5();.#end
3750: 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
3760: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3770: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
3780: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f  QLITE_CONFIG_LOO
3790: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
37a0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
37b0: 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20  fig.szLookaside 
37c0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
37d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
37e0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
37f0: 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67  okaside = va_arg
3800: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3810: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3820: 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64    .    /* Record
3830: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3840: 65 20 6c 6f 67 67 65 72 20 66 75 6e 63 63 74 69  e logger funccti
3850: 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72 73 74  on and its first
3860: 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a   argument..    *
3870: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73  * The default is
3880: 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20   NULL.  Logging 
3890: 69 73 20 64 69 73 61 62 6c 65 64 20 69 66 20 74  is disabled if t
38a0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  he function poin
38b0: 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55  ter is.    ** NU
38c0: 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  LL..    */.    c
38d0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
38e0: 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f  G_LOG: {.      /
38f0: 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20  * MSVC is picky 
3900: 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75  about pulling fu
3910: 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20  nc ptrs from va 
3920: 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  lists..      ** 
3930: 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d  http://support.m
3940: 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f  icrosoft.com/kb/
3950: 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73  47961.      ** s
3960: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3970: 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67  ig.xLog = va_arg
3980: 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69  (ap, void(*)(voi
3990: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  d*,int,const cha
39a0: 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20  r*));.      */. 
39b0: 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
39c0: 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f  d(*LOGFUNC_t)(vo
39d0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
39e0: 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ar*);.      sqli
39f0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3a00: 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  xLog = va_arg(ap
3a10: 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20  , LOGFUNC_t);.  
3a20: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3a30: 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20  lConfig.pLogArg 
3a40: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3a50: 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d*);.      break
3a60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
3a70: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3a80: 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  URI: {.      sql
3a90: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3aa0: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
3ab0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
3ac0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3ad0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
3ae0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
3af0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  E_ERROR;.      b
3b00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
3b10: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
3b20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3b30: 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c  .** Set up the l
3b40: 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 73  ookaside buffers
3b50: 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
3b60: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52  connection..** R
3b70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
3b80: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a  on success.  .**
3b90: 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73   If lookaside is
3ba0: 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c   already active,
3bb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
3bc0: 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  USY..**.** The s
3bd0: 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  z parameter is t
3be0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
3bf0: 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61  es in each looka
3c00: 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68  side slot..** Th
3c10: 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20  e cnt parameter 
3c20: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
3c30: 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61   slots.  If pSta
3c40: 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a  rt is NULL the.*
3c50: 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
3c60: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
3c70: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
3c80: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
3c90: 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74  ()..** If pStart
3ca0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
3cb0: 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62  n it is sz*cnt b
3cc0: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74  ytes of memory t
3cd0: 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65  o use for.** the
3ce0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
3cf0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
3d00: 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
3d10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
3d20: 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c  d *pBuf, int sz,
3d30: 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69   int cnt){.  voi
3d40: 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28  d *pStart;.  if(
3d50: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
3d60: 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Out ){.    retur
3d70: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
3d80: 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79   }.  /* Free any
3d90: 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73   existing lookas
3da0: 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  ide buffer for t
3db0: 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72  his handle befor
3dc0: 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e  e.  ** allocatin
3dd0: 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77  g a new one so w
3de0: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20  e don't have to 
3df0: 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a  have space for .
3e00: 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65    ** both at the
3e10: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f   same time..  */
3e20: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
3e30: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
3e40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
3e50: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
3e60: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
3e70: 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  /* The size of a
3e80: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20   lookaside slot 
3e90: 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67  needs to be larg
3ea0: 65 72 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65  er than a pointe
3eb0: 72 0a 20 20 2a 2a 20 74 6f 20 62 65 20 75 73 65  r.  ** to be use
3ec0: 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ful..  */.  if( 
3ed0: 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28  sz<=(int)sizeof(
3ee0: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20  LookasideSlot*) 
3ef0: 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  ) sz = 0;.  if( 
3f00: 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b  cnt<0 ) cnt = 0;
3f10: 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20  .  if( sz==0 || 
3f20: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a  cnt==0 ){.    sz
3f30: 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
3f40: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
3f50: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
3f60: 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38   sz = ROUNDDOWN8
3f70: 28 73 7a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  (sz); /* IMP: R-
3f80: 33 33 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20  33038-09382 */. 
3f90: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
3fa0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
3fb0: 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69     pStart = sqli
3fc0: 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e  te3Malloc( sz*cn
3fd0: 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  t );  /* IMP: R-
3fe0: 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20  61949-35727 */. 
3ff0: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
4000: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d  ignMalloc();.  }
4010: 65 6c 73 65 7b 0a 20 20 20 20 73 7a 20 3d 20 52  else{.    sz = R
4020: 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20 2f  OUNDDOWN8(sz); /
4030: 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38 2d 30  * IMP: R-33038-0
4040: 39 33 38 32 20 2a 2f 0a 20 20 20 20 70 53 74 61  9382 */.    pSta
4050: 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20  rt = pBuf;.  }. 
4060: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
4070: 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a  Start = pStart;.
4080: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4090: 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d  pFree = 0;.  db-
40a0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20  >lookaside.sz = 
40b0: 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70  (u16)sz;.  if( p
40c0: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74  Start ){.    int
40d0: 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64   i;.    Lookasid
40e0: 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73  eSlot *p;.    as
40f0: 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29  sert( sz > (int)
4100: 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65  sizeof(Lookaside
4110: 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70 20  Slot*) );.    p 
4120: 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  = (LookasideSlot
4130: 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f  *)pStart;.    fo
4140: 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b  r(i=cnt-1; i>=0;
4150: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
4160: 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b  pNext = db->look
4170: 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20  aside.pFree;.   
4180: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
4190: 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20 20  .pFree = p;.    
41a0: 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65    p = (Lookaside
41b0: 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b  Slot*)&((u8*)p)[
41c0: 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  sz];.    }.    d
41d0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e  b->lookaside.pEn
41e0: 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = p;.    db->l
41f0: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
4200: 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 1;.    db->l
4210: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
4220: 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a  ed = pBuf==0 ?1:
4230: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
4240: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
4250: 6e 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  nd = 0;.    db->
4260: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
4270: 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ed = 0;.    db->
4280: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
4290: 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ced = 0;.  }.  r
42a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
42b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
42c0: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
42d0: 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
42e0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
42f0: 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74  ..*/.sqlite3_mut
4300: 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d  ex *sqlite3_db_m
4310: 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  utex(sqlite3 *db
4320: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
4330: 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mutex;.}../*.** 
4340: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
4350: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
4360: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
4370: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
4380: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
4390: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
43a0: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
43b0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
43c0: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
43d0: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
43e0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
43f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
4400: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
4410: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
4420: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
4430: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a   void*); /* IMP:
4440: 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a   R-26835-10964 *
4450: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  /.      int sz =
4460: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4470: 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  ;       /* IMP: 
4480: 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f  R-47871-25994 */
4490: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
44a0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
44b0: 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ;      /* IMP: R
44c0: 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a  -04460-53386 */.
44d0: 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70        rc = setup
44e0: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42  Lookaside(db, pB
44f0: 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20  uf, sz, cnt);.  
4500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4510: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
4520: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
4530: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
4540: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
4550: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a   /* The opcode *
4560: 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d 61  /.        u32 ma
4570: 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  sk;    /* Mask o
4580: 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c  f the bit in sql
4590: 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65  ite3.flags to se
45a0: 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20  t/clear */.     
45b0: 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b   } aFlagOp[] = {
45c0: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
45d0: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
45e0: 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54  E_FKEY,    SQLIT
45f0: 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20  E_ForeignKeys   
4600: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
4610: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
4620: 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51  ABLE_TRIGGER, SQ
4630: 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
4640: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  er  },.      };.
4650: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
4660: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
4670: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
4680: 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32  * IMP: R-42790-2
4690: 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f  3372 */.      fo
46a0: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
46b0: 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b  ze(aFlagOp); i++
46c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
46d0: 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70  FlagOp[i].op==op
46e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
46f0: 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67  t onoff = va_arg
4700: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4710: 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d       int *pRes =
4720: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
4730: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
4740: 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e   oldFlags = db->
4750: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
4760: 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a   if( onoff>0 ){.
4770: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
4780: 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70  flags |= aFlagOp
4790: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
47a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
47b0: 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  off==0 ){.      
47c0: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
47d0: 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  &= ~aFlagOp[i].m
47e0: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
47f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
4800: 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61  ldFlags!=db->fla
4810: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
4820: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
4830: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
4840: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
4850: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
4860: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20   pRes ){.       
4870: 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62       *pRes = (db
4880: 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f  ->flags & aFlagO
4890: 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20  p[i].mask)!=0;. 
48a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
48b0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
48c0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  _OK;.          b
48d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
48e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
48f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
4900: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
4910: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
4920: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
4930: 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b  if the buffer z[
4940: 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  0..n-1] contains
4950: 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a   all spaces..*/.
4960: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70  static int allSp
4970: 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  aces(const char 
4980: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68  *z, int n){.  wh
4990: 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
49a0: 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20  1]==' ' ){ n--; 
49b0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b  }.  return n==0;
49c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
49d0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
49e0: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
49f0: 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20   named "BINARY" 
4a00: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a  which is always.
4a10: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ** available..**
4a20: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c  .** If the padFl
4a30: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ag argument is n
4a40: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61  ot NULL then spa
4a50: 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68  ce padding at th
4a60: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69  e end.** of stri
4a70: 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ngs is ignored. 
4a80: 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73   This implements
4a90: 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61   the RTRIM colla
4aa0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
4ab0: 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28  int binCollFunc(
4ac0: 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67  .  void *padFlag
4ad0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
4ae0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
4af0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
4b00: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
4b10: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
4b20: 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
4b30: 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
4b40: 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d  y2;.  rc = memcm
4b50: 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  p(pKey1, pKey2, 
4b60: 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
4b70: 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c  ){.    if( padFl
4b80: 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  ag.     && allSp
4b90: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
4ba0: 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a  y1)+n, nKey1-n).
4bb0: 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65       && allSpace
4bc0: 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29  s(((char*)pKey2)
4bd0: 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20  +n, nKey2-n).   
4be0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61   ){.      /* Lea
4bf0: 76 65 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20  ve rc unchanged 
4c00: 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  at 0 */.    }els
4c10: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b  e{.      rc = nK
4c20: 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20  ey1 - nKey2;.   
4c30: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4c40: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  rc;.}../*.** Ano
4c50: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
4c60: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
4c70: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
4c80: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
4c90: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
4ca0: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
4cb0: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
4cc0: 6e 64 61 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndant.** compari
4cd0: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
4ce0: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
4cf0: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
4d00: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
4d10: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
4d20: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
4d30: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
4d40: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
4d50: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
4d60: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
4d70: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
4d80: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
4d90: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
4da0: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
4db0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
4dc0: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
4dd0: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
4de0: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
4df0: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
4e00: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
4e10: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
4e20: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
4e30: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
4e40: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
4e50: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
4e60: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
4e70: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
4e80: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
4e90: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
4ea0: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
4eb0: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
4ec0: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
4ed0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
4ee0: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
4ef0: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
4f00: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
4f10: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
4f20: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
4f30: 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  lastRowid;.}../*
4f40: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
4f50: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
4f60: 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   in the most rec
4f70: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
4f80: 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69  te3_exec()..*/.i
4f90: 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  nt sqlite3_chang
4fa0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
4fb0: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
4fc0: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
4fd0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
4fe0: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
4ff0: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
5000: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
5010: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5020: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
5030: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
5040: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61  return db->nTota
5050: 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  lChange;.}../*.*
5060: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e  * Close all open
5070: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69   savepoints. Thi
5080: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
5090: 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c  manipulates fiel
50a0: 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ds of the.** dat
50b0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a  abase handle obj
50c0: 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  ect, it does not
50d0: 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70   close any savep
50e0: 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62  oints that may b
50f0: 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65  e open.** at the
5100: 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65   b-tree/pager le
5110: 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  vel..*/.void sql
5120: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
5130: 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
5140: 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70  {.  while( db->p
5150: 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
5160: 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70   Savepoint *pTmp
5170: 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
5180: 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65  t;.    db->pSave
5190: 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e  point = pTmp->pN
51a0: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
51b0: 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29  DbFree(db, pTmp)
51c0: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76  ;.  }.  db->nSav
51d0: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62  epoint = 0;.  db
51e0: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
51f0: 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61  ;.  db->isTransa
5200: 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
5210: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   0;.}../*.** Inv
5220: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
5230: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f  or function asso
5240: 63 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63  ciated with Func
5250: 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45  Def p, if any. E
5260: 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69  xcept,.** if thi
5270: 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  s is not the las
5280: 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75  t copy of the fu
5290: 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69  nction, do not i
52a0: 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70  nvoke it. Multip
52b0: 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20  le.** copies of 
52c0: 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f  a single functio
52d0: 6e 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68  n are created wh
52e0: 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69  en create_functi
52f0: 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a  on() is called.*
5300: 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e  * with SQLITE_AN
5310: 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  Y as the encodin
5320: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
5330: 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f  d functionDestro
5340: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  y(sqlite3 *db, F
5350: 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75  uncDef *p){.  Fu
5360: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
5370: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70  estructor = p->p
5380: 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66  Destructor;.  if
5390: 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ( pDestructor ){
53a0: 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72  .    pDestructor
53b0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
53c0: 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e  ( pDestructor->n
53d0: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
53e0: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65  pDestructor->xDe
53f0: 73 74 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f  stroy(pDestructo
5400: 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20  r->pUserData);. 
5410: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5420: 65 65 28 64 62 2c 20 70 44 65 73 74 72 75 63 74  ee(db, pDestruct
5430: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  or);.    }.  }.}
5440: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
5450: 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65   existing SQLite
5460: 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 69 6e 74   database.*/.int
5470: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73   sqlite3_close(s
5480: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48  qlite3 *db){.  H
5490: 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20  ashElem *i;     
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
54b0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69 74 65  * Hash table ite
54c0: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a  rator */.  int j
54d0: 3b 0a 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  ;..  if( !db ){.
54e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
54f0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
5500: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
5510: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
5520: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
5530: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
5540: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
5550: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
5560: 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f  mutex);..  /* Fo
5570: 72 63 65 20 78 44 65 73 74 72 6f 79 20 63 61 6c  rce xDestroy cal
5580: 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61  ls on all virtua
5590: 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 73 71  l tables */.  sq
55a0: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
55b0: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d 31 29  alSchema(db, -1)
55c0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61  ;..  /* If a tra
55d0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
55e0: 2c 20 74 68 65 20 52 65 73 65 74 49 6e 74 65 72  , the ResetInter
55f0: 6e 61 6c 53 63 68 65 6d 61 28 29 20 63 61 6c 6c  nalSchema() call
5600: 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c   above.  ** will
5610: 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64   not have called
5620: 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74   the xDisconnect
5630: 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79  () method on any
5640: 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61   virtual.  ** ta
5650: 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e  bles in the db->
5660: 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e  aVTrans[] array.
5670: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
5680: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
5690: 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77  ck().  ** call w
56a0: 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65  ill do so. We ne
56b0: 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ed to do this be
56c0: 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20 66  fore the check f
56d0: 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53  or active.  ** S
56e0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65  QL statements be
56f0: 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61  low, as the v-ta
5700: 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ble implementati
5710: 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e  on may be storin
5720: 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70  g.  ** some prep
5730: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
5740: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f  internally..  */
5750: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
5760: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f  llback(db);..  /
5770: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
5780: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 56  ny outstanding V
5790: 4d 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  Ms, return SQLIT
57a0: 45 5f 42 55 53 59 2e 20 2a 2f 0a 20 20 69 66 28  E_BUSY. */.  if(
57b0: 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20   db->pVdbe ){.  
57c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
57d0: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
57e0: 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65  .        "unable
57f0: 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f   to close due to
5800: 20 75 6e 66 69 6e 61 6c 69 73 65 64 20 73 74 61   unfinalised sta
5810: 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 73  tements");.    s
5820: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
5830: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
5840: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5850: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 61 73 73  _BUSY;.  }.  ass
5860: 65 72 74 28 20 73 71 6c 69 74 65 33 53 61 66 65  ert( sqlite3Safe
5870: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
5880: 64 62 29 20 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d  db) );..  for(j=
5890: 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b  0; j<db->nDb; j+
58a0: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
58b0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  Bt = db->aDb[j].
58c0: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
58d0: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
58e0: 49 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20  IsInBackup(pBt) 
58f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5900: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
5910: 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20  _BUSY, .        
5920: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f    "unable to clo
5930: 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 69  se due to unfini
5940: 73 68 65 64 20 62 61 63 6b 75 70 20 6f 70 65 72  shed backup oper
5950: 61 74 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 73  ation");.      s
5960: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
5970: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
5980: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
5990: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
59a0: 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e   }..  /* Free an
59b0: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61  y outstanding Sa
59c0: 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
59d0: 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  es. */.  sqlite3
59e0: 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
59f0: 64 62 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  db);..  for(j=0;
5a00: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
5a10: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
5a20: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
5a30: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  j];.    if( pDb-
5a40: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71  >pBt ){.      sq
5a50: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
5a60: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20  pDb->pBt);.     
5a70: 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20   pDb->pBt = 0;. 
5a80: 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b       if( j!=1 ){
5a90: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53  .        pDb->pS
5aa0: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20  chema = 0;.     
5ab0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
5ac0: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
5ad0: 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d 31  nalSchema(db, -1
5ae0: 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68  );..  /* Tell th
5af0: 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79  e code in notify
5b00: 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e  .c that the conn
5b10: 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72  ection no longer
5b20: 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20   holds any.  ** 
5b30: 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e  locks and does n
5b40: 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20 66  ot require any f
5b50: 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f  urther unlock-no
5b60: 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
5b70: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f    */.  sqlite3Co
5b80: 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64  nnectionClosed(d
5b90: 62 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  b);..  assert( d
5ba0: 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61  b->nDb<=2 );.  a
5bb0: 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d  ssert( db->aDb==
5bc0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b  db->aDbStatic );
5bd0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72  .  for(j=0; j<Ar
5be0: 72 61 79 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e  raySize(db->aFun
5bf0: 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  c.a); j++){.    
5c00: 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20  FuncDef *pNext, 
5c10: 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20  *pHash, *p;.    
5c20: 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e  for(p=db->aFunc.
5c30: 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68  a[j]; p; p=pHash
5c40: 29 7b 0a 20 20 20 20 20 20 70 48 61 73 68 20 3d  ){.      pHash =
5c50: 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 20   p->pHash;.     
5c60: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
5c70: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73       functionDes
5c80: 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20  troy(db, p);.   
5c90: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e       pNext = p->
5ca0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73  pNext;.        s
5cb0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5cc0: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d   p);.        p =
5cd0: 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a   pNext;.      }.
5ce0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
5cf0: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
5d00: 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
5d10: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
5d20: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43  hNext(i)){.    C
5d30: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
5d40: 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74  (CollSeq *)sqlit
5d50: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
5d60: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20    /* Invoke any 
5d70: 64 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69  destructors regi
5d80: 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61  stered for colla
5d90: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
5da0: 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  er data. */.    
5db0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b  for(j=0; j<3; j+
5dc0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  +){.      if( pC
5dd0: 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20  oll[j].xDel ){. 
5de0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e         pColl[j].
5df0: 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55  xDel(pColl[j].pU
5e00: 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ser);.      }.  
5e10: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
5e20: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29  bFree(db, pColl)
5e30: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
5e40: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43  ashClear(&db->aC
5e50: 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66  ollSeq);.#ifndef
5e60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
5e70: 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28  TUALTABLE.  for(
5e80: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
5e90: 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
5ea0: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
5eb0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f  Next(i)){.    Mo
5ec0: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
5ed0: 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  dule *)sqliteHas
5ee0: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
5ef0: 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79  ( pMod->xDestroy
5f00: 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e   ){.      pMod->
5f10: 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70  xDestroy(pMod->p
5f20: 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Aux);.    }.    
5f30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5f40: 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73  , pMod);.  }.  s
5f50: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
5f60: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23  &db->aModule);.#
5f70: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
5f80: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
5f90: 5f 4f 4b 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c  _OK, 0); /* Deal
5fa0: 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63 68  locates any cach
5fb0: 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73  ed error strings
5fc0: 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70  . */.  if( db->p
5fd0: 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
5fe0: 65 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e  e3ValueFree(db->
5ff0: 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pErr);.  }.  sql
6000: 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69  ite3CloseExtensi
6010: 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e  ons(db);..  db->
6020: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
6030: 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f  AGIC_ERROR;..  /
6040: 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62  * The temp-datab
6050: 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c  ase schema is al
6060: 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e  located differen
6070: 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  tly from the oth
6080: 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f  er schema.  ** o
6090: 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71  bjects (using sq
60a0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72  liteMalloc() dir
60b0: 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f  ectly, instead o
60c0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  f sqlite3BtreeSc
60d0: 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f  hema())..  ** So
60e0: 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
60f0: 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f  freed here. Todo
6100: 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74  : Why not roll t
6110: 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69  he temp schema i
6120: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d  nto.  ** the sam
6130: 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  e sqliteMalloc()
6140: 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74   as the one that
6150: 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64   allocates the d
6160: 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74  atabase .  ** st
6170: 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20  ructure?.  */.  
6180: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
6190: 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  , db->aDb[1].pSc
61a0: 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
61b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
61c0: 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d  >mutex);.  db->m
61d0: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
61e0: 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71  GIC_CLOSED;.  sq
61f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
6200: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
6210: 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61  ssert( db->looka
6220: 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20  side.nOut==0 ); 
6230: 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c   /* Fails on a l
6240: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20  ookaside memory 
6250: 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62  leak */.  if( db
6260: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
6270: 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  loced ){.    sql
6280: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f  ite3_free(db->lo
6290: 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b  okaside.pStart);
62a0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
62b0: 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 52 52 0a  TE_ENABLE_SQLRR.
62c0: 20 20 53 52 52 65 63 43 6c 6f 73 65 28 64 62 29    SRRecClose(db)
62d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 71  ;.#endif.  .  sq
62e0: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a  lite3_free(db);.
62f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6300: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  OK;.}../*.** Rol
6310: 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61  lback all databa
6320: 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69  se files..*/.voi
6330: 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
6340: 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  kAll(sqlite3 *db
6350: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
6360: 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20  t inTrans = 0;. 
6370: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6380: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
6390: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
63a0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
63b0: 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d  lloc();.  for(i=
63c0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
63d0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  +){.    if( db->
63e0: 61 44 62 5b 69 5d 2e 70 42 74 20 29 7b 0a 20 20  aDb[i].pBt ){.  
63f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
6400: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 64 62  treeIsInTrans(db
6410: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b  ->aDb[i].pBt) ){
6420: 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73  .        inTrans
6430: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
6440: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
6450: 52 6f 6c 6c 62 61 63 6b 28 64 62 2d 3e 61 44 62  Rollback(db->aDb
6460: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20 20  [i].pBt);.      
6470: 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72 61  db->aDb[i].inTra
6480: 6e 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ns = 0;.    }.  
6490: 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52  }.  sqlite3VtabR
64a0: 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73  ollback(db);.  s
64b0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
64c0: 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20  alloc();..  if( 
64d0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
64e0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
64f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
6500: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
6510: 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73  ments(db);.    s
6520: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
6530: 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d 31  nalSchema(db, -1
6540: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 79  );.  }..  /* Any
6550: 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
6560: 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20  aint violations 
6570: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
6580: 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d  solved. */.  db-
6590: 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
65a0: 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65   0;..  /* If one
65b0: 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67   has been config
65c0: 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65  ured, invoke the
65d0: 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63   rollback-hook c
65e0: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  allback */.  if(
65f0: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
6600: 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61  llback && (inTra
6610: 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43  ns || !db->autoC
6620: 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62  ommit) ){.    db
6630: 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
6640: 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  ack(db->pRollbac
6650: 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  kArg);.  }.}../*
6660: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61  .** Return a sta
6670: 74 69 63 20 73 74 72 69 6e 67 20 74 68 61 74 20  tic string that 
6680: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69  describes the ki
6690: 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63  nd of error spec
66a0: 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
66b0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e  argument..*/.con
66c0: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
66d0: 45 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a  ErrStr(int rc){.
66e0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
66f0: 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b  har* const aMsg[
6700: 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c  ] = {.    /* SQL
6710: 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20  ITE_OK          
6720: 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72  */ "not an error
6730: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6740: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20  _ERROR       */ 
6750: 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72  "SQL logic error
6760: 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61   or missing data
6770: 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  base",.    /* SQ
6780: 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20  LITE_INTERNAL   
6790: 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51   */ 0,.    /* SQ
67a0: 4c 49 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20  LITE_PERM       
67b0: 20 2a 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d   */ "access perm
67c0: 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a  ission denied",.
67d0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42      /* SQLITE_AB
67e0: 4f 52 54 20 20 20 20 20 20 20 2a 2f 20 22 63 61  ORT       */ "ca
67f0: 6c 6c 62 61 63 6b 20 72 65 71 75 65 73 74 65 64  llback requested
6800: 20 71 75 65 72 79 20 61 62 6f 72 74 22 2c 0a 20   query abort",. 
6810: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53     /* SQLITE_BUS
6820: 59 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74  Y        */ "dat
6830: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22  abase is locked"
6840: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6850: 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22  LOCKED      */ "
6860: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69  database table i
6870: 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f  s locked",.    /
6880: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20  * SQLITE_NOMEM  
6890: 20 20 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20       */ "out of 
68a0: 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20  memory",.    /* 
68b0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
68c0: 20 20 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74     */ "attempt t
68d0: 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e  o write a readon
68e0: 6c 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20  ly database",.  
68f0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45    /* SQLITE_INTE
6900: 52 52 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65  RRUPT   */ "inte
6910: 72 72 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a  rrupted",.    /*
6920: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20   SQLITE_IOERR   
6930: 20 20 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f      */ "disk I/O
6940: 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20   error",.    /* 
6950: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20  SQLITE_CORRUPT  
6960: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
6970: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
6980: 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a  lformed",.    /*
6990: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
69a0: 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20      */ "unknown 
69b0: 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20  operation",.    
69c0: 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20  /* SQLITE_FULL  
69d0: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
69e0: 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75  se or disk is fu
69f0: 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ll",.    /* SQLI
6a00: 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a  TE_CANTOPEN    *
6a10: 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  / "unable to ope
6a20: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22  n database file"
6a30: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6a40: 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22  PROTOCOL    */ "
6a50: 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
6a60: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6a70: 5f 45 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20  _EMPTY       */ 
6a80: 22 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20  "table contains 
6a90: 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a  no data",.    /*
6aa0: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20   SQLITE_SCHEMA  
6ab0: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
6ac0: 20 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e   schema has chan
6ad0: 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ged",.    /* SQL
6ae0: 49 54 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20  ITE_TOOBIG      
6af0: 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c  */ "string or bl
6b00: 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20  ob too big",.   
6b10: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   /* SQLITE_CONST
6b20: 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74  RAINT  */ "const
6b30: 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20  raint failed",. 
6b40: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53     /* SQLITE_MIS
6b50: 4d 41 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74  MATCH    */ "dat
6b60: 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c  atype mismatch",
6b70: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  .    /* SQLITE_M
6b80: 49 53 55 53 45 20 20 20 20 20 20 2a 2f 20 22 6c  ISUSE      */ "l
6b90: 69 62 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63  ibrary routine c
6ba0: 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71  alled out of seq
6bb0: 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53  uence",.    /* S
6bc0: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20  QLITE_NOLFS     
6bd0: 20 20 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c 65    */ "large file
6be0: 20 73 75 70 70 6f 72 74 20 69 73 20 64 69 73 61   support is disa
6bf0: 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  bled",.    /* SQ
6c00: 4c 49 54 45 5f 41 55 54 48 20 20 20 20 20 20 20  LITE_AUTH       
6c10: 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69   */ "authorizati
6c20: 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20  on denied",.    
6c30: 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  /* SQLITE_FORMAT
6c40: 20 20 20 20 20 20 2a 2f 20 22 61 75 78 69 6c 69        */ "auxili
6c50: 61 72 79 20 64 61 74 61 62 61 73 65 20 66 6f 72  ary database for
6c60: 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  mat error",.    
6c70: 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20  /* SQLITE_RANGE 
6c80: 20 20 20 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f        */ "bind o
6c90: 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f  r column index o
6ca0: 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20  ut of range",.  
6cb0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41    /* SQLITE_NOTA
6cc0: 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65  DB      */ "file
6cd0: 20 69 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72   is encrypted or
6ce0: 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61   is not a databa
6cf0: 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 72 63 20 26  se",.  };.  rc &
6d00: 3d 20 30 78 66 66 3b 0a 20 20 69 66 28 20 41 4c  = 0xff;.  if( AL
6d10: 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72  WAYS(rc>=0) && r
6d20: 63 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 61  c<(int)(sizeof(a
6d30: 4d 73 67 29 2f 73 69 7a 65 6f 66 28 61 4d 73 67  Msg)/sizeof(aMsg
6d40: 5b 30 5d 29 29 20 26 26 20 61 4d 73 67 5b 72 63  [0])) && aMsg[rc
6d50: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ]!=0 ){.    retu
6d60: 72 6e 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 7d  rn aMsg[rc];.  }
6d70: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6d80: 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22   "unknown error"
6d90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
6da0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
6db0: 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61  ements a busy ca
6dc0: 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65  llback that slee
6dd0: 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20  ps and tries.** 
6de0: 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69  again until a ti
6df0: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72  meout value is r
6e00: 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d  eached.  The tim
6e10: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a  eout value is.**
6e20: 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
6e30: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
6e40: 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  ds passed in as 
6e50: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
6e60: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
6e70: 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75   int sqliteDefau
6e80: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a  ltBusyCallback(.
6e90: 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20   void *ptr,     
6ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
6eb0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6ec0: 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20   */. int count  
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ee0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
6ef0: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
6f00: 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53  busy */.){.#if S
6f10: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20  QLITE_OS_WIN || 
6f20: 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53  (defined(HAVE_US
6f30: 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
6f40: 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63 20 63  LEEP).  static c
6f50: 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d  onst u8 delays[]
6f60: 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20   =.     { 1, 2, 
6f70: 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32  5, 10, 15, 20, 2
6f80: 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c  5, 25,  25,  50,
6f90: 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73    50, 100 };.  s
6fa0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74  tatic const u8 t
6fb0: 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  otals[] =.     {
6fc0: 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38   0, 1, 3,  8, 18
6fd0: 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30  , 33, 53, 78, 10
6fe0: 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38  3, 128, 178, 228
6ff0: 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45   };.# define NDE
7000: 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28 64 65  LAY ArraySize(de
7010: 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20  lays).  sqlite3 
7020: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
7030: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
7040: 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69  out = db->busyTi
7050: 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c  meout;.  int del
7060: 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73  ay, prior;..  as
7070: 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29  sert( count>=0 )
7080: 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20  ;.  if( count < 
7090: 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65  NDELAY ){.    de
70a0: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75  lay = delays[cou
70b0: 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  nt];.    prior =
70c0: 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a   totals[count];.
70d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c    }else{.    del
70e0: 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c  ay = delays[NDEL
70f0: 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72  AY-1];.    prior
7100: 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59   = totals[NDELAY
7110: 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75  -1] + delay*(cou
7120: 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a  nt-(NDELAY-1));.
7130: 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20    }.  if( prior 
7140: 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75  + delay > timeou
7150: 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  t ){.    delay =
7160: 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72   timeout - prior
7170: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c  ;.    if( delay<
7180: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7190: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
71a0: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65  eep(db->pVfs, de
71b0: 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  lay*1000);.  ret
71c0: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73  urn 1;.#else.  s
71d0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
71e0: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
71f0: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73  nt timeout = ((s
7200: 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62  qlite3 *)ptr)->b
7210: 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66  usyTimeout;.  if
7220: 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30  ( (count+1)*1000
7230: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
7240: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7250: 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70    sqlite3OsSleep
7260: 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30  (db->pVfs, 10000
7270: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
7280: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
7290: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
72a0: 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a  n busy handler..
72b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
72c0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
72d0: 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66  n an operation f
72e0: 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63  ailed with a loc
72f0: 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  k..** If this ro
7300: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f  utine returns no
7310: 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
7320: 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66   is retried.  If
7330: 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30   it.** returns 0
7340: 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  , the operation 
7350: 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53  aborts with an S
7360: 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
7370: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7380: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
7390: 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  r(BusyHandler *p
73a0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
73b0: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c  f( NEVER(p==0) |
73c0: 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c  | p->xFunc==0 ||
73d0: 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65   p->nBusy<0 ) re
73e0: 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70  turn 0;.  rc = p
73f0: 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c  ->xFunc(p->pArg,
7400: 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66   p->nBusy);.  if
7410: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc==0 ){.    p
7420: 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20  ->nBusy = -1;.  
7430: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42  }else{.    p->nB
7440: 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  usy++;.  }.  ret
7450: 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  urn rc; .}../*.*
7460: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
7470: 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c  ets the busy cal
7480: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
7490: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
74a0: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
74b0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
74c0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
74d0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
74e0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
74f0: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
7500: 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  db,.  int (*xBus
7510: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20  y)(void*,int),. 
7520: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
7530: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
7540: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
7550: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
7560: 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79  er.xFunc = xBusy
7570: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
7580: 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b  ler.pArg = pArg;
7590: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
75a0: 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
75b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
75c0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
75d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
75e0: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
75f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
7600: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
7610: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7620: 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73  sets the progres
7630: 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  s callback for a
7640: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
7650: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
7660: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
7670: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
7680: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  en argument. The
7690: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
76a0: 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e  ck will.** be in
76b0: 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73  voked every nOps
76c0: 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69   opcodes..*/.voi
76d0: 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65  d sqlite3_progre
76e0: 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  ss_handler(.  sq
76f0: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
7700: 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a  t nOps,.  int (*
7710: 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a  xProgress)(void*
7720: 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ), .  void *pArg
7730: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
7740: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
7750: 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73  tex);.  if( nOps
7760: 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50  >0 ){.    db->xP
7770: 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72  rogress = xProgr
7780: 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  ess;.    db->nPr
7790: 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f 70 73  ogressOps = nOps
77a0: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
77b0: 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  essArg = pArg;. 
77c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
77d0: 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  xProgress = 0;. 
77e0: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
77f0: 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  Ops = 0;.    db-
7800: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
7810: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
7820: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
7830: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
7840: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
7850: 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20  outine installs 
7860: 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68  a default busy h
7870: 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74  andler that wait
7880: 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65  s for the.** spe
7890: 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66  cified number of
78a0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65   milliseconds be
78b0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30  fore returning 0
78c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
78d0: 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71  _busy_timeout(sq
78e0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d  lite3 *db, int m
78f0: 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20 29  s){.  if( ms>0 )
7900: 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69  {.    db->busyTi
7910: 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 20 20  meout = ms;.    
7920: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
7930: 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44  dler(db, sqliteD
7940: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
7950: 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a  ck, (void*)db);.
7960: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
7970: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
7980: 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  r(db, 0, 0);.  }
7990: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
79a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  _OK;.}../*.** Ca
79b0: 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20  use any pending 
79c0: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f  operation to sto
79d0: 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73  p at its earlies
79e0: 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a  t opportunity..*
79f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69  /.void sqlite3_i
7a00: 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33  nterrupt(sqlite3
7a10: 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31 2e   *db){.  db->u1.
7a20: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20  isInterrupted = 
7a30: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  1;.}.../*.** Thi
7a40: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78  s function is ex
7a50: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61  actly the same a
7a60: 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  s sqlite3_create
7a70: 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63  _function(), exc
7a80: 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ept.** that it i
7a90: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65  s designed to be
7aa0: 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72   called by inter
7ab0: 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69  nal code. The di
7ac0: 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74  fference is.** t
7ad0: 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  hat if a malloc(
7ae0: 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74  ) fails in sqlit
7af0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7b00: 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63  on(), an error c
7b10: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ode.** is return
7b20: 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f  ed and the mallo
7b30: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65  cFailed flag cle
7b40: 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  ared. .*/.int sq
7b50: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
7b60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
7b70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
7b80: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69  unctionName,.  i
7b90: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
7ba0: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65  nc,.  void *pUse
7bb0: 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a  rData,.  void (*
7bc0: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
7bd0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
7be0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
7bf0: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
7c00: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
7c10: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
7c20: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
7c30: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
7c40: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e  context*),.  Fun
7c50: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65  cDestructor *pDe
7c60: 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75  structor.){.  Fu
7c70: 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20  ncDef *p;.  int 
7c80: 6e 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65 72 74  nName;..  assert
7c90: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7ca0: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
7cb0: 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69  );.  if( zFuncti
7cc0: 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20  onName==0 ||.   
7cd0: 20 20 20 28 78 46 75 6e 63 20 26 26 20 28 78 46     (xFunc && (xF
7ce0: 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29 29 20  inal || xStep)) 
7cf0: 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46 75 6e  || .      (!xFun
7d00: 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26 26 20  c && (xFinal && 
7d10: 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20  !xStep)) ||.    
7d20: 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 21 78    (!xFunc && (!x
7d30: 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70 29 29  Final && xStep))
7d40: 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72 67 3c   ||.      (nArg<
7d50: 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54  -1 || nArg>SQLIT
7d60: 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
7d70: 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28 32 35  RG) ||.      (25
7d80: 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  5<(nName = sqlit
7d90: 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e  e3Strlen30( zFun
7da0: 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a  ctionName))) ){.
7db0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7dc0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
7dd0: 20 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51   }.  .#ifndef SQ
7de0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
7df0: 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55    /* If SQLITE_U
7e00: 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65  TF16 is specifie
7e10: 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  d as the encodin
7e20: 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72  g type, transfor
7e30: 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f  m this.  ** to o
7e40: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
7e50: 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
7e60: 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65  TF16BE using the
7e70: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  .  ** SQLITE_UTF
7e80: 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20  16NATIVE macro. 
7e90: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
7ea0: 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
7eb0: 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  lly..  **.  ** I
7ec0: 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20  f SQLITE_ANY is 
7ed0: 73 70 65 63 69 66 69 65 64 2c 20 61 64 64 20 74  specified, add t
7ee0: 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  hree versions of
7ef0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20   the function.  
7f00: 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20 74  ** to the hash t
7f10: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
7f20: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46   enc==SQLITE_UTF
7f30: 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20  16 ){.    enc = 
7f40: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
7f50: 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  VE;.  }else if( 
7f60: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20  enc==SQLITE_ANY 
7f70: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
7f80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
7f90: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
7fa0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
7fb0: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
7fc0: 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61           pUserDa
7fd0: 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70  ta, xFunc, xStep
7fe0: 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72  , xFinal, pDestr
7ff0: 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  uctor);.    if( 
8000: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8010: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
8020: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
8030: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
8040: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
8050: 46 31 36 4c 45 2c 0a 20 20 20 20 20 20 20 20 20  F16LE,.         
8060: 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e   pUserData, xFun
8070: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
8080: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
8090: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
80a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
80b0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
80c0: 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20      }.    enc = 
80d0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a  SQLITE_UTF16BE;.
80e0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20    }.#else.  enc 
80f0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
8100: 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68  endif.  .  /* Ch
8110: 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69  eck if an existi
8120: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  ng function is b
8130: 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20  eing overridden 
8140: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73  or deleted. If s
8150: 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72  o,.  ** and ther
8160: 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
8170: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51  , then return SQ
8180: 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20  LITE_BUSY. If a 
8190: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
81a0: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
81b0: 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68  n/deleted but th
81c0: 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76  ere are no activ
81d0: 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65  e VMs, allow the
81e0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  .  ** operation 
81f0: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20  to continue but 
8200: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
8210: 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  recompiled state
8220: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20  ments..  */.  p 
8230: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
8240: 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74  ction(db, zFunct
8250: 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  ionName, nName, 
8260: 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30  nArg, (u8)enc, 0
8270: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
8280: 3e 69 50 72 65 66 45 6e 63 3d 3d 65 6e 63 20 26  >iPrefEnc==enc &
8290: 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20  & p->nArg==nArg 
82a0: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  ){.    if( db->a
82b0: 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a  ctiveVdbeCnt ){.
82c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
82d0: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
82e0: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
82f0: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
8300: 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74  odify user-funct
8310: 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76  ion due to activ
8320: 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
8330: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
8340: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8350: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8360: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
8370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
8380: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
8390: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
83a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
83b0: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
83c0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
83d0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
83e0: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
83f0: 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20   1);.  assert(p 
8400: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
8410: 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29  led);.  if( !p )
8420: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8430: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
8440: 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72    /* If an older
8450: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
8460: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20  function with a 
8470: 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72  configured destr
8480: 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65  uctor is.  ** be
8490: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76  ing replaced inv
84a0: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
84b0: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65  or function here
84c0: 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44  . */.  functionD
84d0: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a  estroy(db, p);..
84e0: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
84f0: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
8500: 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ctor->nRef++;.  
8510: 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74  }.  p->pDestruct
8520: 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72  or = pDestructor
8530: 3b 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 30  ;.  p->flags = 0
8540: 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78  ;.  p->xFunc = x
8550: 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70  Func;.  p->xStep
8560: 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78   = xStep;.  p->x
8570: 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61  Finalize = xFina
8580: 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74  l;.  p->pUserDat
8590: 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20  a = pUserData;. 
85a0: 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29   p->nArg = (u16)
85b0: 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53  nArg;.  return S
85c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
85d0: 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73  ** Create new us
85e0: 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  er functions..*/
85f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
8600: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
8610: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
8620: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
8630: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
8640: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
8650: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  *p,.  void (*xFu
8660: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
8670: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
8680: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
8690: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
86a0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
86b0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
86c0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
86d0: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
86e0: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75  text*).){.  retu
86f0: 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
8700: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
8710: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
8720: 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  nc, p, xFunc, xS
8730: 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tep,.           
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8750: 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c           xFinal,
8760: 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69   0);.}..int sqli
8770: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8780: 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
8790: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
87a0: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
87b0: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
87c0: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
87d0: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
87e0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
87f0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
8800: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
8810: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
8820: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
8830: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
8840: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
8850: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
8860: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  ,.  void (*xDest
8870: 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a  roy)(void *).){.
8880: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
8890: 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44  E_ERROR;.  FuncD
88a0: 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20  estructor *pArg 
88b0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
88c0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
88d0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65  utex);.  if( xDe
88e0: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72  stroy ){.    pAr
88f0: 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63  g = (FuncDestruc
8900: 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  tor *)sqlite3DbM
8910: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
8920: 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63  zeof(FuncDestruc
8930: 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  tor));.    if( !
8940: 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44  pArg ){.      xD
8950: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20  estroy(p);.     
8960: 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d   goto out;.    }
8970: 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74  .    pArg->xDest
8980: 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a  roy = xDestroy;.
8990: 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44      pArg->pUserD
89a0: 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72  ata = p;.  }.  r
89b0: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
89c0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c  eFunc(db, zFunc,
89d0: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
89e0: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
89f0: 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66  nal, pArg);.  if
8a00: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
8a10: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nRef==0 ){.    a
8a20: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
8a30: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73  E_OK );.    xDes
8a40: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c  troy(p);.    sql
8a50: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8a60: 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a  Arg);.  }.. out:
8a70: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
8a80: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
8a90: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
8aa0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
8ab0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
8ac0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8ad0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20  _OMIT_UTF16.int 
8ae0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
8af0: 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  unction16(.  sql
8b00: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
8b10: 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f  t void *zFunctio
8b20: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
8b30: 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  g,.  int eTextRe
8b40: 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  p,.  void *p,.  
8b50: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
8b60: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
8b70: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
8b80: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
8b90: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
8ba0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
8bb0: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
8bc0: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
8bd0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
8be0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
8bf0: 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71  ar *zFunc8;.  sq
8c00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
8c10: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
8c20: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
8c30: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
8c40: 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55  Func8 = sqlite3U
8c50: 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e  tf16to8(db, zFun
8c60: 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53  ctionName, -1, S
8c70: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
8c80: 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  E);.  rc = sqlit
8c90: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
8ca0: 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65   zFunc8, nArg, e
8cb0: 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46 75 6e  TextRep, p, xFun
8cc0: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
8cd0: 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ,0);.  sqlite3Db
8ce0: 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29  Free(db, zFunc8)
8cf0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8d00: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
8d10: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8d20: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
8d30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
8d40: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
8d50: 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
8d60: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
8d70: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
8d80: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
8d90: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
8da0: 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
8db0: 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
8dc0: 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
8dd0: 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
8de0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
8df0: 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
8e00: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
8e10: 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
8e20: 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
8e30: 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
8e40: 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
8e50: 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
8e60: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
8e70: 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
8e80: 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
8e90: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
8ea0: 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
8eb0: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
8ec0: 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
8ed0: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
8ee0: 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
8ef0: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
8f00: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
8f10: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
8f20: 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
8f30: 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
8f40: 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
8f50: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
8f60: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
8f70: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
8f80: 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
8f90: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
8fa0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
8fb0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
8fc0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
8fd0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
8fe0: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  ( sqlite3FindFun
8ff0: 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ction(db, zName,
9000: 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51   nName, nArg, SQ
9010: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30  LITE_UTF8, 0)==0
9020: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
9030: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e  reateFunc(db, zN
9040: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
9050: 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20  E_UTF8,.        
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
9070: 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46   sqlite3InvalidF
9080: 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  unction, 0, 0, 0
9090: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
90a0: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
90b0: 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73   SQLITE_OK);.  s
90c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
90d0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
90e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
90f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9100: 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52  IT_TRACE./*.** R
9110: 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20  egister a trace 
9120: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  function.  The p
9130: 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65  Arg from the pre
9140: 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
9150: 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72  ed trace.** is r
9160: 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a  eturned.  .**.**
9170: 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75   A NULL trace fu
9180: 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  nction means tha
9190: 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20  t no tracing is 
91a0: 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e  executes.  A non
91b0: 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69  -NULL.** trace i
91c0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
91d0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
91e0: 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
91f0: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a   start of each.*
9200: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  * SQL statement.
9210: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
9220: 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20  3_trace(sqlite3 
9230: 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61  *db, void (*xTra
9240: 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  ce)(void*,const 
9250: 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41  char*), void *pA
9260: 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  rg){.  void *pOl
9270: 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  d;.  sqlite3_mut
9280: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
9290: 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62  ex);.  pOld = db
92a0: 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64  ->pTraceArg;.  d
92b0: 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61  b->xTrace = xTra
92c0: 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65  ce;.  db->pTrace
92d0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
92e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
92f0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
9300: 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f  return pOld;.}./
9310: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
9320: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
9330: 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d  .  The pArg from
9340: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
9350: 72 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70  registered .** p
9360: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20  rofile function 
9370: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a  is returned.  .*
9380: 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66  *.** A NULL prof
9390: 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61  ile function mea
93a0: 6e 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69  ns that no profi
93b0: 6c 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73  ling is executes
93c0: 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  .  A non-NULL.**
93d0: 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f   profile is a po
93e0: 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
93f0: 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f  ion that is invo
9400: 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  ked at the concl
9410: 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68  usion of.** each
9420: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
9430: 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76  hat is run..*/.v
9440: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f  oid *sqlite3_pro
9450: 66 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20  file(.  sqlite3 
9460: 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50  *db,.  void (*xP
9470: 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f  rofile)(void*,co
9480: 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65  nst char*,sqlite
9490: 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64  _uint64),.  void
94a0: 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64   *pArg.){.  void
94b0: 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65   *pOld;.  sqlite
94c0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
94d0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
94e0: 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41   = db->pProfileA
94f0: 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69  rg;.  db->xProfi
9500: 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20  le = xProfile;. 
9510: 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67   db->pProfileArg
9520: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
9530: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
9540: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
9550: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64  urn pOld;.}.#end
9560: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
9570: 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a  T_TRACE */../***
9580: 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 2a 2a   EXPERIMENTAL **
9590: 2a 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  *.**.** Register
95a0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62   a function to b
95b0: 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61  e invoked when a
95c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
95d0: 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65  ments..** If the
95e0: 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f   invoked functio
95f0: 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  n returns non-ze
9600: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d  ro, then the com
9610: 6d 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a  mit becomes a.**
9620: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f   rollback..*/.vo
9630: 69 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d  id *sqlite3_comm
9640: 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  it_hook(.  sqlit
9650: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
9660: 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
9670: 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
9680: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
9690: 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  t (*xCallback)(v
96a0: 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74  oid*),  /* Funct
96b0: 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e  ion to invoke on
96c0: 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a   each commit */.
96d0: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
96f0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
9700: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
9710: 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71  void *pOld;.  sq
9720: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
9730: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
9740: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d  pOld = db->pComm
9750: 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f  itArg;.  db->xCo
9760: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78  mmitCallback = x
9770: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
9780: 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72  pCommitArg = pAr
9790: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
97a0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
97b0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
97c0: 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  ld;.}../*.** Reg
97d0: 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
97e0: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
97f0: 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69  ach time a row i
9800: 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e  s updated,.** in
9810: 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65  serted or delete
9820: 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74  d using this dat
9830: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
9840: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
9850: 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a  e3_update_hook(.
9860: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
9870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9880: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
9890: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
98a0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
98b0: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74  lback)(void*,int
98c0: 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68  ,char const *,ch
98d0: 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74  ar const *,sqlit
98e0: 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64  e_int64),.  void
98f0: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
9900: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
9910: 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
9920: 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
9930: 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pRet;.  sqlite3_
9940: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
9950: 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
9960: 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b   db->pUpdateArg;
9970: 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61  .  db->xUpdateCa
9980: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
9990: 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74  ck;.  db->pUpdat
99a0: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
99b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
99c0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
99d0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
99e0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
99f0: 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
9a00: 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
9a10: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
9a20: 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   is rolled.** ba
9a30: 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ck by this datab
9a40: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
9a50: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
9a60: 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a  _rollback_hook(.
9a70: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9a90: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
9aa0: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
9ab0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
9ac0: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f  lback)(void*), /
9ad0: 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  * Callback funct
9ae0: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
9af0: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
9b00: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
9b10: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
9b20: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
9b30: 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  t;.  sqlite3_mut
9b40: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
9b50: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
9b60: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a  ->pRollbackArg;.
9b70: 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43    db->xRollbackC
9b80: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
9b90: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c  ack;.  db->pRoll
9ba0: 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a  backArg = pArg;.
9bb0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9bc0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
9bd0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
9be0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
9bf0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
9c00: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61  * The sqlite3_wa
9c10: 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63  l_hook() callbac
9c20: 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20  k registered by 
9c30: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
9c40: 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a  checkpoint()..**
9c50: 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f   Invoke sqlite3_
9c60: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69  wal_checkpoint i
9c70: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
9c80: 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f  frames in the lo
9c90: 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65  g file.** is gre
9ca0: 61 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65  ater than sqlite
9cb0: 33 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20 74  3.pWalArg cast t
9cc0: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68  o an integer (th
9cd0: 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72  e value configur
9ce0: 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74  ed by.** wal_aut
9cf0: 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a  ocheckpoint())..
9d00: 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  */ .int sqlite3W
9d10: 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20  alDefaultHook(. 
9d20: 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61   void *pClientDa
9d30: 74 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  ta,     /* Argum
9d40: 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ent */.  sqlite3
9d50: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
9d60: 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  /* Connection */
9d70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9d80: 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74  Db,       /* Dat
9d90: 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
9da0: 46 72 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  Frame           
9db0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c    /* Size of WAL
9dc0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72   */.){.  if( nFr
9dd0: 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f  ame>=SQLITE_PTR_
9de0: 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61  TO_INT(pClientDa
9df0: 74 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ta) ){.    sqlit
9e00: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
9e10: 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  loc();.    sqlit
9e20: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
9e30: 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20  t(db, zDb);.    
9e40: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
9e50: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20  Malloc();.  }.  
9e60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9e70: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9e80: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
9e90: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ../*.** Configur
9ea0: 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c  e an sqlite3_wal
9eb0: 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b  _hook() callback
9ec0: 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   to automaticall
9ed0: 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  y checkpoint.** 
9ee0: 61 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  a database after
9ef0: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
9f00: 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
9f10: 72 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72  re are nFrame or
9f20: 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20  .** more frames 
9f30: 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  in the log file.
9f40: 20 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72   Passing zero or
9f50: 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   a negative valu
9f60: 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61  e as the.** nFra
9f70: 6d 65 20 70 61 72 61 6d 65 74 65 72 20 64 69 73  me parameter dis
9f80: 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20  ables automatic 
9f90: 63 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69  checkpoints enti
9fa0: 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rely..**.** The 
9fb0: 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65  callback registe
9fc0: 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
9fd0: 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e  tion replaces an
9fe0: 79 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62  y existing callb
9ff0: 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65  ack.** registere
a000: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  d using sqlite3_
a010: 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65  wal_hook(). Like
a020: 77 69 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e  wise, registerin
a030: 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  g a callback.** 
a040: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61  using sqlite3_wa
a050: 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65  l_hook() disable
a060: 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  s the automatic 
a070: 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61  checkpoint mecha
a080: 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72  nism.** configur
a090: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
a0a0: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
a0b0: 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  te3_wal_autochec
a0c0: 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
a0d0: 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b  db, int nFrame){
a0e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
a0f0: 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44  MIT_WAL.  UNUSED
a100: 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
a110: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
a120: 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73  ER(nFrame);.#els
a130: 65 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30  e.  if( nFrame>0
a140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
a150: 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c  wal_hook(db, sql
a160: 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f  ite3WalDefaultHo
a170: 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54  ok, SQLITE_INT_T
a180: 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a  O_PTR(nFrame));.
a190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
a1a0: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62  ite3_wal_hook(db
a1b0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
a1c0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
a1d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
a1e0: 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
a1f0: 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
a200: 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74  ed each time a t
a210: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72  ransaction is wr
a220: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68  itten.** into th
a230: 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f  e write-ahead-lo
a240: 67 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  g by this databa
a250: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
a260: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
a270: 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  wal_hook(.  sqli
a280: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
a290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
a2a0: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
a2b0: 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65  o this db handle
a2c0: 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c   */.  int(*xCall
a2d0: 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71  back)(void *, sq
a2e0: 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68  lite3*, const ch
a2f0: 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69  ar*, int),.  voi
a300: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a320: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  First argument p
a330: 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61  assed to xCallba
a340: 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  ck() */.){.#ifnd
a350: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
a360: 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b  AL.  void *pRet;
a370: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a380: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
a390: 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
a3a0: 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78  pWalArg;.  db->x
a3b0: 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  WalCallback = xC
a3c0: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
a3d0: 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  WalArg = pArg;. 
a3e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
a3f0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
a400: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
a410: 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30  #else.  return 0
a420: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
a430: 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74  * Checkpoint dat
a440: 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e  abase zDb..*/.in
a450: 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  t sqlite3_wal_ch
a460: 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73  eckpoint_v2(.  s
a470: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a490: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
a4a0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
a4b0: 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20  r *zDb,         
a4c0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
a4d0: 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  f attached datab
a4e0: 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ase (or NULL) */
a4f0: 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20  .  int eMode,   
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45     /* SQLITE_CHE
a520: 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20  CKPOINT_* value 
a530: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c  */.  int *pnLog,
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a       /* OUT: Siz
a560: 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20  e of WAL log in 
a570: 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20  frames */.  int 
a580: 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20  *pnCkpt         
a590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
a5a0: 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72  UT: Total number
a5b0: 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b   of frames check
a5c0: 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69  pointed */.){.#i
a5d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
a5e0: 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51  _WAL.  return SQ
a5f0: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
a600: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a620: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
a630: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53  */.  int iDb = S
a640: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
a650: 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e  ED;  /* sqlite3.
a660: 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64  aDb[] index of d
a670: 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20  b to checkpoint 
a680: 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  */..  /* Initial
a690: 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 76  ize the output v
a6a0: 61 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69  ariables to -1 i
a6b0: 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
a6c0: 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28  occurs. */.  if(
a6d0: 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20   pnLog ) *pnLog 
a6e0: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b  = -1;.  if( pnCk
a6f0: 70 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d  pt ) *pnCkpt = -
a700: 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51  1;..  assert( SQ
a710: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
a720: 46 55 4c 4c 3e 53 51 4c 49 54 45 5f 43 48 45 43  FULL>SQLITE_CHEC
a730: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 29  KPOINT_PASSIVE )
a740: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
a750: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55  TE_CHECKPOINT_FU
a760: 4c 4c 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  LL<SQLITE_CHECKP
a770: 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a  OINT_RESTART );.
a780: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
a790: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
a7a0: 49 56 45 2b 32 3d 3d 53 51 4c 49 54 45 5f 43 48  IVE+2==SQLITE_CH
a7b0: 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54  ECKPOINT_RESTART
a7c0: 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c   );.  if( eMode<
a7d0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
a7e0: 54 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f  T_PASSIVE || eMo
a7f0: 64 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  de>SQLITE_CHECKP
a800: 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29 7b 0a  OINT_RESTART ){.
a810: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a820: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20  E_MISUSE;.  }.. 
a830: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
a840: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
a850: 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44  .  if( zDb && zD
a860: 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20  b[0] ){.    iDb 
a870: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
a880: 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  ame(db, zDb);.  
a890: 7d 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b  }.  if( iDb<0 ){
a8a0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
a8b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
a8c0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
a8d0: 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e  ITE_ERROR, "unkn
a8e0: 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73  own database: %s
a8f0: 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65  ", zDb);.  }else
a900: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
a910: 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  e3Checkpoint(db,
a920: 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c   iDb, eMode, pnL
a930: 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20  og, pnCkpt);.   
a940: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
a950: 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  , rc, 0);.  }.  
a960: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
a970: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
a980: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
a990: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
a9a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
a9b0: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  if.}.../*.** Che
a9c0: 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65  ckpoint database
a9d0: 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20   zDb. If zDb is 
a9e0: 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20  NULL, or if the 
a9f0: 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74  buffer zDb point
aa00: 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73  s.** to contains
aa10: 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73   a zero-length s
aa20: 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63  tring, all attac
aa30: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72  hed databases ar
aa40: 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74  e .** checkpoint
aa50: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
aa60: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
aa70: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  t(sqlite3 *db, c
aa80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
aa90: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
aaa0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
aab0: 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c  _v2(db, zDb, SQL
aac0: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
aad0: 41 53 53 49 56 45 2c 20 30 2c 20 30 29 3b 0a 7d  ASSIVE, 0, 0);.}
aae0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
aaf0: 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
ab00: 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  Run a checkpoint
ab10: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   on database iDb
ab20: 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
ab30: 70 20 69 66 20 64 61 74 61 62 61 73 65 20 69 44  p if database iD
ab40: 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72  b is.** not curr
ab50: 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41  ently open in WA
ab60: 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  L mode..**.** If
ab70: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
ab80: 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  s open on the da
ab90: 74 61 62 61 73 65 20 62 65 69 6e 67 20 63 68 65  tabase being che
aba0: 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20  ckpointed, this 
abb0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
abc0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  urns SQLITE_LOCK
abd0: 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f  ED and a checkpo
abe0: 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  int is not attem
abf0: 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  pted. If .** an 
ac00: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
ac10: 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  le running the c
ac20: 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51  heckpoint, an SQ
ac30: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
ac40: 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
ac50: 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (i.e. SQLITE_IOE
ac60: 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  RR). Otherwise, 
ac70: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
ac80: 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61   The mutex on da
ac90: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
aca0: 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
acb0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  by the caller. T
acc0: 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f  he mutex.** asso
acd0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
ace0: 73 70 65 63 69 66 69 63 20 62 2d 74 72 65 65 20  specific b-tree 
acf0: 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74  being checkpoint
ad00: 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a  ed is taken by.*
ad10: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
ad20: 77 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70  while the checkp
ad30: 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e  oint is running.
ad40: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73  .**.** If iDb is
ad50: 20 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d   passed SQLITE_M
ad60: 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65  AX_ATTACHED, the
ad70: 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
ad80: 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20  atabases are.** 
ad90: 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66  checkpointed. If
ada0: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
adb0: 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 72  ountered it is r
adc0: 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74  eturned immediat
add0: 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65  ely -.** no atte
ade0: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
adf0: 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65  heckpoint any re
ae00: 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65  maining database
ae10: 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  s..**.** Paramet
ae20: 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20  er eMode is one 
ae30: 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  of SQLITE_CHECKP
ae40: 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55  OINT_PASSIVE, FU
ae50: 4c 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a  LL or RESTART..*
ae60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
ae70: 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20  ckpoint(sqlite3 
ae80: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e  *db, int iDb, in
ae90: 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e  t eMode, int *pn
aea0: 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74  Log, int *pnCkpt
aeb0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
aec0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
aed0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
aee0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ode */.  int i; 
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
af10: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
af20: 75 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73  ugh attached dbs
af30: 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20   */.  int bBusy 
af40: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
af50: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
af60: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73   SQLITE_BUSY has
af70: 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
af80: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
af90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
afa0: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
afb0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f  .  assert( !pnLo
afc0: 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20  g || *pnLog==-1 
afd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e  );.  assert( !pn
afe0: 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d  Ckpt || *pnCkpt=
aff0: 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  =-1 );..  for(i=
b000: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20  0; i<db->nDb && 
b010: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
b020: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d  ++){.    if( i==
b030: 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49  iDb || iDb==SQLI
b040: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20  TE_MAX_ATTACHED 
b050: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
b060: 6c 69 74 65 33 42 74 72 65 65 43 68 65 63 6b 70  lite3BtreeCheckp
b070: 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  oint(db->aDb[i].
b080: 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  pBt, eMode, pnLo
b090: 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
b0a0: 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20    pnLog = 0;.   
b0b0: 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20     pnCkpt = 0;. 
b0c0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
b0d0: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
b0e0: 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20      bBusy = 1;. 
b0f0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
b100: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
b110: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
b120: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
b130: 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20 53 51  K && bBusy) ? SQ
b140: 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a  LITE_BUSY : rc;.
b150: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b160: 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
b170: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b180: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65  ion returns true
b190: 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20   if main-memory 
b1a0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69  should be used i
b1b0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74  nstead of.** a t
b1c0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f  emporary file fo
b1d0: 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65  r transient page
b1e0: 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74  r files and stat
b1f0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a  ement journals..
b200: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
b210: 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e  urned depends on
b220: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62   the value of db
b230: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75  ->temp_store (ru
b240: 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74  ntime.** paramet
b250: 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  er) and the comp
b260: 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f  ile time value o
b270: 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
b280: 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c  ORE. The.** foll
b290: 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
b2a0: 72 69 62 65 73 20 74 68 65 20 72 65 6c 61 74 69  ribes the relati
b2b0: 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 74  onship between t
b2c0: 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a  hese two values.
b2d0: 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ** and this func
b2e0: 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c  tions return val
b2f0: 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49  ue..**.**   SQLI
b300: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20  TE_TEMP_STORE   
b310: 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65    db->temp_store
b320: 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66       Location of
b330: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
b340: 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ase.**   -------
b350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
b360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
b370: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
b380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b390: 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20              any 
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
b3c0: 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
b3d0: 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   0).**   1      
b3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b400: 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
b410: 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20  urn 0).**   1   
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b430: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
b440: 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
b450: 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31  return 1).**   1
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
b480: 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
b490: 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
b4a0: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
b4b0: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
b4c0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
b4d0: 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
b4e0: 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
b4f0: 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
b510: 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
b520: 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  1).**   2       
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b550: 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
b560: 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20  rn 1).**   3    
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b580: 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
b590: 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
b5a0: 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20  eturn 1).*/.int 
b5b0: 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
b5c0: 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65  ory(const sqlite
b5d0: 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49  3 *db){.#if SQLI
b5e0: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31  TE_TEMP_STORE==1
b5f0: 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e  .  return ( db->
b600: 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b  temp_store==2 );
b610: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
b620: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32  TE_TEMP_STORE==2
b630: 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e  .  return ( db->
b640: 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b  temp_store!=1 );
b650: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
b660: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33  TE_TEMP_STORE==3
b670: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
b680: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  dif.#if SQLITE_T
b690: 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53  EMP_STORE<1 || S
b6a0: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
b6b0: 3e 33 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  >3.  return 0;.#
b6c0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
b6d0: 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f  eturn UTF-8 enco
b6e0: 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67  ded English lang
b6f0: 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  uage explanation
b700: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
b710: 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f  ent.** error..*/
b720: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
b730: 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69  ite3_errmsg(sqli
b740: 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73  te3 *db){.  cons
b750: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28  t char *z;.  if(
b760: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
b770: 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  rn sqlite3ErrStr
b780: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  (SQLITE_NOMEM);.
b790: 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
b7a0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
b7b0: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
b7c0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
b7d0: 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53  rrStr(SQLITE_MIS
b7e0: 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20  USE_BKPT);.  }. 
b7f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
b800: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
b810: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
b820: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a  cFailed ){.    z
b830: 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72   = sqlite3ErrStr
b840: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  (SQLITE_NOMEM);.
b850: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d    }else{.    z =
b860: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
b870: 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70  value_text(db->p
b880: 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Err);.    assert
b890: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
b8a0: 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  led );.    if( z
b8b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  ==0 ){.      z =
b8c0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
b8d0: 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20  b->errCode);.   
b8e0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
b8f0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
b900: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
b910: 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n z;.}..#ifndef 
b920: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
b930: 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  6./*.** Return U
b940: 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e  TF-16 encoded En
b950: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
b960: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
b970: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
b980: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
b990: 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65   void *sqlite3_e
b9a0: 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20  rrmsg16(sqlite3 
b9b0: 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63  *db){.  static c
b9c0: 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65  onst u16 outOfMe
b9d0: 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c  m[] = {.    'o',
b9e0: 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
b9f0: 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27  'o', 'f', ' ', '
ba00: 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f  m', 'e', 'm', 'o
ba10: 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20  ', 'r', 'y', 0. 
ba20: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
ba30: 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20  st u16 misuse[] 
ba40: 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27  = {.    'l', 'i'
ba50: 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c  , 'b', 'r', 'a',
ba60: 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20   'r', 'y', ' ', 
ba70: 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27  .    'r', 'o', '
ba80: 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e  u', 't', 'i', 'n
ba90: 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'e', ' ', .  
baa0: 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c    'c', 'a', 'l',
bab0: 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20   'l', 'e', 'd', 
bac0: 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27  ' ', .    'o', '
bad0: 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20  u', 't', ' ', . 
bae0: 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27     'o', 'f', ' '
baf0: 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c  , .    's', 'e',
bb00: 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20   'q', 'u', 'e', 
bb10: 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30  'n', 'c', 'e', 0
bb20: 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76  .  };..  const v
bb30: 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64  oid *z;.  if( !d
bb40: 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
bb50: 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d  (void *)outOfMem
bb60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
bb70: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
bb80: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
bb90: 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
bba0: 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20  *)misuse;.  }.  
bbb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
bbc0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
bbd0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
bbe0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
bbf0: 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  = (void *)outOfM
bc00: 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  em;.  }else{.   
bc10: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
bc20: 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
bc30: 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  rr);.    if( z==
bc40: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
bc50: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
bc60: 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 73 71 6c 69  ->pErr, -1, sqli
bc70: 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72  te3ErrStr(db->er
bc80: 72 43 6f 64 65 29 2c 0a 20 20 20 20 20 20 20 20  rCode),.        
bc90: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
bca0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
bcb0: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
bcc0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64  3_value_text16(d
bcd0: 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a  b->pErr);.    }.
bce0: 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28      /* A malloc(
bcf0: 29 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65  ) may have faile
bd00: 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c  d within the cal
bd10: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c  l to sqlite3_val
bd20: 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20  ue_text16().    
bd30: 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69  ** above. If thi
bd40: 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
bd50: 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  hen the db->mall
bd60: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65  ocFailed flag ne
bd70: 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
bd80: 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
bd90: 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68  returning. Do th
bda0: 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73  is directly, ins
bdb0: 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20  tead of via.    
bdc0: 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  ** sqlite3ApiExi
bdd0: 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65  t(), to avoid se
bde0: 74 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  tting the databa
bdf0: 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20  se handle error 
be00: 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  message..    */.
be10: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
be20: 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  iled = 0;.  }.  
be30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
be40: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
be50: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65    return z;.}.#e
be60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
be70: 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
be80: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
be90: 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72  ost recent error
bea0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
beb0: 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75  by an SQLite rou
bec0: 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73  tine. If NULL is
bed0: 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68  .** passed to th
bee0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20  is function, we 
bef0: 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28  assume a malloc(
bf00: 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20  ) failed during 
bf10: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a  sqlite3_open()..
bf20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  */.int sqlite3_e
bf30: 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a  rrcode(sqlite3 *
bf40: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26  db){.  if( db &&
bf50: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
bf60: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
bf70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
bf80: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
bf90: 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62  T;.  }.  if( !db
bfa0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
bfb0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
bfc0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
bfd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62  .  }.  return db
bfe0: 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e  ->errCode & db->
bff0: 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73  errMask;.}.int s
c000: 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
c010: 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20  errcode(sqlite3 
c020: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26  *db){.  if( db &
c030: 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  & !sqlite3Safety
c040: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
c050: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
c060: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
c070: 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  PT;.  }.  if( !d
c080: 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
c090: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
c0a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
c0b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
c0c0: 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f  b->errCode;.}../
c0d0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
c0e0: 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  w collating func
c0f0: 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73  tion for databas
c100: 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d  e "db".  The nam
c110: 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e  e is zName.** an
c120: 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69  d the encoding i
c130: 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  s enc..*/.static
c140: 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61   int createColla
c150: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a  tion(.  sqlite3*
c160: 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   db,.  const cha
c170: 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20  r *zName, .  u8 
c180: 65 6e 63 2c 0a 20 20 75 38 20 63 6f 6c 6c 54 79  enc,.  u8 collTy
c190: 70 65 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  pe,.  void* pCtx
c1a0: 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
c1b0: 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
c1c0: 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
c1d0: 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
c1e0: 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
c1f0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
c200: 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b  oll;.  int enc2;
c210: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
c220: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
c230: 4e 61 6d 65 29 3b 0a 20 20 0a 20 20 61 73 73 65  Name);.  .  asse
c240: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
c250: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
c260: 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51  ) );..  /* If SQ
c270: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70  LITE_UTF16 is sp
c280: 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65  ecified as the e
c290: 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72  ncoding type, tr
c2a0: 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a  ansform this.  *
c2b0: 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49  * to one of SQLI
c2c0: 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51  TE_UTF16LE or SQ
c2d0: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69  LITE_UTF16BE usi
c2e0: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ng the.  ** SQLI
c2f0: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d  TE_UTF16NATIVE m
c300: 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46  acro. SQLITE_UTF
c310: 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  16 is not used i
c320: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
c330: 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20    enc2 = enc;.  
c340: 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
c350: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a  SQLITE_UTF16 );.
c360: 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
c370: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  ==SQLITE_UTF16_A
c380: 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20  LIGNED );.  if( 
c390: 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
c3a0: 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49  16 || enc2==SQLI
c3b0: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
c3c0: 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53   ){.    enc2 = S
c3d0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
c3e0: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63  E;.  }.  if( enc
c3f0: 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  2<SQLITE_UTF8 ||
c400: 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46   enc2>SQLITE_UTF
c410: 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75  16BE ){.    retu
c420: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
c430: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
c440: 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63   Check if this c
c450: 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20  all is removing 
c460: 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20  or replacing an 
c470: 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69  existing collati
c480: 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  on .  ** sequenc
c490: 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68  e. If so, and th
c4a0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
c4b0: 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e  Ms, return busy.
c4c0: 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61   If there.  ** a
c4d0: 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
c4e0: 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  , invalidate any
c4f0: 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
c500: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
c510: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
c520: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
c530: 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
c540: 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   0);.  if( pColl
c550: 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   && pColl->xCmp 
c560: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  ){.    if( db->a
c570: 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a  ctiveVdbeCnt ){.
c580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
c590: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
c5a0: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
c5b0: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
c5c0: 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  odify collation 
c5d0: 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20  sequence due to 
c5e0: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
c5f0: 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
c600: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
c610: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
c620: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
c630: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20  atements(db);.. 
c640: 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69     /* If collati
c650: 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
c660: 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69  l was created di
c670: 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c  rectly by a call
c680: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
c690: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
c6a0: 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e  ion, and not gen
c6b0: 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43  erated by synthC
c6c0: 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a  ollSeq(),.    **
c6d0: 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73   then any copies
c6e0: 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f   made by synthCo
c6f0: 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20  llSeq() need to 
c700: 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  be invalidated..
c710: 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c      ** Also, col
c720: 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f  lation destructo
c730: 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c  r - CollSeq.xDel
c740: 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61  () - function ma
c750: 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  y need.    ** to
c760: 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20   be called..    
c770: 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f  */ .    if( (pCo
c780: 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54  ll->enc & ~SQLIT
c790: 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
c7a0: 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20  ==enc2 ){.      
c7b0: 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d  CollSeq *aColl =
c7c0: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
c7d0: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
c7e0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
c7f0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
c800: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
c810: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
c820: 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c  llSeq *p = &aCol
c830: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
c840: 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  ( p->enc==pColl-
c850: 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  >enc ){.        
c860: 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b    if( p->xDel ){
c870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
c880: 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a  xDel(p->pUser);.
c890: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c8a0: 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20        p->xCmp = 
c8b0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
c8c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
c8d0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
c8e0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
c8f0: 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
c900: 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 1);.  if( pCol
c910: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
c920: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 43  LITE_NOMEM;.  pC
c930: 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d  oll->xCmp = xCom
c940: 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70  pare;.  pColl->p
c950: 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70  User = pCtx;.  p
c960: 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65  Coll->xDel = xDe
c970: 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20  l;.  pColl->enc 
c980: 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65  = (u8)(enc2 | (e
c990: 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31  nc & SQLITE_UTF1
c9a0: 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 70  6_ALIGNED));.  p
c9b0: 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d 20 63 6f 6c  Coll->type = col
c9c0: 6c 54 79 70 65 3b 0a 20 20 73 71 6c 69 74 65 33  lType;.  sqlite3
c9d0: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
c9e0: 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  _OK, 0);.  retur
c9f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ca00: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61  ./*.** This arra
ca10: 79 20 64 65 66 69 6e 65 73 20 68 61 72 64 20 75  y defines hard u
ca20: 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c  pper bounds on l
ca30: 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68  imit values.  Th
ca40: 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72  e.** initializer
ca50: 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e   must be kept in
ca60: 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 53   sync with the S
ca70: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a  QLITE_LIMIT_*.**
ca80: 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c   #defines in sql
ca90: 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69  ite3.h..*/.stati
caa0: 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72  c const int aHar
cab0: 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53  dLimit[] = {.  S
cac0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
cad0: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ,.  SQLITE_MAX_S
cae0: 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  QL_LENGTH,.  SQL
caf0: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a  ITE_MAX_COLUMN,.
cb00: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50    SQLITE_MAX_EXP
cb10: 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54  R_DEPTH,.  SQLIT
cb20: 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
cb30: 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f  ELECT,.  SQLITE_
cb40: 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53  MAX_VDBE_OP,.  S
cb50: 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
cb60: 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45  ON_ARG,.  SQLITE
cb70: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20  _MAX_ATTACHED,. 
cb80: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
cb90: 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c  _PATTERN_LENGTH,
cba0: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41  .  SQLITE_MAX_VA
cbb0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a 20  RIABLE_NUMBER,. 
cbc0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
cbd0: 47 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a 0a 2f  GER_DEPTH,.};../
cbe0: 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
cbf0: 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61  he hard limits a
cc00: 72 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e  re set to reason
cc10: 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23  able values.*/.#
cc20: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  if SQLITE_MAX_LE
cc30: 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72  NGTH<100.# error
cc40: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
cc50: 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
cc60: 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23  ast 100.#endif.#
cc70: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  if SQLITE_MAX_SQ
cc80: 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65  L_LENGTH<100.# e
cc90: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
cca0: 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  SQL_LENGTH must 
ccb0: 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a  be at least 100.
ccc0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
ccd0: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
cce0: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47  >SQLITE_MAX_LENG
ccf0: 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  TH.# error SQLIT
cd00: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
cd10: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65   must not be gre
cd20: 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ater than SQLITE
cd30: 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64  _MAX_LENGTH.#end
cd40: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
cd50: 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
cd60: 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  T<2.# error SQLI
cd70: 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
cd80: 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61  SELECT must be a
cd90: 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66  t least 2.#endif
cda0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
cdb0: 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72  VDBE_OP<40.# err
cdc0: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  or SQLITE_MAX_VD
cdd0: 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74  BE_OP must be at
cde0: 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66   least 40.#endif
cdf0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
ce00: 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c  FUNCTION_ARG<0 |
ce10: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  | SQLITE_MAX_FUN
ce20: 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a 23  CTION_ARG>1000.#
ce30: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
ce40: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d  X_FUNCTION_ARG m
ce50: 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30  ust be between 0
ce60: 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64 69 66   and 1000.#endif
ce70: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
ce80: 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51  ATTACHED<0 || SQ
ce90: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
cea0: 44 3e 36 32 0a 23 20 65 72 72 6f 72 20 53 51 4c  D>62.# error SQL
ceb0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
cec0: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
ced0: 20 30 20 61 6e 64 20 36 32 0a 23 65 6e 64 69 66   0 and 62.#endif
cee0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
cef0: 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
cf00: 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51  GTH<1.# error SQ
cf10: 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
cf20: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73  TTERN_LENGTH mus
cf30: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a  t be at least 1.
cf40: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
cf50: 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37  E_MAX_COLUMN>327
cf60: 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  67.# error SQLIT
cf70: 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73  E_MAX_COLUMN mus
cf80: 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37  t not exceed 327
cf90: 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  67.#endif.#if SQ
cfa0: 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
cfb0: 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72  _DEPTH<1.# error
cfc0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
cfd0: 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62  GER_DEPTH must b
cfe0: 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e  e at least 1.#en
cff0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
d000: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
d010: 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74  a limit.  Report
d020: 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a   the old value..
d030: 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64  ** If an invalid
d040: 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20   limit index is 
d050: 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74  supplied, report
d060: 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20   -1..** Make no 
d070: 63 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c  changes but stil
d080: 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64  l report the old
d090: 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a   value if the.**
d0a0: 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65   new limit is ne
d0b0: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  gative..**.** A 
d0c0: 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  new lower limit 
d0d0: 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20  does not shrink 
d0e0: 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75  existing constru
d0f0: 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c  cts..** It merel
d100: 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63  y prevents new c
d110: 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65  onstructs that e
d120: 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a  xceed the limit.
d130: 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e  ** from forming.
d140: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
d150: 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  limit(sqlite3 *d
d160: 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20  b, int limitId, 
d170: 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20  int newLimit){. 
d180: 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a   int oldLimit;..
d190: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
d1a0: 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37  F: R-30189-54097
d1b0: 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20   For each limit 
d1c0: 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f  category SQLITE_
d1d0: 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20  LIMIT_NAME.  ** 
d1e0: 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20  there is a hard 
d1f0: 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20  upper bound set 
d200: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
d210: 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73  by a C preproces
d220: 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63  sor.  ** macro c
d230: 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58  alled SQLITE_MAX
d240: 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49  _NAME. (The "_LI
d250: 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d  MIT_" in the nam
d260: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a  e is changed to.
d270: 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20    ** "_MAX_".). 
d280: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48   */.  assert( aH
d290: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
d2a0: 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53  LIMIT_LENGTH]==S
d2b0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
d2c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
d2d0: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
d2e0: 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
d2f0: 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  ]==SQLITE_MAX_SQ
d300: 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  L_LENGTH );.  as
d310: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
d320: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
d330: 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LUMN]==SQLITE_MA
d340: 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73  X_COLUMN );.  as
d350: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
d360: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58  [SQLITE_LIMIT_EX
d370: 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54  PR_DEPTH]==SQLIT
d380: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
d390: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
d3a0: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
d3b0: 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
d3c0: 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ELECT]==SQLITE_M
d3d0: 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
d3e0: 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  CT);.  assert( a
d3f0: 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
d400: 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d  _LIMIT_VDBE_OP]=
d410: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45  =SQLITE_MAX_VDBE
d420: 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OP );.  assert(
d430: 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
d440: 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
d450: 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d  N_ARG]==SQLITE_M
d460: 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
d470: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
d480: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
d490: 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d  IMIT_ATTACHED]==
d4a0: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
d4b0: 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  HED );.  assert(
d4c0: 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
d4d0: 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41  TE_LIMIT_LIKE_PA
d4e0: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a  TTERN_LENGTH]==.
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
d520: 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
d530: 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b  ATTERN_LENGTH );
d540: 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
d550: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
d560: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
d570: 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ER]==SQLITE_MAX_
d580: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29  VARIABLE_NUMBER)
d590: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
d5a0: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
d5b0: 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
d5c0: 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54  H]==SQLITE_MAX_T
d5d0: 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a  RIGGER_DEPTH );.
d5e0: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
d5f0: 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
d600: 45 50 54 48 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f  EPTH==(SQLITE_N_
d610: 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20  LIMIT-1) );...  
d620: 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c  if( limitId<0 ||
d630: 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45   limitId>=SQLITE
d640: 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  _N_LIMIT ){.    
d650: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
d660: 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e   oldLimit = db->
d670: 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  aLimit[limitId];
d680: 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e  .  if( newLimit>
d690: 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
d6a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
d6b0: 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f  R-52476-28732 */
d6c0: 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  .    if( newLimi
d6d0: 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  t>aHardLimit[lim
d6e0: 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e  itId] ){.      n
d6f0: 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c  ewLimit = aHardL
d700: 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20  imit[limitId];  
d710: 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d  /* IMP: R-51463-
d720: 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20  25634 */.    }. 
d730: 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69     db->aLimit[li
d740: 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69  mitId] = newLimi
d750: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
d760: 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  oldLimit;       
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d780: 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35   IMP: R-53341-35
d790: 34 31 39 20 2a 2f 0a 7d 0a 23 69 66 20 64 65 66  419 */.}.#if def
d7a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
d7b0: 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49 4c 45 29  LE_AUTO_PROFILE)
d7c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 6f  .static void pro
d7d0: 66 69 6c 65 5f 73 71 6c 28 76 6f 69 64 20 2a 61  file_sql(void *a
d7e0: 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ux, const char *
d7f0: 73 71 6c 2c 20 75 36 34 20 6e 73 29 20 7b 0a 23  sql, u64 ns) {.#
d800: 70 72 61 67 6d 61 20 75 6e 75 73 65 64 28 61 75  pragma unused(au
d810: 78 29 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65  x)..fprintf(stde
d820: 72 72 2c 20 22 51 75 65 72 79 3a 20 25 73 5c 6e  rr, "Query: %s\n
d830: 20 45 78 65 63 75 74 69 6f 6e 20 54 69 6d 65 3a   Execution Time:
d840: 20 25 6c 6c 75 20 6d 73 5c 6e 22 2c 20 73 71 6c   %llu ms\n", sql
d850: 2c 20 6e 73 20 2f 20 31 30 30 30 30 30 30 29 3b  , ns / 1000000);
d860: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
d870: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
d880: 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20  s used to parse 
d890: 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f  both URIs and no
d8a0: 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20  n-URI filenames 
d8b0: 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a  passed by the.**
d8c0: 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e   user to API fun
d8d0: 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f  ctions sqlite3_o
d8e0: 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33  pen() or sqlite3
d8f0: 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20  _open_v2(), and 
d900: 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  for database.** 
d910: 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61  URIs specified a
d920: 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48  s part of ATTACH
d930: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
d940: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
d950: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
d960: 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61  nction is the na
d970: 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
d980: 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55   use (or.** a NU
d990: 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  LL to signify th
d9a0: 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69  e default VFS) i
d9b0: 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e  f the URI does n
d9c0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66  ot contain a "vf
d9d0: 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20  s=xxx".** query 
d9e0: 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73  parameter. The s
d9f0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
da00: 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20  ontains the URI 
da10: 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65  (or non-URI file
da20: 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e  name).** itself.
da30: 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
da40: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ion is called th
da50: 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62  e *pFlags variab
da60: 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  le should contai
da70: 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  n.** the default
da80: 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74   flags to open t
da90: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
daa0: 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c  le with. The val
dab0: 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
dac0: 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75  *pFlags may be u
dad0: 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65  pdated before re
dae0: 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55  turning if the U
daf0: 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74  RI filename cont
db00: 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d  ains .** "cache=
db10: 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78  xxx" or "mode=xx
db20: 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  x" query paramet
db30: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ers..**.** The t
db40: 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2c 20 70  hird argument, p
db50: 42 74 66 6c 61 67 73 2c 20 70 6f 69 6e 74 73 20  Btflags, points 
db60: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  to an integer co
db70: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 6c 61  ntaining the fla
db80: 67 73 0a 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  gs.** that will 
db90: 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
dba0: 20 35 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f   5th argument to
dbb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
dbc0: 6e 20 28 42 54 52 45 45 5f 58 58 58 0a 2a 2a 20  n (BTREE_XXX.** 
dbd0: 66 6c 61 67 73 29 2e 20 54 68 69 73 20 76 61 6c  flags). This val
dbe0: 75 65 20 77 69 6c 6c 20 62 65 20 65 64 69 74 65  ue will be edite
dbf0: 64 20 69 66 20 74 68 65 20 55 52 49 20 66 69 6c  d if the URI fil
dc00: 65 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 61  ename contains a
dc10: 0a 2a 2a 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68  .** "readonly_sh
dc20: 6d 3d 31 22 20 6f 72 20 22 72 65 61 64 6f 6e 6c  m=1" or "readonl
dc30: 79 5f 73 68 6d 3d 30 22 20 71 75 65 72 79 20 70  y_shm=0" query p
dc40: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
dc50: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
dc60: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
dc70: 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
dc80: 73 65 20 2a 70 70 56 66 73 20 69 73 20 73 65 74  se *ppVfs is set
dc90: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
dca0: 74 68 65 20 56 46 53 20 74 68 61 74 20 73 68 6f  the VFS that sho
dcb0: 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f  uld be used to o
dcc0: 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
dcd0: 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69   file. *pzFile i
dce0: 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e  s set to.** poin
dcf0: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
dd00: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
dd10: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
dd20: 20 6f 70 65 6e 2e 20 49 74 20 69 73 20 74 68 65   open. It is the
dd30: 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c   .** responsibil
dd40: 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
dd50: 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
dd60: 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65  call sqlite3_fre
dd70: 65 28 29 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a  e() to release.*
dd80: 2a 20 74 68 69 73 20 62 75 66 66 65 72 2e 0a 2a  * this buffer..*
dd90: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
dda0: 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 61 6e   occurs, then an
ddb0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
ddc0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
ddd0: 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20  nd *pzErrMsg.** 
dde0: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f  may be set to po
ddf0: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
de00: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e  containing an En
de10: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
de20: 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65  rror .** message
de30: 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
de40: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
de50: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
de60: 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a  tually release.*
de70: 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62 79  * this buffer by
de80: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
de90: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _free()..*/.int 
dea0: 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
deb0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
dec0: 44 65 66 61 75 6c 74 56 66 73 2c 20 20 20 20 20  DefaultVfs,     
ded0: 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65     /* VFS to use
dee0: 20 69 66 20 6e 6f 20 22 76 66 73 3d 78 78 78 22   if no "vfs=xxx"
def0: 20 71 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f   query option */
df00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
df10: 55 72 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  Uri,            
df20: 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e     /* Nul-termin
df30: 61 74 65 64 20 55 52 49 20 74 6f 20 70 61 72 73  ated URI to pars
df40: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
df50: 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20  int *pFlags,    
df60: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
df70: 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58  : SQLITE_OPEN_XX
df80: 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74  X flags */.  int
df90: 20 2a 70 42 74 66 6c 61 67 73 2c 20 20 20 20 20   *pBtflags,     
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dfb0: 49 4e 2f 4f 55 54 3a 20 42 54 52 45 45 5f 58 58  IN/OUT: BTREE_XX
dfc0: 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c  X flags */.  sql
dfd0: 69 74 65 33 5f 76 66 73 20 2a 2a 70 70 56 66 73  ite3_vfs **ppVfs
dfe0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
dff0: 4f 55 54 3a 20 56 46 53 20 74 6f 20 75 73 65 20  OUT: VFS to use 
e000: 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46  */ .  char **pzF
e010: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
e020: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69        /* OUT: Fi
e030: 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74  lename component
e040: 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63 68 61   of URI */.  cha
e050: 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20  r **pzErrMsg    
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e070: 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61  OUT: Error messa
e080: 67 65 20 28 69 66 20 72 63 21 3d 53 51 4c 49 54  ge (if rc!=SQLIT
e090: 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  E_OK) */.){.  in
e0a0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e0b0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
e0c0: 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67 73   flags = *pFlags
e0d0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
e0e0: 7a 56 66 73 20 3d 20 7a 44 65 66 61 75 6c 74 56  zVfs = zDefaultV
e0f0: 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  fs;.  char *zFil
e100: 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69  e;.  char c;.  i
e110: 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c 69 74 65  nt nUri = sqlite
e120: 33 53 74 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b  3Strlen30(zUri);
e130: 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45  ..  assert( *pzE
e140: 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69  rrMsg==0 );..  i
e150: 66 28 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c  f( ((flags & SQL
e160: 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c  ITE_OPEN_URI) ||
e170: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
e180: 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 29 20 0a  nfig.bOpenUri) .
e190: 20 20 20 26 26 20 6e 55 72 69 3e 3d 35 20 26 26     && nUri>=5 &&
e1a0: 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66   memcmp(zUri, "f
e1b0: 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 0a 20 20  ile:", 5)==0 .  
e1c0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70  ){.    char *zOp
e1d0: 74 3b 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74  t;.    int eStat
e1e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
e1f0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 73       /* Parser s
e200: 74 61 74 65 20 77 68 65 6e 20 70 61 72 73 69 6e  tate when parsin
e210: 67 20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74  g URI */.    int
e220: 20 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20   iIn;           
e230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
e240: 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e  put character in
e250: 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  dex */.    int i
e260: 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Out = 0;        
e270: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
e280: 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64  ut character ind
e290: 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ex */.    int nB
e2a0: 79 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20  yte = nUri+2;   
e2b0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
e2c0: 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c   of space to all
e2d0: 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ocate */..    /*
e2e0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 53   Make sure the S
e2f0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66  QLITE_OPEN_URI f
e300: 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e  lag is set to in
e310: 64 69 63 61 74 65 20 74 6f 20 74 68 65 20 56 46  dicate to the VF
e320: 53 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20  S xOpen .    ** 
e330: 6d 65 74 68 6f 64 20 74 68 61 74 20 74 68 65 72  method that ther
e340: 65 20 6d 61 79 20 62 65 20 65 78 74 72 61 20 70  e may be extra p
e350: 61 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77  arameters follow
e360: 69 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d  ing the file-nam
e370: 65 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73  e.  */.    flags
e380: 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
e390: 55 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49  URI;..    for(iI
e3a0: 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69  n=0; iIn<nUri; i
e3b0: 49 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28  In++) nByte += (
e3c0: 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b  zUri[iIn]=='&');
e3d0: 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c  .    zFile = sql
e3e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74  ite3_malloc(nByt
e3f0: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69  e);.    if( !zFi
e400: 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
e410: 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20 2f  TE_NOMEM;..    /
e420: 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 73 63  * Discard the sc
e430: 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69  heme and authori
e440: 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74  ty segments of t
e450: 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69  he URI. */.    i
e460: 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20  f( zUri[5]=='/' 
e470: 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20  && zUri[6]=='/' 
e480: 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37  ){.      iIn = 7
e490: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
e4a0: 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69  Uri[iIn] && zUri
e4b0: 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e  [iIn]!='/' ) iIn
e4c0: 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69  ++;..      if( i
e4d0: 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31  In!=7 && (iIn!=1
e4e0: 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63  6 || memcmp("loc
e4f0: 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37  alhost", &zUri[7
e500: 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20  ], 9)) ){.      
e510: 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
e520: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69  lite3_mprintf("i
e530: 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f  nvalid uri autho
e540: 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20  rity: %.*s", .  
e550: 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c            iIn-7,
e560: 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20   &zUri[7]);.    
e570: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e580: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67  ERROR;.        g
e590: 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
e5a0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
e5b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 49 6e 20  else{.      iIn 
e5c0: 3d 20 35 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 5;.    }..    
e5d0: 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65  /* Copy the file
e5e0: 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65  name and any que
e5f0: 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e  ry parameters in
e600: 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66  to the zFile buf
e610: 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63  fer. .    ** Dec
e620: 6f 64 65 20 25 48 48 20 65 73 63 61 70 65 20 63  ode %HH escape c
e630: 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77  odes along the w
e640: 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ay. .    **.    
e650: 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c  ** Within this l
e660: 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53  oop, variable eS
e670: 74 61 74 65 20 6d 61 79 20 62 65 20 73 65 74 20  tate may be set 
e680: 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65  to 0, 1 or 2, de
e690: 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f  pending.    ** o
e6a0: 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f  n the parsing co
e6b0: 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77  ntext. As follow
e6c0: 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
e6d0: 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69     0: Parsing fi
e6e0: 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20  le-name..    ** 
e6f0: 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d    1: Parsing nam
e700: 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e  e section of a n
e710: 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20  ame=value query 
e720: 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a  parameter..    *
e730: 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76  *   2: Parsing v
e740: 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20  alue section of 
e750: 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65  a name=value que
e760: 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20  ry parameter..  
e770: 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20    */.    eState 
e780: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
e790: 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21  (c = zUri[iIn])!
e7a0: 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a  =0 && c!='#' ){.
e7b0: 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20        iIn++;.   
e7c0: 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20     if( c=='%' . 
e7d0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
e7e0: 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49  Isxdigit(zUri[iI
e7f0: 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20 73  n]) .       && s
e800: 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a  qlite3Isxdigit(z
e810: 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20  Uri[iIn+1]) .   
e820: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e     ){.        in
e830: 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74  t octet = (sqlit
e840: 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b  e3HexToInt(zUri[
e850: 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20  iIn++]) << 4);. 
e860: 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20         octet += 
e870: 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28  sqlite3HexToInt(
e880: 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20  zUri[iIn++]);.. 
e890: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f         assert( o
e8a0: 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74  ctet>=0 && octet
e8b0: 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20  <256 );.        
e8c0: 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a  if( octet==0 ){.
e8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
e8e0: 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
e8f0: 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61 70 70  n when "%00" app
e900: 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  ears within the 
e910: 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20  URI. In this.   
e920: 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77         ** case w
e930: 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78  e ignore all tex
e940: 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64  t in the remaind
e950: 65 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20  er of the path, 
e960: 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20  name or.        
e970: 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65    ** value curre
e980: 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65  ntly being parse
e990: 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65  d. So ignore the
e9a0: 20 63 75 72 72 65 6e 74 20 63 68 61 72 61 63 74   current charact
e9b0: 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
e9c0: 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20  and skip to the 
e9d0: 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72  next "?", "=" or
e9e0: 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72   "&", as appropr
e9f0: 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  iate. */.       
ea00: 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
ea10: 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20  Uri[iIn])!=0 && 
ea20: 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20  c!='#' .        
ea30: 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
ea40: 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20  !=0 || c!='?'). 
ea50: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
ea60: 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63  (eState!=1 || (c
ea70: 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29  !='=' && c!='&')
ea80: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
ea90: 26 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c  && (eState!=2 ||
eaa0: 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20   c!='&').       
eab0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
eac0: 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20    iIn++;.       
ead0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
eae0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
eaf0: 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 6f   }.        c = o
eb00: 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ctet;.      }els
eb10: 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20  e if( eState==1 
eb20: 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d  && (c=='&' || c=
eb30: 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='=') ){.       
eb40: 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d   if( zFile[iOut-
eb50: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]==0 ){.       
eb60: 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f     /* An empty o
eb70: 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f  ption name. Igno
eb80: 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 61  re this option a
eb90: 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20  ltogether. */.  
eba0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
ebb0: 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69  Uri[iIn] && zUri
ebc0: 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55  [iIn]!='#' && zU
ebd0: 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29  ri[iIn-1]!='&' )
ebe0: 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20   iIn++;.        
ebf0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
ec00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
ec10: 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20  ( c=='&' ){.    
ec20: 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74        zFile[iOut
ec30: 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
ec40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ec50: 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 32 3b       eState = 2;
ec60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ec70: 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
ec80: 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74 61 74  }else if( (eStat
ec90: 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29 20  e==0 && c=='?') 
eca0: 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20 26 26  || (eState==2 &&
ecb0: 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20 20   c=='&') ){.    
ecc0: 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
ecd0: 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20     eState = 1;. 
ece0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69       }.      zFi
ecf0: 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a  le[iOut++] = c;.
ed00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 53      }.    if( eS
ed10: 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b  tate==1 ) zFile[
ed20: 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
ed30: 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
ed40: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
ed50: 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
ed60: 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  0';..    /* Chec
ed70: 6b 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20  k if there were 
ed80: 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70 65 63  any options spec
ed90: 69 66 69 65 64 20 74 68 61 74 20 73 68 6f 75 6c  ified that shoul
eda0: 64 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64  d be interpreted
edb0: 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f   .    ** here. O
edc0: 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ptions that are 
edd0: 69 6e 74 65 72 70 72 65 74 65 64 20 68 65 72 65  interpreted here
ede0: 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22 20 61   include "vfs" a
edf0: 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a 20 20  nd those that.  
ee00: 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20    ** correspond 
ee10: 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20 6d 61  to flags that ma
ee20: 79 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74  y be passed to t
ee30: 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  he sqlite3_open_
ee40: 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68  v2().    ** meth
ee50: 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20  od. */.    zOpt 
ee60: 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33  = &zFile[sqlite3
ee70: 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
ee80: 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a  1];.    while( z
ee90: 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Opt[0] ){.      
eea0: 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74  int nOpt = sqlit
eeb0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29  e3Strlen30(zOpt)
eec0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56  ;.      char *zV
eed0: 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b  al = &zOpt[nOpt+
eee0: 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56  1];.      int nV
eef0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  al = sqlite3Strl
ef00: 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20  en30(zVal);..   
ef10: 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26     if( nOpt==3 &
ef20: 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c 20  & memcmp("vfs", 
ef30: 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20  zOpt, 3)==0 ){. 
ef40: 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 7a 56         zVfs = zV
ef50: 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  al;.      }else 
ef60: 69 66 28 20 6e 4f 70 74 3d 3d 31 32 20 26 26 20  if( nOpt==12 && 
ef70: 6d 65 6d 63 6d 70 28 22 72 65 61 64 6f 6e 6c 79  memcmp("readonly
ef80: 5f 73 68 6d 22 2c 20 7a 4f 70 74 2c 20 31 32 29  _shm", zOpt, 12)
ef90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
efa0: 66 28 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a  f( sqlite3Atoi(z
efb0: 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
efc0: 20 20 2a 70 42 74 66 6c 61 67 73 20 7c 3d 20 42    *pBtflags |= B
efd0: 54 52 45 45 5f 52 45 41 44 4f 4e 4c 59 53 48 4d  TREE_READONLYSHM
efe0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
eff0: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 42 74 66  .          *pBtf
f000: 6c 61 67 73 20 26 3d 20 7e 42 54 52 45 45 5f 52  lags &= ~BTREE_R
f010: 45 41 44 4f 4e 4c 59 53 48 4d 3b 0a 20 20 20 20  EADONLYSHM;.    
f020: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
f030: 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
f040: 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20  t OpenMode {.   
f050: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
f060: 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  r *z;.          
f070: 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20  int mode;.      
f080: 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a    } *aMode = 0;.
f090: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d          char *zM
f0a0: 6f 64 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20  odeType;.       
f0b0: 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 20 20 20   int mask;.     
f0c0: 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 0a 20     int limit;.. 
f0d0: 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d         if( nOpt=
f0e0: 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63 61  =5 && memcmp("ca
f0f0: 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d  che", zOpt, 5)==
f100: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
f110: 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65  tatic struct Ope
f120: 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64 65  nMode aCacheMode
f130: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
f140: 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20 20     { "shared",  
f150: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
f160: 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20  EDCACHE },.     
f170: 20 20 20 20 20 20 20 7b 20 22 70 72 69 76 61 74         { "privat
f180: 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  e", SQLITE_OPEN_
f190: 50 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a  PRIVATECACHE },.
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c              { 0,
f1b0: 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d   0 }.          }
f1c0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73  ;..          mas
f1d0: 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  k = SQLITE_OPEN_
f1e0: 53 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c 49  SHAREDCACHE|SQLI
f1f0: 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
f200: 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20 20  ACHE;.          
f210: 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d 6f  aMode = aCacheMo
f220: 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69  de;.          li
f230: 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  mit = mask;.    
f240: 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20        zModeType 
f250: 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20 20  = "cache";.     
f260: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
f270: 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d 63   nOpt==4 && memc
f280: 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c  mp("mode", zOpt,
f290: 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)==0 ){.      
f2a0: 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63      static struc
f2b0: 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e  t OpenMode aOpen
f2c0: 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Mode[] = {.     
f2d0: 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20 20         { "ro",  
f2e0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
f2f0: 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20 20  ONLY },.        
f300: 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51 4c      { "rw",  SQL
f310: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
f320: 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 20  TE }, .         
f330: 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c 49     { "rwc", SQLI
f340: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
f350: 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
f360: 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20  CREATE },.      
f370: 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20        { 0, 0 }. 
f380: 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20           };..   
f390: 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51         mask = SQ
f3a0: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
f3b0: 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  LY|SQLITE_OPEN_R
f3c0: 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
f3d0: 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20  OPEN_CREATE;.   
f3e0: 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61         aMode = a
f3f0: 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20  OpenMode;.      
f400: 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b      limit = mask
f410: 20 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20   & flags;.      
f420: 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20      zModeType = 
f430: 22 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20  "access";.      
f440: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
f450: 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20   aMode ){.      
f460: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
f470: 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20       int mode = 
f480: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  0;.          for
f490: 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a  (i=0; aMode[i].z
f4a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
f4b0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f4c0: 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a  z = aMode[i].z;.
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
f4e0: 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72  nVal==sqlite3Str
f4f0: 6c 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d  len30(z) && 0==m
f500: 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e  emcmp(zVal, z, n
f510: 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
f520: 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f        mode = aMo
f530: 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20  de[i].mode;.    
f540: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
f550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
f560: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f570: 20 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30       if( mode==0
f580: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f590: 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
f5a0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20  te3_mprintf("no 
f5b0: 73 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73  such %s mode: %s
f5c0: 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56  ", zModeType, zV
f5d0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  al);.           
f5e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
f5f0: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OR;.            
f600: 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
f610: 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ut;.          }.
f620: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f            if( mo
f630: 64 65 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20  de>limit ){.    
f640: 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
f650: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
f660: 6e 74 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74  ntf("%s mode not
f670: 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20   allowed: %s",. 
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6a0: 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65         zModeType
f6b0: 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , zVal);.       
f6c0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f6d0: 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 20 20 20  _PERM;.         
f6e0: 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
f6f0: 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  i_out;.         
f700: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61   }.          fla
f710: 67 73 20 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d  gs = (flags & ~m
f720: 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20  ask) | mode;.   
f730: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
f740: 20 20 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56        zOpt = &zV
f750: 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20  al[nVal+1];.    
f760: 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  }..  }else{.    
f770: 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
f780: 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b 32 29 3b 0a  malloc(nUri+2);.
f790: 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29      if( !zFile )
f7a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
f7b0: 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  OMEM;.    memcpy
f7c0: 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55  (zFile, zUri, nU
f7d0: 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e  ri);.    zFile[n
f7e0: 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  Uri] = '\0';.   
f7f0: 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d   zFile[nUri+1] =
f800: 20 27 5c 30 27 3b 0a 20 20 7d 0a 0a 20 20 2a 70   '\0';.  }..  *p
f810: 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
f820: 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20  fs_find(zVfs);. 
f830: 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30 20 29   if( *ppVfs==0 )
f840: 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20  {.    *pzErrMsg 
f850: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
f860: 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20  f("no such vfs: 
f870: 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20  %s", zVfs);.    
f880: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
f890: 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75 72  R;.  }. parse_ur
f8a0: 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  i_out:.  if( rc!
f8b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f8c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
f8d0: 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  File);.    zFile
f8e0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c   = 0;.  }.  *pFl
f8f0: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a  ags = flags;.  *
f900: 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a  pzFile = zFile;.
f910: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f920: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f930: 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72  ine does the wor
f940: 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20 64  k of opening a d
f950: 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61 6c  atabase on behal
f960: 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  f of.** sqlite3_
f970: 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69 74  open() and sqlit
f980: 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68 65  e3_open16(). The
f990: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   database filena
f9a0: 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20  me "zFilename"  
f9b0: 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e 63  .** is UTF-8 enc
f9c0: 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oded..*/.static 
f9d0: 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73 65  int openDatabase
f9e0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
f9f0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61  zFilename, /* Da
fa00: 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
fa10: 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f  UTF-8 encoded */
fa20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
fa30: 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  b,        /* OUT
fa40: 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74 61 62  : Returned datab
fa50: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
fa60: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61  unsigned int fla
fa70: 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61 74  gs,    /* Operat
fa80: 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20  ional flags */. 
fa90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
faa0: 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  s       /* Name 
fab0: 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73  of the VFS to us
fac0: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
fad0: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
fae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
faf0: 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e  re allocated han
fb00: 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  dle here */.  in
fb10: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fb30: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
fb40: 20 20 69 6e 74 20 69 73 54 68 72 65 61 64 73 61    int isThreadsa
fb50: 66 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fe;             
fb60: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 68    /* True for th
fb70: 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65 63 74  readsafe connect
fb80: 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ions */.  char *
fb90: 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  zOpen = 0;      
fba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
fbb0: 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74  ename argument t
fbc0: 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65 65 4f  o pass to BtreeO
fbd0: 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  pen() */.  char 
fbe0: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20  *zErrMsg = 0;   
fbf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
fc00: 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d  ror message from
fc10: 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
fc20: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 62 74 66 6c  () */.  int btfl
fc30: 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
fc40: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
fc50: 6f 66 20 42 54 52 45 45 5f 58 58 58 20 66 6c 61  of BTREE_XXX fla
fc60: 67 73 20 2a 2f 0a 0a 20 20 2a 70 70 44 62 20 3d  gs */..  *ppDb =
fc70: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
fc80: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
fc90: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
fca0: 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
fcb0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
fcc0: 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  rc;.#endif..  /*
fcd0: 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73   Only allow sens
fce0: 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ible combination
fcf0: 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65  s of bits in the
fd00: 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e   flags argument.
fd10: 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e    .  ** Throw an
fd20: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f   error if any no
fd30: 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74  n-sense combinat
fd40: 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66  ion is used.  If
fd50: 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20   we.  ** do not 
fd60: 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f  block illegal co
fd70: 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c  mbinations here,
fd80: 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65   it could trigge
fd90: 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20  r.  ** assert() 
fda0: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65  statements in de
fdb0: 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65  eper layers.  Se
fdc0: 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69  nsible combinati
fdd0: 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20  ons.  ** are:.  
fde0: 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c  **.  **  1:  SQL
fdf0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
fe00: 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49  Y.  **  2:  SQLI
fe10: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
fe20: 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49  E.  **  6:  SQLI
fe30: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
fe40: 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
fe50: 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73  CREATE.  */.  as
fe60: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
fe70: 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30  N_READONLY  == 0
fe80: 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  x01 );.  assert(
fe90: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
fea0: 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29  DWRITE == 0x02 )
feb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
fec0: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20  TE_OPEN_CREATE  
fed0: 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74    == 0x04 );.  t
fee0: 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
fef0: 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b  ags&7))==0x02 );
ff00: 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a   /* READONLY */.
ff10: 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
ff20: 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34  (flags&7))==0x04
ff30: 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45   ); /* READWRITE
ff40: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
ff50: 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d  (1<<(flags&7))==
ff60: 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57  0x40 ); /* READW
ff70: 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f  RITE | CREATE */
ff80: 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61  .  if( ((1<<(fla
ff90: 67 73 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d  gs&7)) & 0x46)==
ffa0: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
ffb0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a  E_MISUSE_BKPT;..
ffc0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
ffd0: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
ffe0: 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  utex==0 ){.    i
fff0: 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
10000 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
10010 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
10020 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20  _NOMUTEX ){.    
10030 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30  isThreadsafe = 0
10040 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else 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 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20  N_FULLMUTEX ){. 
10070 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
10080 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
10090 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
100a0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
100b0 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b  nfig.bFullMutex;
100c0 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
100d0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50   & SQLITE_OPEN_P
100e0 52 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20  RIVATECACHE ){. 
100f0 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
10100 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
10110 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ACHE;.  }else if
10120 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
10130 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68  onfig.sharedCach
10140 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20  eEnabled ){.    
10150 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
10160 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
10170 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ;.  }..  /* Remo
10180 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20  ve harmful bits 
10190 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70  from the flags p
101a0 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20  arameter.  **.  
101b0 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50  ** The SQLITE_OP
101c0 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53  EN_NOMUTEX and S
101d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
101e0 55 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a  UTEX flags were.
101f0 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20    ** dealt with 
10200 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
10210 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73  code block.  Bes
10220 69 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20  ides these, the 
10230 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20  only.  ** valid 
10240 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20  input flags for 
10250 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
10260 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45  ) are SQLITE_OPE
10270 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a  N_READONLY,.  **
10280 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
10290 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f  DWRITE, SQLITE_O
102a0 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c 49  PEN_CREATE, SQLI
102b0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
102c0 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  CHE,.  ** SQLITE
102d0 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
102e0 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65 73  HE, and some res
102f0 65 72 76 65 64 20 62 69 74 73 2e 20 20 53 69 6c  erved bits.  Sil
10300 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20  ently mask.  ** 
10310 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c  off all other fl
10320 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67  ags..  */.  flag
10330 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f  s &=  ~( SQLITE_
10340 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
10350 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  SE |.           
10360 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
10370 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20  EXCLUSIVE |.    
10380 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
10390 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c  E_OPEN_MAIN_DB |
103a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
103b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
103c0 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20  _DB | .         
103d0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
103e0 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
103f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
10400 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
10410 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  N_JOURNAL | .   
10420 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
10430 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
10440 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
10450 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
10460 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20  EN_SUBJOURNAL | 
10470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10480 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
10490 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20  ER_JOURNAL |.   
104a0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
104b0 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
104c0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
104d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
104e0 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  LMUTEX |.       
104f0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
10500 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20  PEN_WAL.        
10510 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c       );..  /* Al
10520 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
10530 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
10540 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74   */.  db = sqlit
10550 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
10560 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b  zeof(sqlite3) );
10570 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67  .  if( db==0 ) g
10580 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
10590 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61    if( isThreadsa
105a0 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75  fe ){.    db->mu
105b0 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
105c0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
105d0 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b  UTEX_RECURSIVE);
105e0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74  .    if( db->mut
105f0 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex==0 ){.      s
10600 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b  qlite3_free(db);
10610 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  .      db = 0;. 
10620 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62       goto opendb
10630 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
10640 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10650 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
10660 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
10670 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44  = 0xff;.  db->nD
10680 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67  b = 2;.  db->mag
10690 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
106a0 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44  C_BUSY;.  db->aD
106b0 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
106c0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69  c;..  assert( si
106d0 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29  zeof(db->aLimit)
106e0 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69  ==sizeof(aHardLi
106f0 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79  mit) );.  memcpy
10700 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61  (db->aLimit, aHa
10710 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28  rdLimit, sizeof(
10720 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20  db->aLimit));.  
10730 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
10740 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75   1;.  db->nextAu
10750 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62  tovac = -1;.  db
10760 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d  ->nextPagesize =
10770 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   0;.  db->flags 
10780 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
10790 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45  olNames | SQLITE
107a0 5f 41 75 74 6f 49 6e 64 65 78 20 7c 20 53 51 4c  _AutoIndex | SQL
107b0 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65  ITE_EnableTrigge
107c0 72 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  r.#if SQLITE_DEF
107d0 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  AULT_FILE_FORMAT
107e0 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  <4.             
107f0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67      | SQLITE_Leg
10800 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69  acyFileFmt.#endi
10810 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
10820 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
10830 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20  NSION.          
10840 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
10850 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65  LoadExtension.#e
10860 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
10870 44 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56  DEFAULT_RECURSIV
10880 45 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20 20  E_TRIGGERS.     
10890 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
108a0 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73  LITE_RecTriggers
108b0 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
108c0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ned(SQLITE_DEFAU
108d0 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29  LT_FOREIGN_KEYS)
108e0 20 26 26 20 53 51 4c 49 54 45 5f 44 45 46 41 55   && SQLITE_DEFAU
108f0 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a  LT_FOREIGN_KEYS.
10900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10910 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67   | SQLITE_Foreig
10920 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a 20 20 20  nKeys.#endif.   
10930 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48 61     ;.  sqlite3Ha
10940 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c  shInit(&db->aCol
10950 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53  lSeq);.#ifndef S
10960 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
10970 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65  ALTABLE.  sqlite
10980 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61  3HashInit(&db->a
10990 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  Module);.#endif.
109a0 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65  .  /* Add the de
109b0 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
109c0 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e  sequence BINARY.
109d0 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f   BINARY works fo
109e0 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a  r both UTF-8.  *
109f0 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f  * and UTF-16, so
10a00 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66   add a version f
10a10 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64  or each to avoid
10a20 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79   any unnecessary
10a30 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e  .  ** conversion
10a40 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f  s. The only erro
10a50 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72  r that can occur
10a60 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f   here is a mallo
10a70 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a  c() failure..  *
10a80 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  /.  createCollat
10a90 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22  ion(db, "BINARY"
10aa0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
10ab0 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52  QLITE_COLL_BINAR
10ac0 59 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  Y, 0,.          
10ad0 20 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46          binCollF
10ae0 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
10af0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
10b00 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f  BINARY", SQLITE_
10b10 55 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45 5f  UTF16BE, SQLITE_
10b20 43 4f 4c 4c 5f 42 49 4e 41 52 59 2c 20 30 2c 0a  COLL_BINARY, 0,.
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b40 20 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30    binCollFunc, 0
10b50 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
10b60 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59  tion(db, "BINARY
10b70 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
10b80 45 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42  E, SQLITE_COLL_B
10b90 49 4e 41 52 59 2c 20 30 2c 0a 20 20 20 20 20 20  INARY, 0,.      
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 43              binC
10bb0 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
10bc0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
10bd0 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49  b, "RTRIM", SQLI
10be0 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
10bf0 43 4f 4c 4c 5f 55 53 45 52 2c 20 28 76 6f 69 64  COLL_USER, (void
10c00 2a 29 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  *)1,.           
10c10 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46 75         binCollFu
10c20 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  nc, 0);.  if( db
10c30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
10c40 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  {.    goto opend
10c50 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d  b_out;.  }.  db-
10c60 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c  >pDfltColl = sql
10c70 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
10c80 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  db, SQLITE_UTF8,
10c90 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20   "BINARY", 0);. 
10ca0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66   assert( db->pDf
10cb0 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20  ltColl!=0 );..  
10cc0 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61 20 55 54  /* Also add a UT
10cd0 46 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e 73 69  F-8 case-insensi
10ce0 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  tive collation s
10cf0 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72  equence. */.  cr
10d00 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
10d10 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49  , "NOCASE", SQLI
10d20 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
10d30 43 4f 4c 4c 5f 4e 4f 43 41 53 45 2c 20 30 2c 0a  COLL_NOCASE, 0,.
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d50 20 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e    nocaseCollatin
10d60 67 46 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a  gFunc, 0);..  /*
10d70 20 50 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e   Parse the filen
10d80 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74  ame/URI argument
10d90 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46  . */.  db->openF
10da0 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
10db0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  rc = sqlite3Pars
10dc0 65 55 72 69 28 0a 20 20 20 20 20 20 7a 56 66 73  eUri(.      zVfs
10dd0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c  , zFilename, &fl
10de0 61 67 73 2c 20 26 62 74 66 6c 61 67 73 2c 20 26  ags, &btflags, &
10df0 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e  db->pVfs, &zOpen
10e00 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
10e10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10e20 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
10e30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 64  SQLITE_NOMEM ) d
10e40 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
10e50 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
10e60 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 7a 45  Error(db, rc, zE
10e70 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30  rrMsg ? "%s" : 0
10e80 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
10e90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
10ea0 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rMsg);.    goto 
10eb0 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
10ec0 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62  .  /* Open the b
10ed0 61 63 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20  ackend database 
10ee0 64 72 69 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d  driver */.  rc =
10ef0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
10f00 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65  n(db->pVfs, zOpe
10f10 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b  n, db, &db->aDb[
10f20 30 5d 2e 70 42 74 2c 20 62 74 66 6c 61 67 73 2c  0].pBt, btflags,
10f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10f40 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
10f50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
10f60 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21  N_DB);.  if( rc!
10f70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10f80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10f90 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a  _IOERR_NOMEM ){.
10fa0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10fb0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
10fc0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
10fd0 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20  db, rc, 0);.    
10fe0 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
10ff0 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 30  .  }.  db->aDb[0
11000 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69  ].pSchema = sqli
11010 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c  te3SchemaGet(db,
11020 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29   db->aDb[0].pBt)
11030 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ;.  db->aDb[1].p
11040 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33  Schema = sqlite3
11050 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29  SchemaGet(db, 0)
11060 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66  ;...  /* The def
11070 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65  ault safety_leve
11080 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  l for the main d
11090 61 74 61 62 61 73 65 20 69 73 20 27 66 75 6c 6c  atabase is 'full
110a0 27 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a  '; for the temp.
110b0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74    ** database it
110c0 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73   is 'NONE'. This
110d0 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61 67   matches the pag
110e0 65 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74  er layer default
110f0 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e  s.  .  */.  db->
11100 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22  aDb[0].zName = "
11110 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62  main";.  db->aDb
11120 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c  [0].safety_level
11130 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62 5b   = 3;.  db->aDb[
11140 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70  1].zName = "temp
11150 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ";.  db->aDb[1].
11160 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31  safety_level = 1
11170 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  ;..  db->magic =
11180 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50   SQLITE_MAGIC_OP
11190 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  EN;.  if( db->ma
111a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
111b0 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
111c0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67  t;.  }..  /* Reg
111d0 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d  ister all built-
111e0 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75  in functions, bu
111f0 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  t do not attempt
11200 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a   to read the.  *
11210 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  * database schem
11220 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20 64  a yet. This is d
11230 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65  elayed until the
11240 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20   first time the 
11250 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73  database.  ** is
11260 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a   accessed..  */.
11270 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
11280 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  b, SQLITE_OK, 0)
11290 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73  ;.  sqlite3Regis
112a0 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
112b0 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c  ons(db);..  /* L
112c0 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78  oad automatic ex
112d0 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e  tensions - exten
112e0 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  sions that have 
112f0 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a  been registered.
11300 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73    ** using the s
11310 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63  qlite3_automatic
11320 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49  _extension() API
11330 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
11340 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f  AutoLoadExtensio
11350 6e 73 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73  ns(db);.  rc = s
11360 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
11370 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  b);.  if( rc!=SQ
11380 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
11390 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
113a0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
113b0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20  TE_ENABLE_FTS1. 
113c0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
113d0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78  Failed ){.    ex
113e0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
113f0 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts1Init(sqlite3
11400 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
11410 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29  ite3Fts1Init(db)
11420 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
11430 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
11440 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64  LE_FTS2.  if( !d
11450 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11460 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
11470 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69   ){.    extern i
11480 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e  nt sqlite3Fts2In
11490 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  it(sqlite3*);.  
114a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
114b0 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s2Init(db);.  }.
114c0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
114d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
114e0 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  3.  if( !db->mal
114f0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
11500 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11510 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
11520 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s3Init(db);.  }.
11530 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
11540 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55  QLITE_ENABLE_ICU
11550 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
11560 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
11570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11580 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75   rc = sqlite3Icu
11590 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
115a0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
115b0 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45  ITE_ENABLE_RTREE
115c0 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
115d0 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
115e0 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
115f0 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65  rc = sqlite3Rtre
11600 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  eInit(db);.  }.#
11610 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
11620 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
11630 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45  ;..  /* -DSQLITE
11640 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
11650 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58  _MODE=1 makes EX
11660 43 4c 55 53 49 56 45 20 74 68 65 20 64 65 66 61  CLUSIVE the defa
11670 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a  ult locking.  **
11680 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45   mode.  -DSQLITE
11690 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
116a0 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52  _MODE=0 make NOR
116b0 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20  MAL the default 
116c0 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64  locking.  ** mod
116d0 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e  e.  Doing nothin
116e0 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61  g at all also ma
116f0 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64  kes NORMAL the d
11700 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66  efault..  */.#if
11710 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
11720 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a  LT_LOCKING_MODE.
11730 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f    db->dfltLockMo
11740 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  de = SQLITE_DEFA
11750 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
11760 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
11770 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69  LockingMode(sqli
11780 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62  te3BtreePager(db
11790 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20  ->aDb[0].pBt),. 
117a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117b0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
117c0 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
117d0 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  MODE);.#endif.. 
117e0 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c   /* Enable the l
117f0 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20  ookaside-malloc 
11800 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73  subsystem */.  s
11810 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62  etupLookaside(db
11820 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62  , 0, sqlite3Glob
11830 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61  alConfig.szLooka
11840 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  side,.          
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
11860 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
11870 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a  g.nLookaside);..
11880 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75    sqlite3_wal_au
11890 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  tocheckpoint(db,
118a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
118b0 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49  WAL_AUTOCHECKPOI
118c0 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74  NT);..opendb_out
118d0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
118e0 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28 20 64  (zOpen);.  if( d
118f0 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
11900 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c   db->mutex!=0 ||
11910 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30   isThreadsafe==0
11920 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   || sqlite3Globa
11930 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
11940 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ex==0 );.    sql
11950 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
11960 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d  (db->mutex);.  }
11970 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
11980 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69  errcode(db);.  i
11990 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
119a0 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MEM ){.    sqlit
119b0 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
119c0 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73    db = 0;.  }els
119d0 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
119e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  _OK ){.    db->m
119f0 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
11a00 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 23 69  GIC_SICK;.  }.#i
11a10 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
11a20 5f 45 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f  _ENABLE_AUTO_PRO
11a30 46 49 4c 45 29 0a 20 20 69 66 28 20 64 62 20 26  FILE).  if( db &
11a40 26 20 21 72 63 20 29 7b 0a 20 20 20 20 63 68 61  & !rc ){.    cha
11a50 72 20 2a 65 6e 76 70 72 6f 66 69 6c 65 20 3d 20  r *envprofile = 
11a60 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 41  getenv("SQLITE_A
11a70 55 54 4f 5f 50 52 4f 46 49 4c 45 22 29 3b 0a 20  UTO_PROFILE");. 
11a80 20 20 20 0a 20 20 20 20 69 66 28 20 65 6e 76 70     .    if( envp
11a90 72 6f 66 69 6c 65 21 3d 4e 55 4c 4c 20 29 7b 0a  rofile!=NULL ){.
11aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
11ab0 6f 66 69 6c 65 28 64 62 2c 20 70 72 6f 66 69 6c  ofile(db, profil
11ac0 65 5f 73 71 6c 2c 20 4e 55 4c 4c 29 3b 0a 20 20  e_sql, NULL);.  
11ad0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
11ae0 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23 69 66   *ppDb = db;.#if
11af0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11b00 45 5f 53 51 4c 52 52 0a 20 20 53 52 52 65 63 4f  E_SQLRR.  SRRecO
11b10 70 65 6e 28 64 62 2c 20 7a 46 69 6c 65 6e 61 6d  pen(db, zFilenam
11b20 65 2c 20 66 6c 61 67 73 29 3b 0a 23 65 6e 64 69  e, flags);.#endi
11b30 66 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  f.  return sqlit
11b40 65 33 41 70 69 45 78 69 74 28 30 2c 20 72 63 29  e3ApiExit(0, rc)
11b50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
11b60 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68  a new database h
11b70 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
11b80 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f  lite3_open(.  co
11b90 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
11ba0 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  ame, .  sqlite3 
11bb0 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74  **ppDb .){.  ret
11bc0 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65  urn openDatabase
11bd0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62  (zFilename, ppDb
11be0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11bf0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
11c00 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
11c10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
11c20 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71  TE, 0);.}.int sq
11c30 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20  lite3_open_v2(. 
11c40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
11c50 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61  ename,   /* Data
11c60 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55  base filename (U
11c70 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74  TF-8) */.  sqlit
11c80 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20  e3 **ppDb,      
11c90 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74     /* OUT: SQLit
11ca0 65 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  e db handle */. 
11cb0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
11cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
11cd0 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
11ce0 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f  r *zVfs        /
11cf0 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f  * Name of VFS mo
11d00 64 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29  dule to use */.)
11d10 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44  {.  return openD
11d20 61 74 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65  atabase(filename
11d30 2c 20 70 70 44 62 2c 20 28 75 6e 73 69 67 6e 65  , ppDb, (unsigne
11d40 64 20 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66  d int)flags, zVf
11d50 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  s);.}..#ifndef S
11d60 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
11d70 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
11d80 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  w database handl
11d90 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
11da0 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73  3_open16(.  cons
11db0 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d  t void *zFilenam
11dc0 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a  e, .  sqlite3 **
11dd0 70 70 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63  ppDb.){.  char c
11de0 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38  onst *zFilename8
11df0 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65  ;   /* zFilename
11e00 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d   encoded in UTF-
11e10 38 20 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46  8 instead of UTF
11e20 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -16 */.  sqlite3
11e30 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20  _value *pVal;.  
11e40 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
11e50 74 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a  t( zFilename );.
11e60 20 20 61 73 73 65 72 74 28 20 70 70 44 62 20 29    assert( ppDb )
11e70 3b 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23  ;.  *ppDb = 0;.#
11e80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11e90 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63  IT_AUTOINIT.  rc
11ea0 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69   = sqlite3_initi
11eb0 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72  alize();.  if( r
11ec0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  c ) return rc;.#
11ed0 65 6e 64 69 66 0a 20 20 70 56 61 6c 20 3d 20 73  endif.  pVal = s
11ee0 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
11ef0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
11f00 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
11f10 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c  , zFilename, SQL
11f20 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c  ITE_UTF16NATIVE,
11f30 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
11f40 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20  .  zFilename8 = 
11f50 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
11f60 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54  (pVal, SQLITE_UT
11f70 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  F8);.  if( zFile
11f80 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20  name8 ){.    rc 
11f90 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  = openDatabase(z
11fa0 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c  Filename8, ppDb,
11fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11fc0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
11fd0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
11fe0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
11ff0 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  E, 0);.    asser
12000 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d  t( *ppDb || rc==
12010 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
12020 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12030 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50  TE_OK && !DbHasP
12040 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30  roperty(*ppDb, 0
12050 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
12060 64 29 20 29 7b 0a 20 20 20 20 20 20 45 4e 43 28  d) ){.      ENC(
12070 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f  *ppDb) = SQLITE_
12080 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20  UTF16NATIVE;.   
12090 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
120a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
120b0 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  M;.  }.  sqlite3
120c0 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
120d0 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ..  return sqlit
120e0 65 33 41 70 69 45 78 69 74 28 30 2c 20 72 63 29  e3ApiExit(0, rc)
120f0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
12100 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
12110 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
12120 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  er a new collati
12130 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68  on sequence with
12140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
12150 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
12160 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
12170 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69  ollation(.  sqli
12180 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73  te3* db, .  cons
12190 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
121a0 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f    int enc, .  vo
121b0 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
121c0 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
121d0 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
121e0 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
121f0 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ).){.  int rc;. 
12200 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
12210 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
12220 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
12230 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
12240 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c    rc = createCol
12250 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  lation(db, zName
12260 2c 20 28 75 38 29 65 6e 63 2c 20 53 51 4c 49 54  , (u8)enc, SQLIT
12270 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20 70 43 74  E_COLL_USER, pCt
12280 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b  x, xCompare, 0);
12290 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
122a0 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
122b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
122c0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
122d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
122e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
122f0 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
12300 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
12310 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
12320 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
12330 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
12340 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c  lation_v2(.  sql
12350 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e  ite3* db, .  con
12360 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
12370 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76  .  int enc, .  v
12380 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
12390 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
123a0 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
123b0 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
123c0 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c  *),.  void(*xDel
123d0 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  )(void*).){.  in
123e0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
123f0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
12400 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
12410 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
12420 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72  led );.  rc = cr
12430 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
12440 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63  , zName, (u8)enc
12450 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53  , SQLITE_COLL_US
12460 45 52 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  ER, pCtx, xCompa
12470 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20  re, xDel);.  rc 
12480 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
12490 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
124a0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
124b0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
124c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
124d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
124e0 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69  UTF16./*.** Regi
124f0 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
12500 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
12510 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
12520 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
12530 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
12540 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20  _collation16(.  
12550 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
12560 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d  const void *zNam
12570 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  e,.  int enc, . 
12580 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
12590 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
125a0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
125b0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
125c0 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
125d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
125e0 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20 20  char *zName8;.  
125f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
12600 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
12610 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
12620 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
12630 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65   zName8 = sqlite
12640 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e  3Utf16to8(db, zN
12650 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
12660 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
12670 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20  if( zName8 ){.  
12680 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c    rc = createCol
12690 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  lation(db, zName
126a0 38 2c 20 28 75 38 29 65 6e 63 2c 20 53 51 4c 49  8, (u8)enc, SQLI
126b0 54 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20 70 43  TE_COLL_USER, pC
126c0 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
126d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
126e0 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b  ree(db, zName8);
126f0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
12700 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
12710 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
12720 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
12730 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
12740 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
12750 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
12760 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73   */../*.** Regis
12770 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  ter a collation 
12780 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
12790 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
127a0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
127b0 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63  le.** db. Replac
127c0 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79  e any previously
127d0 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61   installed colla
127e0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
127f0 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctory..*/.int sq
12800 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
12810 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65  needed(.  sqlite
12820 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a  3 *db, .  void *
12830 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
12840 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65  .  void(*xCollNe
12850 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69  eded)(void*,sqli
12860 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
12870 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29  p,const char*).)
12880 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
12890 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
128a0 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  x);.  db->xCollN
128b0 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65  eeded = xCollNee
128c0 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ded;.  db->xColl
128d0 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20  Needed16 = 0;.  
128e0 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41  db->pCollNeededA
128f0 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64  rg = pCollNeeded
12900 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
12910 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
12920 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
12930 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
12940 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12950 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
12960 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69  gister a collati
12970 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
12980 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ory callback wit
12990 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
129a0 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70  andle.** db. Rep
129b0 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lace any previou
129c0 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f  sly installed co
129d0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
129e0 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74   factory..*/.int
129f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
12a00 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73  on_needed16(.  s
12a10 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76  qlite3 *db, .  v
12a20 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64  oid *pCollNeeded
12a30 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43  Arg, .  void(*xC
12a40 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69  ollNeeded16)(voi
12a50 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20  d*,sqlite3*,int 
12a60 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76  eTextRep,const v
12a70 6f 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74  oid*).){.  sqlit
12a80 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
12a90 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
12aa0 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30  >xCollNeeded = 0
12ab0 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
12ac0 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65  ded16 = xCollNee
12ad0 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f  ded16;.  db->pCo
12ae0 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
12af0 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
12b00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
12b10 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
12b20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12b30 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
12b40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
12b50 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  6 */..#ifndef SQ
12b60 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
12b70 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ATED./*.** This 
12b80 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20  function is now 
12b90 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20  an anachronism. 
12ba0 49 74 20 75 73 65 64 20 74 6f 20 62 65 20 75 73  It used to be us
12bb0 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72  ed to recover fr
12bc0 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29  om a.** malloc()
12bd0 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51   failure, but SQ
12be0 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68  Lite now does th
12bf0 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
12c00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12c10 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28  _global_recover(
12c20 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
12c30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
12c40 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  dif../*.** Test 
12c50 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
12c60 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  r not the databa
12c70 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  se connection is
12c80 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a   in autocommit.*
12c90 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20  * mode.  Return 
12ca0 54 52 55 45 20 69 66 20 69 74 20 69 73 20 61 6e  TRUE if it is an
12cb0 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20  d FALSE if not. 
12cc0 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   Autocommit mode
12cd0 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66   is on.** by def
12ce0 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69  ault.  Autocommi
12cf0 74 20 69 73 20 64 69 73 61 62 6c 65 64 20 62 79  t is disabled by
12d00 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65   a BEGIN stateme
12d10 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64  nt and reenabled
12d20 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20  .** by the next 
12d30 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41  COMMIT or ROLLBA
12d40 43 4b 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54  CK..**.******* T
12d50 48 49 53 20 49 53 20 41 4e 20 45 58 50 45 52 49  HIS IS AN EXPERI
12d60 4d 45 4e 54 41 4c 20 41 50 49 20 41 4e 44 20 49  MENTAL API AND I
12d70 53 20 53 55 42 4a 45 43 54 20 54 4f 20 43 48 41  S SUBJECT TO CHA
12d80 4e 47 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e  NGE ******.*/.in
12d90 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  t sqlite3_get_au
12da0 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33  tocommit(sqlite3
12db0 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20   *db){.  return 
12dc0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a  db->autoCommit;.
12dd0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
12de0 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
12df0 61 72 65 20 73 75 62 74 69 74 75 74 65 73 20 66  are subtitutes f
12e00 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c  or constants SQL
12e10 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20  ITE_CORRUPT,.** 
12e20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53  SQLITE_MISUSE, S
12e30 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20  QLITE_CANTOPEN, 
12e40 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e 64  SQLITE_IOERR and
12e50 20 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20   possibly other 
12e60 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e  error.** constan
12e70 74 73 2e 20 20 54 68 65 79 20 73 65 72 76 65 72  ts.  They server
12e80 20 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a   two purposes:.*
12e90 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65  *.**   1.  Serve
12ea0 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74   as a convenient
12eb0 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
12ec0 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20  breakpoint in a 
12ed0 64 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20  debugger.**     
12ee0 20 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e    to detect when
12ef0 20 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63   version error c
12f00 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73  onditions occurs
12f10 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e  ..**.**   2.  In
12f20 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67  voke sqlite3_log
12f30 28 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  () to provide th
12f40 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f  e source code lo
12f50 63 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20  cation where.** 
12f60 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65        a low-leve
12f70 6c 20 65 72 72 6f 72 20 69 73 20 66 69 72 73 74  l error is first
12f80 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e   detected..*/.in
12f90 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74  t sqlite3Corrupt
12fa0 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
12fb0 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
12fc0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
12fd0 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
12fe0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
12ff0 54 45 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20 20  TE_CORRUPT,.    
13000 20 20 20 20 20 20 20 20 20 20 22 64 61 74 61 62            "datab
13010 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 61  ase corruption a
13020 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e  t line %d of [%.
13030 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20  10s]",.         
13040 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b       lineno, 20+
13050 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
13060 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ());.  return SQ
13070 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a  LITE_CORRUPT;.}.
13080 69 6e 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73  int sqlite3Misus
13090 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  eError(int linen
130a0 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
130b0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
130c0 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
130d0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
130e0 49 54 45 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20  ITE_MISUSE, .   
130f0 20 20 20 20 20 20 20 20 20 20 20 22 6d 69 73 75             "misu
13100 73 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66  se at line %d of
13110 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20   [%.10s]",.     
13120 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c           lineno,
13130 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72   20+sqlite3_sour
13140 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72  ceid());.  retur
13150 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
13160 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61  .}.int sqlite3Ca
13170 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20  ntopenError(int 
13180 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63  lineno){.  testc
13190 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
131a0 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
131b0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   );.  sqlite3_lo
131c0 67 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  g(SQLITE_CANTOPE
131d0 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  N, .            
131e0 20 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66    "cannot open f
131f0 69 6c 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f  ile at line %d o
13200 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20  f [%.10s]",.    
13210 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f            lineno
13220 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75  , 20+sqlite3_sou
13230 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75  rceid());.  retu
13240 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
13250 45 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  EN;.}...#ifndef 
13260 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
13270 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69  ECATED./*.** Thi
13280 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e  s is a convenien
13290 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  ce routine that 
132a0 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
132b0 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69  all thread-speci
132c0 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20  fic.** data for 
132d0 74 68 69 73 20 74 68 72 65 61 64 20 68 61 73 20  this thread has 
132e0 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64  been deallocated
132f0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e  ..**.** SQLite n
13300 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68  o longer uses th
13310 72 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61  read-specific da
13320 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  ta so this routi
13330 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e  ne is now a.** n
13340 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74  o-op.  It is ret
13350 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72  ained for histor
13360 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69  ical compatibili
13370 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ty..*/.void sqli
13380 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e  te3_thread_clean
13390 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64  up(void){.}.#end
133a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
133b0 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
133c0 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63 69 66  n about a specif
133d0 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64  ic column of a d
133e0 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
133f0 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e  * See comment in
13400 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69   sqlite3.h (sqli
13410 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74  te.h.in) for det
13420 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ails..*/.#ifdef 
13430 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
13440 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 69 6e  LUMN_METADATA.in
13450 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  t sqlite3_table_
13460 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
13470 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
13480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13490 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  * Connection han
134a0 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
134b0 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20  har *zDbName,   
134c0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
134d0 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f   name or NULL */
134e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
134f0 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f  TableName,     /
13500 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  * Table name */.
13510 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
13520 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a  olumnName,    /*
13530 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   Column name */.
13540 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70    char const **p
13550 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a  zDataType,    /*
13560 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65   OUTPUT: Declare
13570 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20  d data type */. 
13580 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
13590 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20  CollSeq,     /* 
135a0 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f  OUTPUT: Collatio
135b0 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20  n sequence name 
135c0 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75  */.  int *pNotNu
135d0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
135e0 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65   /* OUTPUT: True
135f0 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e   if NOT NULL con
13600 73 74 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a  straint exists *
13610 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72  /.  int *pPrimar
13620 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  yKey,           
13630 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
13640 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f  if column part o
13650 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  f PK */.  int *p
13660 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20  Autoinc         
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 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e  is auto-incremen
136a0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
136b0 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
136c0 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a  g = 0;.  Table *
136d0 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75  pTab = 0;.  Colu
136e0 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20  mn *pCol = 0;.  
136f0 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68 61  int iCol;..  cha
13700 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79  r const *zDataTy
13710 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  pe = 0;.  char c
13720 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d  onst *zCollSeq =
13730 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c   0;.  int notnul
13740 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69  l = 0;.  int pri
13750 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69  marykey = 0;.  i
13760 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a  nt autoinc = 0;.
13770 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65  .  /* Ensure the
13780 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
13790 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64   has been loaded
137a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
137b0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
137c0 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  tex);.  sqlite3B
137d0 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
137e0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
137f0 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73  Init(db, &zErrMs
13800 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  g);.  if( SQLITE
13810 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67  _OK!=rc ){.    g
13820 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
13830 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
13840 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65  the table in que
13850 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20  stion */.  pTab 
13860 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
13870 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d  le(db, zTableNam
13880 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69  e, zDbName);.  i
13890 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62  f( !pTab || pTab
138a0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
138b0 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67   pTab = 0;.    g
138c0 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
138d0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68   }..  /* Find th
138e0 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69  e column for whi
138f0 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65  ch info is reque
13900 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 73 71  sted */.  if( sq
13910 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f  lite3IsRowid(zCo
13920 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20  lumnName) ){.   
13930 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
13940 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  Key;.    if( iCo
13950 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43  l>=0 ){.      pC
13960 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
13970 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20  [iCol];.    }.  
13980 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
13990 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
139a0 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
139b0 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  .      pCol = &p
139c0 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
139d0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71  .      if( 0==sq
139e0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
139f0 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d  l->zName, zColum
13a00 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  nName) ){.      
13a10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
13a20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
13a30 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  Col==pTab->nCol 
13a40 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
13a50 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72  0;.      goto er
13a60 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ror_out;.    }. 
13a70 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
13a80 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f  lowing block sto
13a90 72 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66  res the meta inf
13aa0 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69  ormation that wi
13ab0 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20  ll be returned. 
13ac0 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65   ** to the calle
13ad0 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61  r in local varia
13ae0 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20  bles zDataType, 
13af0 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c  zCollSeq, notnul
13b00 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20  l, primarykey.  
13b10 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20  ** and autoinc. 
13b20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
13b30 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73  ere are two poss
13b40 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20  ibilities:.  ** 
13b50 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65  .  **     1. The
13b60 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d   specified colum
13b70 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64  n name was rowid
13b80 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f  ", "oid" or "_ro
13b90 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20  wid_" .  **     
13ba0 20 20 20 61 6e 64 20 74 68 65 72 65 20 69 73 20     and there is 
13bb0 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65  no explicitly de
13bc0 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d  clared IPK colum
13bd0 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  n. .  **.  **   
13be0 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69    2. The table i
13bf0 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64  s not a view and
13c00 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
13c10 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a   identified an .
13c20 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c    **        expl
13c30 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
13c40 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74  column. Copy met
13c50 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
13c60 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a  om *pCol..  */ .
13c70 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20    if( pCol ){.  
13c80 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70 43    zDataType = pC
13c90 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a  ol->zType;.    z
13ca0 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e  CollSeq = pCol->
13cb0 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75  zColl;.    notnu
13cc0 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75  ll = pCol->notNu
13cd0 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61  ll!=0;.    prima
13ce0 72 79 6b 65 79 20 20 3d 20 70 43 6f 6c 2d 3e 69  rykey  = pCol->i
13cf0 73 50 72 69 6d 4b 65 79 21 3d 30 3b 0a 20 20 20  sPrimKey!=0;.   
13d00 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d   autoinc = pTab-
13d10 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20  >iPKey==iCol && 
13d20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
13d30 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
13d40 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b  nt)!=0;.  }else{
13d50 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d  .    zDataType =
13d60 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
13d70 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a  primarykey = 1;.
13d80 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c    }.  if( !zColl
13d90 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c  Seq ){.    zColl
13da0 53 65 71 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  Seq = "BINARY";.
13db0 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a    }..error_out:.
13dc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
13dd0 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f  aveAll(db);..  /
13de0 2a 20 57 68 65 74 68 65 72 20 74 68 65 20 66 75  * Whether the fu
13df0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63  nction call succ
13e00 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c  eeded or failed,
13e10 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   set the output 
13e20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20  parameters.  ** 
13e30 74 6f 20 77 68 61 74 65 76 65 72 20 74 68 65 69  to whatever thei
13e40 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70  r local counterp
13e50 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66  arts contain. If
13e60 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63   an error did oc
13e70 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68  cur,.  ** this h
13e80 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
13e90 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74   zeroing all out
13ea0 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a  put parameters..
13eb0 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74    */.  if( pzDat
13ec0 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54  aType ) *pzDataT
13ed0 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b  ype = zDataType;
13ee0 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71  .  if( pzCollSeq
13ef0 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20   ) *pzCollSeq = 
13f00 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20  zCollSeq;.  if( 
13f10 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74  pNotNull ) *pNot
13f20 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a  Null = notnull;.
13f30 20 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65    if( pPrimaryKe
13f40 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79  y ) *pPrimaryKey
13f50 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20   = primarykey;. 
13f60 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20   if( pAutoinc ) 
13f70 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f  *pAutoinc = auto
13f80 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49  inc;..  if( SQLI
13f90 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54  TE_OK==rc && !pT
13fa0 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
13fb0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
13fc0 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73  Msg);.    zErrMs
13fd0 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
13fe0 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20  tf(db, "no such 
13ff0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73  table column: %s
14000 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65  .%s", zTableName
14010 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d  ,.        zColum
14020 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  nName);.    rc =
14030 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
14040 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
14050 72 28 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d  r(db, rc, (zErrM
14060 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72  sg?"%s":0), zErr
14070 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
14080 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
14090 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  g);.  rc = sqlit
140a0 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
140b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
140c0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
140d0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
140e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
140f0 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
14100 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
14110 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
14120 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f  f time slept..*/
14130 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c 65  .int sqlite3_sle
14140 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71  ep(int ms){.  sq
14150 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
14160 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 56 66  .  int rc;.  pVf
14170 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  s = sqlite3_vfs_
14180 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 70  find(0);.  if( p
14190 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Vfs==0 ) return 
141a0 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  0;..  /* This fu
141b0 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20  nction works in 
141c0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75  milliseconds, bu
141d0 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  t the underlying
141e0 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a   OsSleep() .  **
141f0 20 41 50 49 20 75 73 65 73 20 6d 69 63 72 6f 73   API uses micros
14200 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74 68  econds. Hence th
14210 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20  e 1000's..  */. 
14220 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4f 73   rc = (sqlite3Os
14230 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30 30 30  Sleep(pVfs, 1000
14240 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20 72 65  *ms)/1000);.  re
14250 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14260 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
14270 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64 65 64  ble the extended
14280 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a   result codes..*
14290 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  /.int sqlite3_ex
142a0 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f  tended_result_co
142b0 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  des(sqlite3 *db,
142c0 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20 20 73   int onoff){.  s
142d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
142e0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
142f0 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f   db->errMask = o
14300 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66 66 66  noff ? 0xfffffff
14310 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69  f : 0xff;.  sqli
14320 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14330 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
14340 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14350 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
14360 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  the xFileControl
14370 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72   method on a par
14380 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
14390 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
143a0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71  _file_control(sq
143b0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
143c0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20   char *zDbName, 
143d0 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
143e0 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  rg){.  int rc = 
143f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
14400 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74  int iDb;.  sqlit
14410 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
14420 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
14430 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20   zDbName==0 ){. 
14440 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 7d 65     iDb = 0;.  }e
14450 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 44 62  lse{.    for(iDb
14460 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  =0; iDb<db->nDb;
14470 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69   iDb++){.      i
14480 66 28 20 73 74 72 63 6d 70 28 64 62 2d 3e 61 44  f( strcmp(db->aD
14490 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44  b[iDb].zName, zD
144a0 62 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  bName)==0 ) brea
144b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
144c0 66 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  f( iDb<db->nDb )
144d0 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
144e0 72 65 65 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ree = db->aDb[iD
144f0 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  b].pBt;.    if( 
14500 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 20 20  pBtree ){.      
14510 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
14520 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
14530 65 20 2a 66 64 3b 0a 20 20 20 20 20 20 73 71 6c  e *fd;.      sql
14540 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
14550 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20 70 50  Btree);.      pP
14560 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
14570 72 65 65 50 61 67 65 72 28 70 42 74 72 65 65 29  reePager(pBtree)
14580 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14590 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20  pPager!=0 );.   
145a0 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50     fd = sqlite3P
145b0 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29  agerFile(pPager)
145c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
145d0 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  fd!=0 );.      i
145e0 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
145f0 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  NTL_FILE_POINTER
14600 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28 73 71   ){.        *(sq
14610 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72  lite3_file**)pAr
14620 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 20 20  g = fd;.        
14630 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14640 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
14650 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
14660 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
14670 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
14680 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b  l(fd, op, pArg);
14690 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
146a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
146b0 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20  E_NOTFOUND;.    
146c0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
146d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
146e0 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ee);.    }.  }. 
146f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
14700 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
14710 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20  .  return rc;   
14720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  .}../*.** Interf
14730 61 63 65 20 74 6f 20 74 68 65 20 74 65 73 74 69  ace to the testi
14740 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74  ng logic..*/.int
14750 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
14760 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e  ntrol(int op, ..
14770 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
14780 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
14790 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45  _OMIT_BUILTIN_TE
147a0 53 54 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ST.  va_list ap;
147b0 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
147c0 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op);.  switch( o
147d0 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  p ){..    /*.   
147e0 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72   ** Save the cur
147f0 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
14800 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20  e PRNG..    */. 
14810 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
14820 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56  ESTCTRL_PRNG_SAV
14830 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
14840 65 33 50 72 6e 67 53 61 76 65 53 74 61 74 65 28  e3PrngSaveState(
14850 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14860 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
14870 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65    ** Restore the
14880 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52   state of the PR
14890 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73  NG to the last s
148a0 74 61 74 65 20 73 61 76 65 64 20 75 73 69 6e 67  tate saved using
148b0 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56  .    ** PRNG_SAV
148c0 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41 56 45  E.  If PRNG_SAVE
148d0 20 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72   has never befor
148e0 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74  e been called, t
148f0 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  hen.    ** this 
14900 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65 20 50  verb acts like P
14910 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a  RNG_RESET..    *
14920 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
14930 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
14940 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20  RESTORE: {.     
14950 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 74   sqlite3PrngRest
14960 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20  oreState();.    
14970 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
14980 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
14990 73 65 74 20 74 68 65 20 50 52 4e 47 20 62 61 63  set the PRNG bac
149a0 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69 74 69  k to its uniniti
149b0 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20 20 54  alized state.  T
149c0 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20  he next call.   
149d0 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72   ** to sqlite3_r
149e0 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c  andomness() will
149f0 20 72 65 73 65 65 64 20 74 68 65 20 50 52 4e 47   reseed the PRNG
14a00 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
14a10 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74  call.    ** to t
14a20 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d  he xRandomness m
14a30 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64 65 66  ethod of the def
14a40 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f  ault VFS..    */
14a50 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
14a60 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
14a70 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  ESET: {.      sq
14a80 6c 69 74 65 33 50 72 6e 67 52 65 73 65 74 53 74  lite3PrngResetSt
14a90 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
14aa0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
14ab0 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
14ac0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42  3_test_control(B
14ad0 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69 7a 65  ITVEC_TEST, size
14ae0 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a  , program).    *
14af0 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 74  *.    ** Run a t
14b00 65 73 74 20 61 67 61 69 6e 73 74 20 61 20 42 69  est against a Bi
14b10 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66 20 73  tvec object of s
14b20 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67 72 61  ize.  The progra
14b30 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a  m argument.    *
14b40 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66  * is an array of
14b50 20 69 6e 74 65 67 65 72 73 20 74 68 61 74 20 64   integers that d
14b60 65 66 69 6e 65 73 20 74 68 65 20 74 65 73 74 2e  efines the test.
14b70 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61    Return -1 on a
14b80 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61  .    ** memory a
14b90 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c  llocation error,
14ba0 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f   0 on success, o
14bb0 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61  r non-zero for a
14bc0 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20  n error..    ** 
14bd0 53 65 65 20 74 68 65 20 73 71 6c 69 74 65 33 42  See the sqlite3B
14be0 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74  itvecBuiltinTest
14bf0 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
14c00 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
14c10 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
14c20 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
14c30 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20  ITVEC_TEST: {.  
14c40 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f      int sz = va_
14c50 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
14c60 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d      int *aProg =
14c70 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
14c80 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14c90 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74  lite3BitvecBuilt
14ca0 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72 6f 67  inTest(sz, aProg
14cb0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14cc0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
14cd0 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
14ce0 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47  st_control(BENIG
14cf0 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20  N_MALLOC_HOOKS, 
14d00 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20  xBegin, xEnd).  
14d10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69    **.    ** Regi
14d20 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61  ster hooks to ca
14d30 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  ll to indicate w
14d40 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61  hich malloc() fa
14d50 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61  ilures .    ** a
14d60 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a  re benign..    *
14d70 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
14d80 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47  E_TESTCTRL_BENIG
14d90 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20  N_MALLOC_HOOKS: 
14da0 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20  {.      typedef 
14db0 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63  void (*void_func
14dc0 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20  tion)(void);.   
14dd0 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e     void_function
14de0 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20   xBenignBegin;. 
14df0 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69       void_functi
14e00 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20  on xBenignEnd;. 
14e10 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69       xBenignBegi
14e20 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  n = va_arg(ap, v
14e30 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20  oid_function);. 
14e40 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20       xBenignEnd 
14e50 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
14e60 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20  d_function);.   
14e70 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e     sqlite3Benign
14e80 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e  MallocHooks(xBen
14e90 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67  ignBegin, xBenig
14ea0 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65  nEnd);.      bre
14eb0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
14ec0 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
14ed0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
14ee0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
14ef0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73  ENDING_BYTE, uns
14f00 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20  igned int X).   
14f10 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74   **.    ** Set t
14f20 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20  he PENDING byte 
14f30 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  to the value in 
14f40 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66  the argument, if
14f50 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b   X>0..    ** Mak
14f60 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
14f70 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68  X==0.  Return th
14f80 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70  e value of the p
14f90 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20  ending byte.    
14fa0 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74 69 6e  ** as it existin
14fb0 67 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  g before this ro
14fc0 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
14fd0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
14fe0 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e  IMPORTANT:  Chan
14ff0 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47  ging the PENDING
15000 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30   byte from 0x400
15010 30 30 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e  00000 results in
15020 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d  .    ** an incom
15030 70 61 74 69 62 6c 65 20 64 61 74 61 62 61 73 65  patible database
15040 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43   file format.  C
15050 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44  hanging the PEND
15060 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  ING byte.    ** 
15070 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61  while any databa
15080 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  se connection is
15090 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e   open results in
150a0 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20   undefined and. 
150b0 20 20 20 2a 2a 20 64 69 6c 65 74 65 72 69 6f 75     ** dileteriou
150c0 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20  s behavior..    
150d0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
150e0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
150f0 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20  ING_BYTE: {.    
15100 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42    rc = PENDING_B
15110 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  YTE;.#ifndef SQL
15120 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20  ITE_OMIT_WSD.   
15130 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73     {.        uns
15140 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c  igned int newVal
15150 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e   = va_arg(ap, un
15160 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20  signed int);.   
15170 20 20 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20       if( newVal 
15180 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67  ) sqlite3Pending
15190 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20  Byte = newVal;. 
151a0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
151b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
151c0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
151d0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
151e0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
151f0 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e  TCTRL_ASSERT, in
15200 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
15210 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70  ** This action p
15220 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69  rovides a run-ti
15230 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 77  me test to see w
15240 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20  hether or not.  
15250 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61    ** assert() wa
15260 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  s enabled at com
15270 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58  pile-time.  If X
15280 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 73 73   is true and ass
15290 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20  ert().    ** is 
152a0 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  enabled, then th
152b0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
152c0 73 20 74 72 75 65 2e 20 20 49 66 20 58 20 69 73  s true.  If X is
152d0 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a   true and.    **
152e0 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
152f0 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
15300 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
15310 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20  zero.  If X is. 
15320 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20     ** false and 
15330 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62  assert() is enab
15340 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73  led, then the as
15350 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e  sertion fires an
15360 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f  d the.    ** pro
15370 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66  cess aborts.  If
15380 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20   X is false and 
15390 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61  assert() is disa
153a0 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20  bled, then the. 
153b0 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c     ** return val
153c0 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20  ue is zero..    
153d0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
153e0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
153f0 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61  RT: {.      vola
15400 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a  tile int x = 0;.
15410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 78        assert( (x
15420 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
15430 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ))!=0 );.      r
15440 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65  c = x;.      bre
15450 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ak;.    }...    
15460 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
15470 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
15480 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
15490 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20  ALWAYS, int X). 
154a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
154b0 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  s action provide
154c0 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  s a run-time tes
154d0 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65  t to see how the
154e0 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20   ALWAYS and.    
154f0 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20  ** NEVER macros 
15500 77 65 72 65 20 64 65 66 69 6e 65 64 20 61 74 20  were defined at 
15510 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20  compile-time..  
15520 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
15530 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
15540 41 4c 57 41 59 53 28 58 29 2e 20 20 0a 20 20 20  ALWAYS(X).  .   
15550 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
15560 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20  ecommended test 
15570 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65  is X==2.  If the
15580 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
15590 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20   2, that means. 
155a0 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61     ** ALWAYS() a
155b0 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 62  nd NEVER() are b
155c0 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74  oth no-op pass-t
155d0 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77  hrough macros, w
155e0 68 69 63 68 20 69 73 20 74 68 65 0a 20 20 20 20  hich is the.    
155f0 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  ** default setti
15600 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65 74 75  ng.  If the retu
15610 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74  rn value is 1, t
15620 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20  hen ALWAYS() is 
15630 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61  either.    ** ha
15640 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65  rd-coded to true
15650 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73 73 65   or else it asse
15660 72 74 73 20 69 66 20 69 74 73 20 61 72 67 75 6d  rts if its argum
15670 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  ent is false..  
15680 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62    ** The first b
15690 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f  ehavior (hard-co
156a0 64 65 64 20 74 6f 20 74 72 75 65 29 20 69 73 20  ded to true) is 
156b0 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20  the case if.    
156c0 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ** SQLITE_TESTCT
156d0 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20  RL_ASSERT shows 
156e0 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73  that assert() is
156f0 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68   disabled and th
15700 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20  e second.    ** 
15710 62 65 68 61 76 69 6f 72 20 28 61 73 73 65 72 74  behavior (assert
15720 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   if the argument
15730 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20   to ALWAYS() is 
15740 66 61 6c 73 65 29 20 69 73 20 74 68 65 20 63 61  false) is the ca
15750 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c  se if.    ** SQL
15760 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
15770 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61  ERT shows that a
15780 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c  ssert() is enabl
15790 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
157a0 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74  * The run-time t
157b0 65 73 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69  est procedure mi
157c0 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69  ght look somethi
157d0 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ng like this:.  
157e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69    **.    **    i
157f0 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  f( sqlite3_test_
15800 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
15810 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20  ESTCTRL_ALWAYS, 
15820 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20  2)==2 ){.    ** 
15830 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29       // ALWAYS()
15840 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65   and NEVER() are
15850 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
15860 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a  ugh macros.    *
15870 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  *    }else if( s
15880 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
15890 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
158a0 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29  TRL_ASSERT, 1) )
158b0 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
158c0 20 41 4c 57 41 59 53 28 78 29 20 61 73 73 65 72   ALWAYS(x) asser
158d0 74 73 20 74 68 61 74 20 78 20 69 73 20 74 72 75  ts that x is tru
158e0 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73 73 65  e. NEVER(x) asse
158f0 72 74 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a  rts x is false..
15900 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b      **    }else{
15910 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
15920 41 4c 57 41 59 53 28 78 29 20 69 73 20 61 20 63  ALWAYS(x) is a c
15930 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45  onstant 1.  NEVE
15940 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61  R(x) is a consta
15950 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20  nt 0..    **    
15960 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  }.    */.    cas
15970 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
15980 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20  L_ALWAYS: {.    
15990 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67    int x = va_arg
159a0 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
159b0 72 63 20 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a  rc = ALWAYS(x);.
159c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
159d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
159e0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
159f0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
15a00 4c 5f 52 45 53 45 52 56 45 2c 20 73 71 6c 69 74  L_RESERVE, sqlit
15a10 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20  e3 *db, int N). 
15a20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
15a30 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 69   the nReserve si
15a40 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74 68 65 20  ze to N for the 
15a50 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e  main database on
15a60 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
15a70 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20    ** connection 
15a80 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  db..    */.    c
15a90 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
15aa0 54 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20  TRL_RESERVE: {. 
15ab0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
15ac0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
15ad0 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 69  lite3*);.      i
15ae0 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
15af0 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ,int);.      sql
15b00 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
15b10 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
15b20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
15b30 65 74 50 61 67 65 53 69 7a 65 28 64 62 2d 3e 61  etPageSize(db->a
15b40 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c  Db[0].pBt, 0, x,
15b50 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
15b60 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
15b70 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
15b80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
15b90 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74     /*  sqlite3_t
15ba0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
15bb0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
15bc0 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74  MIZATIONS, sqlit
15bd0 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20  e3 *db, int N). 
15be0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61     **.    ** Ena
15bf0 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 76  ble or disable v
15c00 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
15c10 69 6f 6e 73 20 66 6f 72 20 74 65 73 74 69 6e 67  ions for testing
15c20 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20   purposes.  The 
15c30 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74  .    ** argument
15c40 20 4e 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20   N is a bitmask 
15c50 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  of optimizations
15c60 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e   to be disabled.
15c70 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20    For normal.   
15c80 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20   ** operation N 
15c90 73 68 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68  should be 0.  Th
15ca0 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 61  e idea is that a
15cb0 20 74 65 73 74 20 70 72 6f 67 72 61 6d 20 28 6c   test program (l
15cc0 69 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53  ike the.    ** S
15cd0 51 4c 20 4c 6f 67 69 63 20 54 65 73 74 20 6f 72  QL Logic Test or
15ce0 20 53 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c 65   SLT test module
15cf0 29 20 63 61 6e 20 72 75 6e 20 74 68 65 20 73 61  ) can run the sa
15d00 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20  me SQL multiple 
15d10 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69 74  times.    ** wit
15d20 68 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69  h various optimi
15d30 7a 61 74 69 6f 6e 73 20 64 69 73 61 62 6c 65 64  zations disabled
15d40 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
15d50 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a  the same answer.
15d60 20 20 20 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e      ** is obtain
15d70 65 64 20 69 6e 20 65 76 65 72 79 20 63 61 73 65  ed in every case
15d80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
15d90 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
15da0 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a  L_OPTIMIZATIONS:
15db0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
15dc0 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70   *db = va_arg(ap
15dd0 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  , sqlite3*);.   
15de0 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72     int x = va_ar
15df0 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20  g(ap,int);.     
15e00 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 78 20   db->flags = (x 
15e10 26 20 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b  & SQLITE_OptMask
15e20 29 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  ) | (db->flags &
15e30 20 7e 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b   ~SQLITE_OptMask
15e40 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15e50 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
15e60 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20  LITE_N_KEYWORD. 
15e70 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
15e80 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
15e90 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59  E_TESTCTRL_ISKEY
15ea0 57 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72  WORD, const char
15eb0 20 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a   *zWord).    **.
15ec0 20 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20      ** If zWord 
15ed0 69 73 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63  is a keyword rec
15ee0 6f 67 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70  ognized by the p
15ef0 61 72 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75  arser, then retu
15f00 72 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75  rn the.    ** nu
15f10 6d 62 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73  mber of keywords
15f20 2e 20 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69  .  Or if zWord i
15f30 73 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c  s not a keyword,
15f40 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a   return 0..    *
15f50 2a 20 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74  * .    ** This t
15f60 65 73 74 20 66 65 61 74 75 72 65 20 69 73 20 6f  est feature is o
15f70 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  nly available in
15f80 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f   the amalgamatio
15f90 6e 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74  n since.    ** t
15fa0 68 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57  he SQLITE_N_KEYW
15fb0 4f 52 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74  ORD macro is not
15fc0 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73   defined in this
15fd0 20 66 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a   file if SQLite.
15fe0 20 20 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20      ** is built 
15ff0 75 73 69 6e 67 20 73 65 70 61 72 61 74 65 20 73  using separate s
16000 6f 75 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20  ource files..   
16010 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
16020 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b  ITE_TESTCTRL_ISK
16030 45 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20  EYWORD: {.      
16040 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72  const char *zWor
16050 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  d = va_arg(ap, c
16060 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
16070 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
16080 65 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64  e3Strlen30(zWord
16090 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73  );.      rc = (s
160a0 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64  qlite3KeywordCod
160b0 65 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29  e((u8*)zWord, n)
160c0 21 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54  !=TK_ID) ? SQLIT
160d0 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b  E_N_KEYWORD : 0;
160e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
160f0 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20    }.#endif ..   
16100 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
16110 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
16120 54 45 53 54 43 54 52 4c 5f 50 47 48 44 52 53 5a  TESTCTRL_PGHDRSZ
16130 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
16140 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
16150 6f 66 20 61 20 70 63 61 63 68 65 20 68 65 61 64  of a pcache head
16160 65 72 20 69 6e 20 62 79 74 65 73 2e 0a 20 20 20  er in bytes..   
16170 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
16180 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 47 48  ITE_TESTCTRL_PGH
16190 44 52 53 5a 3a 20 7b 0a 20 20 20 20 20 20 72 63  DRSZ: {.      rc
161a0 20 3d 20 73 69 7a 65 6f 66 28 50 67 48 64 72 29   = sizeof(PgHdr)
161b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
161c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 71 6c     }..    /* sql
161d0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
161e0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
161f0 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 2c  L_SCRATCHMALLOC,
16200 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46 72 65   sz, &pNew, pFre
16210 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  e);.    **.    *
16220 2a 20 50 61 73 73 20 70 46 72 65 65 20 69 6e 74  * Pass pFree int
16230 6f 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68  o sqlite3Scratch
16240 46 72 65 65 28 29 2e 20 0a 20 20 20 20 2a 2a 20  Free(). .    ** 
16250 49 66 20 73 7a 3e 30 20 74 68 65 6e 20 61 6c 6c  If sz>0 then all
16260 6f 63 61 74 65 20 61 20 73 63 72 61 74 63 68 20  ocate a scratch 
16270 62 75 66 66 65 72 20 69 6e 74 6f 20 70 4e 65 77  buffer into pNew
16280 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  .  .    */.    c
16290 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
162a0 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f  TRL_SCRATCHMALLO
162b0 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  C: {.      void 
162c0 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65 77 3b  *pFree, **ppNew;
162d0 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  .      int sz;. 
162e0 20 20 20 20 20 73 7a 20 3d 20 76 61 5f 61 72 67       sz = va_arg
162f0 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
16300 20 70 70 4e 65 77 20 3d 20 76 61 5f 61 72 67 28   ppNew = va_arg(
16310 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20 20 20  ap, void**);.   
16320 20 20 20 70 46 72 65 65 20 3d 20 76 61 5f 61 72     pFree = va_ar
16330 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
16340 20 20 20 20 69 66 28 20 73 7a 20 29 20 2a 70 70      if( sz ) *pp
16350 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 63 72  New = sqlite3Scr
16360 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a  atchMalloc(sz);.
16370 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 72        sqlite3Scr
16380 61 74 63 68 46 72 65 65 28 70 46 72 65 65 29 3b  atchFree(pFree);
16390 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
163a0 20 20 7d 0a 0a 20 20 7d 0a 20 20 76 61 5f 65 6e    }..  }.  va_en
163b0 64 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  d(ap);.#endif /*
163c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49   SQLITE_OMIT_BUI
163d0 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72  LTIN_TEST */.  r
163e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a              eturn rc;.}.