/ Hex Artifact Content
Login

Artifact 657885e071f21e601abb727bf4794e55c0722df8:


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: 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20  pHeap==0 ){.    
33a0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 65      /* If the he
33b0: 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20 4e 55  ap pointer is NU
33c0: 4c 4c 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65  LL, then restore
33d0: 20 74 68 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c   the malloc impl
33e0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20 20 20  ementation.     
33f0: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4e 55     ** back to NU
3400: 4c 4c 20 70 6f 69 6e 74 65 72 73 20 74 6f 6f 2e  LL pointers too.
3410: 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
3420: 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 74 6f 20  e the malloc to 
3430: 67 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61  go.        ** ba
3440: 63 6b 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c  ck to its defaul
3450: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
3460: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e   when sqlite3_in
3470: 69 74 69 61 6c 69 7a 65 28 29 20 69 73 0a 20 20  itialize() is.  
3480: 20 20 20 20 20 20 2a 2a 20 72 75 6e 2e 0a 20 20        ** run..  
3490: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
34a0: 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74 65 33   memset(&sqlite3
34b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20  GlobalConfig.m, 
34c0: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
34d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29  3GlobalConfig.m)
34e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
34f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 68          /* The h
3500: 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20 6e  eap pointer is n
3510: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e  ot NULL, then in
3520: 73 74 61 6c 6c 20 6f 6e 65 20 6f 66 20 74 68 65  stall one of the
3530: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 35  .        ** mem5
3540: 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65 74 68 6f 64  .c/mem3.c method
3550: 73 2e 20 49 66 20 6e 65 69 74 68 65 72 20 45 4e  s. If neither EN
3560: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6e 6f 72  ABLE_MEMSYS3 nor
3570: 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 4e 41 42  .        ** ENAB
3580: 4c 45 5f 4d 45 4d 53 59 53 35 20 69 73 20 64 65  LE_MEMSYS5 is de
3590: 66 69 6e 65 64 2c 20 72 65 74 75 72 6e 20 61 6e  fined, return an
35a0: 20 65 72 72 6f 72 2e 0a 20 20 20 20 20 20 20 20   error..        
35b0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
35c0: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a  _ENABLE_MEMSYS3.
35d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
35e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20  lobalConfig.m = 
35f0: 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65  *sqlite3MemGetMe
3600: 6d 73 79 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a  msys3();.#endif.
3610: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
3620: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20  ABLE_MEMSYS5.   
3630: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3640: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
3650: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
3660: 73 35 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  s5();.#endif.   
3670: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
3680: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
3690: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
36a0: 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45  CONFIG_LOOKASIDE
36b0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
36c0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
36d0: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61  Lookaside = va_a
36e0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
36f0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3700: 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64  Config.nLookasid
3710: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
3720: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20  ;.    }.    .   
3740: 20 2f 2a 20 52 65 63 6f 72 64 20 61 20 70 6f 69   /* Record a poi
3750: 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 6f 67 67  nter to the logg
3760: 65 72 20 66 75 6e 63 63 74 69 6f 6e 20 61 6e 64  er funcction and
3770: 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75 6d   its first argum
3780: 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ent..    ** The 
3790: 64 65 66 61 75 6c 74 20 69 73 20 4e 55 4c 4c 2e  default is NULL.
37a0: 20 20 4c 6f 67 67 69 6e 67 20 69 73 20 64 69 73    Logging is dis
37b0: 61 62 6c 65 64 20 69 66 20 74 68 65 20 66 75 6e  abled if the fun
37c0: 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73  ction pointer is
37d0: 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20  .    ** NULL..  
37e0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
37f0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a  LITE_CONFIG_LOG:
3800: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43   {.      /* MSVC
3810: 20 69 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20   is picky about 
3820: 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72  pulling func ptr
3830: 73 20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e  s from va lists.
3840: 0a 20 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f  .      ** http:/
3850: 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f  /support.microso
3860: 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a  ft.com/kb/47961.
3870: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
3880: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
3890: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
38a0: 6f 69 64 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74  oid(*)(void*,int
38b0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a  ,const char*));.
38c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
38d0: 79 70 65 64 65 66 20 76 6f 69 64 28 2a 4c 4f 47  ypedef void(*LOG
38e0: 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 69 6e  FUNC_t)(void*,in
38f0: 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  t,const char*);.
3900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3910: 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d  balConfig.xLog =
3920: 20 76 61 5f 61 72 67 28 61 70 2c 20 4c 4f 47 46   va_arg(ap, LOGF
3930: 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 73 71  UNC_t);.      sq
3940: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3950: 67 2e 70 4c 6f 67 41 72 67 20 3d 20 76 61 5f 61  g.pLogArg = va_a
3960: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20  rg(ap, void*);. 
3970: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3980: 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  }..    default: 
3990: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
39a0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
39b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
39c0: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
39d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
39e0: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65  /*.** Set up the
39f0: 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65   lookaside buffe
3a00: 72 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  rs for a databas
3a10: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
3a20: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
3a30: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a  K on success.  .
3a40: 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20  ** If lookaside 
3a50: 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
3a60: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
3a70: 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  _BUSY..**.** The
3a80: 20 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73   sz parameter is
3a90: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
3aa0: 79 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f  ytes in each loo
3ab0: 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20  kaside slot..** 
3ac0: 54 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65  The cnt paramete
3ad0: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
3ae0: 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53  of slots.  If pS
3af0: 74 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65  tart is NULL the
3b00: 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68  .** space for th
3b10: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
3b20: 72 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ry is obtained f
3b30: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
3b40: 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61  oc()..** If pSta
3b50: 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  rt is not NULL t
3b60: 68 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74  hen it is sz*cnt
3b70: 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
3b80: 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74   to use for.** t
3b90: 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  he lookaside mem
3ba0: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
3bb0: 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64  nt setupLookasid
3bc0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76  e(sqlite3 *db, v
3bd0: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73  oid *pBuf, int s
3be0: 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76  z, int cnt){.  v
3bf0: 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69  oid *pStart;.  i
3c00: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
3c10: 2e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74  .nOut ){.    ret
3c20: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
3c30: 0a 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61  .  }.  /* Free a
3c40: 6e 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b  ny existing look
3c50: 61 73 69 64 65 20 62 75 66 66 65 72 20 66 6f 72  aside buffer for
3c60: 20 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66   this handle bef
3c70: 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  ore.  ** allocat
3c80: 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f  ing a new one so
3c90: 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74   we don't have t
3ca0: 6f 20 68 61 76 65 20 73 70 61 63 65 20 66 6f 72  o have space for
3cb0: 20 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74   .  ** both at t
3cc0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20  he same time..  
3cd0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  */.  if( db->loo
3ce0: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
3cf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
3d00: 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69  free(db->lookasi
3d10: 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  de.pStart);.  }.
3d20: 20 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66    /* The size of
3d30: 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f   a lookaside slo
3d40: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61  t needs to be la
3d50: 72 67 65 72 20 74 68 61 6e 20 61 20 70 6f 69 6e  rger than a poin
3d60: 74 65 72 0a 20 20 2a 2a 20 74 6f 20 62 65 20 75  ter.  ** to be u
3d70: 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  seful..  */.  if
3d80: 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  ( sz<=(int)sizeo
3d90: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
3da0: 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66  ) ) sz = 0;.  if
3db0: 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20  ( cnt<0 ) cnt = 
3dc0: 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c  0;.  if( sz==0 |
3dd0: 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  | cnt==0 ){.    
3de0: 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61  sz = 0;.    pSta
3df0: 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  rt = 0;.  }else 
3e00: 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20  if( pBuf==0 ){. 
3e10: 20 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57     sz = ROUNDDOW
3e20: 4e 38 28 73 7a 29 3b 20 2f 2a 20 49 4d 50 3a 20  N8(sz); /* IMP: 
3e30: 52 2d 33 33 30 33 38 2d 30 39 33 38 32 20 2a 2f  R-33038-09382 */
3e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
3e50: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
3e60: 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 73 71  .    pStart = sq
3e70: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a  lite3Malloc( sz*
3e80: 63 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20  cnt );  /* IMP: 
3e90: 52 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f  R-61949-35727 */
3ea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
3eb0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
3ec0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 7a 20 3d   }else{.    sz =
3ed0: 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b   ROUNDDOWN8(sz);
3ee0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38   /* IMP: R-33038
3ef0: 2d 30 39 33 38 32 20 2a 2f 0a 20 20 20 20 70 53  -09382 */.    pS
3f00: 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d  tart = pBuf;.  }
3f10: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
3f20: 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61 72 74  .pStart = pStart
3f30: 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ;.  db->lookasid
3f40: 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64  e.pFree = 0;.  d
3f50: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20  b->lookaside.sz 
3f60: 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28  = (u16)sz;.  if(
3f70: 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69   pStart ){.    i
3f80: 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73  nt i;.    Lookas
3f90: 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20  ideSlot *p;.    
3fa0: 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e  assert( sz > (in
3fb0: 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69  t)sizeof(Lookasi
3fc0: 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20  deSlot*) );.    
3fd0: 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  p = (LookasideSl
3fe0: 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20  ot*)pStart;.    
3ff0: 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d  for(i=cnt-1; i>=
4000: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70  0; i--){.      p
4010: 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f  ->pNext = db->lo
4020: 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20  okaside.pFree;. 
4030: 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69       db->lookasi
4040: 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20  de.pFree = p;.  
4050: 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69      p = (Lookasi
4060: 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70  deSlot*)&((u8*)p
4070: 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  )[sz];.    }.   
4080: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
4090: 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d  End = p;.    db-
40a0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
40b0: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d  led = 1;.    db-
40c0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
40d0: 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f  oced = pBuf==0 ?
40e0: 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1:0;.  }else{.  
40f0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4100: 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 64 62  pEnd = 0;.    db
4110: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
4120: 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62  bled = 0;.    db
4130: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
4140: 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  loced = 0;.  }. 
4150: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4160: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
4170: 72 6e 20 74 68 65 20 6d 75 74 65 78 20 61 73 73  rn the mutex ass
4180: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
4190: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
41a0: 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d  on..*/.sqlite3_m
41b0: 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62  utex *sqlite3_db
41c0: 5f 6d 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a  _mutex(sqlite3 *
41d0: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
41e0: 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->mutex;.}../*.*
41f0: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
4200: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20  settings for an 
4210: 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62  individual datab
4220: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
4230: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
4240: 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20  _config(sqlite3 
4250: 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e  *db, int op, ...
4260: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
4270: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f  .  int rc;.  va_
4280: 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
4290: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
42a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
42b0: 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44  BCONFIG_LOOKASID
42c0: 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  E: {.      void 
42d0: 2a 70 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61  *pBuf = va_arg(a
42e0: 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d  p, void*); /* IM
42f0: 50 3a 20 52 2d 32 31 31 31 32 2d 31 32 32 37 35  P: R-21112-12275
4300: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
4310: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4320: 74 29 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50  t);       /* IMP
4330: 3a 20 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20  : R-47871-25994 
4340: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74  */.      int cnt
4350: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4360: 74 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a  t);      /* IMP:
4370: 20 52 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a   R-04460-53386 *
4380: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 74  /.      rc = set
4390: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20  upLookaside(db, 
43a0: 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a  pBuf, sz, cnt);.
43b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
43c0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
43d0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
43e0: 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d  ITE_ERROR; /* IM
43f0: 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33 37 32  P: R-42790-23372
4400: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
4410: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
4420: 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72  end(ap);.  retur
4430: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
4440: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
4450: 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e  he buffer z[0..n
4460: 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  -1] contains all
4470: 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   spaces..*/.stat
4480: 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73  ic int allSpaces
4490: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
44a0: 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28  int n){.  while(
44b0: 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>0 && z[n-1]==
44c0: 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  ' ' ){ n--; }.  
44d0: 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a  return n==0;.}..
44e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
44f0: 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
4500: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  ing function nam
4510: 65 64 20 22 42 49 4e 41 52 59 22 20 77 68 69 63  ed "BINARY" whic
4520: 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61  h is always.** a
4530: 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
4540: 49 66 20 74 68 65 20 70 61 64 46 6c 61 67 20 61  If the padFlag a
4550: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
4560: 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70  ULL then space p
4570: 61 64 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e  adding at the en
4580: 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20  d.** of strings 
4590: 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  is ignored.  Thi
45a0: 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  s implements the
45b0: 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e   RTRIM collation
45c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
45d0: 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76  binCollFunc(.  v
45e0: 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20  oid *padFlag,.  
45f0: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
4600: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
4610: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
4620: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
4630: 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e    int rc, n;.  n
4640: 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f   = nKey1<nKey2 ?
4650: 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a   nKey1 : nKey2;.
4660: 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b    rc = memcmp(pK
4670: 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a  ey1, pKey2, n);.
4680: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
4690: 20 20 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20     if( padFlag. 
46a0: 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73      && allSpaces
46b0: 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b  (((char*)pKey1)+
46c0: 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20  n, nKey1-n).    
46d0: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
46e0: 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20  char*)pKey2)+n, 
46f0: 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a  nKey2-n).    ){.
4700: 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72        /* Leave r
4710: 63 20 75 6e 63 68 61 6e 67 65 64 20 61 74 20 30  c unchanged at 0
4720: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
4730: 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20       rc = nKey1 
4740: 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20  - nKey2;.    }. 
4750: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4760: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72  }../*.** Another
4770: 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74   built-in collat
4780: 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f  ing sequence: NO
4790: 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69  CASE. .**.** Thi
47a0: 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  s collating sequ
47b0: 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64  ence is intended
47c0: 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
47d0: 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64 61 6e  "case independan
47e0: 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22  t.** comparison"
47f0: 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c  . SQLite's knowl
4800: 65 64 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e  edge of upper an
4810: 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75  d lower case equ
4820: 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65  ivalents.** exte
4830: 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20  nds only to the 
4840: 32 36 20 63 68 61 72 61 63 74 65 72 73 20 75 73  26 characters us
4850: 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73  ed in the Englis
4860: 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a  h language..**.*
4870: 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20  * At the moment 
4880: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
4890: 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61  UTF-8 implementa
48a0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
48b0: 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74  int nocaseCollat
48c0: 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20  ingFunc(.  void 
48d0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20  *NotUsed,.  int 
48e0: 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
48f0: 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20  d *pKey1,.  int 
4900: 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey2, const voi
4910: 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e  d *pKey2.){.  in
4920: 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t r = sqlite3Str
4930: 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f  NICmp(.      (co
4940: 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31  nst char *)pKey1
4950: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
4960: 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b  pKey2, (nKey1<nK
4970: 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32  ey2)?nKey1:nKey2
4980: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
4990: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
49a0: 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20    if( 0==r ){.  
49b0: 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79    r = nKey1-nKey
49c0: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
49d0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
49e0: 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20  rn the ROWID of 
49f0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
4a00: 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65  insert.*/.sqlite
4a10: 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c  _int64 sqlite3_l
4a20: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
4a30: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
4a40: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74   return db->last
4a50: 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
4a60: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
4a70: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20  r of changes in 
4a80: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
4a90: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
4aa0: 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  exec()..*/.int s
4ab0: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 73  qlite3_changes(s
4ac0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
4ad0: 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67  eturn db->nChang
4ae0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
4af0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
4b00: 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20 74   changes since t
4b10: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
4b20: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a  le was opened..*
4b30: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f  /.int sqlite3_to
4b40: 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  tal_changes(sqli
4b50: 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
4b60: 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  rn db->nTotalCha
4b70: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  nge;.}../*.** Cl
4b80: 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  ose all open sav
4b90: 65 70 6f 69 6e 74 73 2e 20 54 68 69 73 20 66 75  epoints. This fu
4ba0: 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69  nction only mani
4bb0: 70 75 6c 61 74 65 73 20 66 69 65 6c 64 73 20 6f  pulates fields o
4bc0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
4bd0: 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c  e handle object,
4be0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f   it does not clo
4bf0: 73 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74  se any savepoint
4c00: 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f 70  s that may be op
4c10: 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d 74  en.** at the b-t
4c20: 72 65 65 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e  ree/pager level.
4c30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4c40: 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
4c50: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
4c60: 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65  while( db->pSave
4c70: 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53 61 76  point ){.    Sav
4c80: 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64  epoint *pTmp = d
4c90: 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20  b->pSavepoint;. 
4ca0: 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e     db->pSavepoin
4cb0: 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b  t = pTmp->pNext;
4cc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4cd0: 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20  ee(db, pTmp);.  
4ce0: 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69  }.  db->nSavepoi
4cf0: 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53  nt = 0;.  db->nS
4d00: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
4d10: 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f  db->isTransactio
4d20: 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
4d30: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
4d40: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
4d50: 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74  unction associat
4d60: 65 64 20 77 69 74 68 20 46 75 6e 63 44 65 66 20  ed with FuncDef 
4d70: 70 2c 20 69 66 20 61 6e 79 2e 20 45 78 63 65 70  p, if any. Excep
4d80: 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73  t,.** if this is
4d90: 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 63 6f   not the last co
4da0: 70 79 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  py of the functi
4db0: 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b  on, do not invok
4dc0: 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a  e it. Multiple.*
4dd0: 2a 20 63 6f 70 69 65 73 20 6f 66 20 61 20 73 69  * copies of a si
4de0: 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20 61 72  ngle function ar
4df0: 65 20 63 72 65 61 74 65 64 20 77 68 65 6e 20 63  e created when c
4e00: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
4e10: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69   is called.** wi
4e20: 74 68 20 53 51 4c 49 54 45 5f 41 4e 59 20 61 73  th SQLITE_ANY as
4e30: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a   the encoding..*
4e40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 75  /.static void fu
4e50: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 73 71  nctionDestroy(sq
4e60: 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44  lite3 *db, FuncD
4e70: 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65  ef *p){.  FuncDe
4e80: 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72  structor *pDestr
4e90: 75 63 74 6f 72 20 3d 20 70 2d 3e 70 44 65 73 74  uctor = p->pDest
4ea0: 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70 44  ructor;.  if( pD
4eb0: 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
4ec0: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52   pDestructor->nR
4ed0: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44  ef--;.    if( pD
4ee0: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d  estructor->nRef=
4ef0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65 73  =0 ){.      pDes
4f00: 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f  tructor->xDestro
4f10: 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 70  y(pDestructor->p
4f20: 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20 20  UserData);.     
4f30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4f40: 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b  b, pDestructor);
4f50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4f60: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69  .** Close an exi
4f70: 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74  sting SQLite dat
4f80: 61 62 61 73 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c  abase.*/.int sql
4f90: 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74  ite3_close(sqlit
4fa0: 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45  e3 *db){.  HashE
4fb0: 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20 20 20  lem *i;         
4fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
4fd0: 73 68 20 74 61 62 6c 65 20 69 74 65 72 61 74 6f  sh table iterato
4fe0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20  r */.  int j;.. 
4ff0: 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
5000: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5010: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
5020: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
5030: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
5040: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5050: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
5060: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
5070: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
5080: 78 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 52 65  x);..  sqlite3Re
5090: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
50a0: 61 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  a(db, 0);..  /* 
50b0: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
50c0: 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 20 52 65   is open, the Re
50d0: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
50e0: 61 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a 20  a() call above. 
50f0: 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61 76   ** will not hav
5100: 65 20 63 61 6c 6c 65 64 20 74 68 65 20 78 44 69  e called the xDi
5110: 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f  sconnect() metho
5120: 64 20 6f 6e 20 61 6e 79 20 76 69 72 74 75 61 6c  d on any virtual
5130: 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20  .  ** tables in 
5140: 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b  the db->aVTrans[
5150: 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66 6f 6c  ] array. The fol
5160: 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 56 74  lowing sqlite3Vt
5170: 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20 2a  abRollback().  *
5180: 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20 73  * call will do s
5190: 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f 20 64 6f  o. We need to do
51a0: 20 74 68 69 73 20 62 65 66 6f 72 65 20 74 68 65   this before the
51b0: 20 63 68 65 63 6b 20 66 6f 72 20 61 63 74 69 76   check for activ
51c0: 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  e.  ** SQL state
51d0: 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73 20  ments below, as 
51e0: 74 68 65 20 76 2d 74 61 62 6c 65 20 69 6d 70 6c  the v-table impl
51f0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 62  ementation may b
5200: 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20 73  e storing.  ** s
5210: 6f 6d 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ome prepared sta
5220: 74 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61 6c  tements internal
5230: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ly..  */.  sqlit
5240: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64  e3VtabRollback(d
5250: 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  b);..  /* If the
5260: 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74  re are any outst
5270: 61 6e 64 69 6e 67 20 56 4d 73 2c 20 72 65 74 75  anding VMs, retu
5280: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
5290: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64  */.  if( db->pVd
52a0: 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  be ){.    sqlite
52b0: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
52c0: 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20  E_BUSY, .       
52d0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73   "unable to clos
52e0: 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61 6c  e due to unfinal
52f0: 69 73 65 64 20 73 74 61 74 65 6d 65 6e 74 73 22  ised statements"
5300: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
5310: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
5320: 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72  utex);.    retur
5330: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
5340: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
5350: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
5360: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 3b 0a 0a  ickOrOk(db) );..
5370: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d    for(j=0; j<db-
5380: 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nDb; j++){.    
5390: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
53a0: 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[j].pBt;.   
53b0: 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69   if( pBt && sqli
53c0: 74 65 33 42 74 72 65 65 49 73 49 6e 42 61 63 6b  te3BtreeIsInBack
53d0: 75 70 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  up(pBt) ){.     
53e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
53f0: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a  , SQLITE_BUSY, .
5400: 20 20 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c            "unabl
5410: 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74  e to close due t
5420: 6f 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61 63  o unfinished bac
5430: 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e 22 29 3b  kup operation");
5440: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
5450: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
5460: 75 74 65 78 29 3b 0a 20 20 20 20 20 20 72 65 74  utex);.      ret
5470: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
5480: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
5490: 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61   Free any outsta
54a0: 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20  nding Savepoint 
54b0: 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20  structures. */. 
54c0: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
54d0: 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20  epoints(db);..  
54e0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
54f0: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; j++){.    st
5500: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
5510: 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20  db->aDb[j];.    
5520: 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a  if( pDb->pBt ){.
5530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
5540: 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74  eeClose(pDb->pBt
5550: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42  );.      pDb->pB
5560: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
5570: 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   j!=1 ){.       
5580: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20   pDb->pSchema = 
5590: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
55a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
55b0: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
55c0: 61 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  a(db, 0);..  /* 
55d0: 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e  Tell the code in
55e0: 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74   notify.c that t
55f0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f  he connection no
5600: 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e   longer holds an
5610: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64  y.  ** locks and
5620: 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
5630: 65 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e  e any further un
5640: 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
5650: 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  backs..  */.  sq
5660: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43  lite3ConnectionC
5670: 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 61 73  losed(db);..  as
5680: 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32  sert( db->nDb<=2
5690: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
56a0: 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74  ->aDb==db->aDbSt
56b0: 61 74 69 63 20 29 3b 0a 20 20 66 6f 72 28 6a 3d  atic );.  for(j=
56c0: 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 64  0; j<ArraySize(d
56d0: 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a 2b 2b  b->aFunc.a); j++
56e0: 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a  ){.    FuncDef *
56f0: 70 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c 20 2a  pNext, *pHash, *
5700: 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64 62 2d  p;.    for(p=db-
5710: 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70 3b 20  >aFunc.a[j]; p; 
5720: 70 3d 70 48 61 73 68 29 7b 0a 20 20 20 20 20 20  p=pHash){.      
5730: 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73 68  pHash = p->pHash
5740: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
5750: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 75 6e 63   ){.        func
5760: 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20  tionDestroy(db, 
5770: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78  p);.        pNex
5780: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
5790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
57a0: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ree(db, p);.    
57b0: 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20      p = pNext;. 
57c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
57d0: 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
57e0: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43  ashFirst(&db->aC
57f0: 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71  ollSeq); i; i=sq
5800: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
5810: 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  {.    CollSeq *p
5820: 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20  Coll = (CollSeq 
5830: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
5840: 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f  (i);.    /* Invo
5850: 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f  ke any destructo
5860: 72 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  rs registered fo
5870: 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  r collation sequ
5880: 65 6e 63 65 20 75 73 65 72 20 64 61 74 61 2e 20  ence user data. 
5890: 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  */.    for(j=0; 
58a0: 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<3; j++){.     
58b0: 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44   if( pColl[j].xD
58c0: 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  el ){.        pC
58d0: 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c  oll[j].xDel(pCol
58e0: 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20  l[j].pUser);.   
58f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
5900: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5910: 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73   pColl);.  }.  s
5920: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
5930: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a  &db->aCollSeq);.
5940: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5950: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
5960: 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
5970: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d  ashFirst(&db->aM
5980: 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c  odule); i; i=sql
5990: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
59a0: 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f  .    Module *pMo
59b0: 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71  d = (Module *)sq
59c0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
59d0: 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78  .    if( pMod->x
59e0: 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20  Destroy ){.     
59f0: 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28   pMod->xDestroy(
5a00: 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pMod->pAux);.   
5a10: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
5a20: 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a  Free(db, pMod);.
5a30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
5a40: 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64  hClear(&db->aMod
5a50: 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ule);.#endif..  
5a60: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
5a70: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 20   SQLITE_OK, 0); 
5a80: 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61  /* Deallocates a
5a90: 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20  ny cached error 
5aa0: 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 69 66  strings. */.  if
5ab0: 28 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20 20  ( db->pErr ){.  
5ac0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
5ad0: 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  ee(db->pErr);.  
5ae0: 7d 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  }.  sqlite3Close
5af0: 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a  Extensions(db);.
5b00: 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
5b10: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f  QLITE_MAGIC_ERRO
5b20: 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d  R;..  /* The tem
5b30: 70 2d 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  p-database schem
5b40: 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64  a is allocated d
5b50: 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20  ifferently from 
5b60: 74 68 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61  the other schema
5b70: 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75  .  ** objects (u
5b80: 73 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  sing sqliteMallo
5b90: 63 28 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e  c() directly, in
5ba0: 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33  stead of sqlite3
5bb0: 42 74 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a  BtreeSchema())..
5bc0: 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73    ** So it needs
5bd0: 20 74 6f 20 62 65 20 66 72 65 65 64 20 68 65 72   to be freed her
5be0: 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74  e. Todo: Why not
5bf0: 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73   roll the temp s
5c00: 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20  chema into.  ** 
5c10: 74 68 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d  the same sqliteM
5c20: 61 6c 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f  alloc() as the o
5c30: 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65  ne that allocate
5c40: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  s the database .
5c50: 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a    ** structure?.
5c60: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62    */.  sqlite3Db
5c70: 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62  Free(db, db->aDb
5c80: 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [1].pSchema);.  
5c90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
5ca0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
5cb0: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
5cc0: 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45  LITE_MAGIC_CLOSE
5cd0: 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  D;.  sqlite3_mut
5ce0: 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65  ex_free(db->mute
5cf0: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  x);.  assert( db
5d00: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74  ->lookaside.nOut
5d10: 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61 69 6c 73  ==0 );  /* Fails
5d20: 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20   on a lookaside 
5d30: 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f 0a 20  memory leak */. 
5d40: 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   if( db->lookasi
5d50: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a  de.bMalloced ){.
5d60: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
5d70: 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70  (db->lookaside.p
5d80: 53 74 61 72 74 29 3b 0a 20 20 7d 0a 23 69 66 64  Start);.  }.#ifd
5d90: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5da0: 5f 53 51 4c 52 52 0a 20 20 53 52 52 65 63 43 6c  _SQLRR.  SRRecCl
5db0: 6f 73 65 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a  ose(db);.#endif.
5dc0: 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65    .  sqlite3_fre
5dd0: 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(db);.  return 
5de0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5df0: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
5e00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
5e10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5e20: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69  RollbackAll(sqli
5e30: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
5e40: 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73  i;.  int inTrans
5e50: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
5e60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5e70: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
5e80: 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
5e90: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
5ea0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
5eb0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
5ec0: 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  f( db->aDb[i].pB
5ed0: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  t ){.      if( s
5ee0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
5ef0: 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  rans(db->aDb[i].
5f00: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
5f10: 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20  inTrans = 1;.   
5f20: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
5f30: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
5f40: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b  db->aDb[i].pBt);
5f50: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
5f60: 5d 2e 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20  ].inTrans = 0;. 
5f70: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
5f80: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64  e3VtabRollback(d
5f90: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64  b);.  sqlite3End
5fa0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
5fb0: 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
5fc0: 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
5fd0: 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c  anges ){.    sql
5fe0: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
5ff0: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
6000: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  ;.    sqlite3Res
6010: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
6020: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  (db, 0);.  }..  
6030: 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64 20  /* Any deferred 
6040: 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
6050: 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62  tions have now b
6060: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f  een resolved. */
6070: 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  .  db->nDeferred
6080: 43 6f 6e 73 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Cons = 0;..  /* 
6090: 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20  If one has been 
60a0: 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f  configured, invo
60b0: 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d  ke the rollback-
60c0: 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f  hook callback */
60d0: 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c  .  if( db->xRoll
60e0: 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20  backCallback && 
60f0: 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d  (inTrans || !db-
6100: 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a  >autoCommit) ){.
6110: 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63      db->xRollbac
6120: 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52  kCallback(db->pR
6130: 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d  ollbackArg);.  }
6140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6150: 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
6160: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
6170: 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  the kind of erro
6180: 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  r specified in t
6190: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  he.** argument..
61a0: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
61b0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e 74  qlite3ErrStr(int
61c0: 20 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63   rc){.  static c
61d0: 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74  onst char* const
61e0: 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMsg[] = {.    
61f0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20  /* SQLITE_OK    
6200: 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e        */ "not an
6210: 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20   error",.    /* 
6220: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20  SQLITE_ERROR    
6230: 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63     */ "SQL logic
6240: 20 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e   error or missin
6250: 67 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20  g database",.   
6260: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   /* SQLITE_INTER
6270: 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20  NAL    */ 0,.   
6280: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20   /* SQLITE_PERM 
6290: 20 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73         */ "acces
62a0: 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e  s permission den
62b0: 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ied",.    /* SQL
62c0: 49 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20  ITE_ABORT       
62d0: 2a 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71  */ "callback req
62e0: 75 65 73 74 65 64 20 71 75 65 72 79 20 61 62 6f  uested query abo
62f0: 72 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  rt",.    /* SQLI
6300: 54 45 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a  TE_BUSY        *
6310: 2f 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c  / "database is l
6320: 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ocked",.    /* S
6330: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20  QLITE_LOCKED    
6340: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74    */ "database t
6350: 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c  able is locked",
6360: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
6370: 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f  OMEM       */ "o
6380: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20  ut of memory",. 
6390: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41     /* SQLITE_REA
63a0: 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74  DONLY    */ "att
63b0: 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20  empt to write a 
63c0: 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73  readonly databas
63d0: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
63e0: 45 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f  E_INTERRUPT   */
63f0: 20 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a   "interrupted",.
6400: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f      /* SQLITE_IO
6410: 45 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69  ERR       */ "di
6420: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20  sk I/O error",. 
6430: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52     /* SQLITE_COR
6440: 52 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74  RUPT     */ "dat
6450: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
6460: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a   is malformed",.
6470: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
6480: 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20 30 2c 0a  TFOUND    */ 0,.
6490: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55      /* SQLITE_FU
64a0: 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61  LL        */ "da
64b0: 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69  tabase or disk i
64c0: 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20  s full",.    /* 
64d0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
64e0: 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f     */ "unable to
64f0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
6500: 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ile",.    /* SQL
6510: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20  ITE_PROTOCOL    
6520: 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  */ "locking prot
6530: 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51  ocol",.    /* SQ
6540: 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20  LITE_EMPTY      
6550: 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74 61   */ "table conta
6560: 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20  ins no data",.  
6570: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45    /* SQLITE_SCHE
6580: 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61  MA      */ "data
6590: 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
65a0: 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a  changed",.    /*
65b0: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20   SQLITE_TOOBIG  
65c0: 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f      */ "string o
65d0: 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c  r blob too big",
65e0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
65f0: 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63  ONSTRAINT  */ "c
6600: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
6610: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6620: 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20  _MISMATCH    */ 
6630: 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74  "datatype mismat
6640: 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ch",.    /* SQLI
6650: 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a  TE_MISUSE      *
6660: 2f 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69  / "library routi
6670: 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66  ne called out of
6680: 20 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20 20   sequence",.    
6690: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20  /* SQLITE_NOLFS 
66a0: 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20        */ "large 
66b0: 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20  file support is 
66c0: 64 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f  disabled",.    /
66d0: 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20  * SQLITE_AUTH   
66e0: 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69       */ "authori
66f0: 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a  zation denied",.
6700: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f      /* SQLITE_FO
6710: 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61 75  RMAT      */ "au
6720: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
6730: 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a   format error",.
6740: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41      /* SQLITE_RA
6750: 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62 69  NGE       */ "bi
6760: 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64  nd or column ind
6770: 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22  ex out of range"
6780: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6790: 4e 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22  NOTADB      */ "
67a0: 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65  file is encrypte
67b0: 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61  d or is not a da
67c0: 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20  tabase",.  };.  
67d0: 72 63 20 26 3d 20 30 78 66 66 3b 0a 20 20 69 66  rc &= 0xff;.  if
67e0: 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20  ( ALWAYS(rc>=0) 
67f0: 26 26 20 72 63 3c 28 69 6e 74 29 28 73 69 7a 65  && rc<(int)(size
6800: 6f 66 28 61 4d 73 67 29 2f 73 69 7a 65 6f 66 28  of(aMsg)/sizeof(
6810: 61 4d 73 67 5b 30 5d 29 29 20 26 26 20 61 4d 73  aMsg[0])) && aMs
6820: 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20  g[rc]!=0 ){.    
6830: 72 65 74 75 72 6e 20 61 4d 73 67 5b 72 63 5d 3b  return aMsg[rc];
6840: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
6850: 74 75 72 6e 20 22 75 6e 6b 6e 6f 77 6e 20 65 72  turn "unknown er
6860: 72 6f 72 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ror";.  }.}../*.
6870: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6880: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73  implements a bus
6890: 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20  y callback that 
68a0: 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73  sleeps and tries
68b0: 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20  .** again until 
68c0: 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  a timeout value 
68d0: 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65  is reached.  The
68e0: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
68f0: 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20  s.** an integer 
6900: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
6910: 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e  econds passed in
6920: 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   as the first.**
6930: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
6940: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44  atic int sqliteD
6950: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
6960: 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20  ck(. void *ptr, 
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6980: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
6990: 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75  tion */. int cou
69a0: 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
69b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
69c0: 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20 62  imes table has b
69d0: 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23  een busy */.){.#
69e0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
69f0: 20 7c 7c 20 28 64 65 66 69 6e 65 64 28 48 41 56   || (defined(HAV
6a00: 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56  E_USLEEP) && HAV
6a10: 45 5f 55 53 4c 45 45 50 29 0a 20 20 73 74 61 74  E_USLEEP).  stat
6a20: 69 63 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61  ic const u8 dela
6a30: 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c  ys[] =.     { 1,
6a40: 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32   2, 5, 10, 15, 2
6a50: 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20  0, 25, 25,  25, 
6a60: 20 35 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b   50,  50, 100 };
6a70: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
6a80: 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20  u8 totals[] =.  
6a90: 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38     { 0, 1, 3,  8
6aa0: 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38  , 18, 33, 53, 78
6ab0: 2c 20 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c  , 103, 128, 178,
6ac0: 20 32 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65   228 };.# define
6ad0: 20 4e 44 45 4c 41 59 20 28 73 69 7a 65 6f 66 28   NDELAY (sizeof(
6ae0: 64 65 6c 61 79 73 29 2f 73 69 7a 65 6f 66 28 64  delays)/sizeof(d
6af0: 65 6c 61 79 73 5b 30 5d 29 29 0a 20 20 73 71 6c  elays[0])).  sql
6b00: 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69  ite3 *db = (sqli
6b10: 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74  te3 *)ptr;.  int
6b20: 20 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62   timeout = db->b
6b30: 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e  usyTimeout;.  in
6b40: 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a  t delay, prior;.
6b50: 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74  .  assert( count
6b60: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75  >=0 );.  if( cou
6b70: 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20  nt < NDELAY ){. 
6b80: 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79     delay = delay
6b90: 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72  s[count];.    pr
6ba0: 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75  ior = totals[cou
6bb0: 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nt];.  }else{.  
6bc0: 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73    delay = delays
6bd0: 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20  [NDELAY-1];.    
6be0: 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e  prior = totals[N
6bf0: 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79  DELAY-1] + delay
6c00: 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d  *(count-(NDELAY-
6c10: 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  1));.  }.  if( p
6c20: 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74  rior + delay > t
6c30: 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 64 65  imeout ){.    de
6c40: 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20  lay = timeout - 
6c50: 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 64  prior;.    if( d
6c60: 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75 72 6e  elay<=0 ) return
6c70: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
6c80: 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66  3OsSleep(db->pVf
6c90: 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a  s, delay*1000);.
6ca0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73    return 1;.#els
6cb0: 65 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  e.  sqlite3 *db 
6cc0: 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72  = (sqlite3 *)ptr
6cd0: 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20  ;.  int timeout 
6ce0: 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70 74  = ((sqlite3 *)pt
6cf0: 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b  r)->busyTimeout;
6d00: 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29  .  if( (count+1)
6d10: 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f 75 74 20  *1000 > timeout 
6d20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6d30: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
6d40: 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20  Sleep(db->pVfs, 
6d50: 31 30 30 30 30 30 30 29 3b 0a 20 20 72 65 74 75  1000000);.  retu
6d60: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
6d70: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
6d80: 20 67 69 76 65 6e 20 62 75 73 79 20 68 61 6e 64   given busy hand
6d90: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ler..**.** This 
6da0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
6db0: 64 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61 74  d when an operat
6dc0: 69 6f 6e 20 66 61 69 6c 65 64 20 77 69 74 68 20  ion failed with 
6dd0: 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68  a lock..** If th
6de0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6df0: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
6e00: 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65 64   lock is retried
6e10: 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74 75  .  If it.** retu
6e20: 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72 61  rns 0, the opera
6e30: 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74 68  tion aborts with
6e40: 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20   an SQLITE_BUSY 
6e50: 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  error..*/.int sq
6e60: 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
6e70: 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64 6c  andler(BusyHandl
6e80: 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  er *p){.  int rc
6e90: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ;.  if( NEVER(p=
6ea0: 3d 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d  =0) || p->xFunc=
6eb0: 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30  =0 || p->nBusy<0
6ec0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
6ed0: 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e  c = p->xFunc(p->
6ee0: 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b  pArg, p->nBusy);
6ef0: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
6f00: 20 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d      p->nBusy = -
6f10: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
6f20: 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a  p->nBusy++;.  }.
6f30: 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a    return rc; .}.
6f40: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6f50: 69 6e 65 20 73 65 74 73 20 74 68 65 20 62 75 73  ine sets the bus
6f60: 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  y callback for a
6f70: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
6f80: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
6f90: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
6fa0: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
6fb0: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  en argument..*/.
6fc0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79  int sqlite3_busy
6fd0: 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69  _handler(.  sqli
6fe0: 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28  te3 *db,.  int (
6ff0: 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e  *xBusy)(void*,in
7000: 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  t),.  void *pArg
7010: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
7020: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
7030: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79  tex);.  db->busy
7040: 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20  Handler.xFunc = 
7050: 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73  xBusy;.  db->bus
7060: 79 48 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20  yHandler.pArg = 
7070: 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79  pArg;.  db->busy
7080: 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
7090: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
70a0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
70b0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
70c0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
70d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
70e0: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
70f0: 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  K./*.** This rou
7100: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70 72  tine sets the pr
7110: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
7120: 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61  for an Sqlite da
7130: 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  tabase to the.**
7140: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
7150: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
7160: 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74  e given argument
7170: 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63  . The progress c
7180: 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20  allback will.** 
7190: 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79  be invoked every
71a0: 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a   nOps opcodes..*
71b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70  /.void sqlite3_p
71c0: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
71d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
71e0: 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69  .  int nOps,.  i
71f0: 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28  nt (*xProgress)(
7200: 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20  void*), .  void 
7210: 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74  *pArg.){.  sqlit
7220: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
7230: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
7240: 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20 64   nOps>0 ){.    d
7250: 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 78  b->xProgress = x
7260: 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64 62  Progress;.    db
7270: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d  ->nProgressOps =
7280: 20 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70   nOps;.    db->p
7290: 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41  ProgressArg = pA
72a0: 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rg;.  }else{.   
72b0: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
72c0: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f   0;.    db->nPro
72d0: 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20  gressOps = 0;.  
72e0: 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41    db->pProgressA
72f0: 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  rg = 0;.  }.  sq
7300: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
7310: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  e(db->mutex);.}.
7320: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
7330: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74  his routine inst
7340: 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62  alls a default b
7350: 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74  usy handler that
7360: 20 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a   waits for the.*
7370: 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62  * specified numb
7380: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
7390: 64 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ds before return
73a0: 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ing 0..*/.int sq
73b0: 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
73c0: 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ut(sqlite3 *db, 
73d0: 69 6e 74 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d  int ms){.  if( m
73e0: 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62  s>0 ){.    db->b
73f0: 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b  usyTimeout = ms;
7400: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
7410: 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71  y_handler(db, sq
7420: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
7430: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29  allback, (void*)
7440: 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  db);.  }else{.  
7450: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
7460: 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29  andler(db, 0, 0)
7470: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
7480: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
7490: 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e  ** Cause any pen
74a0: 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74  ding operation t
74b0: 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20 65 61  o stop at its ea
74c0: 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69  rliest opportuni
74d0: 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ty..*/.void sqli
74e0: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71  te3_interrupt(sq
74f0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
7500: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
7510: 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ed = 1;.}.../*.*
7520: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
7530: 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  is exactly the s
7540: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63  ame as sqlite3_c
7550: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
7560: 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74  , except.** that
7570: 20 69 74 20 69 73 20 64 65 73 69 67 6e 65 64 20   it is designed 
7580: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20  to be called by 
7590: 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54  internal code. T
75a0: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73  he difference is
75b0: 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61  .** that if a ma
75c0: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20  lloc() fails in 
75d0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
75e0: 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72  unction(), an er
75f0: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72  ror code.** is r
7600: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
7610: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
7620: 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69  g cleared. .*/.i
7630: 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  nt sqlite3Create
7640: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20  Func(.  sqlite3 
7650: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
7660: 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  r *zFunctionName
7670: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
7680: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
7690: 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f  *pUserData,.  vo
76a0: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
76b0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
76c0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
76d0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
76e0: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
76f0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
7700: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
7710: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
7720: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a  ite3_context*),.
7730: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
7740: 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b   *pDestructor.){
7750: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20  .  FuncDef *p;. 
7760: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61   int nName;..  a
7770: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7780: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
7790: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46  tex) );.  if( zF
77a0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c  unctionName==0 |
77b0: 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63 20 26  |.      (xFunc &
77c0: 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74  & (xFinal || xSt
77d0: 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28  ep)) || .      (
77e0: 21 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61  !xFunc && (xFina
77f0: 6c 20 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c  l && !xStep)) ||
7800: 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26  .      (!xFunc &
7810: 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53  & (!xFinal && xS
7820: 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28  tep)) ||.      (
7830: 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e  nArg<-1 || nArg>
7840: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
7850: 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20  ION_ARG) ||.    
7860: 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20    (255<(nName = 
7870: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7880: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29   zFunctionName))
7890: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
78a0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
78b0: 50 54 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 6e 64  PT;.  }.  .#ifnd
78c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
78d0: 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c  TF16.  /* If SQL
78e0: 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65  ITE_UTF16 is spe
78f0: 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e  cified as the en
7900: 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61  coding type, tra
7910: 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a  nsform this.  **
7920: 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   to one of SQLIT
7930: 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c  E_UTF16LE or SQL
7940: 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e  ITE_UTF16BE usin
7950: 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  g the.  ** SQLIT
7960: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61  E_UTF16NATIVE ma
7970: 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31  cro. SQLITE_UTF1
7980: 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  6 is not used in
7990: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20  ternally..  **. 
79a0: 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e   ** If SQLITE_AN
79b0: 59 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  Y is specified, 
79c0: 61 64 64 20 74 68 72 65 65 20 76 65 72 73 69 6f  add three versio
79d0: 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  ns of the functi
79e0: 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68  on.  ** to the h
79f0: 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ash table..  */.
7a00: 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54    if( enc==SQLIT
7a10: 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65  E_UTF16 ){.    e
7a20: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
7a30: 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65  6NATIVE;.  }else
7a40: 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45   if( enc==SQLITE
7a50: 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ANY ){.    int 
7a60: 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
7a70: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
7a80: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
7a90: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
7aa0: 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 70 55  TF8,.         pU
7ab0: 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20  serData, xFunc, 
7ac0: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
7ad0: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
7ae0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7af0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
7b00: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
7b10: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
7b20: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
7b30: 54 45 5f 55 54 46 31 36 4c 45 2c 0a 20 20 20 20  TE_UTF16LE,.    
7b40: 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c        pUserData,
7b50: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
7b60: 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63 74  Final, pDestruct
7b70: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  or);.    }.    i
7b80: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7b90: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
7ba0: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65   rc;.    }.    e
7bb0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
7bc0: 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  6BE;.  }.#else. 
7bd0: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
7be0: 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20  F8;.#endif.  .  
7bf0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 20 65  /* Check if an e
7c00: 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  xisting function
7c10: 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69   is being overri
7c20: 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e  dden or deleted.
7c30: 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64   If so,.  ** and
7c40: 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
7c50: 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65 74 75  e VMs, then retu
7c60: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
7c70: 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20  If a function.  
7c80: 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72  ** is being over
7c90: 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64 20 62  ridden/deleted b
7ca0: 75 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ut there are no 
7cb0: 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f  active VMs, allo
7cc0: 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  w the.  ** opera
7cd0: 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65  tion to continue
7ce0: 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74 65 20   but invalidate 
7cf0: 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64 20  all precompiled 
7d00: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
7d10: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
7d20: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
7d30: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e  FunctionName, nN
7d40: 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65  ame, nArg, (u8)e
7d50: 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20  nc, 0);.  if( p 
7d60: 26 26 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d  && p->iPrefEnc==
7d70: 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d  enc && p->nArg==
7d80: 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20  nArg ){.    if( 
7d90: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
7da0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
7db0: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
7dc0: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
7dd0: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
7de0: 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d  ete/modify user-
7df0: 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20  function due to 
7e00: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
7e10: 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  s");.      asser
7e20: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
7e30: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
7e40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
7e50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7e60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
7e70: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
7e80: 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  ts(db);.    }.  
7e90: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
7ea0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
7eb0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
7ec0: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38  nName, nArg, (u8
7ed0: 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65  )enc, 1);.  asse
7ee0: 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  rt(p || db->mall
7ef0: 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28  ocFailed);.  if(
7f00: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
7f10: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
7f20: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
7f30: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20 6f 66  older version of
7f40: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69   the function wi
7f50: 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65 64 20  th a configured 
7f60: 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 20 20  destructor is.  
7f70: 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65  ** being replace
7f80: 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  d invoke the des
7f90: 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e  tructor function
7fa0: 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e 63   here. */.  func
7fb0: 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20  tionDestroy(db, 
7fc0: 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74  p);..  if( pDest
7fd0: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44  ructor ){.    pD
7fe0: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2b  estructor->nRef+
7ff0: 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 44 65 73  +;.  }.  p->pDes
8000: 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73 74 72  tructor = pDestr
8010: 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 6c 61 67  uctor;.  p->flag
8020: 73 20 3d 20 30 3b 0a 20 20 70 2d 3e 78 46 75 6e  s = 0;.  p->xFun
8030: 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e  c = xFunc;.  p->
8040: 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b 0a 20  xStep = xStep;. 
8050: 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20   p->xFinalize = 
8060: 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73  xFinal;.  p->pUs
8070: 65 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61  erData = pUserDa
8080: 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20  ta;.  p->nArg = 
8090: 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74  (u16)nArg;.  ret
80a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
80b0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e  ../*.** Create n
80c0: 65 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  ew user function
80d0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
80e0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
80f0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
8100: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
8110: 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72  zFunc,.  int nAr
8120: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
8130: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
8140: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
8150: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
8160: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
8170: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
8180: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
8190: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
81a0: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
81b0: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
81c0: 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20  3_context*).){. 
81d0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
81e0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
81f0: 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41  v2(db, zFunc, nA
8200: 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e  rg, enc, p, xFun
8210: 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20  c, xStep,.      
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 46                xF
8240: 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74  inal, 0);.}..int
8250: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
8260: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73  function_v2(.  s
8270: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
8280: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
8290: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
82a0: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
82b0: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e  p,.  void (*xFun
82c0: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
82d0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
82e0: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
82f0: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
8300: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
8310: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8320: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
8330: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
8340: 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ext*),.  void (*
8350: 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a  xDestroy)(void *
8360: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ).){.  int rc = 
8370: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
8380: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
8390: 70 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pArg = 0;.  sqli
83a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
83b0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
83c0: 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ( xDestroy ){.  
83d0: 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65    pArg = (FuncDe
83e0: 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74  structor *)sqlit
83f0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
8400: 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63 44 65  b, sizeof(FuncDe
8410: 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20  structor));.    
8420: 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20  if( !pArg ){.   
8430: 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a     xDestroy(p);.
8440: 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a        goto out;.
8450: 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e      }.    pArg->
8460: 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74  xDestroy = xDest
8470: 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70  roy;.    pArg->p
8480: 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20  UserData = p;.  
8490: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
84a0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
84b0: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
84c0: 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70   p, xFunc, xStep
84d0: 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b  , xFinal, pArg);
84e0: 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70  .  if( pArg && p
84f0: 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  Arg->nRef==0 ){.
8500: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
8510: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
8520: 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20   xDestroy(p);.  
8530: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8540: 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a  db, pArg);.  }..
8550: 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c   out:.  rc = sql
8560: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
8570: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
8580: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
8590: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
85a0: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
85b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
85c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
85d0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a  ate_function16(.
85e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
85f0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75   const void *zFu
8600: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e  nctionName,.  in
8610: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54  t nArg,.  int eT
8620: 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a  extRep,.  void *
8630: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e  p,.  void (*xFun
8640: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
8650: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
8660: 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64  value**),.  void
8670: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
8680: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
8690: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c  qlite3_value**),
86a0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
86b0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
86c0: 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  t*).){.  int rc;
86d0: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b  .  char *zFunc8;
86e0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
86f0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
8700: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
8710: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
8720: 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c  ;.  zFunc8 = sql
8730: 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
8740: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
8750: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  -1, SQLITE_UTF16
8760: 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20  NATIVE);.  rc = 
8770: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
8780: 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41  c(db, zFunc8, nA
8790: 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c  rg, eTextRep, p,
87a0: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
87b0: 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69  Final,0);.  sqli
87c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 46  te3DbFree(db, zF
87d0: 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73 71  unc8);.  rc = sq
87e0: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
87f0: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
8800: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
8810: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
8820: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a   rc;.}.#endif...
8830: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 68  /*.** Declare th
8840: 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61  at a function ha
8850: 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65  s been overloade
8860: 64 20 62 79 20 61 20 76 69 72 74 75 61 6c 20 74  d by a virtual t
8870: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able..**.** If t
8880: 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65  he function alre
8890: 61 64 79 20 65 78 69 73 74 73 20 61 73 20 61 20  ady exists as a 
88a0: 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66  regular global f
88b0: 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a  unction, then.**
88c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
88d0: 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68   a no-op.  If th
88e0: 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
88f0: 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
8900: 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20  create.** a new 
8910: 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79 73 20  one that always 
8920: 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d  throws a run-tim
8930: 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a  e error.  .**.**
8940: 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20 74 61   When virtual ta
8950: 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f 20 70  bles intend to p
8960: 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f  rovide an overlo
8970: 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74  aded function, t
8980: 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61  hey.** should ca
8990: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
89a0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
89b0: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
89c0: 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c   exists..** A gl
89d0: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75  obal function mu
89e0: 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72 64 65  st exist in orde
89f0: 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c  r for name resol
8a00: 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a  ution to work.**
8a10: 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e   properly..*/.in
8a20: 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f  t sqlite3_overlo
8a30: 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73  ad_function(.  s
8a40: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
8a50: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
8a60: 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20  .  int nArg.){. 
8a70: 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c   int nName = sql
8a80: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
8a90: 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  me);.  int rc;. 
8aa0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
8ab0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
8ac0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
8ad0: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
8ae0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
8af0: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
8b00: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  0)==0 ){.    sql
8b10: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
8b20: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  b, zName, nArg, 
8b30: 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b50: 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e 76     0, sqlite3Inv
8b60: 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  alidFunction, 0,
8b70: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63   0, 0);.  }.  rc
8b80: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
8b90: 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  t(db, SQLITE_OK)
8ba0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
8bb0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
8bc0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
8bd0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
8be0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
8bf0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74  .** Register a t
8c00: 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20  race function.  
8c10: 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68  The pArg from th
8c20: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
8c30: 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a  istered trace.**
8c40: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
8c50: 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61  **.** A NULL tra
8c60: 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  ce function mean
8c70: 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e  s that no tracin
8c80: 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20  g is executes.  
8c90: 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72  A non-NULL.** tr
8ca0: 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ace is a pointer
8cb0: 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
8cc0: 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
8cd0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
8ce0: 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65  ach.** SQL state
8cf0: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ment..*/.void *s
8d00: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c  qlite3_trace(sql
8d10: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 28  ite3 *db, void (
8d20: 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63  *xTrace)(void*,c
8d30: 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69  onst char*), voi
8d40: 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64  d *pArg){.  void
8d50: 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65   *pOld;.  sqlite
8d60: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
8d70: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
8d80: 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67   = db->pTraceArg
8d90: 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d  ;.  db->xTrace =
8da0: 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70   xTrace;.  db->p
8db0: 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b  TraceArg = pArg;
8dc0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8dd0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
8de0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
8df0: 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  ;.}./*.** Regist
8e00: 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e  er a profile fun
8e10: 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67  ction.  The pArg
8e20: 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
8e30: 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  usly registered 
8e40: 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  .** profile func
8e50: 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64  tion is returned
8e60: 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  .  .**.** A NULL
8e70: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
8e80: 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  n means that no 
8e90: 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65  profiling is exe
8ea0: 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55  cutes.  A non-NU
8eb0: 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73  LL.** profile is
8ec0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
8ed0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
8ee0: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
8ef0: 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a  conclusion of.**
8f00: 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
8f10: 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e  ent that is run.
8f20: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
8f30: 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c  3_profile(.  sql
8f40: 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
8f50: 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69   (*xProfile)(voi
8f60: 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  d*,const char*,s
8f70: 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20  qlite_uint64),. 
8f80: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
8f90: 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73   void *pOld;.  s
8fa0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
8fb0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
8fc0: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f   pOld = db->pPro
8fd0: 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  fileArg;.  db->x
8fe0: 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69  Profile = xProfi
8ff0: 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69  le;.  db->pProfi
9000: 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  leArg = pArg;.  
9010: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
9020: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
9030: 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d    return pOld;.}
9040: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9050: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a  E_OMIT_TRACE */.
9060: 0a 2f 2a 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54  ./*** EXPERIMENT
9070: 41 4c 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 67  AL ***.**.** Reg
9080: 69 73 74 65 72 20 61 20 66 75 6e 63 74 69 6f 6e  ister a function
9090: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 77   to be invoked w
90a0: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
90b0: 6e 20 63 6f 6d 6d 65 6e 74 73 2e 0a 2a 2a 20 49  n comments..** I
90c0: 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66 75  f the invoked fu
90d0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e  nction returns n
90e0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
90f0: 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73  e commit becomes
9100: 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a   a.** rollback..
9110: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
9120: 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20  _commit_hook(.  
9130: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
9140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
9150: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
9160: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
9170: 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61  .  int (*xCallba
9180: 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20  ck)(void*),  /* 
9190: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f  Function to invo
91a0: 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69  ke on each commi
91b0: 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  t */.  void *pAr
91c0: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
91d0: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
91e0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
91f0: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
9200: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9210: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
9220: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
9230: 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62  pCommitArg;.  db
9240: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
9250: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
9260: 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20   db->pCommitArg 
9270: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
9280: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
9290: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
92a0: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pOld;.}../*.*
92b0: 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
92c0: 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
92d0: 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
92e0: 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a  row is updated,.
92f0: 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64  ** inserted or d
9300: 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 69  eleted using thi
9310: 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
9320: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
9330: 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68  sqlite3_update_h
9340: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
9350: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
9360: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
9370: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
9380: 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  base */.  void (
9390: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
93a0: 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74  *,int,char const
93b0: 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c   *,char const *,
93c0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20  sqlite_int64),. 
93d0: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
93e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
93f0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
9400: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
9410: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
9420: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
9430: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
9440: 52 65 74 20 3d 20 64 62 2d 3e 70 55 70 64 61 74  Ret = db->pUpdat
9450: 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64  eArg;.  db->xUpd
9460: 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  ateCallback = xC
9470: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
9480: 55 70 64 61 74 65 41 72 67 20 3d 20 70 41 72 67  UpdateArg = pArg
9490: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
94a0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
94b0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  x);.  return pRe
94c0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  t;.}../*.** Regi
94d0: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
94e0: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
94f0: 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61  ch time a transa
9500: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a  ction is rolled.
9510: 2a 2a 20 62 61 63 6b 20 62 79 20 74 68 69 73 20  ** back by this 
9520: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
9530: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
9540: 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68  lite3_rollback_h
9550: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
9560: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
9570: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
9580: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
9590: 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  base */.  void (
95a0: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
95b0: 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20  *), /* Callback 
95c0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
95d0: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
95e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
95f0: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
9600: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
9610: 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65   *pRet;.  sqlite
9620: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
9630: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
9640: 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b   = db->pRollback
9650: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c  Arg;.  db->xRoll
9660: 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78  backCallback = x
9670: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
9680: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70  pRollbackArg = p
9690: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
96a0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
96b0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
96c0: 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pRet;.}..#ifndef
96d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
96e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  ./*.** The sqlit
96f0: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61  e3_wal_hook() ca
9700: 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65  llback registere
9710: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77 61 6c  d by sqlite3_wal
9720: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
9730: 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c  )..** Invoke sql
9740: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
9750: 69 6e 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65  int if the numbe
9760: 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74  r of frames in t
9770: 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69  he log file.** i
9780: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 73  s greater than s
9790: 71 6c 69 74 65 33 2e 70 57 61 6c 41 72 67 20 63  qlite3.pWalArg c
97a0: 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ast to an intege
97b0: 72 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  r (the value con
97c0: 66 69 67 75 72 65 64 20 62 79 0a 2a 2a 20 77 61  figured by.** wa
97d0: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
97e0: 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  ())..*/ .int sql
97f0: 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f  ite3WalDefaultHo
9800: 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69  ok(.  void *pCli
9810: 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20  entData,     /* 
9820: 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71  Argument */.  sq
9830: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
9840: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
9850: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
9860: 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f  ar *zDb,       /
9870: 2a 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  * Database */.  
9880: 69 6e 74 20 6e 46 72 61 6d 65 20 20 20 20 20 20  int nFrame      
9890: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
98a0: 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66  f WAL */.){.  if
98b0: 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45  ( nFrame>=SQLITE
98c0: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69  _PTR_TO_INT(pCli
98d0: 65 6e 74 44 61 74 61 29 20 29 7b 0a 20 20 20 20  entData) ){.    
98e0: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
98f0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
9900: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
9910: 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b  kpoint(db, zDb);
9920: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
9930: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
9940: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
9950: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
9960: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
9970: 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  AL */../*.** Con
9980: 66 69 67 75 72 65 20 61 6e 20 73 71 6c 69 74 65  figure an sqlite
9990: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c  3_wal_hook() cal
99a0: 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74  lback to automat
99b0: 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e  ically checkpoin
99c0: 74 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20  t.** a database 
99d0: 61 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67  after committing
99e0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
99f0: 66 20 74 68 65 72 65 20 61 72 65 20 6e 46 72 61  f there are nFra
9a00: 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72  me or.** more fr
9a10: 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20  ames in the log 
9a20: 66 69 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a 65  file. Passing ze
9a30: 72 6f 20 6f 72 20 61 20 6e 65 67 61 74 69 76 65  ro or a negative
9a40: 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a   value as the.**
9a50: 20 6e 46 72 61 6d 65 20 70 61 72 61 6d 65 74 65   nFrame paramete
9a60: 72 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f 6d  r disables autom
9a70: 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 73  atic checkpoints
9a80: 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a   entirely..**.**
9a90: 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65   The callback re
9aa0: 67 69 73 74 65 72 65 64 20 62 79 20 74 68 69 73  gistered by this
9ab0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63   function replac
9ac0: 65 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  es any existing 
9ad0: 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69  callback.** regi
9ae0: 73 74 65 72 65 64 20 75 73 69 6e 67 20 73 71 6c  stered using sql
9af0: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e  ite3_wal_hook().
9b00: 20 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73   Likewise, regis
9b10: 74 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63  tering a callbac
9b20: 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74  k.** using sqlit
9b30: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69  e3_wal_hook() di
9b40: 73 61 62 6c 65 73 20 74 68 65 20 61 75 74 6f 6d  sables the autom
9b50: 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 20  atic checkpoint 
9b60: 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e  mechanism.** con
9b70: 66 69 67 75 72 65 64 20 62 79 20 74 68 69 73 20  figured by this 
9b80: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
9b90: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
9ba0: 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  ocheckpoint(sqli
9bb0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72  te3 *db, int nFr
9bc0: 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ame){.#ifdef SQL
9bd0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55  ITE_OMIT_WAL.  U
9be0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
9bf0: 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  db);.  UNUSED_PA
9c00: 52 41 4d 45 54 45 52 28 6e 46 72 61 6d 65 29 3b  RAMETER(nFrame);
9c10: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 46 72  .#else.  if( nFr
9c20: 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  ame>0 ){.    sql
9c30: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62  ite3_wal_hook(db
9c40: 2c 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61  , sqlite3WalDefa
9c50: 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f  ultHook, SQLITE_
9c60: 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d  INT_TO_PTR(nFram
9c70: 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e));.  }else{.  
9c80: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f    sqlite3_wal_ho
9c90: 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  ok(db, 0, 0);.  
9ca0: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
9cb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9cc0: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
9cd0: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
9ce0: 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
9cf0: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
9d00: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
9d10: 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68 65  to the write-ahe
9d20: 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73 20 64  ad-log by this d
9d30: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
9d40: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
9d50: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20  ite3_wal_hook(. 
9d60: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
9d90: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62 20 68  ook to this db h
9da0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a  andle */.  int(*
9db0: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20  xCallback)(void 
9dc0: 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e  *, sqlite3*, con
9dd0: 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a  st char*, int),.
9de0: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e00: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
9e10: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78 43  ent passed to xC
9e20: 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a  allback() */.){.
9e30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9e40: 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a  MIT_WAL.  void *
9e50: 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pRet;.  sqlite3_
9e60: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
9e70: 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
9e80: 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20   db->pWalArg;.  
9e90: 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b  db->xWalCallback
9ea0: 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
9eb0: 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41  db->pWalArg = pA
9ec0: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
9ed0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9ee0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
9ef0: 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  Ret;.#else.  ret
9f00: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
9f10: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69  ../*.** Checkpoi
9f20: 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e  nt database zDb.
9f30: 20 49 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c   If zDb is NULL,
9f40: 20 6f 72 20 69 66 20 74 68 65 20 62 75 66 66 65   or if the buffe
9f50: 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20  r zDb points.** 
9f60: 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65  to contains a ze
9f70: 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e 67  ro-length string
9f80: 2c 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  , all attached d
9f90: 61 74 61 62 61 73 65 73 20 61 72 65 20 0a 2a 2a  atabases are .**
9fa0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a   checkpointed..*
9fb0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  /.int sqlite3_wa
9fc0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  l_checkpoint(sql
9fd0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
9fe0: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 23 69 66 64  char *zDb){.#ifd
9ff0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
a000: 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  AL.  return SQLI
a010: 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69  TE_OK;.#else.  i
a020: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a040: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
a050: 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51 4c  .  int iDb = SQL
a060: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
a070: 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44  ;  /* sqlite3.aD
a080: 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62 20  b[] index of db 
a090: 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  to checkpoint */
a0a0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
a0b0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
a0c0: 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26  x);.  if( zDb &&
a0d0: 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69   zDb[0] ){.    i
a0e0: 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
a0f0: 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b  DbName(db, zDb);
a100: 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30  .  }.  if( iDb<0
a110: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
a120: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
a130: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
a140: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75  SQLITE_ERROR, "u
a150: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a  nknown database:
a160: 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65   %s", zDb);.  }e
a170: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
a180: 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
a190: 64 62 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  db, iDb);.    sq
a1a0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
a1b0: 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20  c, 0);.  }.  rc 
a1c0: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
a1d0: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
a1e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
a1f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
a200: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
a210: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
a220: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
a230: 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e   Run a checkpoin
a240: 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44  t on database iD
a250: 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  b. This is a no-
a260: 6f 70 20 69 66 20 64 61 74 61 62 61 73 65 20 69  op if database i
a270: 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72  Db is.** not cur
a280: 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57  rently open in W
a290: 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  AL mode..**.** I
a2a0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
a2b0: 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  is open on the d
a2c0: 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 63 68  atabase being ch
a2d0: 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73  eckpointed, this
a2e0: 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65   .** function re
a2f0: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43  turns SQLITE_LOC
a300: 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70  KED and a checkp
a310: 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65  oint is not atte
a320: 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e  mpted. If .** an
a330: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
a340: 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  ile running the 
a350: 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53  checkpoint, an S
a360: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
a370: 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
a380: 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f   (i.e. SQLITE_IO
a390: 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c  ERR). Otherwise,
a3a0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
a3b0: 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64  * The mutex on d
a3c0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
a3d0: 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  b should be held
a3e0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
a3f0: 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73  The mutex.** ass
a400: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
a410: 20 73 70 65 63 69 66 69 63 20 62 2d 74 72 65 65   specific b-tree
a420: 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e   being checkpoin
a430: 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a  ted is taken by.
a440: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
a450: 20 77 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b   while the check
a460: 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67  point is running
a470: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69  ..**.** If iDb i
a480: 73 20 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f  s passed SQLITE_
a490: 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68  MAX_ATTACHED, th
a4a0: 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  en all attached 
a4b0: 64 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a  databases are.**
a4c0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49   checkpointed. I
a4d0: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
a4e0: 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20  countered it is 
a4f0: 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61  returned immedia
a500: 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74  tely -.** no att
a510: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
a520: 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72  checkpoint any r
a530: 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73  emaining databas
a540: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
a550: 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  e3Checkpoint(sql
a560: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
a570: 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  b){.  int rc = S
a580: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
a590: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
a5a0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  code */.  int i;
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
a5d0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
a5e0: 6f 75 67 68 20 61 74 74 61 63 68 65 64 20 64 62  ough attached db
a5f0: 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
a600: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
a610: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
a620: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ..  for(i=0; i<d
a630: 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51  b->nDb && rc==SQ
a640: 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
a650: 20 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c     if( i==iDb ||
a660: 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58   iDb==SQLITE_MAX
a670: 5f 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20  _ATTACHED ){.   
a680: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
a690: 74 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64  treeCheckpoint(d
a6a0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  b->aDb[i].pBt);.
a6b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
a6c0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
a6d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
a6e0: 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  WAL */../*.** Th
a6f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
a700: 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e  rns true if main
a710: 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62  -memory should b
a720: 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
a730: 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  f.** a temporary
a740: 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69   file for transi
a750: 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73 20  ent pager files 
a760: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  and statement jo
a770: 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76  urnals..** The v
a780: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64 65  alue returned de
a790: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
a7a0: 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73  ue of db->temp_s
a7b0: 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a  tore (runtime.**
a7c0: 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20   parameter) and 
a7d0: 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  the compile time
a7e0: 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45   value of SQLITE
a7f0: 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65  _TEMP_STORE. The
a800: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  .** following ta
a810: 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
a820: 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62  e relationship b
a830: 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f  etween these two
a840: 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74   values.** and t
a850: 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  his functions re
a860: 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  turn value..**.*
a870: 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  *   SQLITE_TEMP_
a880: 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65  STORE     db->te
a890: 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63  mp_store     Loc
a8a0: 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61  ation of tempora
a8b0: 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  ry database.**  
a8c0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
a8d0: 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
a8e0: 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
a8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a900: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20  --------.**   0 
a910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a920: 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
a930: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
a940: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
a950: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
a960: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
a970: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
a980: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
a990: 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
a9a0: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
a9c0: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
a9d0: 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa00: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
aa10: 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
aa40: 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
aa50: 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20  turn 0).**   2  
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa70: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
aa80: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
aa90: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
aaa0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
aab0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
aac0: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
aad0: 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
aae0: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
aaf0: 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20           any    
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
ab10: 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
ab20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
ab30: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73  empInMemory(cons
ab40: 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t sqlite3 *db){.
ab50: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
ab60: 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72  STORE==1.  retur
ab70: 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
ab80: 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  re==2 );.#endif.
ab90: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
aba0: 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72  STORE==2.  retur
abb0: 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
abc0: 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a  re!=1 );.#endif.
abd0: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
abe0: 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74 75 72  STORE==3.  retur
abf0: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  n 1;.#endif.#if 
ac00: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
ac10: 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45  E<1 || SQLITE_TE
ac20: 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72 65 74  MP_STORE>3.  ret
ac30: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
ac40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
ac50: 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  F-8 encoded Engl
ac60: 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
ac70: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
ac80: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
ac90: 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  rror..*/.const c
aca0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
acb0: 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29  msg(sqlite3 *db)
acc0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
acd0: 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
ace0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
acf0: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
ad00: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66  NOMEM);.  }.  if
ad10: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
ad20: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
ad30: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
ad40: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
ad50: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
ad60: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
ad70: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
ad80: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
ad90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ada0: 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  ){.    z = sqlit
adb0: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
adc0: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b  NOMEM);.  }else{
add0: 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  .    z = (char*)
ade0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
adf0: 78 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  xt(db->pErr);.  
ae00: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
ae10: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
ae20: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
ae30: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
ae40: 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f  ErrStr(db->errCo
ae50: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  de);.    }.  }. 
ae60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
ae70: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
ae80: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
ae90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
aea0: 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
aeb0: 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e  Return UTF-16 en
aec0: 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  coded English la
aed0: 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
aee0: 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
aef0: 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a  ecent.** error..
af00: 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
af10: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28  qlite3_errmsg16(
af20: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
af30: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
af40: 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a   outOfMem[] = {.
af50: 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74      'o', 'u', 't
af60: 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27  ', ' ', 'o', 'f'
af70: 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c  , ' ', 'm', 'e',
af80: 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20   'm', 'o', 'r', 
af90: 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74  'y', 0.  };.  st
afa0: 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d  atic const u16 m
afb0: 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  isuse[] = {.    
afc0: 27 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c 20 27  'l', 'i', 'b', '
afd0: 72 27 2c 20 27 61 27 2c 20 27 72 27 2c 20 27 79  r', 'a', 'r', 'y
afe0: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 72 27  ', ' ', .    'r'
aff0: 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c  , 'o', 'u', 't',
b000: 20 27 69 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20   'i', 'n', 'e', 
b010: 27 20 27 2c 20 0a 20 20 20 20 27 63 27 2c 20 27  ' ', .    'c', '
b020: 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65  a', 'l', 'l', 'e
b030: 27 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'd', ' ', .  
b040: 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c    'o', 'u', 't',
b050: 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20   ' ', .    'o', 
b060: 27 66 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'f', ' ', .    '
b070: 73 27 2c 20 27 65 27 2c 20 27 71 27 2c 20 27 75  s', 'e', 'q', 'u
b080: 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27 63 27  ', 'e', 'n', 'c'
b090: 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20  , 'e', 0.  };.. 
b0a0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a   const void *z;.
b0b0: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
b0c0: 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29   return (void *)
b0d0: 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20  outOfMem;.  }.  
b0e0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
b0f0: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
b100: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
b110: 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65  n (void *)misuse
b120: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
b130: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
b140: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
b150: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b160: 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20  {.    z = (void 
b170: 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65  *)outOfMem;.  }e
b180: 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  lse{.    z = sql
b190: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
b1a0: 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  6(db->pErr);.   
b1b0: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
b1c0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
b1d0: 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
b1e0: 2d 31 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  -1, sqlite3ErrSt
b1f0: 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 2c 0a  r(db->errCode),.
b200: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
b210: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
b220: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7a 20  TATIC);.      z 
b230: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
b240: 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
b250: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  ;.    }.    /* A
b260: 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61   malloc() may ha
b270: 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69 6e  ve failed within
b280: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
b290: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
b2a0: 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  6().    ** above
b2b0: 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
b2c0: 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
b2d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
b2e0: 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20   flag needs to. 
b2f0: 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65 64     ** be cleared
b300: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
b310: 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65 63  g. Do this direc
b320: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
b330: 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  via.    ** sqlit
b340: 65 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20  e3ApiExit(), to 
b350: 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68  avoid setting th
b360: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
b370: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
b380: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e  .    */.    db->
b390: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
b3a0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
b3b0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
b3c0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
b3d0: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
b3e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
b3f0: 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  6 */../*.** Retu
b400: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
b410: 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65  nt error code ge
b420: 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53 51  nerated by an SQ
b430: 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66  Lite routine. If
b440: 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73   NULL is.** pass
b450: 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
b460: 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61  ion, we assume a
b470: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
b480: 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   during sqlite3_
b490: 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  open()..*/.int s
b4a0: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73  qlite3_errcode(s
b4b0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
b4c0: 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65  f( db && !sqlite
b4d0: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
b4e0: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
b4f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
b500: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
b510: 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
b520: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
b530: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b540: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
b550: 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64  eturn db->errCod
b560: 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  e & db->errMask;
b570: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  .}.int sqlite3_e
b580: 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
b590: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
b5a0: 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
b5b0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
b5c0: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
b5d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
b5e0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
b5f0: 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
b600: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
b610: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
b620: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
b630: 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
b640: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  de;.}../*.** Cre
b650: 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ate a new collat
b660: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ing function for
b670: 20 64 61 74 61 62 61 73 65 20 22 64 62 22 2e 20   database "db". 
b680: 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61   The name is zNa
b690: 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e  me.** and the en
b6a0: 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a  coding is enc..*
b6b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65  /.static int cre
b6c0: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  ateCollation(.  
b6d0: 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63  sqlite3* db,.  c
b6e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
b6f0: 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 75  , .  u8 enc,.  u
b700: 38 20 63 6f 6c 6c 54 79 70 65 2c 0a 20 20 76 6f  8 collType,.  vo
b710: 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
b720: 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
b730: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
b740: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
b750: 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29  ),.  void(*xDel)
b760: 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c  (void*).){.  Col
b770: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
b780: 6e 74 20 65 6e 63 32 3b 0a 20 20 69 6e 74 20 6e  nt enc2;.  int n
b790: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
b7a0: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
b7b0: 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
b7c0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
b7d0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
b7e0: 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46  /* If SQLITE_UTF
b7f0: 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20  16 is specified 
b800: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  as the encoding 
b810: 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20  type, transform 
b820: 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65  this.  ** to one
b830: 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   of SQLITE_UTF16
b840: 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46  LE or SQLITE_UTF
b850: 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20  16BE using the. 
b860: 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   ** SQLITE_UTF16
b870: 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51  NATIVE macro. SQ
b880: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f  LITE_UTF16 is no
b890: 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  t used internall
b8a0: 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d  y..  */.  enc2 =
b8b0: 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73 65   enc;.  testcase
b8c0: 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
b8d0: 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63 61  TF16 );.  testca
b8e0: 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  se( enc2==SQLITE
b8f0: 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29  _UTF16_ALIGNED )
b900: 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53 51  ;.  if( enc2==SQ
b910: 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e  LITE_UTF16 || en
b920: 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
b930: 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20 20  _ALIGNED ){.    
b940: 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55 54  enc2 = SQLITE_UT
b950: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20  F16NATIVE;.  }. 
b960: 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54 45   if( enc2<SQLITE
b970: 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51  _UTF8 || enc2>SQ
b980: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b 0a  LITE_UTF16BE ){.
b990: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b9a0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
b9b0: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
b9c0: 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72  f this call is r
b9d0: 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61  emoving or repla
b9e0: 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67  cing an existing
b9f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a   collation .  **
ba00: 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f   sequence. If so
ba10: 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
ba20: 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75  active VMs, retu
ba30: 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65 72  rn busy. If ther
ba40: 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63  e.  ** are no ac
ba50: 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69  tive VMs, invali
ba60: 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d  date any pre-com
ba70: 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
ba80: 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d  ..  */.  pColl =
ba90: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
baa0: 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32  Seq(db, (u8)enc2
bab0: 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69  , zName, 0);.  i
bac0: 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
bad0: 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69  l->xCmp ){.    i
bae0: 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  f( db->activeVdb
baf0: 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  eCnt ){.      sq
bb00: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
bb10: 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
bb20: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
bb30: 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f  delete/modify co
bb40: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
bb50: 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73   due to active s
bb60: 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
bb70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bb80: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
bb90: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
bba0: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
bbb0: 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  (db);..    /* If
bbc0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
bbd0: 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72  nce pColl was cr
bbe0: 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62  eated directly b
bbf0: 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  y a call to.    
bc00: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ** sqlite3_creat
bc10: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64  e_collation, and
bc20: 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62   not generated b
bc30: 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
bc40: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e  ,.    ** then an
bc50: 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79  y copies made by
bc60: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20   synthCollSeq() 
bc70: 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  need to be inval
bc80: 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41  idated..    ** A
bc90: 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64  lso, collation d
bca0: 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c  estructor - Coll
bcb0: 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e  Seq.xDel() - fun
bcc0: 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20  ction may need. 
bcd0: 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c     ** to be call
bce0: 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  ed..    */ .    
bcf0: 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20  if( (pColl->enc 
bd00: 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  & ~SQLITE_UTF16_
bd10: 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29  ALIGNED)==enc2 )
bd20: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
bd30: 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *aColl = sqlite3
bd40: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43  HashFind(&db->aC
bd50: 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e  ollSeq, zName, n
bd60: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  Name);.      int
bd70: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
bd80: 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<3; j++){.  
bd90: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
bda0: 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20   = &aColl[j];.  
bdb0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63        if( p->enc
bdc0: 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a  ==pColl->enc ){.
bdd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
bde0: 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  >xDel ){.       
bdf0: 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e       p->xDel(p->
be00: 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pUser);.        
be10: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
be20: 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  >xCmp = 0;.     
be30: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
be40: 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20   }.  }..  pColl 
be50: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
be60: 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
be70: 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20  2, zName, 1);.  
be80: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72  if( pColl==0 ) r
be90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
bea0: 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d  EM;.  pColl->xCm
beb0: 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20  p = xCompare;.  
bec0: 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70  pColl->pUser = p
bed0: 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44  Ctx;.  pColl->xD
bee0: 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f  el = xDel;.  pCo
bef0: 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65  ll->enc = (u8)(e
bf00: 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c  nc2 | (enc & SQL
bf10: 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
bf20: 44 29 29 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 74 79  D));.  pColl->ty
bf30: 70 65 20 3d 20 63 6f 6c 6c 54 79 70 65 3b 0a 20  pe = collType;. 
bf40: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
bf50: 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
bf60: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
bf70: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
bf80: 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65  his array define
bf90: 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75  s hard upper bou
bfa0: 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c  nds on limit val
bfb0: 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69  ues.  The.** ini
bfc0: 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65  tializer must be
bfd0: 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69   kept in sync wi
bfe0: 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  th the SQLITE_LI
bff0: 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65  MIT_*.** #define
c000: 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a  s in sqlite3.h..
c010: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
c020: 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d  int aHardLimit[]
c030: 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41   = {.  SQLITE_MA
c040: 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  X_LENGTH,.  SQLI
c050: 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
c060: 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
c070: 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45  COLUMN,.  SQLITE
c080: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c  _MAX_EXPR_DEPTH,
c090: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
c0a0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20  MPOUND_SELECT,. 
c0b0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
c0c0: 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  _OP,.  SQLITE_MA
c0d0: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a  X_FUNCTION_ARG,.
c0e0: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54    SQLITE_MAX_ATT
c0f0: 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f  ACHED,.  SQLITE_
c100: 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
c110: 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
c120: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
c130: 55 4d 42 45 52 2c 0a 20 20 53 51 4c 49 54 45 5f  UMBER,.  SQLITE_
c140: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
c150: 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  H,.};../*.** Mak
c160: 65 20 73 75 72 65 20 74 68 65 20 68 61 72 64 20  e sure the hard 
c170: 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74 20 74  limits are set t
c180: 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c  o reasonable val
c190: 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ues.*/.#if SQLIT
c1a0: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30  E_MAX_LENGTH<100
c1b0: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
c1c0: 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  MAX_LENGTH must 
c1d0: 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a  be at least 100.
c1e0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
c1f0: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
c200: 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  <100.# error SQL
c210: 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
c220: 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
c230: 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23  ast 100.#endif.#
c240: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  if SQLITE_MAX_SQ
c250: 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f  L_LENGTH>SQLITE_
c260: 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72  MAX_LENGTH.# err
c270: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  or SQLITE_MAX_SQ
c280: 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f  L_LENGTH must no
c290: 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
c2a0: 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  n SQLITE_MAX_LEN
c2b0: 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  GTH.#endif.#if S
c2c0: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
c2d0: 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72  ND_SELECT<2.# er
c2e0: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ror SQLITE_MAX_C
c2f0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d  OMPOUND_SELECT m
c300: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
c310: 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  2.#endif.#if SQL
c320: 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c  ITE_MAX_VDBE_OP<
c330: 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  40.# error SQLIT
c340: 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75  E_MAX_VDBE_OP mu
c350: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 34  st be at least 4
c360: 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
c370: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
c380: 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45  _ARG<0 || SQLITE
c390: 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
c3a0: 47 3e 31 30 30 30 0a 23 20 65 72 72 6f 72 20 53  G>1000.# error S
c3b0: 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
c3c0: 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62  ON_ARG must be b
c3d0: 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 30 30  etween 0 and 100
c3e0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
c3f0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
c400: 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  <0 || SQLITE_MAX
c410: 5f 41 54 54 41 43 48 45 44 3e 33 30 0a 23 20 65  _ATTACHED>30.# e
c420: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
c430: 41 54 54 41 43 48 45 44 20 6d 75 73 74 20 62 65  ATTACHED must be
c440: 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 33   between 0 and 3
c450: 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
c460: 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
c470: 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20  TERN_LENGTH<1.# 
c480: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
c490: 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
c4a0: 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
c4b0: 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23  least 1.#endif.#
c4c0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
c4d0: 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72  LUMN>32767.# err
c4e0: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  or SQLITE_MAX_CO
c4f0: 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78  LUMN must not ex
c500: 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69  ceed 32767.#endi
c510: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
c520: 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31  _TRIGGER_DEPTH<1
c530: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
c540: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
c550: 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
c560: 73 74 20 31 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  st 1.#endif.../*
c570: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
c580: 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e  alue of a limit.
c590: 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64    Report the old
c5a0: 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e   value..** If an
c5b0: 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69   invalid limit i
c5c0: 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69 65 64  ndex is supplied
c5d0: 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20  , report -1..** 
c5e0: 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
c5f0: 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74  but still report
c600: 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69   the old value i
c610: 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d  f the.** new lim
c620: 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
c630: 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65  **.** A new lowe
c640: 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74  r limit does not
c650: 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67   shrink existing
c660: 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20   constructs..** 
c670: 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e  It merely preven
c680: 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74  ts new construct
c690: 73 20 74 68 61 74 20 65 78 63 65 65 64 20 74 68  s that exceed th
c6a0: 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20  e limit.** from 
c6b0: 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  forming..*/.int 
c6c0: 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71  sqlite3_limit(sq
c6d0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c  lite3 *db, int l
c6e0: 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c  imitId, int newL
c6f0: 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64  imit){.  int old
c700: 4c 69 6d 69 74 3b 0a 0a 0a 20 20 2f 2a 20 45 56  Limit;...  /* EV
c710: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31  IDENCE-OF: R-301
c720: 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65 61 63  89-54097 For eac
c730: 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f 72 79  h limit category
c740: 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41   SQLITE_LIMIT_NA
c750: 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  ME.  ** there is
c760: 20 61 20 68 61 72 64 20 75 70 70 65 72 20 62 6f   a hard upper bo
c770: 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d 70 69  und set at compi
c780: 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43 20 70  le-time by a C p
c790: 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a  reprocessor.  **
c7a0: 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20 53 51   macro called SQ
c7b0: 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28  LITE_MAX_NAME. (
c7c0: 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e  The "_LIMIT_" in
c7d0: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63 68 61   the name is cha
c7e0: 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d  nged to.  ** "_M
c7f0: 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73  AX_".).  */.  as
c800: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
c810: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
c820: 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  NGTH]==SQLITE_MA
c830: 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  X_LENGTH );.  as
c840: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
c850: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51  [SQLITE_LIMIT_SQ
c860: 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54  L_LENGTH]==SQLIT
c870: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
c880: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
c890: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
c8a0: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53  LIMIT_COLUMN]==S
c8b0: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
c8c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
c8d0: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
c8e0: 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
c8f0: 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  ]==SQLITE_MAX_EX
c900: 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  PR_DEPTH );.  as
c910: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
c920: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
c930: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d  MPOUND_SELECT]==
c940: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
c950: 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61  UND_SELECT);.  a
c960: 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
c970: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
c980: 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f  DBE_OP]==SQLITE_
c990: 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20  MAX_VDBE_OP );. 
c9a0: 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
c9b0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
c9c0: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d  _FUNCTION_ARG]==
c9d0: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
c9e0: 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73 73  ION_ARG );.  ass
c9f0: 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
ca00: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
ca10: 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ACHED]==SQLITE_M
ca20: 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b 0a 20  AX_ATTACHED );. 
ca30: 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
ca40: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
ca50: 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
ca60: 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20  NGTH]==.        
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca90: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41         SQLITE_MA
caa0: 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
cab0: 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72  ENGTH );.  asser
cac0: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
cad0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
cae0: 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c  BLE_NUMBER]==SQL
caf0: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
cb00: 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73 73 65  _NUMBER);.  asse
cb10: 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
cb20: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
cb30: 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  GER_DEPTH]==SQLI
cb40: 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
cb50: 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
cb60: 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54  ( SQLITE_LIMIT_T
cb70: 52 49 47 47 45 52 5f 44 45 50 54 48 3d 3d 28 53  RIGGER_DEPTH==(S
cb80: 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29  QLITE_N_LIMIT-1)
cb90: 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69   );...  if( limi
cba0: 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64  tId<0 || limitId
cbb0: 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54  >=SQLITE_N_LIMIT
cbc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   ){.    return -
cbd0: 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69  1;.  }.  oldLimi
cbe0: 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c  t = db->aLimit[l
cbf0: 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e  imitId];.  if( n
cc00: 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20  ewLimit>=0 ){   
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc20: 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d  /* IMP: R-52476-
cc30: 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69 66 28  28732 */.    if(
cc40: 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c   newLimit>aHardL
cc50: 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b  imit[limitId] ){
cc60: 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20  .      newLimit 
cc70: 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  = aHardLimit[lim
cc80: 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20  itId];  /* IMP: 
cc90: 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20 2a 2f  R-51463-25634 */
cca0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61  .    }.    db->a
ccb0: 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d  Limit[limitId] =
ccc0: 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20   newLimit;.  }. 
ccd0: 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74   return oldLimit
cce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ccf0: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
cd00: 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d  53341-35419 */.}
cd10: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
cd20: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 55 54 4f 5f  ITE_ENABLE_AUTO_
cd30: 50 52 4f 46 49 4c 45 29 0a 73 74 61 74 69 63 20  PROFILE).static 
cd40: 76 6f 69 64 20 70 72 6f 66 69 6c 65 5f 73 71 6c  void profile_sql
cd50: 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73  (void *aux, cons
cd60: 74 20 63 68 61 72 20 2a 73 71 6c 2c 20 75 36 34  t char *sql, u64
cd70: 20 6e 73 29 20 7b 0a 23 70 72 61 67 6d 61 20 75   ns) {.#pragma u
cd80: 6e 75 73 65 64 28 61 75 78 29 0a 09 66 70 72 69  nused(aux)..fpri
cd90: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 51 75 65  ntf(stderr, "Que
cda0: 72 79 3a 20 25 73 5c 6e 20 45 78 65 63 75 74 69  ry: %s\n Executi
cdb0: 6f 6e 20 54 69 6d 65 3a 20 25 6c 6c 75 20 6d 73  on Time: %llu ms
cdc0: 5c 6e 22 2c 20 73 71 6c 2c 20 6e 73 20 2f 20 31  \n", sql, ns / 1
cdd0: 30 30 30 30 30 30 29 3b 0a 7d 0a 23 65 6e 64 69  000000);.}.#endi
cde0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
cdf0: 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
ce00: 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61  ork of opening a
ce10: 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68   database on beh
ce20: 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  alf of.** sqlite
ce30: 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c  3_open() and sql
ce40: 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54  ite3_open16(). T
ce50: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
ce60: 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22  name "zFilename"
ce70: 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65    .** is UTF-8 e
ce80: 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
ce90: 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61  c int openDataba
cea0: 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  se(.  const char
ceb0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20   *zFilename, /* 
cec0: 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
ced0: 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
cee0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
cef0: 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  pDb,        /* O
cf00: 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74  UT: Returned dat
cf10: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
cf20: 20 20 75 6e 73 69 67 6e 65 64 20 66 6c 61 67 73    unsigned flags
cf30: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72  ,        /* Oper
cf40: 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f  ational flags */
cf50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
cf60: 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Vfs       /* Nam
cf70: 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
cf80: 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  use */.){.  sqli
cf90: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
cfa0: 63 3b 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61  c;.  int isThrea
cfb0: 64 73 61 66 65 3b 0a 0a 20 20 2a 70 70 44 62 20  dsafe;..  *ppDb 
cfc0: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
cfd0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
cfe0: 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  T.  rc = sqlite3
cff0: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
d000: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
d010: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f   rc;.#endif..  /
d020: 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e  * Only allow sen
d030: 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f  sible combinatio
d040: 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  ns of bits in th
d050: 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  e flags argument
d060: 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61  .  .  ** Throw a
d070: 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e  n error if any n
d080: 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61  on-sense combina
d090: 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49  tion is used.  I
d0a0: 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74  f we.  ** do not
d0b0: 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63   block illegal c
d0c0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65  ombinations here
d0d0: 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67  , it could trigg
d0e0: 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  er.  ** assert()
d0f0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64   statements in d
d100: 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53  eeper layers.  S
d110: 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74  ensible combinat
d120: 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20  ions.  ** are:. 
d130: 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51   **.  **  1:  SQ
d140: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
d150: 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c  LY.  **  2:  SQL
d160: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
d170: 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c  TE.  **  6:  SQL
d180: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
d190: 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
d1a0: 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61  _CREATE.  */.  a
d1b0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50  ssert( SQLITE_OP
d1c0: 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20  EN_READONLY  == 
d1d0: 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74  0x01 );.  assert
d1e0: 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ( SQLITE_OPEN_RE
d1f0: 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20  ADWRITE == 0x02 
d200: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
d210: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
d220: 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20     == 0x04 );.  
d230: 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
d240: 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29  lags&7))==0x02 )
d250: 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f  ; /* READONLY */
d260: 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c  .  testcase( (1<
d270: 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30  <(flags&7))==0x0
d280: 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54  4 ); /* READWRIT
d290: 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  E */.  testcase(
d2a0: 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d   (1<<(flags&7))=
d2b0: 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44  =0x40 ); /* READ
d2c0: 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a  WRITE | CREATE *
d2d0: 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c  /.  if( ((1<<(fl
d2e0: 61 67 73 26 37 29 29 20 26 20 30 78 34 36 29 3d  ags&7)) & 0x46)=
d2f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
d300: 54 45 5f 4d 49 53 55 53 45 3b 0a 0a 20 20 69 66  TE_MISUSE;..  if
d310: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
d320: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
d330: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72  ==0 ){.    isThr
d340: 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d  eadsafe = 0;.  }
d350: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
d360: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
d370: 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
d380: 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20  readsafe = 0;.  
d390: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
d3a0: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  & SQLITE_OPEN_FU
d3b0: 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  LLMUTEX ){.    i
d3c0: 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b  sThreadsafe = 1;
d3d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
d3e0: 54 68 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c  Threadsafe = sql
d3f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
d400: 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d  .bFullMutex;.  }
d410: 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
d420: 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
d430: 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66  TECACHE ){.    f
d440: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
d450: 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
d460: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
d470: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
d480: 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61  g.sharedCacheEna
d490: 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67  bled ){.    flag
d4a0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
d4b0: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
d4c0: 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68  }..  /* Remove h
d4d0: 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d  armful bits from
d4e0: 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
d4f0: 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  eter.  **.  ** T
d500: 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  he SQLITE_OPEN_N
d510: 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54  OMUTEX and SQLIT
d520: 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
d530: 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a   flags were.  **
d540: 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74   dealt with in t
d550: 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
d560: 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73   block.  Besides
d570: 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79   these, the only
d580: 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75  .  ** valid inpu
d590: 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  t flags for sqli
d5a0: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72  te3_open_v2() ar
d5b0: 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  e SQLITE_OPEN_RE
d5c0: 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c  ADONLY,.  ** SQL
d5d0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
d5e0: 54 45 2c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  TE, and SQLITE_O
d5f0: 50 45 4e 5f 43 52 45 41 54 45 2e 20 20 53 69 6c  PEN_CREATE.  Sil
d600: 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20  ently mask.  ** 
d610: 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c  off all other fl
d620: 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67  ags..  */.  flag
d630: 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f  s &=  ~( SQLITE_
d640: 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
d650: 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  SE |.           
d660: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
d670: 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20  EXCLUSIVE |.    
d680: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
d690: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c  E_OPEN_MAIN_DB |
d6a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d6b0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
d6c0: 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20  _DB | .         
d6d0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
d6e0: 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
d6f0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
d700: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
d710: 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  N_JOURNAL | .   
d720: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
d730: 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
d740: 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
d750: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
d760: 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20  EN_SUBJOURNAL | 
d770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d780: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
d790: 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20  ER_JOURNAL |.   
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
d7b0: 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
d7c0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
d7d0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
d7e0: 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  LMUTEX |.       
d7f0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
d800: 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20  PEN_WAL.        
d810: 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c       );..  /* Al
d820: 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
d830: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
d840: 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74   */.  db = sqlit
d850: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
d860: 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b  zeof(sqlite3) );
d870: 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67  .  if( db==0 ) g
d880: 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
d890: 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61    if( isThreadsa
d8a0: 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75  fe ){.    db->mu
d8b0: 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
d8c0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
d8d0: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b  UTEX_RECURSIVE);
d8e0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74  .    if( db->mut
d8f0: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex==0 ){.      s
d900: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b  qlite3_free(db);
d910: 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  .      db = 0;. 
d920: 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62       goto opendb
d930: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
d940: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d950: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
d960: 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
d970: 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44  = 0xff;.  db->nD
d980: 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67  b = 2;.  db->mag
d990: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
d9a0: 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44  C_BUSY;.  db->aD
d9b0: 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
d9c0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69  c;..  assert( si
d9d0: 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29  zeof(db->aLimit)
d9e0: 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69  ==sizeof(aHardLi
d9f0: 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79  mit) );.  memcpy
da00: 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61  (db->aLimit, aHa
da10: 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28  rdLimit, sizeof(
da20: 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20  db->aLimit));.  
da30: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
da40: 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75   1;.  db->nextAu
da50: 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62  tovac = -1;.  db
da60: 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d  ->nextPagesize =
da70: 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   0;.  db->flags 
da80: 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
da90: 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45  olNames | SQLITE
daa0: 5f 41 75 74 6f 49 6e 64 65 78 0a 23 69 66 20 53  _AutoIndex.#if S
dab0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
dac0: 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20  LE_FORMAT<4.    
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
dae0: 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65  QLITE_LegacyFile
daf0: 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  Fmt.#endif.#ifde
db00: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
db10: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74  | SQLITE_LoadExt
db40: 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69  ension.#endif.#i
db50: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
db60: 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49 47 47  _RECURSIVE_TRIGG
db70: 45 52 53 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERS.            
db80: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65       | SQLITE_Re
db90: 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66  cTriggers.#endif
dba0: 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74  .      ;.  sqlit
dbb0: 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e  e3HashInit(&db->
dbc0: 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64  aCollSeq);.#ifnd
dbd0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
dbe0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71  IRTUALTABLE.  sq
dbf0: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
dc00: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
dc10: 64 69 66 0a 0a 20 20 64 62 2d 3e 70 56 66 73 20  dif..  db->pVfs 
dc20: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
dc30: 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20  nd(zVfs);.  if( 
dc40: 21 64 62 2d 3e 70 56 66 73 20 29 7b 0a 20 20 20  !db->pVfs ){.   
dc50: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
dc60: 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  OR;.    sqlite3E
dc70: 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 22 6e 6f  rror(db, rc, "no
dc80: 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20   such vfs: %s", 
dc90: 7a 56 66 73 29 3b 0a 20 20 20 20 67 6f 74 6f 20  zVfs);.    goto 
dca0: 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
dcb0: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65  .  /* Add the de
dcc0: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
dcd0: 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e  sequence BINARY.
dce0: 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f   BINARY works fo
dcf0: 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a  r both UTF-8.  *
dd00: 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f  * and UTF-16, so
dd10: 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66   add a version f
dd20: 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64  or each to avoid
dd30: 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79   any unnecessary
dd40: 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e  .  ** conversion
dd50: 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f  s. The only erro
dd60: 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72  r that can occur
dd70: 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f   here is a mallo
dd80: 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a  c() failure..  *
dd90: 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  /.  createCollat
dda0: 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22  ion(db, "BINARY"
ddb0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
ddc0: 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52  QLITE_COLL_BINAR
ddd0: 59 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  Y, 0,.          
dde0: 20 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46          binCollF
ddf0: 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
de00: 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
de10: 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f  BINARY", SQLITE_
de20: 55 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45 5f  UTF16BE, SQLITE_
de30: 43 4f 4c 4c 5f 42 49 4e 41 52 59 2c 20 30 2c 0a  COLL_BINARY, 0,.
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 20 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30    binCollFunc, 0
de60: 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
de70: 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59  tion(db, "BINARY
de80: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
de90: 45 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42  E, SQLITE_COLL_B
dea0: 49 4e 41 52 59 2c 20 30 2c 0a 20 20 20 20 20 20  INARY, 0,.      
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 43              binC
dec0: 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
ded0: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
dee0: 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49  b, "RTRIM", SQLI
def0: 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
df00: 43 4f 4c 4c 5f 55 53 45 52 2c 20 28 76 6f 69 64  COLL_USER, (void
df10: 2a 29 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  *)1,.           
df20: 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46 75         binCollFu
df30: 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  nc, 0);.  if( db
df40: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
df50: 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  {.    goto opend
df60: 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d  b_out;.  }.  db-
df70: 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c  >pDfltColl = sql
df80: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
df90: 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  db, SQLITE_UTF8,
dfa0: 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20   "BINARY", 0);. 
dfb0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66   assert( db->pDf
dfc0: 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20  ltColl!=0 );..  
dfd0: 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61 20 55 54  /* Also add a UT
dfe0: 46 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e 73 69  F-8 case-insensi
dff0: 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  tive collation s
e000: 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72  equence. */.  cr
e010: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
e020: 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49  , "NOCASE", SQLI
e030: 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
e040: 43 4f 4c 4c 5f 4e 4f 43 41 53 45 2c 20 30 2c 0a  COLL_NOCASE, 0,.
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e060: 20 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e    nocaseCollatin
e070: 67 46 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a  gFunc, 0);..  /*
e080: 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e   Open the backen
e090: 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65  d database drive
e0a0: 72 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46  r */.  db->openF
e0b0: 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
e0c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
e0d0: 65 4f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  eOpen(zFilename,
e0e0: 20 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d   db, &db->aDb[0]
e0f0: 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20  .pBt, 0,.       
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e110: 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f   flags | SQLITE_
e120: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20  OPEN_MAIN_DB);. 
e130: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e140: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
e150: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  ==SQLITE_IOERR_N
e160: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  OMEM ){.      rc
e170: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
e180: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
e190: 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
e1a0: 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65  0);.    goto ope
e1b0: 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64  ndb_out;.  }.  d
e1c0: 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d  b->aDb[0].pSchem
e1d0: 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
e1e0: 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62  aGet(db, db->aDb
e1f0: 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e  [0].pBt);.  db->
e200: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[1].pSchema =
e210: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
e220: 74 28 64 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a  t(db, 0);...  /*
e230: 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66   The default saf
e240: 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68  ety_level for th
e250: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
e260: 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74  is 'full'; for t
e270: 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74  he temp.  ** dat
e280: 61 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e  abase it is 'NON
e290: 45 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73  E'. This matches
e2a0: 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
e2b0: 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a   defaults.  .  *
e2c0: 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a  /.  db->aDb[0].z
e2d0: 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
e2e0: 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65   db->aDb[0].safe
e2f0: 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20  ty_level = 3;.  
e300: 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65  db->aDb[1].zName
e310: 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d   = "temp";.  db-
e320: 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[1].safety_l
e330: 65 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d  evel = 1;..  db-
e340: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
e350: 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66  MAGIC_OPEN;.  if
e360: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
e370: 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f  ed ){.    goto o
e380: 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pendb_out;.  }..
e390: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
e3a0: 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74  l built-in funct
e3b0: 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74  ions, but do not
e3c0: 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
e3d0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
e3e0: 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54  se schema yet. T
e3f0: 68 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75  his is delayed u
e400: 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74  ntil the first t
e410: 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ime the database
e420: 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65  .  ** is accesse
e430: 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
e440: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
e450: 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
e460: 74 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74  te3RegisterBuilt
e470: 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b  inFunctions(db);
e480: 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f  ..  /* Load auto
e490: 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73  matic extensions
e4a0: 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68   - extensions th
e4b0: 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67  at have been reg
e4c0: 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69  istered.  ** usi
e4d0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61  ng the sqlite3_a
e4e0: 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69  utomatic_extensi
e4f0: 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20  on() API..  */. 
e500: 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64   sqlite3AutoLoad
e510: 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a  Extensions(db);.
e520: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
e530: 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66  rrcode(db);.  if
e540: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e550: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
e560: 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 23 69 66  db_out;.  }..#if
e570: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e580: 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62  E_FTS1.  if( !db
e590: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e5a0: 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
e5b0: 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
e5c0: 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
e5d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31  rc = sqlite3Fts1
e5e0: 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
e5f0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
e600: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a  ITE_ENABLE_FTS2.
e610: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
e620: 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
e630: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e640: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
e650: 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74  e3Fts2Init(sqlit
e660: 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  e3*);.    rc = s
e670: 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64  qlite3Fts2Init(d
e680: 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
e690: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e6a0: 41 42 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20  ABLE_FTS3.  if( 
e6b0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
e6c0: 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
e6d0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
e6e0: 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28 64  qlite3Fts3Init(d
e6f0: 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
e700: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e710: 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21  ABLE_ICU.  if( !
e720: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e730: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
e740: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
e750: 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62 29  lite3IcuInit(db)
e760: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
e770: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e780: 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21  LE_RTREE.  if( !
e790: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e7a0: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
e7b0: 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
e7c0: 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64 62  ite3RtreeInit(db
e7d0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
e7e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
e7f0: 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  , rc, 0);..  /* 
e800: 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
e810: 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20  _LOCKING_MODE=1 
e820: 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20  makes EXCLUSIVE 
e830: 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  the default lock
e840: 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20  ing.  ** mode.  
e850: 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
e860: 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20  _LOCKING_MODE=0 
e870: 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20  make NORMAL the 
e880: 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a  default locking.
e890: 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e    ** mode.  Doin
e8a0: 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c  g nothing at all
e8b0: 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d   also makes NORM
e8c0: 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a  AL the default..
e8d0: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
e8e0: 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
e8f0: 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66  NG_MODE.  db->df
e900: 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c  ltLockMode = SQL
e910: 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
e920: 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69  ING_MODE;.  sqli
e930: 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
e940: 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65  ode(sqlite3Btree
e950: 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d  Pager(db->aDb[0]
e960: 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20  .pBt),.         
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e980: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
e990: 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23  LOCKING_MODE);.#
e9a0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 61 62  endif..  /* Enab
e9b0: 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  le the lookaside
e9c0: 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65  -malloc subsyste
e9d0: 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b  m */.  setupLook
e9e0: 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c  aside(db, 0, sql
e9f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
ea00: 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20  .szLookaside,.  
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
ea30: 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61  balConfig.nLooka
ea40: 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65  side);..  sqlite
ea50: 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
ea60: 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f  oint(db, SQLITE_
ea70: 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f  DEFAULT_WAL_AUTO
ea80: 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70  CHECKPOINT);..op
ea90: 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66 28 20  endb_out:.  if( 
eaa0: 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  db ){.    assert
eab0: 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c  ( db->mutex!=0 |
eac0: 7c 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d  | isThreadsafe==
ead0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62  0 || sqlite3Glob
eae0: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
eaf0: 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tex==0 );.    sq
eb00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
eb10: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
eb20: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
eb30: 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
eb40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
eb50: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69  OMEM ){.    sqli
eb60: 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20  te3_close(db);. 
eb70: 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c     db = 0;.  }el
eb80: 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
eb90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e  E_OK ){.    db->
eba0: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
ebb0: 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 23  AGIC_SICK;.  }.#
ebc0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
ebd0: 45 5f 45 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52  E_ENABLE_AUTO_PR
ebe0: 4f 46 49 4c 45 29 0a 20 20 69 66 28 20 64 62 20  OFILE).  if( db 
ebf0: 26 26 20 21 72 63 20 29 7b 0a 20 20 20 20 63 68  && !rc ){.    ch
ec00: 61 72 20 2a 65 6e 76 70 72 6f 66 69 6c 65 20 3d  ar *envprofile =
ec10: 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
ec20: 41 55 54 4f 5f 50 52 4f 46 49 4c 45 22 29 3b 0a  AUTO_PROFILE");.
ec30: 20 20 20 20 0a 20 20 20 20 69 66 28 20 65 6e 76      .    if( env
ec40: 70 72 6f 66 69 6c 65 21 3d 4e 55 4c 4c 20 29 7b  profile!=NULL ){
ec50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70  .      sqlite3_p
ec60: 72 6f 66 69 6c 65 28 64 62 2c 20 70 72 6f 66 69  rofile(db, profi
ec70: 6c 65 5f 73 71 6c 2c 20 4e 55 4c 4c 29 3b 0a 20  le_sql, NULL);. 
ec80: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
ec90: 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23 69    *ppDb = db;.#i
eca0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ecb0: 4c 45 5f 53 51 4c 52 52 0a 20 20 53 52 52 65 63  LE_SQLRR.  SRRec
ecc0: 4f 70 65 6e 28 64 62 2c 20 7a 46 69 6c 65 6e 61  Open(db, zFilena
ecd0: 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 23 65 6e 64  me, flags);.#end
ece0: 69 66 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  if.  return sqli
ecf0: 74 65 33 41 70 69 45 78 69 74 28 30 2c 20 72 63  te3ApiExit(0, rc
ed00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
ed10: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
ed20: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
ed30: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63  qlite3_open(.  c
ed40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
ed50: 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33  name, .  sqlite3
ed60: 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72 65   **ppDb .){.  re
ed70: 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73  turn openDatabas
ed80: 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44  e(zFilename, ppD
ed90: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
eda0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
edb0: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
edc0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
edd0: 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  ATE, 0);.}.int s
ede0: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a  qlite3_open_v2(.
edf0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
ee00: 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74  lename,   /* Dat
ee10: 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 28  abase filename (
ee20: 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69  UTF-8) */.  sqli
ee30: 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20  te3 **ppDb,     
ee40: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69      /* OUT: SQLi
ee50: 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a  te db handle */.
ee60: 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
ee70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
ee80: 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  gs */.  const ch
ee90: 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 20  ar *zVfs        
eea0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d  /* Name of VFS m
eeb0: 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a  odule to use */.
eec0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e  ){.  return open
eed0: 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e 61 6d  Database(filenam
eee0: 65 2c 20 70 70 44 62 2c 20 66 6c 61 67 73 2c 20  e, ppDb, flags, 
eef0: 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  zVfs);.}..#ifnde
ef00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
ef10: 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  F16./*.** Open a
ef20: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61   new database ha
ef30: 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
ef40: 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63  ite3_open16(.  c
ef50: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65  onst void *zFile
ef60: 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33  name, .  sqlite3
ef70: 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61   **ppDb.){.  cha
ef80: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61  r const *zFilena
ef90: 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e  me8;   /* zFilen
efa0: 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55  ame encoded in U
efb0: 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20  TF-8 instead of 
efc0: 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69  UTF-16 */.  sqli
efd0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
efe0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
eff0: 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 20  sert( zFilename 
f000: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70 44  );.  assert( ppD
f010: 62 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d 20 30  b );.  *ppDb = 0
f020: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
f030: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
f040: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
f050: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
f060: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
f070: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56 61 6c 20  ;.#endif.  pVal 
f080: 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
f090: 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
f0a0: 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
f0b0: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
f0c0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
f0d0: 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  VE, SQLITE_STATI
f0e0: 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38  C);.  zFilename8
f0f0: 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
f100: 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45  ext(pVal, SQLITE
f110: 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46  _UTF8);.  if( zF
f120: 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20  ilename8 ){.    
f130: 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73  rc = openDatabas
f140: 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70  e(zFilename8, pp
f150: 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
f160: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
f170: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
f180: 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
f190: 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73  EATE, 0);.    as
f1a0: 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72  sert( *ppDb || r
f1b0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
f1c0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
f1d0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48  QLITE_OK && !DbH
f1e0: 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62  asProperty(*ppDb
f1f0: 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , 0, DB_SchemaLo
f200: 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20 45  aded) ){.      E
f210: 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49  NC(*ppDb) = SQLI
f220: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
f230: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
f240: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
f250: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  OMEM;.  }.  sqli
f260: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
f270: 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 71  l);..  return sq
f280: 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20  lite3ApiExit(0, 
f290: 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  rc);.}.#endif /*
f2a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
f2b0: 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
f2c0: 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
f2d0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
f2e0: 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
f2f0: 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
f300: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
f310: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73  e_collation(.  s
f320: 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
f330: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
f340: 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
f350: 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
f360: 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
f370: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
f380: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
f390: 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
f3a0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
f3b0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
f3c0: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
f3d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f3e0: 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65  );.  rc = create
f3f0: 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
f400: 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 53 51  ame, (u8)enc, SQ
f410: 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20  LITE_COLL_USER, 
f420: 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
f430: 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
f440: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
f450: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
f460: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
f470: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
f480: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
f490: 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
f4a0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
f4b0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
f4c0: 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
f4d0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
f4e0: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20  collation_v2(.  
f4f0: 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
f500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
f510: 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  e, .  int enc, .
f520: 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
f530: 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
f540: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
f550: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
f560: 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  oid*),.  void(*x
f570: 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20  Del)(void*).){. 
f580: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
f590: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
f5a0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
f5b0: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
f5c0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d  Failed );.  rc =
f5d0: 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
f5e0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29  (db, zName, (u8)
f5f0: 65 6e 63 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c  enc, SQLITE_COLL
f600: 5f 55 53 45 52 2c 20 70 43 74 78 2c 20 78 43 6f  _USER, pCtx, xCo
f610: 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20  mpare, xDel);.  
f620: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
f630: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
f640: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f650: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f660: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
f670: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f680: 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
f690: 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
f6a0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
f6b0: 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
f6c0: 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
f6d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
f6e0: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28  ate_collation16(
f6f0: 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
f700: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
f710: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  Name,.  int enc,
f720: 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
f730: 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
f740: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
f750: 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
f760: 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74   void*).){.  int
f770: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f780: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b  .  char *zName8;
f790: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f7a0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
f7b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
f7c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f7d0: 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c  ;.  zName8 = sql
f7e0: 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
f7f0: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
f800: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
f810: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b  .  if( zName8 ){
f820: 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65  .    rc = create
f830: 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
f840: 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 53  ame8, (u8)enc, S
f850: 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c  QLITE_COLL_USER,
f860: 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
f870: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
f880: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
f890: 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  8);.  }.  rc = s
f8a0: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
f8b0: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
f8c0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
f8d0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
f8e0: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
f8f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
f900: 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
f910: 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69  gister a collati
f920: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
f930: 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ory callback wit
f940: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
f950: 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70  andle.** db. Rep
f960: 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lace any previou
f970: 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f  sly installed co
f980: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
f990: 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74   factory..*/.int
f9a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
f9b0: 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c  on_needed(.  sql
f9c0: 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
f9d0: 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
f9e0: 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
f9f0: 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73  lNeeded)(void*,s
fa00: 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78  qlite3*,int eTex
fa10: 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a  tRep,const char*
fa20: 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ).){.  sqlite3_m
fa30: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
fa40: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f  utex);.  db->xCo
fa50: 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c  llNeeded = xColl
fa60: 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43  Needed;.  db->xC
fa70: 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b  ollNeeded16 = 0;
fa80: 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  .  db->pCollNeed
fa90: 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65  edArg = pCollNee
faa0: 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  dedArg;.  sqlite
fab0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
fac0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
fad0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fae0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
faf0: 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
fb00: 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
fb10: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
fb20: 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
fb30: 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
fb40: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
fb50: 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
fb60: 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
fb70: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
fb80: 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
fb90: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
fba0: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a  ation_needed16(.
fbb0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
fbc0: 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65    void *pCollNee
fbd0: 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28  dedArg, .  void(
fbe0: 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28  *xCollNeeded16)(
fbf0: 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69  void*,sqlite3*,i
fc00: 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73  nt eTextRep,cons
fc10: 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 73 71  t void*).){.  sq
fc20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
fc30: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
fc40: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20  db->xCollNeeded 
fc50: 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  = 0;.  db->xColl
fc60: 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c  Needed16 = xColl
fc70: 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e  Needed16;.  db->
fc80: 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d  pCollNeededArg =
fc90: 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b   pCollNeededArg;
fca0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
fcb0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
fcc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
fcd0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
fce0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
fcf0: 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TF16 */..#ifndef
fd00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
fd10: 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68  RECATED./*.** Th
fd20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
fd30: 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73  ow an anachronis
fd40: 6d 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  m. It used to be
fd50: 20 75 73 65 64 20 74 6f 20 72 65 63 6f 76 65 72   used to recover
fd60: 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f   from a.** mallo
fd70: 63 28 29 20 66 61 69 6c 75 72 65 2c 20 62 75 74  c() failure, but
fd80: 20 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73   SQLite now does
fd90: 20 74 68 69 73 20 61 75 74 6f 6d 61 74 69 63 61   this automatica
fda0: 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lly..*/.int sqli
fdb0: 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  te3_global_recov
fdc0: 65 72 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  er(void){.  retu
fdd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fde0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65  #endif../*.** Te
fdf0: 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65  st to see whethe
fe00: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61 74  r or not the dat
fe10: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
fe20: 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69   is in autocommi
fe30: 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75  t.** mode.  Retu
fe40: 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
fe50: 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f   and FALSE if no
fe60: 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d  t.  Autocommit m
fe70: 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20  ode is on.** by 
fe80: 64 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f  default.  Autoco
fe90: 6d 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65 64  mmit is disabled
fea0: 20 62 79 20 61 20 42 45 47 49 4e 20 73 74 61 74   by a BEGIN stat
feb0: 65 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61 62  ement and reenab
fec0: 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65  led.** by the ne
fed0: 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c  xt COMMIT or ROL
fee0: 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  LBACK..**.******
fef0: 2a 20 54 48 49 53 20 49 53 20 41 4e 20 45 58 50  * THIS IS AN EXP
ff00: 45 52 49 4d 45 4e 54 41 4c 20 41 50 49 20 41 4e  ERIMENTAL API AN
ff10: 44 20 49 53 20 53 55 42 4a 45 43 54 20 54 4f 20  D IS SUBJECT TO 
ff20: 43 48 41 4e 47 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f  CHANGE ******.*/
ff30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74  .int sqlite3_get
ff40: 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69  _autocommit(sqli
ff50: 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
ff60: 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  rn db->autoCommi
ff70: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
ff80: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
ff90: 65 73 20 61 72 65 20 73 75 62 74 69 74 75 74 65  es are subtitute
ffa0: 73 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20  s for constants 
ffb0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a  SQLITE_CORRUPT,.
ffc0: 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  ** SQLITE_MISUSE
ffd0: 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
ffe0: 4e 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  N, SQLITE_IOERR 
fff0: 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68  and possibly oth
10000 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73  er error.** cons
10010 74 61 6e 74 73 2e 20 20 54 68 65 79 20 73 65 72  tants.  They ser
10020 76 65 72 20 74 77 6f 20 70 75 72 70 6f 73 65 73  ver two purposes
10030 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65  :.**.**   1.  Se
10040 72 76 65 20 61 73 20 61 20 63 6f 6e 76 65 6e 69  rve as a conveni
10050 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74  ent place to set
10060 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e   a breakpoint in
10070 20 61 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 20   a debugger.**  
10080 20 20 20 20 20 74 6f 20 64 65 74 65 63 74 20 77       to detect w
10090 68 65 6e 20 76 65 72 73 69 6f 6e 20 65 72 72 6f  hen version erro
100a0 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63  r conditions occ
100b0 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20  urs..**.**   2. 
100c0 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f   Invoke sqlite3_
100d0 6c 6f 67 28 29 20 74 6f 20 70 72 6f 76 69 64 65  log() to provide
100e0 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65   the source code
100f0 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65 72 65 0a   location where.
10100 2a 2a 20 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c  **       a low-l
10110 65 76 65 6c 20 65 72 72 6f 72 20 69 73 20 66 69  evel error is fi
10120 72 73 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f  rst detected..*/
10130 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72  .int sqlite3Corr
10140 75 70 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  uptError(int lin
10150 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
10160 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
10170 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
10180 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53  .  sqlite3_log(S
10190 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 20  QLITE_CORRUPT,. 
101a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 64 61               "da
101b0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
101c0 6e 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  n at line %d of 
101d0 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
101e0 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20          lineno, 
101f0 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  20+sqlite3_sourc
10200 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e  eid());.  return
10210 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
10220 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69  .}.int sqlite3Mi
10230 73 75 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69  suseError(int li
10240 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
10250 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
10260 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
10270 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
10280 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 0a  SQLITE_MISUSE, .
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6d                "m
102a0 69 73 75 73 65 20 61 74 20 6c 69 6e 65 20 25 64  isuse at line %d
102b0 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20   of [%.10s]",.  
102c0 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
102d0 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73  no, 20+sqlite3_s
102e0 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65  ourceid());.  re
102f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
10300 53 45 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  SE;.}.int sqlite
10310 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69  3CantopenError(i
10320 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
10330 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
10340 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
10350 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
10360 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 41 4e 54  _log(SQLITE_CANT
10370 4f 50 45 4e 2c 20 0a 20 20 20 20 20 20 20 20 20  OPEN, .         
10380 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 6f 70 65       "cannot ope
10390 6e 20 66 69 6c 65 20 61 74 20 6c 69 6e 65 20 25  n file at line %
103a0 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20  d of [%.10s]",. 
103b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e               lin
103c0 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f  eno, 20+sqlite3_
103d0 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72  sourceid());.  r
103e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
103f0 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  TOPEN;.}...#ifnd
10400 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
10410 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
10420 54 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e  This is a conven
10430 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68  ience routine th
10440 61 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  at makes sure th
10450 61 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70  at all thread-sp
10460 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66  ecific.** data f
10470 6f 72 20 74 68 69 73 20 74 68 72 65 61 64 20 68  or this thread h
10480 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61  as been dealloca
10490 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ted..**.** SQLit
104a0 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73  e no longer uses
104b0 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
104c0 20 64 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f   data so this ro
104d0 75 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a  utine is now a.*
104e0 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20  * no-op.  It is 
104f0 72 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73  retained for his
10500 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62  torical compatib
10510 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ility..*/.void s
10520 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
10530 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23  eanup(void){.}.#
10540 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
10550 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  urn meta informa
10560 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65  tion about a spe
10570 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20  cific column of 
10580 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
10590 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ..** See comment
105a0 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73   in sqlite3.h (s
105b0 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20  qlite.h.in) for 
105c0 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64  details..*/.#ifd
105d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
105e0 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
105f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62  .int sqlite3_tab
10600 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
10610 74 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ta(.  sqlite3 *d
10620 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
10630 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
10640 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
10650 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c  t char *zDbName,
10660 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
10670 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c  ase name or NULL
10680 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
10690 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20   *zTableName,   
106a0 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20    /* Table name 
106b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
106c0 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20  *zColumnName,   
106d0 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
106e0 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
106f0 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20  **pzDataType,   
10700 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c   /* OUTPUT: Decl
10710 61 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a  ared data type *
10720 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
10730 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20  *pzCollSeq,     
10740 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61  /* OUTPUT: Colla
10750 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
10760 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f  me */.  int *pNo
10770 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  tNull,          
10780 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
10790 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20  rue if NOT NULL 
107a0 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74  constraint exist
107b0 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69  s */.  int *pPri
107c0 6d 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20  maryKey,        
107d0 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
107e0 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72  ue if column par
107f0 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74  t of PK */.  int
10800 20 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20   *pAutoinc      
10810 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
10820 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
10830 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65  mn is auto-incre
10840 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
10850 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
10860 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c  rMsg = 0;.  Tabl
10870 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43  e *pTab = 0;.  C
10880 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b  olumn *pCol = 0;
10890 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20  .  int iCol;..  
108a0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74  char const *zDat
108b0 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61  aType = 0;.  cha
108c0 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65  r const *zCollSe
108d0 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74  q = 0;.  int not
108e0 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  null = 0;.  int 
108f0 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a  primarykey = 0;.
10900 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20    int autoinc = 
10910 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  0;..  /* Ensure 
10920 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
10930 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61  ema has been loa
10940 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ded */.  sqlite3
10950 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
10960 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74  >mutex);.  sqlit
10970 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
10980 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  db);.  rc = sqli
10990 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72  te3Init(db, &zEr
109a0 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c  rMsg);.  if( SQL
109b0 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
109c0 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
109d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
109e0 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  te the table in 
109f0 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54  question */.  pT
10a00 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
10a10 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65  Table(db, zTable
10a20 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  Name, zDbName);.
10a30 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70    if( !pTab || p
10a40 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
10a50 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20      pTab = 0;.  
10a60 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
10a70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64  ;.  }..  /* Find
10a80 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20   the column for 
10a90 77 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65  which info is re
10aa0 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28  quested */.  if(
10ab0 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
10ac0 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
10ad0 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
10ae0 3e 69 50 4b 65 79 3b 0a 20 20 20 20 69 66 28 20  >iPKey;.    if( 
10af0 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
10b00 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
10b10 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d  Col[iCol];.    }
10b20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
10b30 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
10b40 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
10b50 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d  +){.      pCol =
10b60 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
10b70 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  l];.      if( 0=
10b80 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
10b90 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
10ba0 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20  lumnName) ){.   
10bb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10bc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
10bd0 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43  ( iCol==pTab->nC
10be0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ol ){.      pTab
10bf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 0;.      goto
10c00 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
10c10 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
10c20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
10c30 73 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20  stores the meta 
10c40 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74  information that
10c50 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
10c60 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61  d.  ** to the ca
10c70 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61  ller in local va
10c80 72 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70  riables zDataTyp
10c90 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74  e, zCollSeq, not
10ca0 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79  null, primarykey
10cb0 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e  .  ** and autoin
10cc0 63 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  c. At this point
10cd0 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
10ce0 6f 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20  ossibilities:.  
10cf0 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20  ** .  **     1. 
10d00 54 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f  The specified co
10d10 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f  lumn name was ro
10d20 77 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22  wid", "oid" or "
10d30 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20  _rowid_" .  **  
10d40 20 20 20 20 20 20 61 6e 64 20 74 68 65 72 65 20        and there 
10d50 69 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79  is no explicitly
10d60 20 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f   declared IPK co
10d70 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  lumn. .  **.  **
10d80 20 20 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c       2. The tabl
10d90 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
10da0 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  and the column n
10db0 61 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20 61  ame identified a
10dc0 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65  n .  **        e
10dd0 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72  xplicitly declar
10de0 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20  ed column. Copy 
10df0 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
10e00 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a   from *pCol..  *
10e10 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b  / .  if( pCol ){
10e20 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d  .    zDataType =
10e30 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20   pCol->zType;.  
10e40 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f    zCollSeq = pCo
10e50 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f  l->zColl;.    no
10e60 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f  tnull = pCol->no
10e70 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72  tNull!=0;.    pr
10e80 69 6d 61 72 79 6b 65 79 20 20 3d 20 70 43 6f 6c  imarykey  = pCol
10e90 2d 3e 69 73 50 72 69 6d 4b 65 79 21 3d 30 3b 0a  ->isPrimKey!=0;.
10ea0 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54      autoinc = pT
10eb0 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20  ab->iPKey==iCol 
10ec0 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
10ed0 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
10ee0 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c  ement)!=0;.  }el
10ef0 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70  se{.    zDataTyp
10f00 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
10f10 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20     primarykey = 
10f20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43  1;.  }.  if( !zC
10f30 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43  ollSeq ){.    zC
10f40 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59  ollSeq = "BINARY
10f50 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75  ";.  }..error_ou
10f60 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t:.  sqlite3Btre
10f70 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a  eLeaveAll(db);..
10f80 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65    /* Whether the
10f90 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73   function call s
10fa0 75 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c  ucceeded or fail
10fb0 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70  ed, set the outp
10fc0 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20  ut parameters.  
10fd0 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74  ** to whatever t
10fe0 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74  heir local count
10ff0 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e  erparts contain.
11000 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64   If an error did
11010 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69   occur,.  ** thi
11020 73 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  s has the effect
11030 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20   of zeroing all 
11040 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
11050 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a  s..  */.  if( pz
11060 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61  DataType ) *pzDa
11070 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79  taType = zDataTy
11080 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c  pe;.  if( pzColl
11090 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71  Seq ) *pzCollSeq
110a0 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69   = zCollSeq;.  i
110b0 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70  f( pNotNull ) *p
110c0 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c  NotNull = notnul
110d0 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72  l;.  if( pPrimar
110e0 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79  yKey ) *pPrimary
110f0 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79  Key = primarykey
11100 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63  ;.  if( pAutoinc
11110 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61   ) *pAutoinc = a
11120 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53  utoinc;..  if( S
11130 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20  QLITE_OK==rc && 
11140 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  !pTab ){.    sql
11150 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
11160 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72  ErrMsg);.    zEr
11170 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  rMsg = sqlite3MP
11180 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75  rintf(db, "no su
11190 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a  ch table column:
111a0 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e   %s.%s", zTableN
111b0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f  ame,.        zCo
111c0 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72  lumnName);.    r
111d0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
111e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
111f0 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a 45  rror(db, rc, (zE
11200 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a  rrMsg?"%s":0), z
11210 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
11220 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
11230 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71  rMsg);.  rc = sq
11240 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
11250 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
11260 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
11270 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
11280 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
11290 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
112a0 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
112b0 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
112c0 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
112d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
112e0 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20  sleep(int ms){. 
112f0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
11300 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
11310 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
11320 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
11330 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75  ( pVfs==0 ) retu
11340 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rn 0;..  /* This
11350 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
11360 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  in milliseconds,
11370 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79   but the underly
11380 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20  ing OsSleep() . 
11390 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63   ** API uses mic
113a0 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65  roseconds. Hence
113b0 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a   the 1000's..  *
113c0 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65  /.  rc = (sqlite
113d0 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31  3OsSleep(pVfs, 1
113e0 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20  000*ms)/1000);. 
113f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11400 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
11410 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e  isable the exten
11420 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73  ded result codes
11430 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11440 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
11450 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a  _codes(sqlite3 *
11460 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a  db, int onoff){.
11470 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
11480 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
11490 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
114a0 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66  = onoff ? 0xffff
114b0 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73  ffff : 0xff;.  s
114c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
114d0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
114e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
114f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  K;.}../*.** Invo
11500 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74  ke the xFileCont
11510 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20  rol method on a 
11520 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
11530 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
11540 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
11550 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
11560 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
11570 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
11580 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  *pArg){.  int rc
11590 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
115a0 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71  .  int iDb;.  sq
115b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
115c0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
115d0 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 29  if( zDbName==0 )
115e0 7b 0a 20 20 20 20 69 44 62 20 3d 20 30 3b 0a 20  {.    iDb = 0;. 
115f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
11600 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e  iDb=0; iDb<db->n
11610 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20  Db; iDb++){.    
11620 20 20 69 66 28 20 73 74 72 63 6d 70 28 64 62 2d    if( strcmp(db-
11630 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
11640 20 7a 44 62 4e 61 6d 65 29 3d 3d 30 20 29 20 62   zDbName)==0 ) b
11650 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
11660 20 20 69 66 28 20 69 44 62 3c 64 62 2d 3e 6e 44    if( iDb<db->nD
11670 62 20 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  b ){.    Btree *
11680 70 42 74 72 65 65 20 3d 20 64 62 2d 3e 61 44 62  pBtree = db->aDb
11690 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69  [iDb].pBt;.    i
116a0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
116b0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
116c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
116d0 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 20 20  file *fd;.      
116e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
116f0 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 20  r(pBtree);.     
11700 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
11710 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 72  3BtreePager(pBtr
11720 65 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ee);.      asser
11730 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
11740 20 20 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74        fd = sqlit
11750 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
11760 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
11770 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20  t( fd!=0 );.    
11780 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45    if( op==SQLITE
11790 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e  _FCNTL_FILE_POIN
117a0 54 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  TER ){.        *
117b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29  (sqlite3_file**)
117c0 70 41 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20  pArg = fd;.     
117d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
117e0 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  K;.      }else i
117f0 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  f( fd->pMethods 
11800 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
11810 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
11820 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72  trol(fd, op, pAr
11830 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
11840 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
11850 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ave(pBtree);.   
11860 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
11870 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
11880 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
11890 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a  n rc;   .}../*.*
118a0 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74  * Interface to t
118b0 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63  he testing logic
118c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
118d0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e  _test_control(in
118e0 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e  t op, ...){.  in
118f0 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65  t rc = 0;.#ifnde
11900 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55  f SQLITE_OMIT_BU
11910 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76 61 5f  ILTIN_TEST.  va_
11920 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
11930 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
11940 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20  witch( op ){..  
11950 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65    /*.    ** Save
11960 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
11970 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a  te of the PRNG..
11980 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
11990 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
119a0 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20  PRNG_SAVE: {.   
119b0 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61     sqlite3PrngSa
119c0 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  veState();.     
119d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
119e0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73     /*.    ** Res
119f0 74 6f 72 65 20 74 68 65 20 73 74 61 74 65 20 6f  tore the state o
11a00 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68  f the PRNG to th
11a10 65 20 6c 61 73 74 20 73 74 61 74 65 20 73 61 76  e last state sav
11a20 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20  ed using.    ** 
11a30 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50  PRNG_SAVE.  If P
11a40 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76  RNG_SAVE has nev
11a50 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63  er before been c
11a60 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20  alled, then.    
11a70 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61 63 74  ** this verb act
11a80 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45  s like PRNG_RESE
11a90 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  T..    */.    ca
11aa0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
11ab0 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a  RL_PRNG_RESTORE:
11ac0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
11ad0 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65  PrngRestoreState
11ae0 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
11af0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
11b00 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20     ** Reset the 
11b10 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73  PRNG back to its
11b20 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
11b30 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20  tate.  The next 
11b40 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
11b50 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
11b60 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20  s() will reseed 
11b70 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61  the PRNG using a
11b80 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20   single call.   
11b90 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64   ** to the xRand
11ba0 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66  omness method of
11bb0 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
11bc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
11bd0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
11be0 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a  L_PRNG_RESET: {.
11bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
11c00 67 52 65 73 65 74 53 74 61 74 65 28 29 3b 0a 20  gResetState();. 
11c10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11c20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
11c30 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
11c40 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45  ontrol(BITVEC_TE
11c50 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61  ST, size, progra
11c60 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m).    **.    **
11c70 20 52 75 6e 20 61 20 74 65 73 74 20 61 67 61 69   Run a test agai
11c80 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a  nst a Bitvec obj
11c90 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68  ect of size.  Th
11ca0 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65  e program argume
11cb0 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20  nt.    ** is an 
11cc0 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72  array of integer
11cd0 73 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  s that defines t
11ce0 68 65 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e  he test.  Return
11cf0 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20   -1 on a.    ** 
11d00 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
11d10 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75  n error, 0 on su
11d20 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  ccess, or non-ze
11d30 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e  ro for an error.
11d40 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20  .    ** See the 
11d50 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
11d60 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61  ltinTest() for a
11d70 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
11d80 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
11d90 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
11da0 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45  STCTRL_BITVEC_TE
11db0 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ST: {.      int 
11dc0 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  sz = va_arg(ap, 
11dd0 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  int);.      int 
11de0 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28  *aProg = va_arg(
11df0 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20  ap, int*);.     
11e00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
11e10 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73  vecBuiltinTest(s
11e20 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20  z, aProg);.     
11e30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
11e40 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
11e50 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
11e60 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  ol(BENIGN_MALLOC
11e70 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20  _HOOKS, xBegin, 
11e80 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20  xEnd).    **.   
11e90 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f   ** Register hoo
11ea0 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e  ks to call to in
11eb0 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c  dicate which mal
11ec0 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a  loc() failures .
11ed0 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67      ** are benig
11ee0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
11ef0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
11f00 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  RL_BENIGN_MALLOC
11f10 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20  _HOOKS: {.      
11f20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76  typedef void (*v
11f30 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f  oid_function)(vo
11f40 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f  id);.      void_
11f50 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e  function xBenign
11f60 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69  Begin;.      voi
11f70 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69  d_function xBeni
11f80 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65  gnEnd;.      xBe
11f90 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61  nignBegin = va_a
11fa0 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63  rg(ap, void_func
11fb0 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65  tion);.      xBe
11fc0 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67  nignEnd = va_arg
11fd0 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69  (ap, void_functi
11fe0 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  on);.      sqlit
11ff0 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f  e3BenignMallocHo
12000 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e  oks(xBenignBegin
12010 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20  , xBenignEnd);. 
12020 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12030 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
12040 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
12050 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
12060 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
12070 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  YTE, unsigned in
12080 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
12090 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44 49  ** Set the PENDI
120a0 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20 76  NG byte to the v
120b0 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67 75  alue in the argu
120c0 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20  ment, if X>0..  
120d0 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61    ** Make no cha
120e0 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52  nges if X==0.  R
120f0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
12100 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62  of the pending b
12110 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74  yte.    ** as it
12120 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65   existing before
12130 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
12140 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a  s called..    **
12150 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e  .    ** IMPORTAN
12160 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65  T:  Changing the
12170 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72   PENDING byte fr
12180 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72 65  om 0x40000000 re
12190 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20  sults in.    ** 
121a0 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
121b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
121c0 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20  rmat.  Changing 
121d0 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
121e0 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e  .    ** while an
121f0 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  y database conne
12200 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65  ction is open re
12210 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e  sults in undefin
12220 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 69  ed and.    ** di
12230 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76 69  leterious behavi
12240 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  or..    */.    c
12250 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
12260 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45  TRL_PENDING_BYTE
12270 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 50  : {.      rc = P
12280 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66  ENDING_BYTE;.#if
12290 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
122a0 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20 20  _WSD.      {.   
122b0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e       unsigned in
122c0 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72  t newVal = va_ar
122d0 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69  g(ap, unsigned i
122e0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nt);.        if(
122f0 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65   newVal ) sqlite
12300 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e  3PendingByte = n
12310 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23  ewVal;.      }.#
12320 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
12330 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
12340 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
12350 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
12360 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
12370 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20  SERT, int X).   
12380 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
12390 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
123a0 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
123b0 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
123c0 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73  r not.    ** ass
123d0 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65  ert() was enable
123e0 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
123f0 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65  e.  If X is true
12400 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20   and assert().  
12410 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c    ** is enabled,
12420 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
12430 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20   value is true. 
12440 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e   If X is true an
12450 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28  d.    ** assert(
12460 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
12470 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
12480 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49  alue is zero.  I
12490 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61  f X is.    ** fa
124a0 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  lse and assert()
124b0 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
124c0 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20  n the assertion 
124d0 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20  fires and the.  
124e0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f    ** process abo
124f0 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66 61  rts.  If X is fa
12500 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  lse and assert()
12510 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68   is disabled, th
12520 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  en the.    ** re
12530 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
12540 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ro..    */.    c
12550 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
12560 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20  TRL_ASSERT: {.  
12570 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74      volatile int
12580 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73   x = 0;.      as
12590 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61 72  sert( (x = va_ar
125a0 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b  g(ap,int))!=0 );
125b0 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a 20  .      rc = x;. 
125c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
125d0 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  }...    /*.    *
125e0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
125f0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
12600 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20  ESTCTRL_ALWAYS, 
12610 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
12620 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e    ** This action
12630 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d   provides a run-
12640 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65  time test to see
12650 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53 20   how the ALWAYS 
12660 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52  and.    ** NEVER
12670 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65 66   macros were def
12680 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
12690 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  time..    **.   
126a0 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76   ** The return v
126b0 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28 58  alue is ALWAYS(X
126c0 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ).  .    **.    
126d0 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64  ** The recommend
126e0 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32 2e  ed test is X==2.
126f0 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
12700 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61 74  value is 2, that
12710 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c   means.    ** AL
12720 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52  WAYS() and NEVER
12730 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f  () are both no-o
12740 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d  p pass-through m
12750 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  acros, which is 
12760 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
12770 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20  lt setting.  If 
12780 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
12790 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57 41   is 1, then ALWA
127a0 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a 20  YS() is either. 
127b0 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64     ** hard-coded
127c0 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73 65   to true or else
127d0 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20 69   it asserts if i
127e0 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ts argument is f
127f0 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  alse..    ** The
12800 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72 20   first behavior 
12810 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74  (hard-coded to t
12820 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73 65  rue) is the case
12830 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
12840 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
12850 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
12860 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
12870 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  d and the second
12880 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f 72  .    ** behavior
12890 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65 20   (assert if the 
128a0 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41  argument to ALWA
128b0 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20 69  YS() is false) i
128c0 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20  s the case if.  
128d0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54    ** SQLITE_TEST
128e0 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77  CTRL_ASSERT show
128f0 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20  s that assert() 
12900 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20  is enabled..    
12910 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75  **.    ** The ru
12920 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f 63  n-time test proc
12930 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b  edure might look
12940 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20   something like 
12950 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
12960 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69 74   **    if( sqlit
12970 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
12980 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
12990 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b  ALWAYS, 2)==2 ){
129a0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
129b0 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56  ALWAYS() and NEV
129c0 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70  ER() are no-op p
129d0 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72  ass-through macr
129e0 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c  os.    **    }el
129f0 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  se if( sqlite3_t
12a00 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
12a10 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
12a20 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a  RT, 1) ){.    **
12a30 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
12a40 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74 20  x) asserts that 
12a50 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45 52  x is true. NEVER
12a60 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69 73  (x) asserts x is
12a70 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20   false..    **  
12a80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20    }else{.    ** 
12a90 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78       // ALWAYS(x
12aa0 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
12ab0 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73 20  1.  NEVER(x) is 
12ac0 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20  a constant 0..  
12ad0 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f    **    }.    */
12ae0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
12af0 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
12b00 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  : {.      int x 
12b10 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
12b20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c 57  ;.      rc = ALW
12b30 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62 72  AYS(x);.      br
12b40 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
12b50 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
12b60 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
12b70 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
12b80 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  E, sqlite3 *db, 
12b90 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
12ba0 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65    ** Set the nRe
12bb0 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20  serve size to N 
12bc0 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
12bd0 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74  abase on the dat
12be0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e  abase.    ** con
12bf0 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20  nection db..    
12c00 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
12c10 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45  TE_TESTCTRL_RESE
12c20 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RVE: {.      sql
12c30 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
12c40 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
12c50 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76  .      int x = v
12c60 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
12c70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
12c80 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
12c90 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ex);.      sqlit
12ca0 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
12cb0 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  ze(db->aDb[0].pB
12cc0 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20  t, 0, x, 0);.   
12cd0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
12ce0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
12cf0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
12d00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73      }..    /*  s
12d10 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
12d20 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
12d30 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
12d40 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  S, sqlite3 *db, 
12d50 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
12d60 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64    ** Enable or d
12d70 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f  isable various o
12d80 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72  ptimizations for
12d90 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
12da0 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20  s.  The .    ** 
12db0 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20  argument N is a 
12dc0 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d  bitmask of optim
12dd0 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64  izations to be d
12de0 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f  isabled.  For no
12df0 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72  rmal.    ** oper
12e00 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62  ation N should b
12e10 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20 69  e 0.  The idea i
12e20 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70 72  s that a test pr
12e30 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a  ogram (like the.
12e40 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63      ** SQL Logic
12e50 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73   Test or SLT tes
12e60 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75  t module) can ru
12e70 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d  n the same SQL m
12e80 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20  ultiple times.  
12e90 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75    ** with variou
12ea0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  s optimizations 
12eb0 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69  disabled to veri
12ec0 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  fy that the same
12ed0 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69   answer.    ** i
12ee0 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76  s obtained in ev
12ef0 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  ery case..    */
12f00 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
12f10 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
12f20 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20  ZATIONS: {.     
12f30 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
12f40 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
12f50 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78  3*);.      int x
12f60 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
12f70 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  );.      db->fla
12f80 67 73 20 3d 20 28 78 20 26 20 53 51 4c 49 54 45  gs = (x & SQLITE
12f90 5f 4f 70 74 4d 61 73 6b 29 20 7c 20 28 64 62 2d  _OptMask) | (db-
12fa0 3e 66 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  >flags & ~SQLITE
12fb0 5f 4f 70 74 4d 61 73 6b 29 3b 0a 20 20 20 20 20  _OptMask);.     
12fc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
12fd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b  ifdef SQLITE_N_K
12fe0 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71  EYWORD.    /* sq
12ff0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
13000 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
13010 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f  RL_ISKEYWORD, co
13020 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 29  nst char *zWord)
13030 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
13040 66 20 7a 57 6f 72 64 20 69 73 20 61 20 6b 65 79  f zWord is a key
13050 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65 64 20  word recognized 
13060 62 79 20 74 68 65 20 70 61 72 73 65 72 2c 20 74  by the parser, t
13070 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 20  hen return the. 
13080 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
13090 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 69 66  keywords.  Or if
130a0 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20 61 20   zWord is not a 
130b0 6b 65 79 77 6f 72 64 2c 20 72 65 74 75 72 6e 20  keyword, return 
130c0 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  0..    ** .    *
130d0 2a 20 54 68 69 73 20 74 65 73 74 20 66 65 61 74  * This test feat
130e0 75 72 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ure is only avai
130f0 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 61 6d 61  lable in the ama
13100 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a  lgamation since.
13110 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54      ** the SQLIT
13120 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72  E_N_KEYWORD macr
13130 6f 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  o is not defined
13140 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69 66   in this file if
13150 20 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69   SQLite.    ** i
13160 73 20 62 75 69 6c 74 20 75 73 69 6e 67 20 73 65  s built using se
13170 70 61 72 61 74 65 20 73 6f 75 72 63 65 20 66 69  parate source fi
13180 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  les..    */.    
13190 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
131a0 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20  CTRL_ISKEYWORD: 
131b0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
131c0 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61  ar *zWord = va_a
131d0 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61  rg(ap, const cha
131e0 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r*);.      int n
131f0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
13200 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20  30(zWord);.     
13210 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4b 65   rc = (sqlite3Ke
13220 79 77 6f 72 64 43 6f 64 65 28 28 75 38 2a 29 7a  ywordCode((u8*)z
13230 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29  Word, n)!=TK_ID)
13240 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57   ? SQLITE_N_KEYW
13250 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20 20 20 62  ORD : 0;.      b
13260 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
13270 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c 69  if ..    /* sqli
13280 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
13290 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
132a0 5f 50 47 48 44 52 53 5a 29 0a 20 20 20 20 2a 2a  _PGHDRSZ).    **
132b0 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  .    ** Return t
132c0 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70 63 61  he size of a pca
132d0 63 68 65 20 68 65 61 64 65 72 20 69 6e 20 62 79  che header in by
132e0 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tes..    */.    
132f0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
13300 43 54 52 4c 5f 50 47 48 44 52 53 5a 3a 20 7b 0a  CTRL_PGHDRSZ: {.
13310 20 20 20 20 20 20 72 63 20 3d 20 73 69 7a 65 6f        rc = sizeo
13320 66 28 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20  f(PgHdr);.      
13330 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
13340 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
13350 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
13360 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43  _TESTCTRL_SCRATC
13370 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e  HMALLOC, sz, &pN
13380 65 77 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20  ew, pFree);.    
13390 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73 20 70  **.    ** Pass p
133a0 46 72 65 65 20 69 6e 74 6f 20 73 71 6c 69 74 65  Free into sqlite
133b0 33 53 63 72 61 74 63 68 46 72 65 65 28 29 2e 20  3ScratchFree(). 
133c0 0a 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20  .    ** If sz>0 
133d0 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20  then allocate a 
133e0 73 63 72 61 74 63 68 20 62 75 66 66 65 72 20 69  scratch buffer i
133f0 6e 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20 20  nto pNew.  .    
13400 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
13410 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41  TE_TESTCTRL_SCRA
13420 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20  TCHMALLOC: {.   
13430 20 20 20 76 6f 69 64 20 2a 70 46 72 65 65 2c 20     void *pFree, 
13440 2a 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20 20 69  **ppNew;.      i
13450 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20  nt sz;.      sz 
13460 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
13470 29 3b 0a 20 20 20 20 20 20 70 70 4e 65 77 20 3d  );.      ppNew =
13480 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
13490 2a 2a 29 3b 0a 20 20 20 20 20 20 70 46 72 65 65  **);.      pFree
134a0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
134b0 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  id*);.      if( 
134c0 73 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20 73 71  sz ) *ppNew = sq
134d0 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c  lite3ScratchMall
134e0 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 73 71  oc(sz);.      sq
134f0 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65  lite3ScratchFree
13500 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 62  (pFree);.      b
13510 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  reak;.    }..  }
13520 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23  .  va_end(ap);.#
13530 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13540 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53  OMIT_BUILTIN_TES
13550 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  T */.  return rc
13560 3b 0a 7d 0a                                      ;.}.