/ Hex Artifact Content
Login

Artifact 79573a52c9746bdc3e7942e0127556fa39cdbae5:


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 2f 2a 0a 2a 2a 20 54 68 65 20 76 65  if../*.** The ve
0360: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62  rsion of the lib
0370: 72 61 72 79 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  rary.*/.#ifndef 
0380: 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54  SQLITE_AMALGAMAT
0390: 49 4f 4e 0a 63 6f 6e 73 74 20 63 68 61 72 20 73  ION.const char s
03a0: 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d  qlite3_version[]
03b0: 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f   = SQLITE_VERSIO
03c0: 4e 3b 0a 23 65 6e 64 69 66 0a 63 6f 6e 73 74 20  N;.#endif.const 
03d0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 6c 69  char *sqlite3_li
03e0: 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29 7b 20  bversion(void){ 
03f0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 76  return sqlite3_v
0400: 65 72 73 69 6f 6e 3b 20 7d 0a 63 6f 6e 73 74 20  ersion; }.const 
0410: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f  char *sqlite3_so
0420: 75 72 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65  urceid(void){ re
0430: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52  turn SQLITE_SOUR
0440: 43 45 5f 49 44 3b 20 7d 0a 69 6e 74 20 73 71 6c  CE_ID; }.int sql
0450: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  ite3_libversion_
0460: 6e 75 6d 62 65 72 28 76 6f 69 64 29 7b 20 72 65  number(void){ re
0470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 56 45 52 53  turn SQLITE_VERS
0480: 49 4f 4e 5f 4e 55 4d 42 45 52 3b 20 7d 0a 69 6e  ION_NUMBER; }.in
0490: 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  t sqlite3_thread
04a0: 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65 74 75  safe(void){ retu
04b0: 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  rn SQLITE_THREAD
04c0: 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20 21 64 65  SAFE; }..#if !de
04d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
04e0: 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69  T_TRACE) && defi
04f0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
0500: 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a  E_IOTRACE)./*.**
0510: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
0520: 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  g function point
0530: 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61  er is not NULL a
0540: 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45 5f  nd if.** SQLITE_
0550: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 69  ENABLE_IOTRACE i
0560: 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
0570: 6d 65 73 73 61 67 65 73 20 64 65 73 63 72 69 62  messages describ
0580: 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69 76  ing.** I/O activ
0590: 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 75 73  e are written us
05a0: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
05b0: 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61 67  n.  These messag
05c0: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 64  es.** are intend
05d0: 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
05e0: 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e 0a   activity only..
05f0: 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c 69 74 65  */.void (*sqlite
0600: 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20  3IoTrace)(const 
0610: 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b  char*, ...) = 0;
0620: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
0630: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0640: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0650: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
0660: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
0670: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
0680: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
0690: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
06a0: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
06b0: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
06c0: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
06d0: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
06e0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
06f0: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
0700: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
0710: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
0720: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
0730: 49 6e 69 74 69 61 6c 69 7a 65 20 53 51 4c 69 74  Initialize SQLit
0740: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  e.  .**.** This 
0750: 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
0760: 63 61 6c 6c 65 64 20 74 6f 20 69 6e 69 74 69 61  called to initia
0770: 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
0780: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 0a 2a 2a 20 56  allocation,.** V
0790: 46 53 2c 20 61 6e 64 20 6d 75 74 65 78 20 73 75  FS, and mutex su
07a0: 62 73 79 73 74 65 6d 73 20 70 72 69 6f 72 20 74  bsystems prior t
07b0: 6f 20 64 6f 69 6e 67 20 61 6e 79 20 73 65 72 69  o doing any seri
07c0: 6f 75 73 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a  ous work with.**
07d0: 20 53 51 4c 69 74 65 2e 20 20 42 75 74 20 61 73   SQLite.  But as
07e0: 20 6c 6f 6e 67 20 61 73 20 79 6f 75 20 64 6f 20   long as you do 
07f0: 6e 6f 74 20 63 6f 6d 70 69 6c 65 20 77 69 74 68  not compile with
0800: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0810: 4f 49 4e 49 54 0a 2a 2a 20 74 68 69 73 20 72 6f  OINIT.** this ro
0820: 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
0830: 6c 6c 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  lled automatical
0840: 6c 79 20 62 79 20 6b 65 79 20 72 6f 75 74 69 6e  ly by key routin
0850: 65 73 20 73 75 63 68 20 61 73 0a 2a 2a 20 73 71  es such as.** sq
0860: 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 20 20 0a  lite3_open().  .
0870: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
0880: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 65 78  ne is a no-op ex
0890: 63 65 70 74 20 6f 6e 20 69 74 73 20 76 65 72 79  cept on its very
08a0: 20 66 69 72 73 74 20 63 61 6c 6c 20 66 6f 72 20   first call for 
08b0: 74 68 65 20 70 72 6f 63 65 73 73 2c 0a 2a 2a 20  the process,.** 
08c0: 6f 72 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  or for the first
08d0: 20 63 61 6c 6c 20 61 66 74 65 72 20 61 20 63 61   call after a ca
08e0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 68  ll to sqlite3_sh
08f0: 75 74 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  utdown..**.** Th
0900: 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20 74  e first thread t
0910: 6f 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  o call this rout
0920: 69 6e 65 20 72 75 6e 73 20 74 68 65 20 69 6e 69  ine runs the ini
0930: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 6f 0a 2a  tialization to.*
0940: 2a 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49  * completion.  I
0950: 66 20 73 75 62 73 65 71 75 65 6e 74 20 74 68 72  f subsequent thr
0960: 65 61 64 73 20 63 61 6c 6c 20 74 68 69 73 20 72  eads call this r
0970: 6f 75 74 69 6e 65 20 62 65 66 6f 72 65 20 74 68  outine before th
0980: 65 20 66 69 72 73 74 0a 2a 2a 20 74 68 72 65 61  e first.** threa
0990: 64 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 74  d has finished t
09a0: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
09b0: 6e 20 70 72 6f 63 65 73 73 2c 20 74 68 65 6e 20  n process, then 
09c0: 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  the subsequent.*
09d0: 2a 20 74 68 72 65 61 64 73 20 6d 75 73 74 20 62  * threads must b
09e0: 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 66  lock until the f
09f0: 69 72 73 74 20 74 68 72 65 61 64 20 66 69 6e 69  irst thread fini
0a00: 73 68 65 73 20 77 69 74 68 20 74 68 65 20 69 6e  shes with the in
0a10: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 2a 2a  itialization..**
0a20: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 68  .** The first th
0a30: 72 65 61 64 20 6d 69 67 68 74 20 63 61 6c 6c 20  read might call 
0a40: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 63  this routine rec
0a50: 75 72 73 69 76 65 6c 79 2e 20 20 52 65 63 75 72  ursively.  Recur
0a60: 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f  sive.** calls to
0a70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   this routine sh
0a80: 6f 75 6c 64 20 6e 6f 74 20 62 6c 6f 63 6b 2c 20  ould not block, 
0a90: 6f 66 20 63 6f 75 72 73 65 2e 20 20 4f 74 68 65  of course.  Othe
0aa0: 72 77 69 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69  rwise the.** ini
0ab0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63  tialization proc
0ac0: 65 73 73 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  ess would never 
0ad0: 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20  complete..**.** 
0ae0: 4c 65 74 20 58 20 62 65 20 74 68 65 20 66 69 72  Let X be the fir
0af0: 73 74 20 74 68 72 65 61 64 20 74 6f 20 65 6e 74  st thread to ent
0b00: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  er this routine.
0b10: 20 20 4c 65 74 20 59 20 62 65 20 73 6f 6d 65 20    Let Y be some 
0b20: 6f 74 68 65 72 0a 2a 2a 20 74 68 72 65 61 64 2e  other.** thread.
0b30: 20 20 54 68 65 6e 20 77 68 69 6c 65 20 74 68 65    Then while the
0b40: 20 69 6e 69 74 69 61 6c 20 69 6e 76 6f 63 61 74   initial invocat
0b50: 69 6f 6e 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ion of this rout
0b60: 69 6e 65 20 62 79 20 58 20 69 73 0a 2a 2a 20 69  ine by X is.** i
0b70: 6e 63 6f 6d 70 6c 65 74 65 2c 20 69 74 20 69 73  ncomplete, it is
0b80: 20 72 65 71 75 69 72 65 64 20 74 68 61 74 3a 0a   required that:.
0b90: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 61 6c 6c  **.**    *  Call
0ba0: 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  s to this routin
0bb0: 65 20 66 72 6f 6d 20 59 20 6d 75 73 74 20 62 6c  e from Y must bl
0bc0: 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 6f 75  ock until the ou
0bd0: 74 65 72 2d 6d 6f 73 74 0a 2a 2a 20 20 20 20 20  ter-most.**     
0be0: 20 20 63 61 6c 6c 20 62 79 20 58 20 63 6f 6d 70    call by X comp
0bf0: 6c 65 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  letes..**.**    
0c00: 2a 20 20 52 65 63 75 72 73 69 76 65 20 63 61 6c  *  Recursive cal
0c10: 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ls to this routi
0c20: 6e 65 20 66 72 6f 6d 20 74 68 72 65 61 64 20 58  ne from thread X
0c30: 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
0c40: 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  ely.**       wit
0c50: 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a  hout blocking..*
0c60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e  /.int sqlite3_in
0c70: 69 74 69 61 6c 69 7a 65 28 76 6f 69 64 29 7b 0a  itialize(void){.
0c80: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
0c90: 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  *pMaster;       
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0cb0: 2a 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69  * The main stati
0cc0: 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 69 6e 74  c mutex */.  int
0cd0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
0d00: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66  ult code */..#if
0d10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0d20: 57 53 44 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  WSD.  rc = sqlit
0d30: 65 33 5f 77 73 64 5f 69 6e 69 74 28 34 30 39 36  e3_wsd_init(4096
0d40: 2c 20 32 34 29 3b 0a 20 20 69 66 28 20 72 63 21  , 24);.  if( rc!
0d50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
0d60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
0d70: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
0d80: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
0d90: 64 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 6e  dy completely in
0da0: 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20  itialized, then 
0db0: 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74  this call.  ** t
0dc0: 6f 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  o sqlite3_initia
0dd0: 6c 69 7a 65 28 29 20 73 68 6f 75 6c 64 20 62 65  lize() should be
0de0: 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 74   a no-op.  But t
0df0: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
0e00: 6e 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 63  n.  ** must be c
0e10: 6f 6d 70 6c 65 74 65 2e 20 20 53 6f 20 69 73 49  omplete.  So isI
0e20: 6e 69 74 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  nit must not be 
0e30: 73 65 74 20 75 6e 74 69 6c 20 74 68 65 20 76 65  set until the ve
0e40: 72 79 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74  ry end.  ** of t
0e50: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a  his routine..  *
0e60: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  /.  if( sqlite3G
0e70: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
0e80: 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  it ) return SQLI
0e90: 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  TE_OK;..  /* Mak
0ea0: 65 20 73 75 72 65 20 74 68 65 20 6d 75 74 65 78  e sure the mutex
0eb0: 20 73 75 62 73 79 73 74 65 6d 20 69 73 20 69 6e   subsystem is in
0ec0: 69 74 69 61 6c 69 7a 65 64 2e 20 20 49 66 20 75  itialized.  If u
0ed0: 6e 61 62 6c 65 20 74 6f 20 0a 20 20 2a 2a 20 69  nable to .  ** i
0ee0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 75  nitialize the mu
0ef0: 74 65 78 20 73 75 62 73 79 73 74 65 6d 2c 20 72  tex subsystem, r
0f00: 65 74 75 72 6e 20 65 61 72 6c 79 20 77 69 74 68  eturn early with
0f10: 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 2a 2a   the error..  **
0f20: 20 49 66 20 74 68 65 20 73 79 73 74 65 6d 20 69   If the system i
0f30: 73 20 73 6f 20 73 69 63 6b 20 74 68 61 74 20 77  s so sick that w
0f40: 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
0f50: 61 6c 6c 6f 63 61 74 65 20 61 20 6d 75 74 65 78  allocate a mutex
0f60: 2c 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  ,.  ** there is 
0f70: 6e 6f 74 20 6d 75 63 68 20 53 51 4c 69 74 65 20  not much SQLite 
0f80: 69 73 20 67 6f 69 6e 67 20 74 6f 20 62 65 20 61  is going to be a
0f90: 62 6c 65 20 74 6f 20 64 6f 2e 0a 20 20 2a 2a 0a  ble to do..  **.
0fa0: 20 20 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 73    ** The mutex s
0fb0: 75 62 73 79 73 74 65 6d 20 6d 75 73 74 20 74 61  ubsystem must ta
0fc0: 6b 65 20 63 61 72 65 20 6f 66 20 73 65 72 69 61  ke care of seria
0fd0: 6c 69 7a 69 6e 67 20 69 74 73 20 6f 77 6e 0a 20  lizing its own. 
0fe0: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69   ** initializati
0ff0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
1000: 73 71 6c 69 74 65 33 4d 75 74 65 78 49 6e 69 74  sqlite3MutexInit
1010: 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
1020: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
1030: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  Initialize the m
1040: 61 6c 6c 6f 63 28 29 20 73 79 73 74 65 6d 20 61  alloc() system a
1050: 6e 64 20 74 68 65 20 72 65 63 75 72 73 69 76 65  nd the recursive
1060: 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65   pInitMutex mute
1070: 78 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 70 65  x..  ** This ope
1080: 72 61 74 69 6f 6e 20 69 73 20 70 72 6f 74 65 63  ration is protec
1090: 74 65 64 20 62 79 20 74 68 65 20 53 54 41 54 49  ted by the STATI
10a0: 43 5f 4d 41 53 54 45 52 20 6d 75 74 65 78 2e 20  C_MASTER mutex. 
10b0: 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20   Note that.  ** 
10c0: 4d 75 74 65 78 41 6c 6c 6f 63 28 29 20 69 73 20  MutexAlloc() is 
10d0: 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 73 74 61  called for a sta
10e0: 74 69 63 20 6d 75 74 65 78 20 70 72 69 6f 72 20  tic mutex prior 
10f0: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  to initializing 
1100: 74 68 65 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20  the.  ** malloc 
1110: 73 75 62 73 79 73 74 65 6d 20 2d 20 74 68 69 73  subsystem - this
1120: 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
1130: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  e allocation of 
1140: 61 20 73 74 61 74 69 63 0a 20 20 2a 2a 20 6d 75  a static.  ** mu
1150: 74 65 78 20 6d 75 73 74 20 6e 6f 74 20 72 65 71  tex must not req
1160: 75 69 72 65 20 73 75 70 70 6f 72 74 20 66 72 6f  uire support fro
1170: 6d 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 75 62  m the malloc sub
1180: 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 70  system..  */.  p
1190: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
11a0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
11b0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
11c0: 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65  ASTER);.  sqlite
11d0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
11e0: 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  aster);.  sqlite
11f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1200: 4d 75 74 65 78 49 6e 69 74 20 3d 20 31 3b 0a 20  MutexInit = 1;. 
1210: 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f   if( !sqlite3Glo
1220: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c  balConfig.isMall
1230: 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63  ocInit ){.    rc
1240: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
1250: 49 6e 69 74 28 29 3b 0a 20 20 7d 0a 20 20 69 66  Init();.  }.  if
1260: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1270: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  ){.    sqlite3Gl
1280: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c  obalConfig.isMal
1290: 6c 6f 63 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  locInit = 1;.   
12a0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f   if( !sqlite3Glo
12b0: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
12c0: 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 73 71  utex ){.      sq
12d0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
12e0: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 0a 20  g.pInitMutex =. 
12f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1300: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
1310: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
1320: 56 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  VE);.      if( s
1330: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1340: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 26 26  ig.bCoreMutex &&
1350: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
1360: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1370: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1380: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1390: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
13c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
13d0: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b  nRefInitMutex++;
13e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
13f0: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
1400: 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63  er);..  /* If rc
1410: 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
1420: 4b 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  K at this point,
1430: 20 74 68 65 6e 20 65 69 74 68 65 72 20 74 68 65   then either the
1440: 20 6d 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62   malloc.  ** sub
1450: 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74  system could not
1460: 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
1470: 6f 72 20 74 68 65 20 73 79 73 74 65 6d 20 66 61  or the system fa
1480: 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  iled to allocate
1490: 0a 20 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d  .  ** the pInitM
14a0: 75 74 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75  utex mutex. Retu
14b0: 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65  rn an error in e
14c0: 69 74 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a  ither case.  */.
14d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
14f0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
1500: 44 6f 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  Do the rest of t
1510: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
1520: 6e 20 75 6e 64 65 72 20 74 68 65 20 72 65 63 75  n under the recu
1530: 72 73 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20  rsive mutex so. 
1540: 20 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c   ** that we will
1550: 20 62 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64   be able to hand
1560: 6c 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  le recursive cal
1570: 6c 73 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c  ls into.  ** sql
1580: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1590: 29 2e 20 20 54 68 65 20 72 65 63 75 72 73 69 76  ).  The recursiv
15a0: 65 20 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79  e calls normally
15b0: 20 63 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20   come through.  
15c0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  ** sqlite3_os_in
15d0: 69 74 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76  it() when it inv
15e0: 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73  okes sqlite3_vfs
15f0: 5f 72 65 67 69 73 74 65 72 28 29 2c 20 62 75 74  _register(), but
1600: 20 6f 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75   other.  ** recu
1610: 72 73 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68  rsive calls migh
1620: 74 20 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62  t also be possib
1630: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
1640: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
1650: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1660: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a  ig.pInitMutex);.
1670: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1680: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
1690: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 47 6c  ==0 && sqlite3Gl
16a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
16b0: 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20  gress==0 ){.    
16c0: 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70 48 61  FuncDefHash *pHa
16d0: 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46 75 6e  sh = &GLOBAL(Fun
16e0: 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69 74 65  cDefHash, sqlite
16f0: 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73  3GlobalFunctions
1700: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
1710: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1720: 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 6d  gress = 1;.    m
1730: 65 6d 73 65 74 28 70 48 61 73 68 2c 20 30 2c 20  emset(pHash, 0, 
1740: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c  sizeof(sqlite3Gl
1750: 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29 29 3b  obalFunctions));
1760: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69  .    sqlite3Regi
1770: 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e 63 74 69  sterGlobalFuncti
1780: 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73  ons();.    if( s
1790: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
17a0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d  ig.isPCacheInit=
17b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
17c0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e   sqlite3PcacheIn
17d0: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
17e0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
17f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1800: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1810: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
1820: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  t = 1;.      rc 
1830: 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28  = sqlite3OsInit(
1840: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1850: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1860: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1870: 43 61 63 68 65 42 75 66 66 65 72 53 65 74 75 70  CacheBufferSetup
1880: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1890: 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20 0a 20 20  onfig.pPage, .  
18a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
18b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
18c0: 67 65 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ge, sqlite3Globa
18d0: 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 29 3b 0a  lConfig.nPage);.
18e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
18f0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
1900: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
1910: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1920: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d  fig.inProgress =
1930: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
1940: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
1950: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1960: 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a  g.pInitMutex);..
1970: 20 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64    /* Go back und
1980: 65 72 20 74 68 65 20 73 74 61 74 69 63 20 6d 75  er the static mu
1990: 74 65 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70  tex and clean up
19a0: 20 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 20   the recursive. 
19b0: 20 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65   ** mutex to pre
19c0: 76 65 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20  vent a resource 
19d0: 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  leak..  */.  sql
19e0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
19f0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c  (pMaster);.  sql
1a00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1a10: 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d  .nRefInitMutex--
1a20: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ;.  if( sqlite3G
1a30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
1a40: 49 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a  InitMutex<=0 ){.
1a50: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1a60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1a70: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30  nRefInitMutex==0
1a80: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
1a90: 6d 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74  mutex_free(sqlit
1aa0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1ab0: 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20  InitMutex);.    
1ac0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1ad0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d  fig.pInitMutex =
1ae0: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
1af0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
1b00: 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  aster);..  /* Th
1b10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a  e following is j
1b20: 75 73 74 20 61 20 73 61 6e 69 74 79 20 63 68 65  ust a sanity che
1b30: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
1b40: 53 51 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20  SQLite has.  ** 
1b50: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f  been compiled co
1b60: 72 72 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20  rrectly.  It is 
1b70: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e  important to run
1b80: 20 74 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a   this code, but.
1b90: 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61    ** we don't wa
1ba0: 6e 74 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f  nt to run it too
1bb0: 20 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20   often and soak 
1bc0: 75 70 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f  up CPU cycles fo
1bd0: 72 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e  r no.  ** reason
1be0: 2e 20 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20  .  So we run it 
1bf0: 6f 6e 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74  once during init
1c00: 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f  ialization..  */
1c10: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1c20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c30: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1c40: 4e 54 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63  NT.  /* This sec
1c50: 74 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f  tion of code's o
1c60: 6e 6c 79 20 22 6f 75 74 70 75 74 22 20 69 73 20  nly "output" is 
1c70: 76 69 61 20 61 73 73 65 72 74 28 29 20 73 74 61  via assert() sta
1c80: 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66  tements. */.  if
1c90: 20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ( rc==SQLITE_OK
1ca0: 20 29 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20   ){.    u64 x = 
1cb0: 28 28 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31  (((u64)1)<<63)-1
1cc0: 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a  ;.    double y;.
1cd0: 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f      assert(sizeo
1ce0: 66 28 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73  f(x)==8);.    as
1cf0: 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d  sert(sizeof(x)==
1d00: 73 69 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20  sizeof(y));.    
1d10: 6d 65 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38  memcpy(&y, &x, 8
1d20: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1d30: 71 6c 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29  qlite3IsNaN(y) )
1d40: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e  ;.  }.#endif.#en
1d50: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
1d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20  ;.}../*.** Undo 
1d70: 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 73  the effects of s
1d80: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
1d90: 65 28 29 2e 20 20 4d 75 73 74 20 6e 6f 74 20 62  e().  Must not b
1da0: 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 0a 2a  e called while.*
1db0: 2a 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  * there are outs
1dc0: 74 61 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65  tanding database
1dd0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20   connections or 
1de0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1df0: 6e 73 20 6f 72 0a 2a 2a 20 77 68 69 6c 65 20 61  ns or.** while a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 53 51 4c 69 74  ny part of SQLit
1e10: 65 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 69  e is otherwise i
1e20: 6e 20 75 73 65 20 69 6e 20 61 6e 79 20 74 68 72  n use in any thr
1e30: 65 61 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ead.  This.** ro
1e40: 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 72  utine is not thr
1e50: 65 61 64 73 61 66 65 2e 20 20 42 75 74 20 69 74  eadsafe.  But it
1e60: 20 69 73 20 73 61 66 65 20 74 6f 20 69 6e 76 6f   is safe to invo
1e70: 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ke this routine.
1e80: 2a 2a 20 6f 6e 20 77 68 65 6e 20 53 51 4c 69 74  ** on when SQLit
1e90: 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 68 75  e is already shu
1ea0: 74 20 64 6f 77 6e 2e 20 20 49 66 20 53 51 4c 69  t down.  If SQLi
1eb0: 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 68  te is already sh
1ec0: 75 74 20 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20  ut down.** when 
1ed0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1ee0: 69 6e 76 6f 6b 65 64 2c 20 74 68 65 6e 20 74 68  invoked, then th
1ef0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1f00: 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a  harmless no-op..
1f10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
1f20: 68 75 74 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 20  hutdown(void){. 
1f30: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
1f40: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
1f50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f  ){.    sqlite3_o
1f60: 73 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  s_end();.    sql
1f70: 69 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f  ite3_reset_auto_
1f80: 65 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20  extension();.   
1f90: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1fa0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b  nfig.isInit = 0;
1fb0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1fc0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1fd0: 73 50 43 61 63 68 65 49 6e 69 74 20 29 7b 0a 20  sPCacheInit ){. 
1fe0: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1ff0: 53 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20  Shutdown();.    
2000: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2010: 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74  fig.isPCacheInit
2020: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
2030: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2040: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
2050: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d   ){.    sqlite3M
2060: 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20  allocEnd();.    
2070: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2080: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
2090: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
20a0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
20b0: 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20  fig.isMutexInit 
20c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 75  ){.    sqlite3Mu
20d0: 74 65 78 45 6e 64 28 29 3b 0a 20 20 20 20 73 71  texEnd();.    sq
20e0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
20f0: 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d 20  g.isMutexInit = 
2100: 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
2110: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2120: 2a 0a 2a 2a 20 54 68 69 73 20 41 50 49 20 61 6c  *.** This API al
2130: 6c 6f 77 73 20 61 70 70 6c 69 63 61 74 69 6f 6e  lows application
2140: 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  s to modify the 
2150: 67 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75 72 61  global configura
2160: 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 53  tion of.** the S
2170: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 61 74  QLite library at
2180: 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a   run-time..**.**
2190: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
21a0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
21b0: 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61  led when there a
21c0: 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
21d0: 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  g.** database co
21e0: 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d  nnections or mem
21f0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e  ory allocations.
2200: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
2210: 73 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73  s not.** threads
2220: 61 66 65 2e 20 20 46 61 69 6c 75 72 65 20 74 6f  afe.  Failure to
2230: 20 68 65 65 64 20 74 68 65 73 65 20 77 61 72 6e   heed these warn
2240: 69 6e 67 73 20 63 61 6e 20 6c 65 61 64 20 74 6f  ings can lead to
2250: 20 75 6e 70 72 65 64 69 63 74 61 62 6c 65 0a 2a   unpredictable.*
2260: 2a 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69  * behavior..*/.i
2270: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  nt sqlite3_confi
2280: 67 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a  g(int op, ...){.
2290: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
22a0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22b0: 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65  OK;..  /* sqlite
22c0: 33 5f 63 6f 6e 66 69 67 28 29 20 73 68 61 6c 6c  3_config() shall
22d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
22e0: 49 53 55 53 45 20 69 66 20 69 74 20 69 73 20 69  ISUSE if it is i
22f0: 6e 76 6f 6b 65 64 20 77 68 69 6c 65 0a 20 20 2a  nvoked while.  *
2300: 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62  * the SQLite lib
2310: 72 61 72 79 20 69 73 20 69 6e 20 75 73 65 2e 20  rary is in use. 
2320: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
2330: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2340: 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nit ) return SQL
2350: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
2360: 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ..  va_start(ap,
2370: 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20   op);.  switch( 
2380: 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4d 75  op ){..    /* Mu
2390: 74 65 78 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  tex configuratio
23a0: 6e 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 6f 6e  n options are on
23b0: 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ly available in 
23c0: 61 20 74 68 72 65 61 64 73 61 66 65 0a 20 20 20  a threadsafe.   
23d0: 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e 20 0a 20 20   ** compile. .  
23e0: 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
23f0: 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41  (SQLITE_THREADSA
2400: 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  FE) && SQLITE_TH
2410: 52 45 41 44 53 41 46 45 3e 30 0a 20 20 20 20 63  READSAFE>0.    c
2420: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
2430: 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 3a 20  G_SINGLETHREAD: 
2440: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62  {.      /* Disab
2450: 6c 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20  le all mutexing 
2460: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2470: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
2480: 72 65 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20  reMutex = 0;.   
2490: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
24a0: 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
24b0: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  x = 0;.      bre
24c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
24d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
24e0: 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a  _MULTITHREAD: {.
24f0: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
2500: 20 6d 75 74 65 78 69 6e 67 20 6f 66 20 64 61 74   mutexing of dat
2510: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2520: 73 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 6e  s */.      /* En
2530: 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66  able mutexing of
2540: 20 63 6f 72 65 20 64 61 74 61 20 73 74 72 75 63   core data struc
2550: 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 20 20 73  tures */.      s
2560: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2570: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
2580: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
2590: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
25a0: 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20  llMutex = 0;.   
25b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
25c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
25d0: 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49 5a 45  CONFIG_SERIALIZE
25e0: 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e  D: {.      /* En
25f0: 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e  able all mutexin
2600: 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  g */.      sqlit
2610: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2620: 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 0a 20  CoreMutex = 1;. 
2630: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2640: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
2650: 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  tex = 1;.      b
2660: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2670: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2680: 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20  IG_MUTEX: {.    
2690: 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20    /* Specify an 
26a0: 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 75 74 65  alternative mute
26b0: 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  x implementation
26c0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
26d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75  3GlobalConfig.mu
26e0: 74 65 78 20 3d 20 2a 76 61 5f 61 72 67 28 61 70  tex = *va_arg(ap
26f0: 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  , sqlite3_mutex_
2700: 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20  methods*);.     
2710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2720: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2730: 4e 46 49 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b  NFIG_GETMUTEX: {
2740: 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65  .      /* Retrie
2750: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  ve the current m
2760: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
2770: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61  ion */.      *va
2780: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
2790: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
27a0: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
27b0: 43 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20  Config.mutex;.  
27c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
27d0: 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20 63 61  .#endif...    ca
27e0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
27f0: 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  _MALLOC: {.     
2800: 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61   /* Specify an a
2810: 6c 74 65 72 6e 61 74 69 76 65 20 6d 61 6c 6c 6f  lternative mallo
2820: 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  c implementation
2830: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2840: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20  3GlobalConfig.m 
2850: 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71  = *va_arg(ap, sq
2860: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
2870: 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  s*);.      break
2880: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2890: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47   SQLITE_CONFIG_G
28a0: 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20  ETMALLOC: {.    
28b0: 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68    /* Retrieve th
28c0: 65 20 63 75 72 72 65 6e 74 20 6d 61 6c 6c 6f 63  e current malloc
28d0: 28 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  () implementatio
28e0: 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  n */.      if( s
28f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2900: 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20  ig.m.xMalloc==0 
2910: 29 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44  ) sqlite3MemSetD
2920: 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20  efault();.      
2930: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
2940: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a  te3_mem_methods*
2950: 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ) = sqlite3Globa
2960: 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20 20  lConfig.m;.     
2970: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2980: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2990: 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a 20  NFIG_MEMSTATUS: 
29a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c  {.      /* Enabl
29b0: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
29c0: 20 6d 61 6c 6c 6f 63 20 73 74 61 74 75 73 20 63   malloc status c
29d0: 6f 6c 6c 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  ollection */.   
29e0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
29f0: 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20  Config.bMemstat 
2a00: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
2a10: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2a20: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2a30: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52  QLITE_CONFIG_SCR
2a40: 41 54 43 48 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ATCH: {.      /*
2a50: 20 44 65 73 69 67 6e 61 74 65 20 61 20 62 75 66   Designate a buf
2a60: 66 65 72 20 66 6f 72 20 73 63 72 61 74 63 68 20  fer for scratch 
2a70: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a  memory space */.
2a80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2a90: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74  balConfig.pScrat
2aa0: 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ch = va_arg(ap, 
2ab0: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
2ac0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2ad0: 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20 76 61  g.szScratch = va
2ae0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
2af0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2b00: 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63  alConfig.nScratc
2b10: 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  h = va_arg(ap, i
2b20: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
2b30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2b40: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
2b50: 41 47 45 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  AGECACHE: {.    
2b60: 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61    /* Designate a
2b70: 20 62 75 66 66 65 72 20 66 6f 72 20 70 61 67 65   buffer for page
2b80: 20 63 61 63 68 65 20 6d 65 6d 6f 72 79 20 73 70   cache memory sp
2b90: 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ace */.      sql
2ba0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2bb0: 2e 70 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28  .pPage = va_arg(
2bc0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
2bd0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2be0: 6f 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d 20 76  onfig.szPage = v
2bf0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
2c00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2c10: 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20  balConfig.nPage 
2c20: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
2c30: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2c40: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
2c50: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43  SQLITE_CONFIG_PC
2c60: 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ACHE: {.      /*
2c70: 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65   Specify an alte
2c80: 72 6e 61 74 69 76 65 20 70 61 67 65 20 63 61 63  rnative page cac
2c90: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2ca0: 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  n */.      sqlit
2cb0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
2cc0: 63 61 63 68 65 20 3d 20 2a 76 61 5f 61 72 67 28  cache = *va_arg(
2cd0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63  ap, sqlite3_pcac
2ce0: 68 65 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20  he_methods*);.  
2cf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2d00: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
2d10: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43  E_CONFIG_GETPCAC
2d20: 48 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  HE: {.      if( 
2d30: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2d40: 66 69 67 2e 70 63 61 63 68 65 2e 78 49 6e 69 74  fig.pcache.xInit
2d50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
2d60: 71 6c 69 74 65 33 50 43 61 63 68 65 53 65 74 44  qlite3PCacheSetD
2d70: 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20  efault();.      
2d80: 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28  }.      *va_arg(
2d90: 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63  ap, sqlite3_pcac
2da0: 68 65 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73  he_methods*) = s
2db0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2dc0: 69 67 2e 70 63 61 63 68 65 3b 0a 20 20 20 20 20  ig.pcache;.     
2dd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
2de0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2df0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
2e00: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
2e10: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
2e20: 53 35 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  S5).    case SQL
2e30: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
2e40: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69   {.      /* Desi
2e50: 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20 66  gnate a buffer f
2e60: 6f 72 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 73  or heap memory s
2e70: 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  pace */.      sq
2e80: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2e90: 67 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67  g.pHeap = va_arg
2ea0: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
2eb0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2ec0: 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76  Config.nHeap = v
2ed0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
2ee0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2ef0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20  balConfig.mnReq 
2f00: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
2f10: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71  );..      if( sq
2f20: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2f30: 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20  g.pHeap==0 ){.  
2f40: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2f50: 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20  heap pointer is 
2f60: 4e 55 4c 4c 2c 20 74 68 65 6e 20 72 65 73 74 6f  NULL, then resto
2f70: 72 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 69 6d  re the malloc im
2f80: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20  plementation.   
2f90: 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20       ** back to 
2fa0: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 74 6f  NULL pointers to
2fb0: 6f 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  o.  This will ca
2fc0: 75 73 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 74  use the malloc t
2fd0: 6f 20 67 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  o go.        ** 
2fe0: 62 61 63 6b 20 74 6f 20 69 74 73 20 64 65 66 61  back to its defa
2ff0: 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ult implementati
3000: 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f  on when sqlite3_
3010: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 0a  initialize() is.
3020: 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6e 2e 0a          ** run..
3030: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
3040: 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74     memset(&sqlit
3050: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3060: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
3070: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3080: 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  m));.      }else
3090: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
30a0: 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73   heap pointer is
30b0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
30c0: 69 6e 73 74 61 6c 6c 20 6f 6e 65 20 6f 66 20 74  install one of t
30d0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65  he.        ** me
30e0: 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65 74 68  m5.c/mem3.c meth
30f0: 6f 64 73 2e 20 49 66 20 6e 65 69 74 68 65 72 20  ods. If neither 
3100: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6e  ENABLE_MEMSYS3 n
3110: 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 4e  or.        ** EN
3120: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 69 73 20  ABLE_MEMSYS5 is 
3130: 64 65 66 69 6e 65 64 2c 20 72 65 74 75 72 6e 20  defined, return 
3140: 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 20 20  an error..      
3150: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
3160: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
3170: 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  3.        sqlite
3180: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20  3GlobalConfig.m 
3190: 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74  = *sqlite3MemGet
31a0: 4d 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e 64 69  Memsys3();.#endi
31b0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
31c0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 0a 20  ENABLE_MEMSYS5. 
31d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
31e0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a  obalConfig.m = *
31f0: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d  sqlite3MemGetMem
3200: 73 79 73 35 28 29 3b 0a 23 65 6e 64 69 66 0a 20  sys5();.#endif. 
3210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
3220: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
3230: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3240: 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49  E_CONFIG_LOOKASI
3250: 44 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  DE: {.      sqli
3260: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3270: 73 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61  szLookaside = va
3280: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3290: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
32a0: 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73  alConfig.nLookas
32b0: 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ide = va_arg(ap,
32c0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
32d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20  ak;.    }.    . 
32e0: 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 61 20 70     /* Record a p
32f0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 6f  ointer to the lo
3300: 67 67 65 72 20 66 75 6e 63 63 74 69 6f 6e 20 61  gger funcction a
3310: 6e 64 20 69 74 73 20 66 69 72 73 74 20 61 72 67  nd its first arg
3320: 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ument..    ** Th
3330: 65 20 64 65 66 61 75 6c 74 20 69 73 20 4e 55 4c  e default is NUL
3340: 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69 73 20 64  L.  Logging is d
3350: 69 73 61 62 6c 65 64 20 69 66 20 74 68 65 20 66  isabled if the f
3360: 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
3370: 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 0a  is.    ** NULL..
3380: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
3390: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
33a0: 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53  G: {.      /* MS
33b0: 56 43 20 69 73 20 70 69 63 6b 79 20 61 62 6f 75  VC is picky abou
33c0: 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70  t pulling func p
33d0: 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69 73 74  trs from va list
33e0: 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74 74 70  s..      ** http
33f0: 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f  ://support.micro
3400: 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36  soft.com/kb/4796
3410: 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  1.      ** sqlit
3420: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
3430: 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Log = va_arg(ap,
3440: 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a 2c 69   void(*)(void*,i
3450: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  nt,const char*))
3460: 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ;.      */.     
3470: 20 74 79 70 65 64 65 66 20 76 6f 69 64 28 2a 4c   typedef void(*L
3480: 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c  OGFUNC_t)(void*,
3490: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  int,const char*)
34a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
34b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
34c0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 4c 4f   = va_arg(ap, LO
34d0: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
34e0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
34f0: 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d 20 76 61  fig.pLogArg = va
3500: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
3510: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3520: 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74    }..    default
3530: 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  : {.      rc = S
3540: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
3550: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3560: 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29    }.  va_end(ap)
3570: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
3580: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74  ../*.** Set up t
3590: 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66  he lookaside buf
35a0: 66 65 72 73 20 66 6f 72 20 61 20 64 61 74 61 62  fers for a datab
35b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
35c0: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
35d0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
35e0: 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64   .** If lookasid
35f0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  e is already act
3600: 69 76 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ive, return SQLI
3610: 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54  TE_BUSY..**.** T
3620: 68 65 20 73 7a 20 70 61 72 61 6d 65 74 65 72 20  he sz parameter 
3630: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
3640: 20 62 79 74 65 73 20 69 6e 20 65 61 63 68 20 6c   bytes in each l
3650: 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a  ookaside slot..*
3660: 2a 20 54 68 65 20 63 6e 74 20 70 61 72 61 6d 65  * The cnt parame
3670: 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ter is the numbe
3680: 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66 20  r of slots.  If 
3690: 70 53 74 61 72 74 20 69 73 20 4e 55 4c 4c 20 74  pStart is NULL t
36a0: 68 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72 20  he.** space for 
36b0: 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  the lookaside me
36c0: 6d 6f 72 79 20 69 73 20 6f 62 74 61 69 6e 65 64  mory is obtained
36d0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
36e0: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53  lloc()..** If pS
36f0: 74 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  tart is not NULL
3700: 20 74 68 65 6e 20 69 74 20 69 73 20 73 7a 2a 63   then it is sz*c
3710: 6e 74 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  nt bytes of memo
3720: 72 79 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a  ry to use for.**
3730: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d   the lookaside m
3740: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
3750: 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73   int setupLookas
3760: 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ide(sqlite3 *db,
3770: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
3780: 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20   sz, int cnt){. 
3790: 20 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a 20   void *pStart;. 
37a0: 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   if( db->lookasi
37b0: 64 65 2e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 72  de.nOut ){.    r
37c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
37d0: 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65  Y;.  }.  /* Free
37e0: 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6c 6f   any existing lo
37f0: 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 20 66  okaside buffer f
3800: 6f 72 20 74 68 69 73 20 68 61 6e 64 6c 65 20 62  or this handle b
3810: 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63  efore.  ** alloc
3820: 61 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20  ating a new one 
3830: 73 6f 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65  so we don't have
3840: 20 74 6f 20 68 61 76 65 20 73 70 61 63 65 20 66   to have space f
3850: 6f 72 20 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74  or .  ** both at
3860: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
3870: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c    */.  if( db->l
3880: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
3890: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
38a0: 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61  3_free(db->looka
38b0: 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20  side.pStart);.  
38c0: 7d 0a 20 20 2f 2a 20 54 68 65 20 73 69 7a 65 20  }.  /* The size 
38d0: 6f 66 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73  of a lookaside s
38e0: 6c 6f 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  lot needs to be 
38f0: 6c 61 72 67 65 72 20 74 68 61 6e 20 61 20 70 6f  larger than a po
3900: 69 6e 74 65 72 0a 20 20 2a 2a 20 74 6f 20 62 65  inter.  ** to be
3910: 20 75 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20   useful..  */.  
3920: 69 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a  if( sz<=(int)siz
3930: 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f  eof(LookasideSlo
3940: 74 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20  t*) ) sz = 0;.  
3950: 69 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20  if( cnt<0 ) cnt 
3960: 3d 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30  = 0;.  if( sz==0
3970: 20 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20   || cnt==0 ){.  
3980: 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53    sz = 0;.    pS
3990: 74 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tart = 0;.  }els
39a0: 65 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b  e if( pBuf==0 ){
39b0: 0a 20 20 20 20 73 7a 20 3d 20 52 4f 55 4e 44 38  .    sz = ROUND8
39c0: 28 73 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (sz);.    sqlite
39d0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
39e0: 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72 74  oc();.    pStart
39f0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
3a00: 28 20 73 7a 2a 63 6e 74 20 29 3b 0a 20 20 20 20  ( sz*cnt );.    
3a10: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
3a20: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 65 6c 73  Malloc();.  }els
3a30: 65 7b 0a 20 20 20 20 73 7a 20 3d 20 52 4f 55 4e  e{.    sz = ROUN
3a40: 44 44 4f 57 4e 38 28 73 7a 29 3b 0a 20 20 20 20  DDOWN8(sz);.    
3a50: 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20  pStart = pBuf;. 
3a60: 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   }.  db->lookasi
3a70: 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61  de.pStart = pSta
3a80: 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  rt;.  db->lookas
3a90: 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20  ide.pFree = 0;. 
3aa0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73   db->lookaside.s
3ab0: 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69  z = (u16)sz;.  i
3ac0: 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
3ad0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b   int i;.    Look
3ae0: 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20  asideSlot *p;.  
3af0: 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28    assert( sz > (
3b00: 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61  int)sizeof(Looka
3b10: 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20  sideSlot*) );.  
3b20: 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65    p = (Lookaside
3b30: 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20  Slot*)pStart;.  
3b40: 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69    for(i=cnt-1; i
3b50: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  >=0; i--){.     
3b60: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e   p->pNext = db->
3b70: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b  lookaside.pFree;
3b80: 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  .      db->looka
3b90: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a  side.pFree = p;.
3ba0: 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61        p = (Looka
3bb0: 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a  sideSlot*)&((u8*
3bc0: 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20  )p)[sz];.    }. 
3bd0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
3be0: 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64  .pEnd = p;.    d
3bf0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
3c00: 61 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 64  abled = 1;.    d
3c10: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
3c20: 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30  lloced = pBuf==0
3c30: 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a   ?1:0;.  }else{.
3c40: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
3c50: 65 2e 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20  e.pEnd = 0;.    
3c60: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
3c70: 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  nabled = 0;.    
3c80: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
3c90: 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d  alloced = 0;.  }
3ca0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
3cb0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
3cc0: 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20 61  turn the mutex a
3cd0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
3ce0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
3cf0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  tion..*/.sqlite3
3d00: 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f  _mutex *sqlite3_
3d10: 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65 33  db_mutex(sqlite3
3d20: 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20   *db){.  return 
3d30: 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a  db->mutex;.}../*
3d40: 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
3d50: 6e 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61  n settings for a
3d60: 6e 20 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74  n individual dat
3d70: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
3d80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
3d90: 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65  db_config(sqlite
3da0: 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e  3 *db, int op, .
3db0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
3dc0: 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76  p;.  int rc;.  v
3dd0: 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
3de0: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
3df0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3e00: 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53  _DBCONFIG_LOOKAS
3e10: 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69  IDE: {.      voi
3e20: 64 20 2a 70 42 75 66 20 3d 20 76 61 5f 61 72 67  d *pBuf = va_arg
3e30: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
3e40: 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61     int sz = va_a
3e50: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
3e60: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f     int cnt = va_
3e70: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3e80: 20 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f      rc = setupLo
3e90: 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75 66  okaside(db, pBuf
3ea0: 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20  , sz, cnt);.    
3eb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3ec0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
3ed0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3ee0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
3ef0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
3f00: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
3f10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
3f20: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
3f30: 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30  f the buffer z[0
3f40: 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20  ..n-1] contains 
3f50: 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73  all spaces..*/.s
3f60: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61  tatic int allSpa
3f70: 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ces(const char *
3f80: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69  z, int n){.  whi
3f90: 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31  le( n>0 && z[n-1
3fa0: 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d  ]==' ' ){ n--; }
3fb0: 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a  .  return n==0;.
3fc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
3fd0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
3fe0: 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
3ff0: 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77  named "BINARY" w
4000: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a  hich is always.*
4010: 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  * available..**.
4020: 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c 61  ** If the padFla
4030: 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  g argument is no
4040: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63  t NULL then spac
4050: 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68 65  e padding at the
4060: 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e   end.** of strin
4070: 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20  gs is ignored.  
4080: 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20  This implements 
4090: 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74  the RTRIM collat
40a0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
40b0: 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a  nt binCollFunc(.
40c0: 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c    void *padFlag,
40d0: 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
40e0: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
40f0: 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f  .  int nKey2, co
4100: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a  nst void *pKey2.
4110: 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a  ){.  int rc, n;.
4120: 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79    n = nKey1<nKey
4130: 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79  2 ? nKey1 : nKey
4140: 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70  2;.  rc = memcmp
4150: 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e  (pKey1, pKey2, n
4160: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
4170: 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c 61  {.    if( padFla
4180: 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61  g.     && allSpa
4190: 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79  ces(((char*)pKey
41a0: 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20  1)+n, nKey1-n). 
41b0: 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73      && allSpaces
41c0: 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29 2b  (((char*)pKey2)+
41d0: 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20  n, nKey2-n).    
41e0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61 76  ){.      /* Leav
41f0: 65 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20 61  e rc unchanged a
4200: 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  t 0 */.    }else
4210: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65  {.      rc = nKe
4220: 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20  y1 - nKey2;.    
4230: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
4240: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74  c;.}../*.** Anot
4250: 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c  her built-in col
4260: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a  lating sequence:
4270: 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20   NOCASE. .**.** 
4280: 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73  This collating s
4290: 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e  equence is inten
42a0: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66  ded to be used f
42b0: 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e  or "case indepen
42c0: 64 61 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73  dant.** comparis
42d0: 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e  on". SQLite's kn
42e0: 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72  owledge of upper
42f0: 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20   and lower case 
4300: 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65  equivalents.** e
4310: 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74  xtends only to t
4320: 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73  he 26 characters
4330: 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67   used in the Eng
4340: 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a  lish language..*
4350: 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65  *.** At the mome
4360: 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  nt there is only
4370: 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65   a UTF-8 impleme
4380: 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ntation..*/.stat
4390: 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c  ic int nocaseCol
43a0: 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f  latingFunc(.  vo
43b0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69  id *NotUsed,.  i
43c0: 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
43d0: 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69  void *pKey1,.  i
43e0: 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20  nt nKey2, const 
43f0: 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20  void *pKey2.){. 
4400: 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33   int r = sqlite3
4410: 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20  StrNICmp(.      
4420: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b  (const char *)pK
4430: 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ey1, (const char
4440: 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31   *)pKey2, (nKey1
4450: 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b  <nKey2)?nKey1:nK
4460: 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ey2);.  UNUSED_P
4470: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
4480: 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b  );.  if( 0==r ){
4490: 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e  .    r = nKey1-n
44a0: 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key2;.  }.  retu
44b0: 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn r;.}../*.** R
44c0: 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20  eturn the ROWID 
44d0: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
44e0: 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c  nt insert.*/.sql
44f0: 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65  ite_int64 sqlite
4500: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
4510: 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29  wid(sqlite3 *db)
4520: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c  {.  return db->l
4530: 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  astRowid;.}../*.
4540: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
4550: 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20  mber of changes 
4560: 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  in the most rece
4570: 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  nt call to sqlit
4580: 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e  e3_exec()..*/.in
4590: 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  t sqlite3_change
45a0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
45b0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68    return db->nCh
45c0: 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ange;.}../*.** R
45d0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
45e0: 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63   of changes sinc
45f0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  e the database h
4600: 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64  andle was opened
4610: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4620: 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73  _total_changes(s
4630: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
4640: 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c  eturn db->nTotal
4650: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
4660: 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20   Close all open 
4670: 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73  savepoints. This
4680: 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d   function only m
4690: 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64  anipulates field
46a0: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  s of the.** data
46b0: 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65  base handle obje
46c0: 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ct, it does not 
46d0: 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f  close any savepo
46e0: 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62 65  ints that may be
46f0: 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20   open.** at the 
4700: 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76  b-tree/pager lev
4710: 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  el..*/.void sqli
4720: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
4730: 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
4740: 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53  .  while( db->pS
4750: 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
4760: 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20  Savepoint *pTmp 
4770: 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  = db->pSavepoint
4780: 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70  ;.    db->pSavep
4790: 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65  oint = pTmp->pNe
47a0: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  xt;.    sqlite3D
47b0: 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b  bFree(db, pTmp);
47c0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65  .  }.  db->nSave
47d0: 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  point = 0;.  db-
47e0: 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
47f0: 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63  .  db->isTransac
4800: 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  tionSavepoint = 
4810: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  0;.}../*.** Clos
4820: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51  e an existing SQ
4830: 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f  Lite database.*/
4840: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .int sqlite3_clo
4850: 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  se(sqlite3 *db){
4860: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a  .  HashElem *i;.
4870: 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 69 66 28 20    int j;..  if( 
4880: 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
4890: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
48a0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
48b0: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
48c0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
48d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
48e0: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73  SE_BKPT;.  }.  s
48f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
4900: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a  er(db->mutex);..
4910: 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e    sqlite3ResetIn
4920: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c  ternalSchema(db,
4930: 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20   0);..  /* If a 
4940: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
4950: 70 65 6e 2c 20 74 68 65 20 52 65 73 65 74 49 6e  pen, the ResetIn
4960: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 29 20 63  ternalSchema() c
4970: 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77  all above.  ** w
4980: 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c  ill not have cal
4990: 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e  led the xDisconn
49a0: 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20  ect() method on 
49b0: 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a  any virtual.  **
49c0: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64   tables in the d
49d0: 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72  b->aVTrans[] arr
49e0: 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ay. The followin
49f0: 67 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c  g sqlite3VtabRol
4a00: 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c  lback().  ** cal
4a10: 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65  l will do so. We
4a20: 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73   need to do this
4a30: 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63   before the chec
4a40: 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a  k for active.  *
4a50: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
4a60: 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76   below, as the v
4a70: 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  -table implement
4a80: 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f  ation may be sto
4a90: 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70  ring.  ** some p
4aa0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
4ab0: 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ts internally.. 
4ac0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61   */.  sqlite3Vta
4ad0: 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a  bRollback(db);..
4ae0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
4af0: 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e  e any outstandin
4b00: 67 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 53 51  g VMs, return SQ
4b10: 4c 49 54 45 5f 42 55 53 59 2e 20 2a 2f 0a 20 20  LITE_BUSY. */.  
4b20: 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b  if( db->pVdbe ){
4b30: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
4b40: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  r(db, SQLITE_BUS
4b50: 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61  Y, .        "una
4b60: 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65  ble to close due
4b70: 20 74 6f 20 75 6e 66 69 6e 61 6c 69 73 65 64 20   to unfinalised 
4b80: 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20  statements");.  
4b90: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
4ba0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
4bb0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
4bc0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20  ITE_BUSY;.  }.  
4bd0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
4be0: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
4bf0: 4f 6b 28 64 62 29 20 29 3b 0a 0a 20 20 66 6f 72  Ok(db) );..  for
4c00: 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b  (j=0; j<db->nDb;
4c10: 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   j++){.    Btree
4c20: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
4c30: 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  j].pBt;.    if( 
4c40: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
4c50: 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42  reeIsInBackup(pB
4c60: 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
4c70: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
4c80: 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20  ITE_BUSY, .     
4c90: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
4ca0: 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66  close due to unf
4cb0: 69 6e 69 73 68 65 64 20 62 61 63 6b 75 70 20 6f  inished backup o
4cc0: 70 65 72 61 74 69 6f 6e 22 29 3b 0a 20 20 20 20  peration");.    
4cd0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
4ce0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
4cf0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
4d00: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
4d10: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  }.  }..  /* Free
4d20: 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   any outstanding
4d30: 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63   Savepoint struc
4d40: 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  tures. */.  sqli
4d50: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
4d60: 74 73 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 6a  ts(db);..  for(j
4d70: 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a  =0; j<db->nDb; j
4d80: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
4d90: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
4da0: 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[j];.    if( p
4db0: 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  Db->pBt ){.     
4dc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
4dd0: 73 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20  se(pDb->pBt);.  
4de0: 20 20 20 20 70 44 62 2d 3e 70 42 74 20 3d 20 30      pDb->pBt = 0
4df0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 31  ;.      if( j!=1
4e00: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
4e10: 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20  >pSchema = 0;.  
4e20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4e30: 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e    sqlite3ResetIn
4e40: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c  ternalSchema(db,
4e50: 20 30 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20   0);..  /* Tell 
4e60: 74 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69  the code in noti
4e70: 66 79 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f  fy.c that the co
4e80: 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67  nnection no long
4e90: 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a  er holds any.  *
4ea0: 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73  * locks and does
4eb0: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79   not require any
4ec0: 20 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d   further unlock-
4ed0: 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
4ee0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
4ef0: 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64  ConnectionClosed
4f00: 28 64 62 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  (db);..  assert(
4f10: 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20   db->nDb<=2 );. 
4f20: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
4f30: 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  ==db->aDbStatic 
4f40: 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  );.  for(j=0; j<
4f50: 41 72 72 61 79 53 69 7a 65 28 64 62 2d 3e 61 46  ArraySize(db->aF
4f60: 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20  unc.a); j++){.  
4f70: 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74    FuncDef *pNext
4f80: 2c 20 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20  , *pHash, *p;.  
4f90: 20 20 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e    for(p=db->aFun
4fa0: 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61  c.a[j]; p; p=pHa
4fb0: 73 68 29 7b 0a 20 20 20 20 20 20 70 48 61 73 68  sh){.      pHash
4fc0: 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20   = p->pHash;.   
4fd0: 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20     while( p ){. 
4fe0: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
4ff0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
5000: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5010: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70  b, p);.        p
5020: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20   = pNext;.      
5030: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  }.    }.  }.  fo
5040: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
5050: 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  rst(&db->aCollSe
5060: 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  q); i; i=sqliteH
5070: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
5080: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
5090: 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c  = (CollSeq *)sql
50a0: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
50b0: 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e      /* Invoke an
50c0: 79 20 64 65 73 74 72 75 63 74 6f 72 73 20 72 65  y destructors re
50d0: 67 69 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c  gistered for col
50e0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
50f0: 75 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20  user data. */.  
5100: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
5110: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
5120: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b  pColl[j].xDel ){
5130: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a  .        pColl[j
5140: 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e  ].xDel(pColl[j].
5150: 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pUser);.      }.
5160: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
5170: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
5180: 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  l);.  }.  sqlite
5190: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
51a0: 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64  aCollSeq);.#ifnd
51b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
51c0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f  IRTUALTABLE.  fo
51d0: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
51e0: 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  rst(&db->aModule
51f0: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
5200: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
5210: 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28  Module *pMod = (
5220: 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48  Module *)sqliteH
5230: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
5240: 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72  if( pMod->xDestr
5250: 6f 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64  oy ){.      pMod
5260: 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d  ->xDestroy(pMod-
5270: 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20  >pAux);.    }.  
5280: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5290: 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20  db, pMod);.  }. 
52a0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
52b0: 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  r(&db->aModule);
52c0: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
52d0: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
52e0: 54 45 5f 4f 4b 2c 20 30 29 3b 20 2f 2a 20 44 65  TE_OK, 0); /* De
52f0: 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61  allocates any ca
5300: 63 68 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e  ched error strin
5310: 67 73 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  gs. */.  if( db-
5320: 3e 70 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >pErr ){.    sql
5330: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62  ite3ValueFree(db
5340: 2d 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73  ->pErr);.  }.  s
5350: 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e  qlite3CloseExten
5360: 73 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64 62  sions(db);..  db
5370: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
5380: 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20  _MAGIC_ERROR;.. 
5390: 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74   /* The temp-dat
53a0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20  abase schema is 
53b0: 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72  allocated differ
53c0: 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f  ently from the o
53d0: 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a  ther schema.  **
53e0: 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20   objects (using 
53f0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64  sqliteMalloc() d
5400: 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
5410: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
5420: 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20  Schema())..  ** 
5430: 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  So it needs to b
5440: 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f  e freed here. To
5450: 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c  do: Why not roll
5460: 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61   the temp schema
5470: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73   into.  ** the s
5480: 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ame sqliteMalloc
5490: 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68  () as the one th
54a0: 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  at allocates the
54b0: 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20   database .  ** 
54c0: 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a  structure?.  */.
54d0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
54e0: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  db, db->aDb[1].p
54f0: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
5500: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
5510: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
5520: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
5530: 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
5540: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
5550: 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ee(db->mutex);. 
5560: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f   assert( db->loo
5570: 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29  kaside.nOut==0 )
5580: 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61  ;  /* Fails on a
5590: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
55a0: 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20  y leak */.  if( 
55b0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
55c0: 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73  alloced ){.    s
55d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
55e0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
55f0: 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
5600: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 52  LITE_ENABLE_SQLR
5610: 52 0a 20 20 53 52 52 65 63 43 6c 6f 73 65 28 64  R.  SRRecClose(d
5620: 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20  b);.#endif.  .  
5630: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29  sqlite3_free(db)
5640: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
5650: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
5660: 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61  ollback all data
5670: 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76  base files..*/.v
5680: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
5690: 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  ackAll(sqlite3 *
56a0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db){.  int i;.  
56b0: 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b  int inTrans = 0;
56c0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
56d0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
56e0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
56f0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
5700: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28  Malloc();.  for(
5710: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
5720: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62  i++){.    if( db
5730: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 20 29 7b 0a  ->aDb[i].pBt ){.
5740: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5750: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
5760: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20  db->aDb[i].pBt) 
5770: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61  ){.        inTra
5780: 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ns = 1;.      }.
5790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
57a0: 65 65 52 6f 6c 6c 62 61 63 6b 28 64 62 2d 3e 61  eeRollback(db->a
57b0: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
57c0: 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54    db->aDb[i].inT
57d0: 72 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  rans = 0;.    }.
57e0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61    }.  sqlite3Vta
57f0: 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20  bRollback(db);. 
5800: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
5810: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66  nMalloc();..  if
5820: 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ( db->flags&SQLI
5830: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
5840: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5850: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
5860: 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
5870: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
5880: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
5890: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e  0);.  }..  /* An
58a0: 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  y deferred const
58b0: 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73  raint violations
58c0: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
58d0: 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62  esolved. */.  db
58e0: 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
58f0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  = 0;..  /* If on
5900: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69  e has been confi
5910: 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68  gured, invoke th
5920: 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20  e rollback-hook 
5930: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66  callback */.  if
5940: 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43  ( db->xRollbackC
5950: 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72  allback && (inTr
5960: 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f  ans || !db->auto
5970: 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64  Commit) ){.    d
5980: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
5990: 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61  back(db->pRollba
59a0: 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ckArg);.  }.}../
59b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
59c0: 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61 74  atic string that
59d0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b   describes the k
59e0: 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65  ind of error spe
59f0: 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  cified in the.**
5a00: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f   argument..*/.co
5a10: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
5a20: 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b  3ErrStr(int rc){
5a30: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
5a40: 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67  char* const aMsg
5a50: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51  [] = {.    /* SQ
5a60: 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20  LITE_OK         
5a70: 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f   */ "not an erro
5a80: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
5a90: 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a 2f  E_ERROR       */
5aa0: 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f   "SQL logic erro
5ab0: 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74  r or missing dat
5ac0: 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53  abase",.    /* S
5ad0: 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20  QLITE_INTERNAL  
5ae0: 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53    */ 0,.    /* S
5af0: 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20 20 20  QLITE_PERM      
5b00: 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70 65 72    */ "access per
5b10: 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c  mission denied",
5b20: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41  .    /* SQLITE_A
5b30: 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20 22 63  BORT       */ "c
5b40: 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73 74 65  allback requeste
5b50: 64 20 71 75 65 72 79 20 61 62 6f 72 74 22 2c 0a  d query abort",.
5b60: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55      /* SQLITE_BU
5b70: 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61  SY        */ "da
5b80: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
5b90: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
5ba0: 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a 2f 20  _LOCKED      */ 
5bb0: 22 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20  "database table 
5bc0: 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20  is locked",.    
5bd0: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  /* SQLITE_NOMEM 
5be0: 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66        */ "out of
5bf0: 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a   memory",.    /*
5c00: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
5c10: 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70 74 20      */ "attempt 
5c20: 74 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f  to write a reado
5c30: 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20  nly database",. 
5c40: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54     /* SQLITE_INT
5c50: 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69 6e 74  ERRUPT   */ "int
5c60: 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20 20 2f  errupted",.    /
5c70: 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 20  * SQLITE_IOERR  
5c80: 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f       */ "disk I/
5c90: 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  O error",.    /*
5ca0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
5cb0: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
5cc0: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
5cd0: 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f  alformed",.    /
5ce0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  * SQLITE_NOTFOUN
5cf0: 44 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f  D    */ 0,.    /
5d00: 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20  * SQLITE_FULL   
5d10: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
5d20: 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c  e or disk is ful
5d30: 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  l",.    /* SQLIT
5d40: 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f  E_CANTOPEN    */
5d50: 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
5d60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c   database file",
5d70: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50  .    /* SQLITE_P
5d80: 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c  ROTOCOL    */ "l
5d90: 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22  ocking protocol"
5da0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
5db0: 45 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20 22  EMPTY       */ "
5dc0: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e  table contains n
5dd0: 6f 20 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20  o data",.    /* 
5de0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20  SQLITE_SCHEMA   
5df0: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
5e00: 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67  schema has chang
5e10: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
5e20: 54 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a  TE_TOOBIG      *
5e30: 2f 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f  / "string or blo
5e40: 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20  b too big",.    
5e50: 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  /* SQLITE_CONSTR
5e60: 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72  AINT  */ "constr
5e70: 61 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20  aint failed",.  
5e80: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d    /* SQLITE_MISM
5e90: 41 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61  ATCH    */ "data
5ea0: 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a  type mismatch",.
5eb0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49      /* SQLITE_MI
5ec0: 53 55 53 45 20 20 20 20 20 20 2a 2f 20 22 6c 69  SUSE      */ "li
5ed0: 62 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61  brary routine ca
5ee0: 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75  lled out of sequ
5ef0: 65 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  ence",.    /* SQ
5f00: 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20  LITE_NOLFS      
5f10: 20 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c 65 20   */ "large file 
5f20: 73 75 70 70 6f 72 74 20 69 73 20 64 69 73 61 62  support is disab
5f30: 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  led",.    /* SQL
5f40: 49 54 45 5f 41 55 54 48 20 20 20 20 20 20 20 20  ITE_AUTH        
5f50: 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f  */ "authorizatio
5f60: 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f  n denied",.    /
5f70: 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20  * SQLITE_FORMAT 
5f80: 20 20 20 20 20 2a 2f 20 22 61 75 78 69 6c 69 61       */ "auxilia
5f90: 72 79 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d  ry database form
5fa0: 61 74 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f  at error",.    /
5fb0: 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20  * SQLITE_RANGE  
5fc0: 20 20 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72       */ "bind or
5fd0: 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75   column index ou
5fe0: 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20  t of range",.   
5ff0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44   /* SQLITE_NOTAD
6000: 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20  B      */ "file 
6010: 69 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72 20  is encrypted or 
6020: 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73  is not a databas
6030: 65 22 2c 0a 20 20 7d 3b 0a 20 20 72 63 20 26 3d  e",.  };.  rc &=
6040: 20 30 78 66 66 3b 0a 20 20 69 66 28 20 41 4c 57   0xff;.  if( ALW
6050: 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63  AYS(rc>=0) && rc
6060: 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 61 4d  <(int)(sizeof(aM
6070: 73 67 29 2f 73 69 7a 65 6f 66 28 61 4d 73 67 5b  sg)/sizeof(aMsg[
6080: 30 5d 29 29 20 26 26 20 61 4d 73 67 5b 72 63 5d  0])) && aMsg[rc]
6090: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
60a0: 6e 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 7d 65  n aMsg[rc];.  }e
60b0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
60c0: 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b  "unknown error";
60d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
60e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  is routine imple
60f0: 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61 6c  ments a busy cal
6100: 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65 70  lback that sleep
6110: 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61  s and tries.** a
6120: 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d  gain until a tim
6130: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72 65  eout value is re
6140: 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d 65  ached.  The time
6150: 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  out value is.** 
6160: 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
6170: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
6180: 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 74  s passed in as t
6190: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
61a0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
61b0: 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75 6c  int sqliteDefaul
61c0: 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20  tBusyCallback(. 
61d0: 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20 20  void *ptr,      
61e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
61f0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
6200: 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20 20  */. int count   
6210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6220: 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  Number of times 
6230: 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62  table has been b
6240: 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51  usy */.){.#if SQ
6250: 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 28  LITE_OS_WIN || (
6260: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
6270: 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
6280: 45 45 50 29 0a 20 20 73 74 61 74 69 63 20 63 6f  EEP).  static co
6290: 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20  nst u8 delays[] 
62a0: 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35  =.     { 1, 2, 5
62b0: 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35  , 10, 15, 20, 25
62c0: 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20  , 25,  25,  50, 
62d0: 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74   50, 100 };.  st
62e0: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f  atic const u8 to
62f0: 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20  tals[] =.     { 
6300: 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c  0, 1, 3,  8, 18,
6310: 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33   33, 53, 78, 103
6320: 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20  , 128, 178, 228 
6330: 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c  };.# define NDEL
6340: 41 59 20 28 73 69 7a 65 6f 66 28 64 65 6c 61 79  AY (sizeof(delay
6350: 73 29 2f 73 69 7a 65 6f 66 28 64 65 6c 61 79 73  s)/sizeof(delays
6360: 5b 30 5d 29 29 0a 20 20 73 71 6c 69 74 65 33 20  [0])).  sqlite3 
6370: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
6380: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
6390: 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69  out = db->busyTi
63a0: 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c  meout;.  int del
63b0: 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73  ay, prior;..  as
63c0: 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29  sert( count>=0 )
63d0: 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20  ;.  if( count < 
63e0: 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65  NDELAY ){.    de
63f0: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75  lay = delays[cou
6400: 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  nt];.    prior =
6410: 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a   totals[count];.
6420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c    }else{.    del
6430: 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c  ay = delays[NDEL
6440: 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72  AY-1];.    prior
6450: 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59   = totals[NDELAY
6460: 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75  -1] + delay*(cou
6470: 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a  nt-(NDELAY-1));.
6480: 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20    }.  if( prior 
6490: 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75  + delay > timeou
64a0: 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  t ){.    delay =
64b0: 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72   timeout - prior
64c0: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c  ;.    if( delay<
64d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
64e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
64f0: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65  eep(db->pVfs, de
6500: 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  lay*1000);.  ret
6510: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73  urn 1;.#else.  s
6520: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
6530: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
6540: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73  nt timeout = ((s
6550: 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62  qlite3 *)ptr)->b
6560: 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66  usyTimeout;.  if
6570: 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30  ( (count+1)*1000
6580: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
6590: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
65a0: 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70    sqlite3OsSleep
65b0: 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30  (db->pVfs, 10000
65c0: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
65d0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
65e0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
65f0: 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a  n busy handler..
6600: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6610: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
6620: 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66  n an operation f
6630: 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63  ailed with a loc
6640: 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  k..** If this ro
6650: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f  utine returns no
6660: 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
6670: 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66   is retried.  If
6680: 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30   it.** returns 0
6690: 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  , the operation 
66a0: 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53  aborts with an S
66b0: 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
66c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
66d0: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
66e0: 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  r(BusyHandler *p
66f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
6700: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c  f( NEVER(p==0) |
6710: 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c  | p->xFunc==0 ||
6720: 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65   p->nBusy<0 ) re
6730: 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70  turn 0;.  rc = p
6740: 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c  ->xFunc(p->pArg,
6750: 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66   p->nBusy);.  if
6760: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc==0 ){.    p
6770: 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20  ->nBusy = -1;.  
6780: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42  }else{.    p->nB
6790: 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  usy++;.  }.  ret
67a0: 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  urn rc; .}../*.*
67b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
67c0: 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c  ets the busy cal
67d0: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
67e0: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
67f0: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
6800: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
6810: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
6820: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
6830: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
6840: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
6850: 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  db,.  int (*xBus
6860: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20  y)(void*,int),. 
6870: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
6880: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
6890: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
68a0: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
68b0: 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79  er.xFunc = xBusy
68c0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
68d0: 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b  ler.pArg = pArg;
68e0: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
68f0: 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
6900: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
6910: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
6920: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6930: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
6940: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
6950: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
6960: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6970: 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73  sets the progres
6980: 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  s callback for a
6990: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
69a0: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
69b0: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
69c0: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
69d0: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  en argument. The
69e0: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
69f0: 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e  ck will.** be in
6a00: 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73  voked every nOps
6a10: 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69   opcodes..*/.voi
6a20: 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65  d sqlite3_progre
6a30: 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  ss_handler(.  sq
6a40: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
6a50: 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a  t nOps,.  int (*
6a60: 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a  xProgress)(void*
6a70: 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ), .  void *pArg
6a80: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
6a90: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
6aa0: 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73  tex);.  if( nOps
6ab0: 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50  >0 ){.    db->xP
6ac0: 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72  rogress = xProgr
6ad0: 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  ess;.    db->nPr
6ae0: 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f 70 73  ogressOps = nOps
6af0: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
6b00: 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  essArg = pArg;. 
6b10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
6b20: 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  xProgress = 0;. 
6b30: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
6b40: 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  Ops = 0;.    db-
6b50: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
6b60: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
6b70: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
6b80: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
6b90: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
6ba0: 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20  outine installs 
6bb0: 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68  a default busy h
6bc0: 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74  andler that wait
6bd0: 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65  s for the.** spe
6be0: 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66  cified number of
6bf0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65   milliseconds be
6c00: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30  fore returning 0
6c10: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6c20: 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71  _busy_timeout(sq
6c30: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d  lite3 *db, int m
6c40: 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20 29  s){.  if( ms>0 )
6c50: 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69  {.    db->busyTi
6c60: 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 20 20  meout = ms;.    
6c70: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
6c80: 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44  dler(db, sqliteD
6c90: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
6ca0: 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a  ck, (void*)db);.
6cb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
6cc0: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
6cd0: 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  r(db, 0, 0);.  }
6ce0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6cf0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  _OK;.}../*.** Ca
6d00: 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20  use any pending 
6d10: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f  operation to sto
6d20: 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73  p at its earlies
6d30: 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a  t opportunity..*
6d40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69  /.void sqlite3_i
6d50: 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33  nterrupt(sqlite3
6d60: 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31 2e   *db){.  db->u1.
6d70: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20  isInterrupted = 
6d80: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  1;.}.../*.** Thi
6d90: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78  s function is ex
6da0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61  actly the same a
6db0: 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  s sqlite3_create
6dc0: 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63  _function(), exc
6dd0: 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ept.** that it i
6de0: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65  s designed to be
6df0: 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72   called by inter
6e00: 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69  nal code. The di
6e10: 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74  fference is.** t
6e20: 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  hat if a malloc(
6e30: 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74  ) fails in sqlit
6e40: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
6e50: 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63  on(), an error c
6e60: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ode.** is return
6e70: 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f  ed and the mallo
6e80: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65  cFailed flag cle
6e90: 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  ared. .*/.int sq
6ea0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
6eb0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
6ec0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
6ed0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69  unctionName,.  i
6ee0: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
6ef0: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65  nc,.  void *pUse
6f00: 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a  rData,.  void (*
6f10: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
6f20: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
6f30: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
6f40: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
6f50: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
6f60: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
6f70: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
6f80: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
6f90: 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 46  context*).){.  F
6fa0: 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74  uncDef *p;.  int
6fb0: 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65 72   nName;..  asser
6fc0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6fd0: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
6fe0: 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74   );.  if( zFunct
6ff0: 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20  ionName==0 ||.  
7000: 20 20 20 20 28 78 46 75 6e 63 20 26 26 20 28 78      (xFunc && (x
7010: 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29 29  Final || xStep))
7020: 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46 75   || .      (!xFu
7030: 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26 26  nc && (xFinal &&
7040: 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20   !xStep)) ||.   
7050: 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 21     (!xFunc && (!
7060: 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70 29  xFinal && xStep)
7070: 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72 67  ) ||.      (nArg
7080: 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49  <-1 || nArg>SQLI
7090: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
70a0: 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28 32  ARG) ||.      (2
70b0: 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  55<(nName = sqli
70c0: 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46 75  te3Strlen30( zFu
70d0: 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b  nctionName))) ){
70e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
70f0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
7100: 20 20 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20 53    }.  .#ifndef S
7110: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
7120: 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  /* If SQLITE_
7130: 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69  UTF16 is specifi
7140: 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  ed as the encodi
7150: 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f  ng type, transfo
7160: 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20  rm this.  ** to 
7170: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54  one of SQLITE_UT
7180: 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f  F16LE or SQLITE_
7190: 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68  UTF16BE using th
71a0: 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54  e.  ** SQLITE_UT
71b0: 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e  F16NATIVE macro.
71c0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
71d0: 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
71e0: 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ally..  **.  ** 
71f0: 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73  If SQLITE_ANY is
7200: 20 73 70 65 63 69 66 69 65 64 2c 20 61 64 64 20   specified, add 
7210: 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f  three versions o
7220: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20  f the function. 
7230: 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20   ** to the hash 
7240: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
7250: 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ( enc==SQLITE_UT
7260: 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d  F16 ){.    enc =
7270: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
7280: 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  IVE;.  }else if(
7290: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59   enc==SQLITE_ANY
72a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
72b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
72c0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
72d0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41  FunctionName, nA
72e0: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
72f0: 0a 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44  .         pUserD
7300: 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  ata, xFunc, xSte
7310: 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 20 20  p, xFinal);.    
7320: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7330: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
7340: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
7350: 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  c(db, zFunctionN
7360: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
7370: 45 5f 55 54 46 31 36 4c 45 2c 0a 20 20 20 20 20  E_UTF16LE,.     
7380: 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c 20       pUserData, 
7390: 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  xFunc, xStep, xF
73a0: 69 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  inal);.    }.   
73b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
73c0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
73d0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
73e0: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
73f0: 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65  F16BE;.  }.#else
7400: 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  .  enc = SQLITE_
7410: 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a  UTF8;.#endif.  .
7420: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e    /* Check if an
7430: 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69   existing functi
7440: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72  on is being over
7450: 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65  ridden or delete
7460: 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61  d. If so,.  ** a
7470: 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74  nd there are act
7480: 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65  ive VMs, then re
7490: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
74a0: 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a  . If a function.
74b0: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76    ** is being ov
74c0: 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64  erridden/deleted
74d0: 20 62 75 74 20 74 68 65 72 65 20 61 72 65 20 6e   but there are n
74e0: 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c  o active VMs, al
74f0: 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  low the.  ** ope
7500: 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e  ration to contin
7510: 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74  ue but invalidat
7520: 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65  e all precompile
7530: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
7540: 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
7550: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
7560: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
7570: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38  nName, nArg, (u8
7580: 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  )enc, 0);.  if( 
7590: 70 20 26 26 20 70 2d 3e 69 50 72 65 66 45 6e 63  p && p->iPrefEnc
75a0: 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67  ==enc && p->nArg
75b0: 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66  ==nArg ){.    if
75c0: 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ( db->activeVdbe
75d0: 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Cnt ){.      sql
75e0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
75f0: 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
7600: 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64      "unable to d
7610: 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65  elete/modify use
7620: 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74  r-function due t
7630: 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
7640: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73  nts");.      ass
7650: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
7660: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
7670: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
7680: 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SY;.    }else{. 
7690: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69       sqlite3Expi
76a0: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
76b0: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a  ents(db);.    }.
76c0: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
76d0: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
76e0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
76f0: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  , nName, nArg, (
7700: 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73  u8)enc, 1);.  as
7710: 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61  sert(p || db->ma
7720: 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69  llocFailed);.  i
7730: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
7740: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
7750: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 66 6c 61 67 73  ;.  }.  p->flags
7760: 20 3d 20 30 3b 0a 20 20 70 2d 3e 78 46 75 6e 63   = 0;.  p->xFunc
7770: 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78   = xFunc;.  p->x
7780: 53 74 65 70 20 3d 20 78 53 74 65 70 3b 0a 20 20  Step = xStep;.  
7790: 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78  p->xFinalize = x
77a0: 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65  Final;.  p->pUse
77b0: 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61 74  rData = pUserDat
77c0: 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28  a;.  p->nArg = (
77d0: 75 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75  u16)nArg;.  retu
77e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
77f0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65  ./*.** Create ne
7800: 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73  w user functions
7810: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7820: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7830: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
7840: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7850: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
7860: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
7870: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  enc,.  void *p,.
7880: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
7890: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
78a0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
78b0: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
78c0: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
78d0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
78e0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
78f0: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
7900: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7910: 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
7920: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7930: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
7940: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7950: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
7960: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41  FunctionName, nA
7970: 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e  rg, enc, p, xFun
7980: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
7990: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
79a0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
79b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
79c0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
79d0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
79e0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
79f0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e  TE_OMIT_UTF16.in
7a00: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
7a10: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73  _function16(.  s
7a20: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
7a30: 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74  nst void *zFunct
7a40: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
7a50: 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74  Arg,.  int eText
7a60: 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  Rep,.  void *p,.
7a70: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
7a80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
7a90: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
7aa0: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ue**),.  void (*
7ab0: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
7ac0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
7ad0: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
7ae0: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
7af0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
7b00: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
7b10: 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20  char *zFunc8;.  
7b20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
7b30: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
7b40: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
7b50: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
7b60: 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65   zFunc8 = sqlite
7b70: 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46  3Utf16to8(db, zF
7b80: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c  unctionName, -1,
7b90: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
7ba0: 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  IVE);.  rc = sql
7bb0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
7bc0: 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c  b, zFunc8, nArg,
7bd0: 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46   eTextRep, p, xF
7be0: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
7bf0: 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  al);.  sqlite3Db
7c00: 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29  Free(db, zFunc8)
7c10: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7c20: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
7c30: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
7c40: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
7c50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
7c60: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
7c70: 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
7c80: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
7c90: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
7ca0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
7cb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
7cc0: 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
7cd0: 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
7ce0: 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
7cf0: 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
7d00: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
7d10: 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
7d20: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
7d30: 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
7d40: 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
7d50: 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
7d60: 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
7d70: 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
7d80: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
7d90: 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
7da0: 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
7db0: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
7dc0: 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
7dd0: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
7de0: 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
7df0: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
7e00: 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
7e10: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
7e20: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
7e30: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
7e40: 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
7e50: 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
7e60: 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
7e70: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
7e80: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
7e90: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
7ea0: 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
7eb0: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
7ec0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
7ed0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
7ee0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
7ef0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
7f00: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  ( sqlite3FindFun
7f10: 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ction(db, zName,
7f20: 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51   nName, nArg, SQ
7f30: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30  LITE_UTF8, 0)==0
7f40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
7f50: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e  reateFunc(db, zN
7f60: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
7f70: 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20  E_UTF8,.        
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
7f90: 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46   sqlite3InvalidF
7fa0: 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a  unction, 0, 0);.
7fb0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
7fc0: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 53 51  e3ApiExit(db, SQ
7fd0: 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69  LITE_OK);.  sqli
7fe0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
7ff0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
8000: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
8010: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8020: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69  TRACE./*.** Regi
8030: 73 74 65 72 20 61 20 74 72 61 63 65 20 66 75 6e  ster a trace fun
8040: 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67  ction.  The pArg
8050: 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
8060: 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  usly registered 
8070: 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65 74 75  trace.** is retu
8080: 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20  rned.  .**.** A 
8090: 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e 63 74  NULL trace funct
80a0: 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ion means that n
80b0: 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65 78 65  o tracing is exe
80c0: 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55  cutes.  A non-NU
80d0: 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73 20 61  LL.** trace is a
80e0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
80f0: 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69  nction that is i
8100: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 73 74  nvoked at the st
8110: 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53  art of each.** S
8120: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  QL statement..*/
8130: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 74  .void *sqlite3_t
8140: 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a 64 62  race(sqlite3 *db
8150: 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63 65 29  , void (*xTrace)
8160: 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
8170: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
8180: 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
8190: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
81a0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
81b0: 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
81c0: 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e  TraceArg;.  db->
81d0: 78 54 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b  xTrace = xTrace;
81e0: 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67  .  db->pTraceArg
81f0: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
8200: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
8210: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
8220: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a  urn pOld;.}./*.*
8230: 2a 20 52 65 67 69 73 74 65 72 20 61 20 70 72 6f  * Register a pro
8240: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20  file function.  
8250: 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68  The pArg from th
8260: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
8270: 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66  istered .** prof
8280: 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ile function is 
8290: 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
82a0: 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65  * A NULL profile
82b0: 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20   function means 
82c0: 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e  that no profilin
82d0: 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20  g is executes.  
82e0: 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72  A non-NULL.** pr
82f0: 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74  ofile is a point
8300: 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
8310: 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64   that is invoked
8320: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
8330: 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51  on of.** each SQ
8340: 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  L statement that
8350: 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64   is run..*/.void
8360: 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c   *sqlite3_profil
8370: 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
8380: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66  ,.  void (*xProf
8390: 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ile)(void*,const
83a0: 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69   char*,sqlite_ui
83b0: 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70  nt64),.  void *p
83c0: 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70  Arg.){.  void *p
83d0: 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Old;.  sqlite3_m
83e0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
83f0: 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  utex);.  pOld = 
8400: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 3b  db->pProfileArg;
8410: 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20  .  db->xProfile 
8420: 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64 62  = xProfile;.  db
8430: 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20 3d 20  ->pProfileArg = 
8440: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
8450: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
8460: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
8470: 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20   pOld;.}.#endif 
8480: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  /* SQLITE_OMIT_T
8490: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 20 45 58  RACE */../*** EX
84a0: 50 45 52 49 4d 45 4e 54 41 4c 20 2a 2a 2a 0a 2a  PERIMENTAL ***.*
84b0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
84c0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  function to be i
84d0: 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72  nvoked when a tr
84e0: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e  ansaction commen
84f0: 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ts..** If the in
8500: 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72  voked function r
8510: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
8520: 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74   then the commit
8530: 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f   becomes a.** ro
8540: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  llback..*/.void 
8550: 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f  *sqlite3_commit_
8560: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
8570: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
8580: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
8590: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
85a0: 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28  abase */.  int (
85b0: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
85c0: 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  *),  /* Function
85d0: 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61   to invoke on ea
85e0: 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76  ch commit */.  v
85f0: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
8600: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
8610: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
8620: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
8630: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
8640: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
8650: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
8660: 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  d = db->pCommitA
8670: 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69  rg;.  db->xCommi
8680: 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  tCallback = xCal
8690: 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f  lback;.  db->pCo
86a0: 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b 0a  mmitArg = pArg;.
86b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
86c0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
86d0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
86e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
86f0: 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
8700: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
8710: 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75   time a row is u
8720: 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72  pdated,.** inser
8730: 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75  ted or deleted u
8740: 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61  sing this databa
8750: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
8760: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
8770: 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73  update_hook(.  s
8780: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
8790: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
87a0: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
87b0: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
87c0: 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61    void (*xCallba
87d0: 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68  ck)(void*,int,ch
87e0: 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20  ar const *,char 
87f0: 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69  const *,sqlite_i
8800: 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70  nt64),.  void *p
8810: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
8820: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
8830: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
8840: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
8850: 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  t;.  sqlite3_mut
8860: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
8870: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
8880: 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20  ->pUpdateArg;.  
8890: 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
88a0: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
88b0: 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72  .  db->pUpdateAr
88c0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
88d0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
88e0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
88f0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
8900: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
8910: 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
8920: 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
8930: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
8940: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
8950: 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
8960: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
8970: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f  void *sqlite3_ro
8980: 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73  llback_hook(.  s
8990: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
89a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
89b0: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
89c0: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
89d0: 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61    void (*xCallba
89e0: 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43  ck)(void*), /* C
89f0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
8a00: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
8a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a20: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
8a30: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
8a40: 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
8a50: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
8a60: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
8a70: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
8a80: 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64  RollbackArg;.  d
8a90: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
8aa0: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
8ab0: 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  ;.  db->pRollbac
8ac0: 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  kArg = pArg;.  s
8ad0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
8ae0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
8af0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
8b00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8b10: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54  OMIT_WAL./*.** T
8b20: 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  he sqlite3_wal_h
8b30: 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 72  ook() callback r
8b40: 65 67 69 73 74 65 72 65 64 20 62 79 20 73 71 6c  egistered by sql
8b50: 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
8b60: 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e  ckpoint()..** In
8b70: 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77 61 6c  voke sqlite3_wal
8b80: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74  _checkpoint if t
8b90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  he number of fra
8ba0: 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66  mes in the log f
8bb0: 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  ile.** is greate
8bc0: 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33 2e 70  r than sqlite3.p
8bd0: 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f 20 61  WalArg cast to a
8be0: 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65 20 76  n integer (the v
8bf0: 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20  alue configured 
8c00: 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68  by.** wal_autoch
8c10: 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20  eckpoint())..*/ 
8c20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 44  .int sqlite3WalD
8c30: 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f  efaultHook(.  vo
8c40: 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c  id *pClientData,
8c50: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
8c60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
8c70: 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b,           /* 
8c80: 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  Connection */.  
8c90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
8ca0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
8cb0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61  se */.  int nFra
8cc0: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  me             /
8cd0: 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f  * Size of WAL */
8ce0: 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65  .){.  if( nFrame
8cf0: 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  >=SQLITE_PTR_TO_
8d00: 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74 61 29  INT(pClientData)
8d10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
8d20: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
8d30: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
8d40: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64  wal_checkpoint(d
8d50: 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c  b, zDb);.    sql
8d60: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
8d70: 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  loc();.  }.  ret
8d80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8d90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8da0: 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
8db0: 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61  *.** Configure a
8dc0: 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  n sqlite3_wal_ho
8dd0: 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f  ok() callback to
8de0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
8df0: 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64  heckpoint.** a d
8e00: 61 74 61 62 61 73 65 20 61 66 74 65 72 20 63 6f  atabase after co
8e10: 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
8e20: 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  action if there 
8e30: 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a  are nFrame or.**
8e40: 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69 6e 20   more frames in 
8e50: 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61  the log file. Pa
8e60: 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20  ssing zero or a 
8e70: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 61  negative value a
8e80: 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20  s the.** nFrame 
8e90: 70 61 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c  parameter disabl
8ea0: 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65  es automatic che
8eb0: 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c  ckpoints entirel
8ec0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
8ed0: 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64  lback registered
8ee0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
8ef0: 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79 20 65  n replaces any e
8f00: 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b  xisting callback
8f10: 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20 75  .** registered u
8f20: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c  sing sqlite3_wal
8f30: 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73  _hook(). Likewis
8f40: 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67 20 61  e, registering a
8f50: 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69   callback.** usi
8f60: 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  ng sqlite3_wal_h
8f70: 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73 20 74  ook() disables t
8f80: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65  he automatic che
8f90: 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73  ckpoint mechanis
8fa0: 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20  m.** configured 
8fb0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
8fc0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8fd0: 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
8fe0: 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
8ff0: 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69   int nFrame){.#i
9000: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9010: 54 5f 57 41 4c 0a 20 20 69 66 28 20 6e 46 72 61  T_WAL.  if( nFra
9020: 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  me>0 ){.    sqli
9030: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c  te3_wal_hook(db,
9040: 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75   sqlite3WalDefau
9050: 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49  ltHook, SQLITE_I
9060: 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65  NT_TO_PTR(nFrame
9070: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
9080: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
9090: 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  k(db, 0, 0);.  }
90a0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
90b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
90c0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
90d0: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
90e0: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
90f0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
9100: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
9110: 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  o the write-ahea
9120: 64 2d 6c 6f 67 20 62 79 20 74 68 69 73 20 64 61  d-log by this da
9130: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9140: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
9150: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20  te3_wal_hook(.  
9160: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
9190: 6f 6b 20 74 6f 20 74 68 69 73 20 64 62 20 68 61  ok to this db ha
91a0: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78  ndle */.  int(*x
91b0: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a  Callback)(void *
91c0: 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73  , sqlite3*, cons
91d0: 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20  t char*, int),. 
91e0: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
9210: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78 43 61  nt passed to xCa
9220: 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23  llback() */.){.#
9230: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9240: 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70  IT_WAL.  void *p
9250: 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Ret;.  sqlite3_m
9260: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
9270: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
9280: 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64  db->pWalArg;.  d
9290: 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20  b->xWalCallback 
92a0: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
92b0: 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41 72  b->pWalArg = pAr
92c0: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
92d0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
92e0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
92f0: 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  et;.#else.  retu
9300: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 0;.#endif.}..
9310: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  ./*.** Checkpoin
9320: 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20  t database zDb. 
9330: 49 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20  If zDb is NULL, 
9340: 6f 72 20 69 66 20 74 68 65 20 62 75 66 66 65 72  or if the buffer
9350: 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zDb points.** t
9360: 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72  o contains a zer
9370: 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c  o-length string,
9380: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
9390: 74 61 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20  tabases are .** 
93a0: 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f  checkpointed..*/
93b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
93c0: 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  _checkpoint(sqli
93d0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
93e0: 68 61 72 20 2a 7a 44 62 29 7b 0a 23 69 66 64 65  har *zDb){.#ifde
93f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
9400: 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  L.  return SQLIT
9410: 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  E_OK;.#else.  in
9420: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9440: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
9450: 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51 4c 49    int iDb = SQLI
9460: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3b  TE_MAX_ATTACHED;
9470: 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44 62    /* sqlite3.aDb
9480: 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62 20 74  [] index of db t
9490: 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  o checkpoint */.
94a0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
94b0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
94c0: 29 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20  );.  if( zDb && 
94d0: 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44  zDb[0] ){.    iD
94e0: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
94f0: 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a  bName(db, zDb);.
9500: 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30 20    }.  if( iDb<0 
9510: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
9520: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
9530: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
9540: 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e  QLITE_ERROR, "un
9550: 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20  known database: 
9560: 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c  %s", zDb);.  }el
9570: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
9580: 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64  ite3Checkpoint(d
9590: 62 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  b, iDb);.    sql
95a0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
95b0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  , 0);.  }.  rc =
95c0: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
95d0: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
95e0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
95f0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
9600: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
9610: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9620: 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
9630: 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  Run a checkpoint
9640: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   on database iDb
9650: 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
9660: 70 20 69 66 20 64 61 74 61 62 61 73 65 20 69 44  p if database iD
9670: 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72  b is.** not curr
9680: 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41  ently open in WA
9690: 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  L mode..**.** If
96a0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
96b0: 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  s open on the da
96c0: 74 61 62 61 73 65 20 62 65 69 6e 67 20 63 68 65  tabase being che
96d0: 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20  ckpointed, this 
96e0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
96f0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  urns SQLITE_LOCK
9700: 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f  ED and a checkpo
9710: 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  int is not attem
9720: 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  pted. If .** an 
9730: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
9740: 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  le running the c
9750: 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51  heckpoint, an SQ
9760: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
9770: 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
9780: 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (i.e. SQLITE_IOE
9790: 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  RR). Otherwise, 
97a0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
97b0: 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61   The mutex on da
97c0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
97d0: 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
97e0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  by the caller. T
97f0: 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f  he mutex.** asso
9800: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
9810: 73 70 65 63 69 66 69 63 20 62 2d 74 72 65 65 20  specific b-tree 
9820: 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74  being checkpoint
9830: 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a  ed is taken by.*
9840: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
9850: 77 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70  while the checkp
9860: 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e  oint is running.
9870: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73  .**.** If iDb is
9880: 20 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d   passed SQLITE_M
9890: 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65  AX_ATTACHED, the
98a0: 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
98b0: 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20  atabases are.** 
98c0: 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66  checkpointed. If
98d0: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
98e0: 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 72  ountered it is r
98f0: 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74  eturned immediat
9900: 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65  ely -.** no atte
9910: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
9920: 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65  heckpoint any re
9930: 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65  maining database
9940: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
9950: 33 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  3Checkpoint(sqli
9960: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
9970: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
9980: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
9990: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
99a0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ode */.  int i; 
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
99d0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
99e0: 75 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73  ugh attached dbs
99f0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
9a00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9a10: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
9a20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
9a30: 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c  ->nDb && rc==SQL
9a40: 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
9a50: 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20    if( i==iDb || 
9a60: 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  iDb==SQLITE_MAX_
9a70: 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20  ATTACHED ){.    
9a80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
9a90: 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62  reeCheckpoint(db
9aa0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  ->aDb[i].pBt);. 
9ab0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
9ac0: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
9ad0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
9ae0: 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  AL */../*.** Thi
9af0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
9b00: 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d  ns true if main-
9b10: 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65  memory should be
9b20: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
9b30: 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20  .** a temporary 
9b40: 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65  file for transie
9b50: 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73 20 61  nt pager files a
9b60: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  nd statement jou
9b70: 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61  rnals..** The va
9b80: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64 65 70  lue returned dep
9b90: 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75  ends on the valu
9ba0: 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74  e of db->temp_st
9bb0: 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20  ore (runtime.** 
9bc0: 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74  parameter) and t
9bd0: 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  he compile time 
9be0: 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f  value of SQLITE_
9bf0: 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a  TEMP_STORE. The.
9c00: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  ** following tab
9c10: 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
9c20: 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65   relationship be
9c30: 74 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20  tween these two 
9c40: 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68  values.** and th
9c50: 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  is functions ret
9c60: 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  urn value..**.**
9c70: 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53     SQLITE_TEMP_S
9c80: 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d  TORE     db->tem
9c90: 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61  p_store     Loca
9ca0: 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72  tion of temporar
9cb0: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  y database.**   
9cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9cd0: 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
9ce0: 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
9cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d00: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d20: 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20     any          
9d30: 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
9d40: 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
9d50: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
9d60: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
9d70: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
9d80: 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
9d90: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
9da0: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
9dc0: 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
9dd0: 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
9e00: 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
9e10: 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   0).**   2      
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e40: 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
9e50: 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20  urn 0).**   2   
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e70: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
9e80: 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
9e90: 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32  return 1).**   2
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9eb0: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
9ec0: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
9ed0: 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
9ee0: 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
9ef0: 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20          any     
9f00: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
9f10: 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
9f20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65  */.int sqlite3Te
9f30: 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74  mpInMemory(const
9f40: 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23   sqlite3 *db){.#
9f50: 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
9f60: 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e  TORE==1.  return
9f70: 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72   ( db->temp_stor
9f80: 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23  e==2 );.#endif.#
9f90: 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
9fa0: 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e  TORE==2.  return
9fb0: 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72   ( db->temp_stor
9fc0: 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23  e!=1 );.#endif.#
9fd0: 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
9fe0: 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74 75 72 6e  TORE==3.  return
9ff0: 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   1;.#endif.#if S
a000: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
a010: 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d  <1 || SQLITE_TEM
a020: 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72 65 74 75  P_STORE>3.  retu
a030: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 0;.#endif.}..
a040: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
a050: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
a060: 63 72 65 61 74 65 20 61 20 63 6f 6e 6e 65 63 74  create a connect
a070: 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73  ion to a databas
a080: 65 20 42 54 72 65 65 0a 2a 2a 20 64 72 69 76 65  e BTree.** drive
a090: 72 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  r.  If zFilename
a0a0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
a0b0: 61 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 61  a file, then tha
a0c0: 74 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6f 70 65  t file is.** ope
a0d0: 6e 65 64 20 61 6e 64 20 75 73 65 64 2e 20 20 49  ned and used.  I
a0e0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  f zFilename is t
a0f0: 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
a100: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 0a 2a 2a  memory:" then.**
a110: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
a120: 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
a130: 79 20 28 61 6e 64 20 69 73 20 74 68 75 73 20 66  y (and is thus f
a140: 6f 72 67 6f 74 74 65 6e 20 61 73 20 73 6f 6f 6e  orgotten as soon
a150: 20 61 73 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65   as.** the conne
a160: 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e  ction is closed.
a170: 29 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  )  If zFilename 
a180: 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65  is NULL then the
a190: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20   database.** is 
a1a0: 61 20 22 76 69 72 74 75 61 6c 22 20 64 61 74 61  a "virtual" data
a1b0: 62 61 73 65 20 66 6f 72 20 74 72 61 6e 73 69 65  base for transie
a1c0: 6e 74 20 75 73 65 20 6f 6e 6c 79 20 61 6e 64 20  nt use only and 
a1d0: 69 73 20 64 65 6c 65 74 65 64 20 61 73 0a 2a 2a  is deleted as.**
a1e0: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 63 6f 6e   soon as the con
a1f0: 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  nection is close
a200: 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 69 72 74 75  d..**.** A virtu
a210: 61 6c 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  al database can 
a220: 62 65 20 65 69 74 68 65 72 20 61 20 64 69 73 6b  be either a disk
a230: 20 66 69 6c 65 20 28 74 68 61 74 20 69 73 20 61   file (that is a
a240: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20  utomatically.** 
a250: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
a260: 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 29   file is closed)
a270: 20 6f 72 20 69 74 20 61 6e 20 62 65 20 68 65 6c   or it an be hel
a280: 64 20 65 6e 74 69 72 65 6c 79 20 69 6e 20 6d 65  d entirely in me
a290: 6d 6f 72 79 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  mory..** The sql
a2a0: 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
a2b0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  () function is u
a2c0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
a2d0: 20 77 68 69 63 68 2e 0a 2a 2f 0a 69 6e 74 20 73   which..*/.int s
a2e0: 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f  qlite3BtreeFacto
a2f0: 72 79 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ry(.  sqlite3 *d
a300: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
a310: 2f 2a 20 4d 61 69 6e 20 64 61 74 61 62 61 73 65  /* Main database
a320: 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 75   when opening au
a330: 78 20 6f 74 68 65 72 77 69 73 65 20 30 20 2a 2f  x otherwise 0 */
a340: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a350: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20  Filename,    /* 
a360: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
a370: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
a380: 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
a390: 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 4a 6f 75 72  /.  int omitJour
a3a0: 6e 61 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nal,          /*
a3b0: 20 69 66 20 54 52 55 45 20 74 68 65 6e 20 64 6f   if TRUE then do
a3c0: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 20 74 68 69   not journal thi
a3d0: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
a3e0: 6e 43 61 63 68 65 2c 20 20 20 20 20 20 20 20 20  nCache,         
a3f0: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 61 6e        /* How man
a400: 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
a410: 61 67 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 69  age cache */.  i
a420: 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20  nt vfsFlags,    
a430: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
a440: 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
a450: 20 74 6f 20 76 66 73 4f 70 65 6e 20 2a 2f 0a 20   to vfsOpen */. 
a460: 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
a470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
a480: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72  inter to new Btr
a490: 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65  ee object writte
a4a0: 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  n here */.){.  i
a4b0: 6e 74 20 62 74 46 6c 61 67 73 20 3d 20 30 3b 0a  nt btFlags = 0;.
a4c0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 61    int rc;.  .  a
a4d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
a4e0: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
a4f0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
a500: 28 20 70 70 42 74 72 65 65 20 21 3d 20 30 29 3b  ( ppBtree != 0);
a510: 0a 20 20 69 66 28 20 6f 6d 69 74 4a 6f 75 72 6e  .  if( omitJourn
a520: 61 6c 20 29 7b 0a 20 20 20 20 62 74 46 6c 61 67  al ){.    btFlag
a530: 73 20 7c 3d 20 42 54 52 45 45 5f 4f 4d 49 54 5f  s |= BTREE_OMIT_
a540: 4a 4f 55 52 4e 41 4c 3b 0a 20 20 7d 0a 20 20 69  JOURNAL;.  }.  i
a550: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
a560: 51 4c 49 54 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b  QLITE_NoReadlock
a570: 20 29 7b 0a 20 20 20 20 62 74 46 6c 61 67 73 20   ){.    btFlags 
a580: 7c 3d 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44  |= BTREE_NO_READ
a590: 4c 4f 43 4b 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  LOCK;.  }.#ifnde
a5a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
a5b0: 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 7a 46 69  MORYDB.  if( zFi
a5c0: 6c 65 6e 61 6d 65 3d 3d 30 20 26 26 20 73 71 6c  lename==0 && sql
a5d0: 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
a5e0: 28 64 62 29 20 29 7b 0a 20 20 20 20 7a 46 69 6c  (db) ){.    zFil
a5f0: 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f 72 79  ename = ":memory
a600: 3a 22 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  :";.  }.#endif..
a610: 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20    if( (vfsFlags 
a620: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
a630: 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 7a 46  IN_DB)!=0 && (zF
a640: 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a  ilename==0 || *z
a650: 46 69 6c 65 6e 61 6d 65 3d 3d 30 29 20 29 7b 0a  Filename==0) ){.
a660: 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28      vfsFlags = (
a670: 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49  vfsFlags & ~SQLI
a680: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
a690: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54   | SQLITE_OPEN_T
a6a0: 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 72 63  EMP_DB;.  }.  rc
a6b0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
a6c0: 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 28  pen(zFilename, (
a6d0: 73 71 6c 69 74 65 33 20 2a 29 64 62 2c 20 70 70  sqlite3 *)db, pp
a6e0: 42 74 72 65 65 2c 20 62 74 46 6c 61 67 73 2c 20  Btree, btFlags, 
a6f0: 76 66 73 46 6c 61 67 73 29 3b 0a 0a 20 20 2f 2a  vfsFlags);..  /*
a700: 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77   If the B-Tree w
a710: 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
a720: 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20  opened, set the 
a730: 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
a740: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 65 66   to the.  ** def
a750: 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65  ault value. Exce
a760: 70 74 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 20  pt, if the call 
a770: 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20 72  to BtreeOpen() r
a780: 65 74 75 72 6e 65 64 20 61 20 68 61 6e 64 6c 65  eturned a handle
a790: 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 61 6e  .  ** open on an
a7a0: 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64   existing shared
a7b0: 20 70 61 67 65 72 2d 63 61 63 68 65 2c 20 64 6f   pager-cache, do
a7c0: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
a7d0: 70 61 67 65 72 2d 63 61 63 68 65 20 0a 20 20 2a  pager-cache .  *
a7e0: 2a 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69  * size..  */.  i
a7f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a800: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 74   && 0==sqlite3Bt
a810: 72 65 65 53 63 68 65 6d 61 28 2a 70 70 42 74 72  reeSchema(*ppBtr
a820: 65 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  ee, 0, 0) ){.   
a830: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
a840: 43 61 63 68 65 53 69 7a 65 28 2a 70 70 42 74 72  CacheSize(*ppBtr
a850: 65 65 2c 20 6e 43 61 63 68 65 29 3b 0a 20 20 7d  ee, nCache);.  }
a860: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a870: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
a880: 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  F-8 encoded Engl
a890: 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
a8a0: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
a8b0: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
a8c0: 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  rror..*/.const c
a8d0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
a8e0: 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29  msg(sqlite3 *db)
a8f0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
a900: 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
a910: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
a920: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
a930: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66  NOMEM);.  }.  if
a940: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
a950: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
a960: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
a970: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
a980: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
a990: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
a9a0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
a9b0: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
a9c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a9d0: 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  ){.    z = sqlit
a9e0: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
a9f0: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b  NOMEM);.  }else{
aa00: 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  .    z = (char*)
aa10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
aa20: 78 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  xt(db->pErr);.  
aa30: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
aa40: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
aa50: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
aa60: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
aa70: 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f  ErrStr(db->errCo
aa80: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  de);.    }.  }. 
aa90: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
aaa0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
aab0: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
aac0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
aad0: 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
aae0: 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e  Return UTF-16 en
aaf0: 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  coded English la
ab00: 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
ab10: 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
ab20: 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a  ecent.** error..
ab30: 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
ab40: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28  qlite3_errmsg16(
ab50: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
ab60: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
ab70: 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a   outOfMem[] = {.
ab80: 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74      'o', 'u', 't
ab90: 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27  ', ' ', 'o', 'f'
aba0: 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c  , ' ', 'm', 'e',
abb0: 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20   'm', 'o', 'r', 
abc0: 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74  'y', 0.  };.  st
abd0: 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d  atic const u16 m
abe0: 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  isuse[] = {.    
abf0: 27 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c 20 27  'l', 'i', 'b', '
ac00: 72 27 2c 20 27 61 27 2c 20 27 72 27 2c 20 27 79  r', 'a', 'r', 'y
ac10: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 72 27  ', ' ', .    'r'
ac20: 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c  , 'o', 'u', 't',
ac30: 20 27 69 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20   'i', 'n', 'e', 
ac40: 27 20 27 2c 20 0a 20 20 20 20 27 63 27 2c 20 27  ' ', .    'c', '
ac50: 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65  a', 'l', 'l', 'e
ac60: 27 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'd', ' ', .  
ac70: 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c    'o', 'u', 't',
ac80: 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20   ' ', .    'o', 
ac90: 27 66 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'f', ' ', .    '
aca0: 73 27 2c 20 27 65 27 2c 20 27 71 27 2c 20 27 75  s', 'e', 'q', 'u
acb0: 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27 63 27  ', 'e', 'n', 'c'
acc0: 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20  , 'e', 0.  };.. 
acd0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a   const void *z;.
ace0: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
acf0: 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29   return (void *)
ad00: 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20  outOfMem;.  }.  
ad10: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
ad20: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
ad30: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
ad40: 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65  n (void *)misuse
ad50: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
ad60: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
ad70: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
ad80: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
ad90: 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20  {.    z = (void 
ada0: 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65  *)outOfMem;.  }e
adb0: 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  lse{.    z = sql
adc0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
add0: 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  6(db->pErr);.   
ade0: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
adf0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
ae00: 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
ae10: 2d 31 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  -1, sqlite3ErrSt
ae20: 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 2c 0a  r(db->errCode),.
ae30: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
ae40: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
ae50: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7a 20  TATIC);.      z 
ae60: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
ae70: 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
ae80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  ;.    }.    /* A
ae90: 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61   malloc() may ha
aea0: 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69 6e  ve failed within
aeb0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
aec0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
aed0: 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  6().    ** above
aee0: 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
aef0: 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
af00: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
af10: 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20   flag needs to. 
af20: 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65 64     ** be cleared
af30: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
af40: 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65 63  g. Do this direc
af50: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
af60: 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  via.    ** sqlit
af70: 65 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20  e3ApiExit(), to 
af80: 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68  avoid setting th
af90: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
afa0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
afb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e  .    */.    db->
afc0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
afd0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
afe0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
aff0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
b000: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
b010: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
b020: 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  6 */../*.** Retu
b030: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
b040: 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65  nt error code ge
b050: 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53 51  nerated by an SQ
b060: 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66  Lite routine. If
b070: 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73   NULL is.** pass
b080: 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
b090: 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61  ion, we assume a
b0a0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
b0b0: 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   during sqlite3_
b0c0: 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  open()..*/.int s
b0d0: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73  qlite3_errcode(s
b0e0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
b0f0: 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65  f( db && !sqlite
b100: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
b110: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
b120: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
b130: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
b140: 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
b150: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
b160: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b170: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
b180: 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64  eturn db->errCod
b190: 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  e & db->errMask;
b1a0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  .}.int sqlite3_e
b1b0: 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
b1c0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
b1d0: 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
b1e0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
b1f0: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
b200: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
b210: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
b220: 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
b230: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
b240: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
b250: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
b260: 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
b270: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  de;.}../*.** Cre
b280: 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ate a new collat
b290: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ing function for
b2a0: 20 64 61 74 61 62 61 73 65 20 22 64 62 22 2e 20   database "db". 
b2b0: 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61   The name is zNa
b2c0: 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e  me.** and the en
b2d0: 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a  coding is enc..*
b2e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65  /.static int cre
b2f0: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  ateCollation(.  
b300: 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63  sqlite3* db,.  c
b310: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
b320: 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 75  , .  u8 enc,.  u
b330: 38 20 63 6f 6c 6c 54 79 70 65 2c 0a 20 20 76 6f  8 collType,.  vo
b340: 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
b350: 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
b360: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
b370: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
b380: 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29  ),.  void(*xDel)
b390: 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c  (void*).){.  Col
b3a0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
b3b0: 6e 74 20 65 6e 63 32 3b 0a 20 20 69 6e 74 20 6e  nt enc2;.  int n
b3c0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
b3d0: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
b3e0: 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
b3f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
b400: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
b410: 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46  /* If SQLITE_UTF
b420: 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20  16 is specified 
b430: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  as the encoding 
b440: 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20  type, transform 
b450: 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65  this.  ** to one
b460: 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   of SQLITE_UTF16
b470: 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46  LE or SQLITE_UTF
b480: 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20  16BE using the. 
b490: 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   ** SQLITE_UTF16
b4a0: 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51  NATIVE macro. SQ
b4b0: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f  LITE_UTF16 is no
b4c0: 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  t used internall
b4d0: 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d  y..  */.  enc2 =
b4e0: 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73 65   enc;.  testcase
b4f0: 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
b500: 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63 61  TF16 );.  testca
b510: 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  se( enc2==SQLITE
b520: 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29  _UTF16_ALIGNED )
b530: 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53 51  ;.  if( enc2==SQ
b540: 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e  LITE_UTF16 || en
b550: 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
b560: 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20 20  _ALIGNED ){.    
b570: 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55 54  enc2 = SQLITE_UT
b580: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20  F16NATIVE;.  }. 
b590: 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54 45   if( enc2<SQLITE
b5a0: 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51  _UTF8 || enc2>SQ
b5b0: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b 0a  LITE_UTF16BE ){.
b5c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b5d0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
b5e0: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
b5f0: 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72  f this call is r
b600: 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61  emoving or repla
b610: 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67  cing an existing
b620: 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a   collation .  **
b630: 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f   sequence. If so
b640: 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
b650: 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75  active VMs, retu
b660: 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65 72  rn busy. If ther
b670: 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63  e.  ** are no ac
b680: 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69  tive VMs, invali
b690: 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d  date any pre-com
b6a0: 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
b6b0: 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d  ..  */.  pColl =
b6c0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
b6d0: 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32  Seq(db, (u8)enc2
b6e0: 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69  , zName, 0);.  i
b6f0: 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
b700: 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69  l->xCmp ){.    i
b710: 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  f( db->activeVdb
b720: 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  eCnt ){.      sq
b730: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
b740: 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
b750: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
b760: 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f  delete/modify co
b770: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
b780: 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73   due to active s
b790: 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
b7a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b7b0: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
b7c0: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
b7d0: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
b7e0: 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  (db);..    /* If
b7f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
b800: 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72  nce pColl was cr
b810: 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62  eated directly b
b820: 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  y a call to.    
b830: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ** sqlite3_creat
b840: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64  e_collation, and
b850: 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62   not generated b
b860: 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
b870: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e  ,.    ** then an
b880: 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79  y copies made by
b890: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20   synthCollSeq() 
b8a0: 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  need to be inval
b8b0: 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41  idated..    ** A
b8c0: 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64  lso, collation d
b8d0: 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c  estructor - Coll
b8e0: 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e  Seq.xDel() - fun
b8f0: 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20  ction may need. 
b900: 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c     ** to be call
b910: 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  ed..    */ .    
b920: 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20  if( (pColl->enc 
b930: 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  & ~SQLITE_UTF16_
b940: 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29  ALIGNED)==enc2 )
b950: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
b960: 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *aColl = sqlite3
b970: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43  HashFind(&db->aC
b980: 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e  ollSeq, zName, n
b990: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  Name);.      int
b9a0: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
b9b0: 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<3; j++){.  
b9c0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
b9d0: 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20   = &aColl[j];.  
b9e0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63        if( p->enc
b9f0: 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a  ==pColl->enc ){.
ba00: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
ba10: 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  >xDel ){.       
ba20: 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e       p->xDel(p->
ba30: 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pUser);.        
ba40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
ba50: 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  >xCmp = 0;.     
ba60: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ba70: 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20   }.  }..  pColl 
ba80: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
ba90: 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
baa0: 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20  2, zName, 1);.  
bab0: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
bac0: 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78   pColl->xCmp = x
bad0: 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 70 43 6f  Compare;.    pCo
bae0: 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78  ll->pUser = pCtx
baf0: 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 78 44 65  ;.    pColl->xDe
bb00: 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 20 20 70 43  l = xDel;.    pC
bb10: 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28  oll->enc = (u8)(
bb20: 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51  enc2 | (enc & SQ
bb30: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
bb40: 45 44 29 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d  ED));.    pColl-
bb50: 3e 74 79 70 65 20 3d 20 63 6f 6c 6c 54 79 70 65  >type = collType
bb60: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
bb70: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
bb80: 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  OK, 0);.  return
bb90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
bba0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79  /*.** This array
bbb0: 20 64 65 66 69 6e 65 73 20 68 61 72 64 20 75 70   defines hard up
bbc0: 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69  per bounds on li
bbd0: 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65  mit values.  The
bbe0: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  .** initializer 
bbf0: 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20  must be kept in 
bc00: 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 53 51  sync with the SQ
bc10: 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20  LITE_LIMIT_*.** 
bc20: 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69  #defines in sqli
bc30: 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  te3.h..*/.static
bc40: 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64   const int aHard
bc50: 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51  Limit[] = {.  SQ
bc60: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c  LITE_MAX_LENGTH,
bc70: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  .  SQLITE_MAX_SQ
bc80: 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  L_LENGTH,.  SQLI
bc90: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20  TE_MAX_COLUMN,. 
bca0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
bcb0: 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45  _DEPTH,.  SQLITE
bcc0: 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
bcd0: 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LECT,.  SQLITE_M
bce0: 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51  AX_VDBE_OP,.  SQ
bcf0: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
bd00: 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f  N_ARG,.  SQLITE_
bd10: 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20  MAX_ATTACHED,.  
bd20: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
bd30: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a  PATTERN_LENGTH,.
bd40: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52    SQLITE_MAX_VAR
bd50: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a 20 20  IABLE_NUMBER,.  
bd60: 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
bd70: 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a  ER_DEPTH,.};../*
bd80: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
bd90: 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72  e hard limits ar
bda0: 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61  e set to reasona
bdb0: 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69  ble values.*/.#i
bdc0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  f SQLITE_MAX_LEN
bdd0: 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
bde0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
bdf0: 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
be00: 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
be10: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
be20: 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
be30: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ror SQLITE_MAX_S
be40: 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  QL_LENGTH must b
be50: 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
be60: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
be70: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e  _MAX_SQL_LENGTH>
be80: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
be90: 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  H.# error SQLITE
bea0: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
beb0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61  must not be grea
bec0: 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  ter than SQLITE_
bed0: 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69  MAX_LENGTH.#endi
bee0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
bef0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
bf00: 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <2.# error SQLIT
bf10: 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
bf20: 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61 74  ELECT must be at
bf30: 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a   least 2.#endif.
bf40: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  #if SQLITE_MAX_V
bf50: 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f  DBE_OP<40.# erro
bf60: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  r SQLITE_MAX_VDB
bf70: 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20  E_OP must be at 
bf80: 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a  least 40.#endif.
bf90: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  #if SQLITE_MAX_F
bfa0: 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c  UNCTION_ARG<0 ||
bfb0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
bfc0: 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a 23 20  TION_ARG>1000.# 
bfd0: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
bfe0: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75  _FUNCTION_ARG mu
bff0: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  st be between 0 
c000: 61 6e 64 20 31 30 30 30 0a 23 65 6e 64 69 66 0a  and 1000.#endif.
c010: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  #if SQLITE_MAX_A
c020: 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c  TTACHED<0 || SQL
c030: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
c040: 3e 33 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  >30.# error SQLI
c050: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20  TE_MAX_ATTACHED 
c060: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
c070: 30 20 61 6e 64 20 33 30 0a 23 65 6e 64 69 66 0a  0 and 30.#endif.
c080: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
c090: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
c0a0: 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  TH<1.# error SQL
c0b0: 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
c0c0: 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74  TERN_LENGTH must
c0d0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
c0e0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
c0f0: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36  _MAX_COLUMN>3276
c100: 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  7.# error SQLITE
c110: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74  _MAX_COLUMN must
c120: 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37 36   not exceed 3276
c130: 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  7.#endif.#if SQL
c140: 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
c150: 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20  DEPTH<1.# error 
c160: 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
c170: 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65  ER_DEPTH must be
c180: 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64   at least 1.#end
c190: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  if.../*.** Chang
c1a0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  e the value of a
c1b0: 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20   limit.  Report 
c1c0: 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a  the old value..*
c1d0: 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20  * If an invalid 
c1e0: 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73  limit index is s
c1f0: 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20  upplied, report 
c200: 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63  -1..** Make no c
c210: 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c  hanges but still
c220: 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20   report the old 
c230: 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20  value if the.** 
c240: 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  new limit is neg
c250: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ative..**.** A n
c260: 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64  ew lower limit d
c270: 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65  oes not shrink e
c280: 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63  xisting construc
c290: 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79  ts..** It merely
c2a0: 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f   prevents new co
c2b0: 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78  nstructs that ex
c2c0: 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a  ceed the limit.*
c2d0: 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a  * from forming..
c2e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c  */.int sqlite3_l
c2f0: 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  imit(sqlite3 *db
c300: 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69  , int limitId, i
c310: 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20  nt newLimit){.  
c320: 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 20 20  int oldLimit;.  
c330: 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c  if( limitId<0 ||
c340: 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45   limitId>=SQLITE
c350: 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  _N_LIMIT ){.    
c360: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
c370: 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e   oldLimit = db->
c380: 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  aLimit[limitId];
c390: 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e  .  if( newLimit>
c3a0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65  =0 ){.    if( ne
c3b0: 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69  wLimit>aHardLimi
c3c0: 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20  t[limitId] ){.  
c3d0: 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61      newLimit = a
c3e0: 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  HardLimit[limitI
c3f0: 64 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  d];.    }.    db
c400: 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
c410: 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20  ] = newLimit;.  
c420: 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69  }.  return oldLi
c430: 6d 69 74 3b 0a 7d 0a 23 69 66 20 64 65 66 69 6e  mit;.}.#if defin
c440: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
c450: 5f 41 55 54 4f 5f 50 52 4f 46 49 4c 45 29 0a 73  _AUTO_PROFILE).s
c460: 74 61 74 69 63 20 76 6f 69 64 20 70 72 6f 66 69  tatic void profi
c470: 6c 65 5f 73 71 6c 28 76 6f 69 64 20 2a 61 75 78  le_sql(void *aux
c480: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  , const char *sq
c490: 6c 2c 20 75 36 34 20 6e 73 29 20 7b 0a 23 70 72  l, u64 ns) {.#pr
c4a0: 61 67 6d 61 20 75 6e 75 73 65 64 28 61 75 78 29  agma unused(aux)
c4b0: 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
c4c0: 2c 20 22 51 75 65 72 79 3a 20 25 73 5c 6e 20 45  , "Query: %s\n E
c4d0: 78 65 63 75 74 69 6f 6e 20 54 69 6d 65 3a 20 25  xecution Time: %
c4e0: 6c 6c 75 20 6d 73 5c 6e 22 2c 20 73 71 6c 2c 20  llu ms\n", sql, 
c4f0: 6e 73 20 2f 20 31 30 30 30 30 30 30 29 3b 0a 7d  ns / 1000000);.}
c500: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
c510: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
c520: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65   the work of ope
c530: 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ning a database 
c540: 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20  on behalf of.** 
c550: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61  sqlite3_open() a
c560: 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nd sqlite3_open1
c570: 36 28 29 2e 20 54 68 65 20 64 61 74 61 62 61 73  6(). The databas
c580: 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c  e filename "zFil
c590: 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55  ename"  .** is U
c5a0: 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f  TF-8 encoded..*/
c5b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
c5c0: 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73  Database(.  cons
c5d0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
c5e0: 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66  e, /* Database f
c5f0: 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e  ilename UTF-8 en
c600: 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  coded */.  sqlit
c610: 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20  e3 **ppDb,      
c620: 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
c630: 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
c640: 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  le */.  unsigned
c650: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 2f   flags,        /
c660: 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c  * Operational fl
c670: 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
c680: 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20  har *zVfs       
c690: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56  /* Name of the V
c6a0: 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  FS to use */.){.
c6b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
c6c0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
c6d0: 73 54 68 72 65 61 64 73 61 66 65 3b 0a 0a 20 20  sThreadsafe;..  
c6e0: 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64  *ppDb = 0;.#ifnd
c6f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
c700: 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73  UTOINIT.  rc = s
c710: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
c720: 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  e();.  if( rc ) 
c730: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
c740: 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  f..  if( sqlite3
c750: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
c760: 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  reMutex==0 ){.  
c770: 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
c780: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
c790: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
c7a0: 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20  PEN_NOMUTEX ){. 
c7b0: 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
c7c0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
c7d0: 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
c7e0: 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29  OPEN_FULLMUTEX )
c7f0: 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
c800: 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  fe = 1;.  }else{
c810: 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
c820: 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  e = sqlite3Globa
c830: 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
c840: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c  ex;.  }.  if( fl
c850: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
c860: 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 29  N_PRIVATECACHE )
c870: 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e  {.    flags &= ~
c880: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
c890: 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65  EDCACHE;.  }else
c8a0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
c8b0: 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
c8c0: 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20  acheEnabled ){. 
c8d0: 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
c8e0: 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
c8f0: 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  CHE;.  }..  /* R
c900: 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69  emove harmful bi
c910: 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67  ts from the flag
c920: 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a  s parameter.  **
c930: 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  .  ** The SQLITE
c940: 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e  _OPEN_NOMUTEX an
c950: 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  d SQLITE_OPEN_FU
c960: 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65  LLMUTEX flags we
c970: 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69  re.  ** dealt wi
c980: 74 68 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  th in the previo
c990: 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20  us code block.  
c9a0: 42 65 73 69 64 65 73 20 74 68 65 73 65 2c 20 74  Besides these, t
c9b0: 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c  he only.  ** val
c9c0: 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66  id input flags f
c9d0: 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  or sqlite3_open_
c9e0: 76 32 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f  v2() are SQLITE_
c9f0: 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20  OPEN_READONLY,. 
ca00: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
ca10: 52 45 41 44 57 52 49 54 45 2c 20 61 6e 64 20 53  READWRITE, and S
ca20: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
ca30: 45 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73  E.  Silently mas
ca40: 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f  k.  ** off all o
ca50: 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f  ther flags..  */
ca60: 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20  .  flags &=  ~( 
ca70: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
ca80: 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
ca90: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
caa0: 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
cab0: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
cac0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
cad0: 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20  IN_DB |.        
cae0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
caf0: 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20  EN_TEMP_DB | .  
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
cb10: 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
cb20: 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  NT_DB | .       
cb30: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
cb40: 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
cb50: 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
cb60: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
cb70: 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  EMP_JOURNAL | . 
cb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
cb90: 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
cba0: 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
cbb0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
cbc0: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
cbd0: 4c 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  L |.            
cbe0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e     SQLITE_OPEN_N
cbf0: 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  OMUTEX |.       
cc00: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
cc10: 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20  PEN_FULLMUTEX.  
cc20: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20             );.. 
cc30: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
cc40: 20 73 71 6c 69 74 65 20 64 61 74 61 20 73 74 72   sqlite data str
cc50: 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d  ucture */.  db =
cc60: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
cc70: 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  ro( sizeof(sqlit
cc80: 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d  e3) );.  if( db=
cc90: 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62  =0 ) goto opendb
cca0: 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68  _out;.  if( isTh
ccb0: 72 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20  readsafe ){.    
ccc0: 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  db->mutex = sqli
ccd0: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
cce0: 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
ccf0: 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  SIVE);.    if( d
cd00: 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  b->mutex==0 ){. 
cd10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
cd20: 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20  e(db);.      db 
cd30: 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 0;.      goto 
cd40: 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20  opendb_out;.    
cd50: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
cd60: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
cd70: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
cd80: 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20  rMask = 0xff;.  
cd90: 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64  db->nDb = 2;.  d
cda0: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
cdb0: 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20  E_MAGIC_BUSY;.  
cdc0: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
cdd0: 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65  bStatic;..  asse
cde0: 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61  rt( sizeof(db->a
cdf0: 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61  Limit)==sizeof(a
ce00: 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20  HardLimit) );.  
ce10: 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69  memcpy(db->aLimi
ce20: 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73  t, aHardLimit, s
ce30: 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
ce40: 29 29 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f  ));.  db->autoCo
ce50: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e  mmit = 1;.  db->
ce60: 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31  nextAutovac = -1
ce70: 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65  ;.  db->nextPage
ce80: 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  size = 0;.  db->
ce90: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
cea0: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20  ShortColNames | 
ceb0: 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78  SQLITE_AutoIndex
cec0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41  .#if SQLITE_DEFA
ced0: 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c  ULT_FILE_FORMAT<
cee0: 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4.              
cef0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61     | SQLITE_Lega
cf00: 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66  cyFileFmt.#endif
cf10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
cf20: 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
cf30: 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20  SION.           
cf40: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c        | SQLITE_L
cf50: 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e  oadExtension.#en
cf60: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  dif.#if SQLITE_D
cf70: 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56 45  EFAULT_RECURSIVE
cf80: 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20 20 20  _TRIGGERS.      
cf90: 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
cfa0: 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 0a  ITE_RecTriggers.
cfb0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20  #endif.      ;. 
cfc0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
cfd0: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
cfe0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cff0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
d000: 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  E.  sqlite3HashI
d010: 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  nit(&db->aModule
d020: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d  );.#endif..  db-
d030: 3e 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  >pVfs = sqlite3_
d040: 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a  vfs_find(zVfs);.
d050: 20 20 69 66 28 20 21 64 62 2d 3e 70 56 66 73 20    if( !db->pVfs 
d060: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
d070: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
d080: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
d090: 63 2c 20 22 6e 6f 20 73 75 63 68 20 76 66 73 3a  c, "no such vfs:
d0a0: 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20   %s", zVfs);.   
d0b0: 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
d0c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
d0d0: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
d0e0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42  ation sequence B
d0f0: 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f  INARY. BINARY wo
d100: 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46  rks for both UTF
d110: 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d  -8.  ** and UTF-
d120: 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72  16, so add a ver
d130: 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f  sion for each to
d140: 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63   avoid any unnec
d150: 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76  essary.  ** conv
d160: 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c  ersions. The onl
d170: 79 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e  y error that can
d180: 20 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61   occur here is a
d190: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
d1a0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65  e..  */.  create
d1b0: 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42  Collation(db, "B
d1c0: 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55  INARY", SQLITE_U
d1d0: 54 46 38 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c  TF8, SQLITE_COLL
d1e0: 5f 42 49 4e 41 52 59 2c 20 30 2c 0a 20 20 20 20  _BINARY, 0,.    
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69                bi
d200: 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
d210: 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
d220: 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53  (db, "BINARY", S
d230: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 53  QLITE_UTF16BE, S
d240: 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52  QLITE_COLL_BINAR
d250: 59 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  Y, 0,.          
d260: 20 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46          binCollF
d270: 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
d280: 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
d290: 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f  BINARY", SQLITE_
d2a0: 55 54 46 31 36 4c 45 2c 20 53 51 4c 49 54 45 5f  UTF16LE, SQLITE_
d2b0: 43 4f 4c 4c 5f 42 49 4e 41 52 59 2c 20 30 2c 0a  COLL_BINARY, 0,.
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2d0: 20 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30    binCollFunc, 0
d2e0: 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
d2f0: 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22  tion(db, "RTRIM"
d300: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
d310: 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c  QLITE_COLL_USER,
d320: 20 28 76 6f 69 64 2a 29 31 2c 0a 20 20 20 20 20   (void*)1,.     
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e               bin
d340: 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
d350: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
d360: 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
d370: 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
d380: 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  .  db->pDfltColl
d390: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
d3a0: 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45  llSeq(db, SQLITE
d3b0: 5f 55 54 46 38 2c 20 22 42 49 4e 41 52 59 22 2c  _UTF8, "BINARY",
d3c0: 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64   0);.  assert( d
d3d0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20  b->pDfltColl!=0 
d3e0: 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64  );..  /* Also ad
d3f0: 64 20 61 20 55 54 46 2d 38 20 63 61 73 65 2d 69  d a UTF-8 case-i
d400: 6e 73 65 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61  nsensitive colla
d410: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a  tion sequence. *
d420: 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  /.  createCollat
d430: 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22  ion(db, "NOCASE"
d440: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
d450: 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53  QLITE_COLL_NOCAS
d460: 45 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  E, 0,.          
d470: 20 20 20 20 20 20 20 20 6e 6f 63 61 73 65 43 6f          nocaseCo
d480: 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b  llatingFunc, 0);
d490: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
d4a0: 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61 73 65  backend database
d4b0: 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 64 62 2d   driver */.  db-
d4c0: 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61  >openFlags = fla
d4d0: 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  gs;.  rc = sqlit
d4e0: 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 64  e3BtreeFactory(d
d4f0: 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 2c  b, zFilename, 0,
d500: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
d510: 43 41 43 48 45 5f 53 49 5a 45 2c 20 0a 20 20 20  CACHE_SIZE, .   
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d530: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20          flags | 
d540: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
d550: 5f 44 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _DB,.           
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d570: 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  &db->aDb[0].pBt)
d580: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
d590: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
d5a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
d5b0: 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  R_NOMEM ){.     
d5c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
d5d0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  EM;.    }.    sq
d5e0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
d5f0: 63 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  c, 0);.    goto 
d600: 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
d610: 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63    db->aDb[0].pSc
d620: 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63  hema = sqlite3Sc
d630: 68 65 6d 61 47 65 74 28 64 62 2c 20 64 62 2d 3e  hemaGet(db, db->
d640: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64  aDb[0].pBt);.  d
d650: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
d660: 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
d670: 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 0a 20  aGet(db, 0);... 
d680: 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   /* The default 
d690: 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72  safety_level for
d6a0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
d6b0: 73 65 20 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f  se is 'full'; fo
d6c0: 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20  r the temp.  ** 
d6d0: 64 61 74 61 62 61 73 65 20 69 74 20 69 73 20 27  database it is '
d6e0: 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d 61 74 63  NONE'. This matc
d6f0: 68 65 73 20 74 68 65 20 70 61 67 65 72 20 6c 61  hes the pager la
d700: 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a  yer defaults.  .
d710: 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30    */.  db->aDb[0
d720: 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22  ].zName = "main"
d730: 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73  ;.  db->aDb[0].s
d740: 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b  afety_level = 3;
d750: 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e  .  db->aDb[1].zN
d760: 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20  ame = "temp";.  
d770: 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74  db->aDb[1].safet
d780: 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a 20 20  y_level = 1;..  
d790: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
d7a0: 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20  TE_MAGIC_OPEN;. 
d7b0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
d7c0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
d7d0: 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
d7e0: 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  }..  /* Register
d7f0: 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75   all built-in fu
d800: 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20  nctions, but do 
d810: 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72  not attempt to r
d820: 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  ead the.  ** dat
d830: 61 62 61 73 65 20 73 63 68 65 6d 61 20 79 65 74  abase schema yet
d840: 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61 79 65  . This is delaye
d850: 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  d until the firs
d860: 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62  t time the datab
d870: 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65  ase.  ** is acce
d880: 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ssed..  */.  sql
d890: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
d8a0: 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73  LITE_OK, 0);.  s
d8b0: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 42 75  qlite3RegisterBu
d8c0: 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64  iltinFunctions(d
d8d0: 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61  b);..  /* Load a
d8e0: 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69  utomatic extensi
d8f0: 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73  ons - extensions
d900: 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
d910: 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20  registered.  ** 
d920: 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
d930: 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65  3_automatic_exte
d940: 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a  nsion() API..  *
d950: 2f 0a 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c  /.  sqlite3AutoL
d960: 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62  oadExtensions(db
d970: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
d980: 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
d990: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d9a0: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f  OK ){.    goto o
d9b0: 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pendb_out;.  }..
d9c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d9d0: 41 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20  ABLE_FTS1.  if( 
d9e0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
d9f0: 64 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  d ){.    extern 
da00: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31 49  int sqlite3Fts1I
da10: 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  nit(sqlite3*);. 
da20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
da30: 74 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts1Init(db);.  }
da40: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
da50: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
da60: 53 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S2.  if( !db->ma
da70: 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
da80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
da90: 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
daa0: 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 73 71  lite3Fts2Init(sq
dab0: 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20  lite3*);.    rc 
dac0: 3d 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69  = sqlite3Fts2Ini
dad0: 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
dae0: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
daf0: 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 69  _ENABLE_FTS3.  i
db00: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
db10: 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
db20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
db30: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69  = sqlite3Fts3Ini
db40: 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
db50: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
db60: 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69 66  _ENABLE_ICU.  if
db70: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
db80: 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
db90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
dba0: 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28   sqlite3IcuInit(
dbb0: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
dbc0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
dbd0: 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66  NABLE_RTREE.  if
dbe0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
dbf0: 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
dc00: 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20  E_OK){.    rc = 
dc10: 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74  sqlite3RtreeInit
dc20: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
dc30: 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ..  sqlite3Error
dc40: 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20  (db, rc, 0);..  
dc50: 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41  /* -DSQLITE_DEFA
dc60: 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
dc70: 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49  =1 makes EXCLUSI
dc80: 56 45 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c  VE the default l
dc90: 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65  ocking.  ** mode
dca0: 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41  .  -DSQLITE_DEFA
dcb0: 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
dcc0: 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74  =0 make NORMAL t
dcd0: 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
dce0: 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44  ng.  ** mode.  D
dcf0: 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20  oing nothing at 
dd00: 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e  all also makes N
dd10: 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c  ORMAL the defaul
dd20: 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  t..  */.#ifdef S
dd30: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
dd40: 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d  CKING_MODE.  db-
dd50: 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20  >dfltLockMode = 
dd60: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
dd70: 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73  OCKING_MODE;.  s
dd80: 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
dd90: 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74  ngMode(sqlite3Bt
dda0: 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62  reePager(db->aDb
ddb0: 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20  [0].pBt),.      
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55      SQLITE_DEFAU
dde0: 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29  LT_LOCKING_MODE)
ddf0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  ;.#endif..  /* E
de00: 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73  nable the lookas
de10: 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79  ide-malloc subsy
de20: 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c  stem */.  setupL
de30: 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20  ookaside(db, 0, 
de40: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
de50: 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c  fig.szLookaside,
de60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
de70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
de80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
de90: 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c  okaside);..  sql
dea0: 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
deb0: 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49  ckpoint(db, SQLI
dec0: 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41  TE_DEFAULT_WAL_A
ded0: 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a  UTOCHECKPOINT);.
dee0: 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69  .opendb_out:.  i
def0: 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73  f( db ){.    ass
df00: 65 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d  ert( db->mutex!=
df10: 30 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66  0 || isThreadsaf
df20: 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47  e==0 || sqlite3G
df30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
df40: 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20  lMutex==0 );.   
df50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
df60: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
df70: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
df80: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
df90: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
dfa0: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73  E_NOMEM ){.    s
dfb0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
dfc0: 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20  ;.    db = 0;.  
dfd0: 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
dfe0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64  LITE_OK ){.    d
dff0: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
e000: 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20  E_MAGIC_SICK;.  
e010: 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  }.#if defined(SQ
e020: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 55 54 4f  LITE_ENABLE_AUTO
e030: 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 66 28 20  _PROFILE).  if( 
e040: 64 62 20 26 26 20 21 72 63 20 29 7b 0a 20 20 20  db && !rc ){.   
e050: 20 63 68 61 72 20 2a 65 6e 76 70 72 6f 66 69 6c   char *envprofil
e060: 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  e = getenv("SQLI
e070: 54 45 5f 41 55 54 4f 5f 50 52 4f 46 49 4c 45 22  TE_AUTO_PROFILE"
e080: 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
e090: 65 6e 76 70 72 6f 66 69 6c 65 21 3d 4e 55 4c 4c  envprofile!=NULL
e0a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e0b0: 33 5f 70 72 6f 66 69 6c 65 28 64 62 2c 20 70 72  3_profile(db, pr
e0c0: 6f 66 69 6c 65 5f 73 71 6c 2c 20 4e 55 4c 4c 29  ofile_sql, NULL)
e0d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
e0e0: 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b  if.  *ppDb = db;
e0f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e100: 4e 41 42 4c 45 5f 53 51 4c 52 52 0a 20 20 53 52  NABLE_SQLRR.  SR
e110: 52 65 63 4f 70 65 6e 28 64 62 2c 20 7a 46 69 6c  RecOpen(db, zFil
e120: 65 6e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 23  ename, flags);.#
e130: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 73  endif.  return s
e140: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c  qlite3ApiExit(0,
e150: 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f   rc);.}../*.** O
e160: 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61  pen a new databa
e170: 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
e180: 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a  t sqlite3_open(.
e190: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
e1a0: 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
e1b0: 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20  te3 **ppDb .){. 
e1c0: 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61   return openData
e1d0: 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  base(zFilename, 
e1e0: 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ppDb,.          
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
e200: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
e210: 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
e220: 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e  CREATE, 0);.}.in
e230: 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  t sqlite3_open_v
e240: 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2(.  const char 
e250: 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  *filename,   /* 
e260: 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
e270: 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73  e (UTF-8) */.  s
e280: 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20  qlite3 **ppDb,  
e290: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
e2a0: 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20  QLite db handle 
e2b0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e2d0: 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  Flags */.  const
e2e0: 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20   char *zVfs     
e2f0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46     /* Name of VF
e300: 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20  S module to use 
e310: 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  */.){.  return o
e320: 70 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65  penDatabase(file
e330: 6e 61 6d 65 2c 20 70 70 44 62 2c 20 66 6c 61 67  name, ppDb, flag
e340: 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66  s, zVfs);.}..#if
e350: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e360: 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65  _UTF16./*.** Ope
e370: 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
e380: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
e390: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a  sqlite3_open16(.
e3a0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
e3b0: 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
e3c0: 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20  te3 **ppDb.){.  
e3d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
e3e0: 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69  ename8;   /* zFi
e3f0: 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69  lename encoded i
e400: 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20  n UTF-8 instead 
e410: 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73  of UTF-16 */.  s
e420: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
e430: 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  al;.  int rc;.. 
e440: 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
e450: 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  me );.  assert( 
e460: 70 70 44 62 20 29 3b 0a 20 20 2a 70 70 44 62 20  ppDb );.  *ppDb 
e470: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
e480: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
e490: 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  T.  rc = sqlite3
e4a0: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
e4b0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
e4c0: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56   rc;.#endif.  pV
e4d0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
e4e0: 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74  eNew(0);.  sqlit
e4f0: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
e500: 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  al, -1, zFilenam
e510: 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  e, SQLITE_UTF16N
e520: 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54  ATIVE, SQLITE_ST
e530: 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61  ATIC);.  zFilena
e540: 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  me8 = sqlite3Val
e550: 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c  ueText(pVal, SQL
e560: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28  ITE_UTF8);.  if(
e570: 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20   zFilename8 ){. 
e580: 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61     rc = openData
e590: 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c  base(zFilename8,
e5a0: 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
e5c0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
e5d0: 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
e5e0: 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20  _CREATE, 0);.   
e5f0: 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c   assert( *ppDb |
e600: 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
e610: 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  EM );.    if( rc
e620: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
e630: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70  DbHasProperty(*p
e640: 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d  pDb, 0, DB_Schem
e650: 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20  aLoaded) ){.    
e660: 20 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53    ENC(*ppDb) = S
e670: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
e680: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  E;.    }.  }else
e690: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
e6a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73  E_NOMEM;.  }.  s
e6b0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
e6c0: 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pVal);..  return
e6d0: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
e6e0: 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66  0, rc);.}.#endif
e6f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e700: 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
e710: 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
e720: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
e730: 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
e740: 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
e750: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
e760: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  eate_collation(.
e770: 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
e780: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
e790: 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
e7a0: 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
e7b0: 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
e7c0: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
e7d0: 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
e7e0: 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74   void*).){.  int
e7f0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d   rc;.  sqlite3_m
e800: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
e810: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
e820: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
e830: 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65  ed );.  rc = cre
e840: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
e850: 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c   zName, (u8)enc,
e860: 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45   SQLITE_COLL_USE
e870: 52 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  R, pCtx, xCompar
e880: 65 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  e, 0);.  rc = sq
e890: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
e8a0: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
e8b0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
e8c0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
e8d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
e8e0: 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
e8f0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
e900: 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
e910: 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
e920: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
e930: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
e940: 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
e950: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e960: 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
e970: 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
e980: 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
e990: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
e9a0: 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
e9b0: 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
e9c0: 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
e9d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
e9e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
e9f0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
ea00: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
ea10: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
ea20: 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
ea30: 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  ion(db, zName, (
ea40: 75 38 29 65 6e 63 2c 20 53 51 4c 49 54 45 5f 43  u8)enc, SQLITE_C
ea50: 4f 4c 4c 5f 55 53 45 52 2c 20 70 43 74 78 2c 20  OLL_USER, pCtx, 
ea60: 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b  xCompare, xDel);
ea70: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
ea80: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
ea90: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
eaa0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
eab0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
eac0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ead0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
eae0: 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
eaf0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
eb00: 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
eb10: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
eb20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
eb30: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
eb40: 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  16(.  sqlite3* d
eb50: 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  b, .  const void
eb60: 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65   *zName,.  int e
eb70: 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
eb80: 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
eb90: 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
eba0: 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
ebb0: 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
ebc0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
ebd0: 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  OK;.  char *zNam
ebe0: 65 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e8;.  sqlite3_mu
ebf0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
ec00: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
ec10: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
ec20: 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20  d );.  zName8 = 
ec30: 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28  sqlite3Utf16to8(
ec40: 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53  db, zName, -1, S
ec50: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
ec60: 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38  E);.  if( zName8
ec70: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65   ){.    rc = cre
ec80: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
ec90: 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63   zName8, (u8)enc
eca0: 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53  , SQLITE_COLL_US
ecb0: 45 52 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  ER, pCtx, xCompa
ecc0: 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  re, 0);.    sqli
ecd0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
ece0: 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20  ame8);.  }.  rc 
ecf0: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
ed00: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
ed10: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ed20: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
ed30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
ed40: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
ed50: 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
ed60: 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
ed70: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
ed80: 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
ed90: 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
eda0: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
edb0: 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
edc0: 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
edd0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
ede0: 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
edf0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
ee00: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20  ation_needed(.  
ee10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
ee20: 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
ee30: 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
ee40: 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64  CollNeeded)(void
ee50: 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
ee60: 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68  TextRep,const ch
ee70: 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ar*).){.  sqlite
ee80: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
ee90: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
eea0: 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43  xCollNeeded = xC
eeb0: 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d  ollNeeded;.  db-
eec0: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
eed0: 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e   0;.  db->pCollN
eee0: 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
eef0: 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
ef00: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
ef10: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
ef20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ef30: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
ef40: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
ef50: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
ef60: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
ef70: 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
ef80: 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
ef90: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
efa0: 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
efb0: 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
efc0: 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
efd0: 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
efe0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
eff0: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
f000: 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
f010: 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
f020: 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
f030: 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31  id(*xCollNeeded1
f040: 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  6)(void*,sqlite3
f050: 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
f060: 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
f070: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
f080: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
f090: 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
f0a0: 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43  ed = 0;.  db->xC
f0b0: 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43  ollNeeded16 = xC
f0c0: 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64  ollNeeded16;.  d
f0d0: 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
f0e0: 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
f0f0: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
f100: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
f110: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
f120: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
f130: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
f140: 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e  T_UTF16 */..#ifn
f150: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f160: 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
f170: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
f180: 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f  s now an anachro
f190: 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f  nism. It used to
f1a0: 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f   be used to reco
f1b0: 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61  ver from a.** ma
f1c0: 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20  lloc() failure, 
f1d0: 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64  but SQLite now d
f1e0: 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74  oes this automat
f1f0: 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  ically..*/.int s
f200: 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65  qlite3_global_re
f210: 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72  cover(void){.  r
f220: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f230: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
f240: 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   Test to see whe
f250: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
f260: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
f270: 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  ion is in autoco
f280: 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52  mmit.** mode.  R
f290: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
f2a0: 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66   is and FALSE if
f2b0: 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69   not.  Autocommi
f2c0: 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20  t mode is on.** 
f2d0: 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74  by default.  Aut
f2e0: 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62  ocommit is disab
f2f0: 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e 20 73  led by a BEGIN s
f300: 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65  tatement and ree
f310: 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65  nabled.** by the
f320: 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20   next COMMIT or 
f330: 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 2a  ROLLBACK..**.***
f340: 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20 41 4e 20  **** THIS IS AN 
f350: 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 41 50 49  EXPERIMENTAL API
f360: 20 41 4e 44 20 49 53 20 53 55 42 4a 45 43 54 20   AND IS SUBJECT 
f370: 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a 2a 2a 2a  TO CHANGE ******
f380: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
f390: 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73  get_autocommit(s
f3a0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
f3b0: 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f  eturn db->autoCo
f3c0: 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  mmit;.}../*.** T
f3d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
f3e0: 74 69 6e 65 73 20 61 72 65 20 73 75 62 74 69 74  tines are subtit
f3f0: 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74 61 6e  utes for constan
f400: 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ts SQLITE_CORRUP
f410: 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53  T,.** SQLITE_MIS
f420: 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  USE, SQLITE_CANT
f430: 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49 4f 45  OPEN, SQLITE_IOE
f440: 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  RR and possibly 
f450: 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63  other error.** c
f460: 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 79 20  onstants.  They 
f470: 73 65 72 76 65 72 20 74 77 6f 20 70 75 72 70 6f  server two purpo
f480: 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20  ses:.**.**   1. 
f490: 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e 76   Serve as a conv
f4a0: 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20  enient place to 
f4b0: 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
f4c0: 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a 2a   in a debugger.*
f4d0: 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65 63  *       to detec
f4e0: 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20 65  t when version e
f4f0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  rror conditions 
f500: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  occurs..**.**   
f510: 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74  2.  Invoke sqlit
f520: 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f 76  e3_log() to prov
f530: 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20 63  ide the source c
f540: 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65  ode location whe
f550: 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c 6f  re.**       a lo
f560: 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69 73  w-level error is
f570: 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64 2e   first detected.
f580: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
f590: 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74 20  orruptError(int 
f5a0: 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63  lineno){.  testc
f5b0: 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
f5c0: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
f5d0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   );.  sqlite3_lo
f5e0: 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  g(SQLITE_CORRUPT
f5f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f600: 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70  "database corrup
f610: 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25 64 20  tion at line %d 
f620: 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
f630: 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e             linen
f640: 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f  o, 20+sqlite3_so
f650: 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74  urceid());.  ret
f660: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f670: 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  PT;.}.int sqlite
f680: 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e 74  3MisuseError(int
f690: 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
f6a0: 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
f6b0: 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
f6c0: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
f6d0: 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  og(SQLITE_MISUSE
f6e0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
f6f0: 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69 6e 65   "misuse at line
f700: 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c   %d of [%.10s]",
f710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
f720: 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65  ineno, 20+sqlite
f730: 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
f740: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
f750: 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73 71 6c  ISUSE;.}.int sql
f760: 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f  ite3CantopenErro
f770: 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
f780: 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
f790: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
f7a0: 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Log!=0 );.  sqli
f7b0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43  te3_log(SQLITE_C
f7c0: 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20 20 20  ANTOPEN, .      
f7d0: 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
f7e0: 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c 69 6e  open file at lin
f7f0: 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
f800: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f810: 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
f820: 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
f830: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f840: 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23 69  CANTOPEN;.}...#i
f850: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f860: 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
f870: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e  ** This is a con
f880: 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65  venience routine
f890: 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
f8a0: 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64   that all thread
f8b0: 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74  -specific.** dat
f8c0: 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65 61  a for this threa
f8d0: 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c  d has been deall
f8e0: 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ocated..**.** SQ
f8f0: 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75  Lite no longer u
f900: 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63 69  ses thread-speci
f910: 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69 73  fic data so this
f920: 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20   routine is now 
f930: 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20  a.** no-op.  It 
f940: 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20  is retained for 
f950: 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61  historical compa
f960: 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69  tibility..*/.voi
f970: 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  d sqlite3_thread
f980: 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a  _cleanup(void){.
f990: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
f9a0: 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f  Return meta info
f9b0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20  rmation about a 
f9c0: 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20  specific column 
f9d0: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74 61  of a database ta
f9e0: 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d  ble..** See comm
f9f0: 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  ent in sqlite3.h
fa00: 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66   (sqlite.h.in) f
fa10: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23  or details..*/.#
fa20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
fa30: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
fa40: 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ATA.int sqlite3_
fa50: 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
fa60: 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33  adata(.  sqlite3
fa70: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
fa80: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
fa90: 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  on handle */.  c
faa0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
fab0: 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61  me,        /* Da
fac0: 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e  tabase name or N
fad0: 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
fae0: 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c  har *zTableName,
faf0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61       /* Table na
fb00: 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  me */.  const ch
fb10: 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  ar *zColumnName,
fb20: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
fb30: 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  me */.  char con
fb40: 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c  st **pzDataType,
fb50: 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44      /* OUTPUT: D
fb60: 65 63 6c 61 72 65 64 20 64 61 74 61 20 74 79 70  eclared data typ
fb70: 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  e */.  char cons
fb80: 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20  t **pzCollSeq,  
fb90: 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f     /* OUTPUT: Co
fba0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
fbb0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   name */.  int *
fbc0: 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20  pNotNull,       
fbd0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
fbe0: 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55  : True if NOT NU
fbf0: 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  LL constraint ex
fc00: 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ists */.  int *p
fc10: 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20  PrimaryKey,     
fc20: 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
fc30: 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20   True if column 
fc40: 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20  part of PK */.  
fc50: 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20  int *pAutoinc   
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
fc70: 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
fc80: 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e  olumn is auto-in
fc90: 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  crement */.){.  
fca0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
fcb0: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54  zErrMsg = 0;.  T
fcc0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a  able *pTab = 0;.
fcd0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
fce0: 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a   0;.  int iCol;.
fcf0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
fd00: 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20  DataType = 0;.  
fd10: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
fd20: 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lSeq = 0;.  int 
fd30: 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69  notnull = 0;.  i
fd40: 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20  nt primarykey = 
fd50: 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63  0;.  int autoinc
fd60: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75   = 0;..  /* Ensu
fd70: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
fd80: 73 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20  schema has been 
fd90: 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  loaded */.  sqli
fda0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
fdb0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
fdc0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
fdd0: 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73  ll(db);.  rc = s
fde0: 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26  qlite3Init(db, &
fdf0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
fe00: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
fe10: 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
fe20: 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  out;.  }..  /* L
fe30: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
fe40: 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20  in question */. 
fe50: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
fe60: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61  indTable(db, zTa
fe70: 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65  bleName, zDbName
fe80: 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c  );.  if( !pTab |
fe90: 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
fea0: 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b  ){.    pTab = 0;
feb0: 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
fec0: 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  out;.  }..  /* F
fed0: 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66  ind the column f
fee0: 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73  or which info is
fef0: 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
ff00: 69 66 28 20 73 71 6c 69 74 65 33 49 73 52 6f 77  if( sqlite3IsRow
ff10: 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  id(zColumnName) 
ff20: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
ff30: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 69  ab->iPKey;.    i
ff40: 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
ff50: 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
ff60: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
ff70: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
ff80: 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
ff90: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
ffa0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f  ol++){.      pCo
ffb0: 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
ffc0: 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28  iCol];.      if(
ffd0: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
ffe0: 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  mp(pCol->zName, 
fff0: 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
10000 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10010 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
10020 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d   if( iCol==pTab-
10030 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70  >nCol ){.      p
10040 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67  Tab = 0;.      g
10050 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
10060 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
10070 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
10080 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65  ck stores the me
10090 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ta information t
100a0 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
100b0 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65  rned.  ** to the
100c0 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c   caller in local
100d0 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61   variables zData
100e0 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20  Type, zCollSeq, 
100f0 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79  notnull, primary
10100 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74  key.  ** and aut
10110 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f  oinc. At this po
10120 69 6e 74 20 74 68 65 72 65 20 61 72 65 20 74 77  int there are tw
10130 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a  o possibilities:
10140 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
10150 31 2e 20 54 68 65 20 73 70 65 63 69 66 69 65 64  1. The specified
10160 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73   column name was
10170 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f   rowid", "oid" o
10180 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a  r "_rowid_" .  *
10190 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65  *        and the
101a0 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69  re is no explici
101b0 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b  tly declared IPK
101c0 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20   column. .  **. 
101d0 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74   **     2. The t
101e0 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69  able is not a vi
101f0 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d  ew and the colum
10200 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65  n name identifie
10210 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20  d an .  **      
10220 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63    explicitly dec
10230 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f  lared column. Co
10240 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  py meta informat
10250 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a  ion from *pCol..
10260 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c    */ .  if( pCol
10270 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70   ){.    zDataTyp
10280 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b  e = pCol->zType;
10290 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20  .    zCollSeq = 
102a0 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20  pCol->zColl;.   
102b0 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d   notnull = pCol-
102c0 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20  >notNull!=0;.   
102d0 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 70   primarykey  = p
102e0 43 6f 6c 2d 3e 69 73 50 72 69 6d 4b 65 79 21 3d  Col->isPrimKey!=
102f0 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d  0;.    autoinc =
10300 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43   pTab->iPKey==iC
10310 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62  ol && (pTab->tab
10320 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
10330 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20  ncrement)!=0;.  
10340 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61  }else{.    zData
10350 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
10360 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79  ;.    primarykey
10370 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
10380 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  !zCollSeq ){.   
10390 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e   zCollSeq = "BIN
103a0 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72  ARY";.  }..error
103b0 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42  _out:.  sqlite3B
103c0 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
103d0 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20  ;..  /* Whether 
103e0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  the function cal
103f0 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72 20 66  l succeeded or f
10400 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f  ailed, set the o
10410 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
10420 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65  .  ** to whateve
10430 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f  r their local co
10440 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61  unterparts conta
10450 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  in. If an error 
10460 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20  did occur,.  ** 
10470 74 68 69 73 20 68 61 73 20 74 68 65 20 65 66 66  this has the eff
10480 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61  ect of zeroing a
10490 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  ll output parame
104a0 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ters..  */.  if(
104b0 20 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70   pzDataType ) *p
104c0 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74  zDataType = zDat
104d0 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43  aType;.  if( pzC
104e0 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c  ollSeq ) *pzColl
104f0 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a  Seq = zCollSeq;.
10500 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29    if( pNotNull )
10510 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74   *pNotNull = not
10520 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69  null;.  if( pPri
10530 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d  maryKey ) *pPrim
10540 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79  aryKey = primary
10550 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f  key;.  if( pAuto
10560 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20  inc ) *pAutoinc 
10570 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66  = autoinc;..  if
10580 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20  ( SQLITE_OK==rc 
10590 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
105a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
105b0 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
105c0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
105d0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f  3MPrintf(db, "no
105e0 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75   such table colu
105f0 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62  mn: %s.%s", zTab
10600 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  leName,.        
10610 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20  zColumnName);.  
10620 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
10630 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
10640 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
10650 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29  (zErrMsg?"%s":0)
10660 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71  , zErrMsg);.  sq
10670 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10680 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d  zErrMsg);.  rc =
10690 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
106a0 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
106b0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
106c0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
106d0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
106e0 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
106f0 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
10700 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
10710 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
10720 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pt..*/.int sqlit
10730 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29  e3_sleep(int ms)
10740 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
10750 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  *pVfs;.  int rc;
10760 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65  .  pVfs = sqlite
10770 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
10780 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72   if( pVfs==0 ) r
10790 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54  eturn 0;..  /* T
107a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  his function wor
107b0 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e  ks in millisecon
107c0 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65  ds, but the unde
107d0 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29  rlying OsSleep()
107e0 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20   .  ** API uses 
107f0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65  microseconds. He
10800 6e 63 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a  nce the 1000's..
10810 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c    */.  rc = (sql
10820 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73  ite3OsSleep(pVfs
10830 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29  , 1000*ms)/1000)
10840 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10850 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f  ../*.** Enable o
10860 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 65 78  r disable the ex
10870 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f  tended result co
10880 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  des..*/.int sqli
10890 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  te3_extended_res
108a0 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65  ult_codes(sqlite
108b0 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66  3 *db, int onoff
108c0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
108d0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
108e0 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
108f0 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66  sk = onoff ? 0xf
10900 66 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a  fffffff : 0xff;.
10910 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10920 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
10930 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10940 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
10950 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43  nvoke the xFileC
10960 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e  ontrol method on
10970 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
10980 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
10990 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
109a0 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  rol(sqlite3 *db,
109b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
109c0 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f  Name, int op, vo
109d0 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74  id *pArg){.  int
109e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
109f0 4f 52 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20  OR;.  int iDb;. 
10a00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10a10 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
10a20 0a 20 20 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d  .  if( zDbName==
10a30 30 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 30  0 ){.    iDb = 0
10a40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
10a50 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62  or(iDb=0; iDb<db
10a60 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20  ->nDb; iDb++){. 
10a70 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
10a80 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
10a90 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3d 3d 30 20  me, zDbName)==0 
10aa0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
10ab0 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 64 62 2d   }.  if( iDb<db-
10ac0 3e 6e 44 62 20 29 7b 0a 20 20 20 20 42 74 72 65  >nDb ){.    Btre
10ad0 65 20 2a 70 42 74 72 65 65 20 3d 20 64 62 2d 3e  e *pBtree = db->
10ae0 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20  aDb[iDb].pBt;.  
10af0 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
10b00 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61        Pager *pPa
10b10 67 65 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ger;.      sqlit
10b20 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20  e3_file *fd;.   
10b30 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
10b40 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
10b50 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
10b60 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
10b70 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20 61 73  Btree);.      as
10b80 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
10b90 29 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 73 71  );.      fd = sq
10ba0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
10bb0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
10bc0 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20  sert( fd!=0 );. 
10bd0 20 20 20 20 20 69 66 28 20 66 64 2d 3e 70 4d 65       if( fd->pMe
10be0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20  thods ){.       
10bf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
10c00 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f  ileControl(fd, o
10c10 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20 20  p, pArg);.      
10c20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
10c30 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
10c40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
10c50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10c60 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
10c70 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 0a 7d   return rc;   .}
10c80 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ../*.** Interfac
10c90 65 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67  e to the testing
10ca0 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73   logic..*/.int s
10cb0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
10cc0 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  rol(int op, ...)
10cd0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
10ce0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10cf0 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54  MIT_BUILTIN_TEST
10d00 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
10d10 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70   va_start(ap, op
10d20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  );.  switch( op 
10d30 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  ){..    /*.    *
10d40 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
10d50 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
10d60 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  PRNG..    */.   
10d70 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
10d80 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a  TCTRL_PRNG_SAVE:
10d90 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
10da0 50 72 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b  PrngSaveState();
10db0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10dc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
10dd0 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 73  ** Restore the s
10de0 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47  tate of the PRNG
10df0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61   to the last sta
10e00 74 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20  te saved using. 
10e10 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e     ** PRNG_SAVE.
10e20 20 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68    If PRNG_SAVE h
10e30 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20  as never before 
10e40 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65  been called, the
10e50 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65  n.    ** this ve
10e60 72 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e  rb acts like PRN
10e70 47 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a  G_RESET..    */.
10e80 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
10e90 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
10ea0 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73  STORE: {.      s
10eb0 71 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72  qlite3PrngRestor
10ec0 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  eState();.      
10ed0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
10ee0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65    /*.    ** Rese
10ef0 74 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20  t the PRNG back 
10f00 74 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c  to its uninitial
10f10 69 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68 65  ized state.  The
10f20 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a   next call.    *
10f30 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e  * to sqlite3_ran
10f40 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72  domness() will r
10f50 65 73 65 65 64 20 74 68 65 20 50 52 4e 47 20 75  eseed the PRNG u
10f60 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61  sing a single ca
10f70 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  ll.    ** to the
10f80 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74   xRandomness met
10f90 68 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61 75  hod of the defau
10fa0 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20  lt VFS..    */. 
10fb0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
10fc0 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
10fd0 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ET: {.      sqli
10fe0 74 65 33 50 72 6e 67 52 65 73 65 74 53 74 61 74  te3PrngResetStat
10ff0 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
11000 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
11010 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
11020 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54  test_control(BIT
11030 56 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20  VEC_TEST, size, 
11040 70 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a  program).    **.
11050 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73      ** Run a tes
11060 74 20 61 67 61 69 6e 73 74 20 61 20 42 69 74 76  t against a Bitv
11070 65 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a  ec object of siz
11080 65 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20  e.  The program 
11090 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20  argument.    ** 
110a0 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69  is an array of i
110b0 6e 74 65 67 65 72 73 20 74 68 61 74 20 64 65 66  ntegers that def
110c0 69 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20 20  ines the test.  
110d0 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20  Return -1 on a. 
110e0 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c     ** memory all
110f0 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30  ocation error, 0
11100 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20   on success, or 
11110 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20  non-zero for an 
11120 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65  error..    ** Se
11130 65 20 74 68 65 20 73 71 6c 69 74 65 33 42 69 74  e the sqlite3Bit
11140 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29  vecBuiltinTest()
11150 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
11160 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
11170 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
11180 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54  ITE_TESTCTRL_BIT
11190 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20  VEC_TEST: {.    
111a0 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72    int sz = va_ar
111b0 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
111c0 20 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76    int *aProg = v
111d0 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b  a_arg(ap, int*);
111e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
111f0 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e  te3BitvecBuiltin
11200 54 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b  Test(sz, aProg);
11210 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11220 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
11230 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
11240 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f  _control(BENIGN_
11250 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42  MALLOC_HOOKS, xB
11260 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20  egin, xEnd).    
11270 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74  **.    ** Regist
11280 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c  er hooks to call
11290 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69   to indicate whi
112a0 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  ch malloc() fail
112b0 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65  ures .    ** are
112c0 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a   benign..    */.
112d0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
112e0 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f  TESTCTRL_BENIGN_
112f0 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a  MALLOC_HOOKS: {.
11300 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
11310 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69  id (*void_functi
11320 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20  on)(void);.     
11330 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78   void_function x
11340 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20  BenignBegin;.   
11350 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e     void_function
11360 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20   xBenignEnd;.   
11370 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20     xBenignBegin 
11380 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
11390 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20  d_function);.   
113a0 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20     xBenignEnd = 
113b0 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f  va_arg(ap, void_
113c0 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  function);.     
113d0 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61   sqlite3BenignMa
113e0 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67  llocHooks(xBenig
113f0 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45  nBegin, xBenignE
11400 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nd);.      break
11410 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
11420 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
11430 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
11440 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e  ITE_TESTCTRL_PEN
11450 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67  DING_BYTE, unsig
11460 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  ned int X).    *
11470 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
11480 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f   PENDING byte to
11490 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
114a0 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58  e argument, if X
114b0 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20  >0..    ** Make 
114c0 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d  no changes if X=
114d0 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  =0.  Return the 
114e0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e  value of the pen
114f0 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a  ding byte.    **
11500 20 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20   as it existing 
11510 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
11520 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ine was called..
11530 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d      **.    ** IM
11540 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69  PORTANT:  Changi
11550 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  ng the PENDING b
11560 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30  yte from 0x40000
11570 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20  000 results in. 
11580 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61     ** an incompa
11590 74 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66  tible database f
115a0 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61  ile format.  Cha
115b0 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e  nging the PENDIN
115c0 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68  G byte.    ** wh
115d0 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65  ile any database
115e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
115f0 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75  pen results in u
11600 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20  ndefined and.   
11610 20 2a 2a 20 64 69 6c 65 74 65 72 69 6f 75 73 20   ** dileterious 
11620 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f  behavior..    */
11630 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
11640 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
11650 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20  G_BYTE: {.      
11660 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rc = PENDING_BYT
11670 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  E;.#ifndef SQLIT
11680 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20  E_OMIT_WSD.     
11690 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67   {.        unsig
116a0 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d  ned int newVal =
116b0 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69   va_arg(ap, unsi
116c0 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20  gned int);.     
116d0 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20     if( newVal ) 
116e0 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79  sqlite3PendingBy
116f0 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20  te = newVal;.   
11700 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
11710 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
11720 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
11730 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
11740 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
11750 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20  TRL_ASSERT, int 
11760 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
11770 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f   This action pro
11780 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65  vides a run-time
11790 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   test to see whe
117a0 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20  ther or not.    
117b0 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20  ** assert() was 
117c0 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
117d0 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69  le-time.  If X i
117e0 73 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72  s true and asser
117f0 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e  t().    ** is en
11800 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
11810 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
11820 74 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74  true.  If X is t
11830 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  rue and.    ** a
11840 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
11850 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
11860 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
11870 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20  ro.  If X is.   
11880 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73   ** false and as
11890 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65  sert() is enable
118a0 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65  d, then the asse
118b0 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20  rtion fires and 
118c0 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
118d0 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58  ss aborts.  If X
118e0 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73   is false and as
118f0 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
11900 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ed, then the.   
11910 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
11920 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   is zero..    */
11930 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
11940 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
11950 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69  : {.      volati
11960 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20  le int x = 0;.  
11970 20 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d      assert( (x =
11980 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29   va_arg(ap,int))
11990 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  !=0 );.      rc 
119a0 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = x;.      break
119b0 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
119c0 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
119d0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
119e0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
119f0 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20  WAYS, int X).   
11a00 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
11a10 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
11a20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
11a30 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41  to see how the A
11a40 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a  LWAYS and.    **
11a50 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65   NEVER macros we
11a60 72 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f  re defined at co
11a70 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20  mpile-time..    
11a80 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
11a90 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c  turn value is AL
11aa0 57 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a  WAYS(X).  .    *
11ab0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  *.    ** The rec
11ac0 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73  ommended test is
11ad0 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72   X==2.  If the r
11ae0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32  eturn value is 2
11af0 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20  , that means.   
11b00 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64   ** ALWAYS() and
11b10 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74   NEVER() are bot
11b20 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  h no-op pass-thr
11b30 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69  ough macros, whi
11b40 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ch is the.    **
11b50 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
11b60 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
11b70 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65   value is 1, the
11b80 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69  n ALWAYS() is ei
11b90 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64  ther.    ** hard
11ba0 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f  -coded to true o
11bb0 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74  r else it assert
11bc0 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e  s if its argumen
11bd0 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  t is false..    
11be0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68  ** The first beh
11bf0 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65  avior (hard-code
11c00 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68  d to true) is th
11c10 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
11c20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
11c30 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
11c40 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64  at assert() is d
11c50 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  isabled and the 
11c60 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65  second.    ** be
11c70 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69  havior (assert i
11c80 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
11c90 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61  o ALWAYS() is fa
11ca0 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65  lse) is the case
11cb0 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
11cc0 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
11cd0 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
11ce0 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
11cf0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
11d00 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  The run-time tes
11d10 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68  t procedure migh
11d20 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67  t look something
11d30 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
11d40 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28  **.    **    if(
11d50 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
11d60 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
11d70 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29  TCTRL_ALWAYS, 2)
11d80 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20  ==2 ){.    **   
11d90 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61     // ALWAYS() a
11da0 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e  nd NEVER() are n
11db0 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67  o-op pass-throug
11dc0 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20  h macros.    ** 
11dd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
11de0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
11df0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
11e00 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a  L_ASSERT, 1) ){.
11e10 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
11e20 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73  LWAYS(x) asserts
11e30 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e   that x is true.
11e40 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74   NEVER(x) assert
11e50 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  s x is false..  
11e60 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    **    }else{. 
11e70 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
11e80 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e  WAYS(x) is a con
11e90 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28  stant 1.  NEVER(
11ea0 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
11eb0 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a   0..    **    }.
11ec0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
11ed0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
11ee0 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20  ALWAYS: {.      
11ef0 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
11f00 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  p,int);.      rc
11f10 20 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20   = ALWAYS(x);.  
11f20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11f30 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
11f40 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
11f50 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
11f60 52 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33  RESERVE, sqlite3
11f70 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20   *db, int N).   
11f80 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74   **.    ** Set t
11f90 68 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65  he nReserve size
11fa0 20 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61   to N for the ma
11fb0 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74  in database on t
11fc0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
11fd0 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ** connection db
11fe0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
11ff0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
12000 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20  L_RESERVE: {.   
12010 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
12020 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
12030 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  te3*);.      int
12040 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69   x = va_arg(ap,i
12050 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
12060 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
12070 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
12080 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
12090 50 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62  PageSize(db->aDb
120a0 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30  [0].pBt, 0, x, 0
120b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
120c0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
120d0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62  >mutex);.      b
120e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
120f0 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   /*  sqlite3_tes
12100 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
12110 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
12120 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33  ZATIONS, sqlite3
12130 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20   *db, int N).   
12140 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c   **.    ** Enabl
12150 65 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72  e or disable var
12160 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ious optimizatio
12170 6e 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  ns for testing p
12180 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20  urposes.  The . 
12190 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e     ** argument N
121a0 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
121b0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74   optimizations t
121c0 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20  o be disabled.  
121d0 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a  For normal.    *
121e0 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68  * operation N sh
121f0 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
12200 69 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74  idea is that a t
12210 65 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b  est program (lik
12220 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c  e the.    ** SQL
12230 20 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53   Logic Test or S
12240 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20  LT test module) 
12250 63 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65  can run the same
12260 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69   SQL multiple ti
12270 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  mes.    ** with 
12280 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61  various optimiza
12290 74 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74  tions disabled t
122a0 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
122b0 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20  e same answer.  
122c0 20 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64    ** is obtained
122d0 20 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a   in every case..
122e0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
122f0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
12300 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b  OPTIMIZATIONS: {
12310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
12320 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
12330 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
12340 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28   int x = va_arg(
12350 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 64  ap,int);.      d
12360 62 2d 3e 66 6c 61 67 73 20 3d 20 28 78 20 26 20  b->flags = (x & 
12370 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29 20  SQLITE_OptMask) 
12380 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 7e  | (db->flags & ~
12390 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29 3b  SQLITE_OptMask);
123a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
123b0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
123c0 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20  TE_N_KEYWORD.   
123d0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
123e0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
123f0 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f  TESTCTRL_ISKEYWO
12400 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  RD, const char *
12410 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20  zWord).    **.  
12420 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73    ** If zWord is
12430 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67   a keyword recog
12440 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61 72  nized by the par
12450 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ser, then return
12460 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62   the.    ** numb
12470 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20  er of keywords. 
12480 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20   Or if zWord is 
12490 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72  not a keyword, r
124a0 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20  eturn 0..    ** 
124b0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73  .    ** This tes
124c0 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c  t feature is onl
124d0 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  y available in t
124e0 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20  he amalgamation 
124f0 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65  since.    ** the
12500 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
12510 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64  D macro is not d
12520 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66  efined in this f
12530 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20  ile if SQLite.  
12540 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73    ** is built us
12550 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f 75  ing separate sou
12560 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a  rce files..    *
12570 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
12580 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59  E_TESTCTRL_ISKEY
12590 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f  WORD: {.      co
125a0 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20  nst char *zWord 
125b0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e  = va_arg(ap, con
125c0 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
125d0 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
125e0 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b  Strlen30(zWord);
125f0 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c  .      rc = (sql
12600 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28  ite3KeywordCode(
12610 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d  (u8*)zWord, n)!=
12620 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f  TK_ID) ? SQLITE_
12630 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20  N_KEYWORD : 0;. 
12640 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12650 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f  }.#endif ..    /
12660 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
12670 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
12680 53 54 43 54 52 4c 5f 50 47 48 44 52 53 5a 29 0a  STCTRL_PGHDRSZ).
12690 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65      **.    ** Re
126a0 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
126b0 20 61 20 70 63 61 63 68 65 20 68 65 61 64 65 72   a pcache header
126c0 20 69 6e 20 62 79 74 65 73 2e 0a 20 20 20 20 2a   in bytes..    *
126d0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
126e0 45 5f 54 45 53 54 43 54 52 4c 5f 50 47 48 44 52  E_TESTCTRL_PGHDR
126f0 53 5a 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  SZ: {.      rc =
12700 20 73 69 7a 65 6f 66 28 50 67 48 64 72 29 3b 0a   sizeof(PgHdr);.
12710 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12720 20 7d 0a 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64   }..  }.  va_end
12730 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  (ap);.#endif /* 
12740 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c  SQLITE_OMIT_BUIL
12750 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65  TIN_TEST */.  re
12760 74 75 72 6e 20 72 63 3b 0a 7d 0a                 turn rc;.}.