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

Artifact cb5ce39624f312888a9058d6fcacb54a9f6e5e85:


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: 2a 0a 2a 2a 20 24 49 64 3a 20 6d 61 69 6e 2e 63  *.** $Id: main.c
0270: 2c 76 20 31 2e 35 33 33 20 32 30 30 39 2f 30 33  ,v 1.533 2009/03
0280: 2f 31 39 20 31 38 3a 35 31 3a 30 37 20 64 61 6e  /19 18:51:07 dan
0290: 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 2a  ielk1977 Exp $.*
02a0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
02b0: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
02c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
02d0: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02e0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0300: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
0310: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
0320: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
0330: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0340: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0350: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  u.h".#endif../*.
0360: 2a 2a 20 54 68 65 20 76 65 72 73 69 6f 6e 20 6f  ** The version o
0370: 66 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2f  f the library.*/
0380: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0390: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 63 6f 6e  AMALGAMATION.con
03a0: 73 74 20 63 68 61 72 20 73 71 6c 69 74 65 33 5f  st char sqlite3_
03b0: 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c 49  version[] = SQLI
03c0: 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e 64  TE_VERSION;.#end
03d0: 69 66 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  if.const char *s
03e0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
03f0: 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  n(void){ return 
0400: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 3b  sqlite3_version;
0410: 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c   }.int sqlite3_l
0420: 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72  ibversion_number
0430: 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53  (void){ return S
0440: 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  QLITE_VERSION_NU
0450: 4d 42 45 52 3b 20 7d 0a 69 6e 74 20 73 71 6c 69  MBER; }.int sqli
0460: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 76  te3_threadsafe(v
0470: 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c  oid){ return SQL
0480: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3b 20  ITE_THREADSAFE; 
0490: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
04a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
04b0: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
04c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
04d0: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ACE)./*.** If th
04e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
04f0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20  tion pointer is 
0500: 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a  not NULL and if.
0510: 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ** SQLITE_ENABLE
0520: 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62  _IOTRACE is enab
0530: 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67  led, then messag
0540: 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a  es describing.**
0550: 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20   I/O active are 
0560: 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68  written using th
0570: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  is function.  Th
0580: 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20  ese messages.** 
0590: 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72  are intended for
05a0: 20 64 65 62 75 67 67 69 6e 67 20 61 63 74 69 76   debugging activ
05b0: 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ity only..*/.voi
05c0: 64 20 28 2a 73 71 6c 69 74 65 33 49 6f 54 72 61  d (*sqlite3IoTra
05d0: 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ce)(const char*,
05e0: 20 2e 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e 64 69   ...) = 0;.#endi
05f0: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
0600: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
0610: 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73   variable points
0620: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69   to a string whi
0630: 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d  ch is the.** nam
0640: 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79  e of a directory
0650: 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69 72 65  , then that dire
0660: 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73  ctory will be us
0670: 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74  ed to store.** t
0680: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a  emporary files..
0690: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  **.** See also t
06a0: 68 65 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f  he "PRAGMA temp_
06b0: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22  store_directory"
06c0: 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   SQL command..*/
06d0: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 74  .char *sqlite3_t
06e0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
06f0: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  0;../*.** Initia
0700: 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a  lize SQLite.  .*
0710: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0720: 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
0730: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
0740: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
0750: 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e  tion,.** VFS, an
0760: 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  d mutex subsyste
0770: 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ms prior to doin
0780: 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f  g any serious wo
0790: 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74  rk with.** SQLit
07a0: 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20  e.  But as long 
07b0: 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f  as you do not co
07c0: 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54  mpile with SQLIT
07d0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
07e0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
07f0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61  will be called a
0800: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20  utomatically by 
0810: 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63  key routines suc
0820: 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  h as.** sqlite3_
0830: 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  open().  .**.** 
0840: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0850: 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f  a no-op except o
0860: 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73 74  n its very first
0870: 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72   call for the pr
0880: 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72  ocess,.** or for
0890: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
08a0: 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
08b0: 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
08c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
08d0: 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c  t thread to call
08e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
08f0: 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ns the initializ
0900: 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70  ation to.** comp
0910: 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73  letion.  If subs
0920: 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20 63  equent threads c
0930: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
0940: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
0950: 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20  t.** thread has 
0960: 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69  finished the ini
0970: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63  tialization proc
0980: 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75  ess, then the su
0990: 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65  bsequent.** thre
09a0: 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  ads must block u
09b0: 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74  ntil the first t
09c0: 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20 77  hread finishes w
09d0: 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ith the initiali
09e0: 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  zation..**.** Th
09f0: 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20 6d  e first thread m
0a00: 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72  ight call this r
0a10: 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76 65  outine recursive
0a20: 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a  ly.  Recursive.*
0a30: 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20  * calls to this 
0a40: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e  routine should n
0a50: 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75  ot block, of cou
0a60: 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  rse.  Otherwise 
0a70: 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  the.** initializ
0a80: 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f  ation process wo
0a90: 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65  uld never comple
0aa0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20  te..**.** Let X 
0ab0: 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68 72  be the first thr
0ac0: 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69  ead to enter thi
0ad0: 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20  s routine.  Let 
0ae0: 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a  Y be some other.
0af0: 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e  ** thread.  Then
0b00: 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69   while the initi
0b10: 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  al invocation of
0b20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79   this routine by
0b30: 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c   X is.** incompl
0b40: 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75 69  ete, it is requi
0b50: 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  red that:.**.** 
0b60: 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74     *  Calls to t
0b70: 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d  his routine from
0b80: 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e   Y must block un
0b90: 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f  til the outer-mo
0ba0: 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c  st.**       call
0bb0: 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e   by X completes.
0bc0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63  .**.**    *  Rec
0bd0: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20  ursive calls to 
0be0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
0bf0: 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75 72  m thread X retur
0c00: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  n immediately.**
0c10: 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 62         without b
0c20: 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
0c30: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
0c40: 7a 65 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ze(void){.  sqli
0c50: 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
0c60: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
0c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0c80: 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65  main static mute
0c90: 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  x */.  int rc;  
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
0cd0: 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  de */..#ifdef SQ
0ce0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20  LITE_OMIT_WSD.  
0cf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64  rc = sqlite3_wsd
0d00: 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b  _init(4096, 24);
0d10: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
0d20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
0d30: 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
0d40: 66 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74  f..  /* If SQLit
0d50: 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d  e is already com
0d60: 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69  pletely initiali
0d70: 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63  zed, then this c
0d80: 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69  all.  ** to sqli
0d90: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
0da0: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d   should be a no-
0db0: 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69  op.  But the ini
0dc0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
0dd0: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74   must be complet
0de0: 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75  e.  So isInit mu
0df0: 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e  st not be set un
0e00: 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64  til the very end
0e10: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  .  ** of this ro
0e20: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  utine..  */.  if
0e30: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
0e40: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72  onfig.isInit ) r
0e50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0e60: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
0e70: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
0e80: 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  stem is initiali
0e90: 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20  zed.  If unable 
0ea0: 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  to .  ** initial
0eb0: 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ize the mutex su
0ec0: 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20  bsystem, return 
0ed0: 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65  early with the e
0ee0: 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rror..  ** If th
0ef0: 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73  e system is so s
0f00: 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20  ick that we are 
0f10: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
0f20: 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a  te a mutex,.  **
0f30: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   there is not mu
0f40: 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69  ch SQLite is goi
0f50: 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ng to be able to
0f60: 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   do..  **.  ** T
0f70: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
0f80: 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72  em must take car
0f90: 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67  e of serializing
0fa0: 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e   its own.  ** in
0fb0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
0fc0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
0fd0: 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20  3MutexInit();.  
0fe0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
0ff0: 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  rc;..  /* Initia
1000: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28  lize the malloc(
1010: 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65  ) system and the
1020: 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74   recursive pInit
1030: 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a  Mutex mutex..  *
1040: 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
1050: 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
1060: 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54   the STATIC_MAST
1070: 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20  ER mutex.  Note 
1080: 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41  that.  ** MutexA
1090: 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64  lloc() is called
10a0: 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75   for a static mu
10b0: 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69  tex prior to ini
10c0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20  tializing the.  
10d0: 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  ** malloc subsys
10e0: 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69  tem - this impli
10f0: 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  es that the allo
1100: 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74  cation of a stat
1110: 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75  ic.  ** mutex mu
1120: 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73  st not require s
1130: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
1140: 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
1150: 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72  ..  */.  pMaster
1160: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
1170: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1180: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
1190: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
11a0: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
11b0: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
11c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
11d0: 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20  allocInit ){.   
11e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c   rc = sqlite3Mal
11f0: 6c 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d 0a 20  locInit();.  }. 
1200: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1210: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1220: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1230: 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31 3b 0a  MallocInit = 1;.
1240: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
1250: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1260: 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  itMutex ){.     
1270: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1280: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20  nfig.pInitMutex 
1290: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
12a0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
12b0: 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20  _RECURSIVE);.   
12c0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
12d0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
12e0: 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74 65  Mutex && !sqlite
12f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
1300: 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  nitMutex ){.    
1310: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1320: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
1330: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
1340: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1350: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1360: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
1370: 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73  Mutex++;.  }.  s
1380: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1390: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20  ve(pMaster);..  
13a0: 2f 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  /* If unable to 
13b0: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
13c0: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 2c  alloc subsystem,
13d0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 65 61 72   then return ear
13e0: 6c 79 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 69  ly..  ** There i
13f0: 73 20 6c 69 74 74 6c 65 20 68 6f 70 65 20 6f 66  s little hope of
1400: 20 67 65 74 74 69 6e 67 20 53 51 4c 69 74 65 20   getting SQLite 
1410: 74 6f 20 72 75 6e 20 69 66 20 74 68 65 20 6d 61  to run if the ma
1420: 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79 73  lloc.  ** subsys
1430: 74 65 6d 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e  tem cannot be in
1440: 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
1450: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1460: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1470: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
1480: 44 6f 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  Do the rest of t
1490: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
14a0: 6e 20 75 6e 64 65 72 20 74 68 65 20 72 65 63 75  n under the recu
14b0: 72 73 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20  rsive mutex so. 
14c0: 20 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c   ** that we will
14d0: 20 62 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64   be able to hand
14e0: 6c 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  le recursive cal
14f0: 6c 73 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c  ls into.  ** sql
1500: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1510: 29 2e 20 20 54 68 65 20 72 65 63 75 72 73 69 76  ).  The recursiv
1520: 65 20 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79  e calls normally
1530: 20 63 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20   come through.  
1540: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  ** sqlite3_os_in
1550: 69 74 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76  it() when it inv
1560: 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73  okes sqlite3_vfs
1570: 5f 72 65 67 69 73 74 65 72 28 29 2c 20 62 75 74  _register(), but
1580: 20 6f 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75   other.  ** recu
1590: 72 73 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68  rsive calls migh
15a0: 74 20 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62  t also be possib
15b0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
15c0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
15d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
15e0: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a  ig.pInitMutex);.
15f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1600: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
1610: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 47 6c  ==0 && sqlite3Gl
1620: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1630: 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20  gress==0 ){.    
1640: 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70 48 61  FuncDefHash *pHa
1650: 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46 75 6e  sh = &GLOBAL(Fun
1660: 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69 74 65  cDefHash, sqlite
1670: 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73  3GlobalFunctions
1680: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
1690: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
16a0: 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 6d  gress = 1;.    m
16b0: 65 6d 73 65 74 28 70 48 61 73 68 2c 20 30 2c 20  emset(pHash, 0, 
16c0: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c  sizeof(sqlite3Gl
16d0: 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29 29 3b  obalFunctions));
16e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69  .    sqlite3Regi
16f0: 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e 63 74 69  sterGlobalFuncti
1700: 6f 6e 73 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  ons();.    rc = 
1710: 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
1720: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1730: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1740: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
1750: 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29  acheInitialize()
1760: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
1770: 43 61 63 68 65 42 75 66 66 65 72 53 65 74 75 70  CacheBufferSetup
1780: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1790: 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20 0a 20 20  onfig.pPage, .  
17a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
17b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
17c0: 67 65 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ge, sqlite3Globa
17d0: 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 29 3b 0a  lConfig.nPage);.
17e0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
17f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e  3GlobalConfig.in
1800: 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  Progress = 0;.  
1810: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1820: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 28  onfig.isInit = (
1830: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
1840: 31 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71  1 : 0);.  }.  sq
1850: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1860: 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  e(sqlite3GlobalC
1870: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1880: 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63 6b  );..  /* Go back
1890: 20 75 6e 64 65 72 20 74 68 65 20 73 74 61 74 69   under the stati
18a0: 63 20 6d 75 74 65 78 20 61 6e 64 20 63 6c 65 61  c mutex and clea
18b0: 6e 20 75 70 20 74 68 65 20 72 65 63 75 72 73 69  n up the recursi
18c0: 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74 6f  ve.  ** mutex to
18d0: 20 70 72 65 76 65 6e 74 20 61 20 72 65 73 6f 75   prevent a resou
18e0: 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20  rce leak..  */. 
18f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1900: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
1910: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1920: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1930: 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69  ex--;.  if( sqli
1940: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1950: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d 30  nRefInitMutex<=0
1960: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1970: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1980: 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65  fig.nRefInitMute
1990: 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  x==0 );.    sqli
19a0: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73  te3_mutex_free(s
19b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
19c0: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a  ig.pInitMutex);.
19d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
19e0: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
19f0: 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  ex = 0;.  }.  sq
1a00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1a10: 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f  e(pMaster);..  /
1a20: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1a30: 69 73 20 6a 75 73 74 20 61 20 73 61 6e 69 74 79  is just a sanity
1a40: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
1a50: 75 72 65 20 53 51 4c 69 74 65 20 68 61 73 0a 20  ure SQLite has. 
1a60: 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65   ** been compile
1a70: 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 74  d correctly.  It
1a80: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
1a90: 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 2c 20   run this code, 
1aa0: 62 75 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27  but.  ** we don'
1ab0: 74 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 69 74  t want to run it
1ac0: 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20 73   too often and s
1ad0: 6f 61 6b 20 75 70 20 43 50 55 20 63 79 63 6c 65  oak up CPU cycle
1ae0: 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72 65  s for no.  ** re
1af0: 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75 6e  ason.  So we run
1b00: 20 69 74 20 6f 6e 63 65 20 64 75 72 69 6e 67 20   it once during 
1b10: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a  initialization..
1b20: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45    */.#ifndef NDE
1b30: 42 55 47 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  BUG.#ifndef SQLI
1b40: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1b50: 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69 73  _POINT.  /* This
1b60: 20 73 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64 65   section of code
1b70: 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74 22  's only "output"
1b80: 20 69 73 20 76 69 61 20 61 73 73 65 72 74 28 29   is via assert()
1b90: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a   statements. */.
1ba0: 20 20 69 66 20 28 20 72 63 3d 3d 53 51 4c 49 54    if ( rc==SQLIT
1bb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34 20  E_OK ){.    u64 
1bc0: 78 20 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 36  x = (((u64)1)<<6
1bd0: 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65  3)-1;.    double
1be0: 20 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73   y;.    assert(s
1bf0: 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20 20  izeof(x)==8);.  
1c00: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
1c10: 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b 0a  x)==sizeof(y));.
1c20: 20 20 20 20 6d 65 6d 63 70 79 28 26 79 2c 20 26      memcpy(&y, &
1c30: 78 2c 20 38 29 3b 0a 20 20 20 20 61 73 73 65 72  x, 8);.    asser
1c40: 74 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28  t( sqlite3IsNaN(
1c50: 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  y) );.  }.#endif
1c60: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
1c70: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
1c80: 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74 73 20  ndo the effects 
1c90: 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  of sqlite3_initi
1ca0: 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e  alize().  Must n
1cb0: 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69  ot be called whi
1cc0: 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  le.** there are 
1cd0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61 74 61  outstanding data
1ce0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
1cf0: 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   or memory alloc
1d00: 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69  ations or.** whi
1d10: 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66 20 53  le any part of S
1d20: 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72 77 69  QLite is otherwi
1d30: 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61 6e 79  se in use in any
1d40: 20 74 68 72 65 61 64 2e 20 20 54 68 69 73 0a 2a   thread.  This.*
1d50: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  * routine is not
1d60: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 4e 6f   threadsafe.  No
1d70: 74 20 62 79 20 61 20 6c 6f 6e 67 20 73 68 6f 74  t by a long shot
1d80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d90: 5f 73 68 75 74 64 6f 77 6e 28 76 6f 69 64 29 7b  _shutdown(void){
1da0: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
1db0: 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49  Config.isMallocI
1dc0: 6e 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  nit = 0;.  sqlit
1dd0: 65 33 50 63 61 63 68 65 53 68 75 74 64 6f 77 6e  e3PcacheShutdown
1de0: 28 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ();.  if( sqlite
1df0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1e00: 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Init ){.    sqli
1e10: 74 65 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a 20 20  te3_os_end();.  
1e20: 7d 0a 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  }.  sqlite3Mallo
1e30: 63 45 6e 64 28 29 3b 0a 20 20 73 71 6c 69 74 65  cEnd();.  sqlite
1e40: 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20 73  3MutexEnd();.  s
1e50: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1e60: 69 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  ig.isInit = 0;. 
1e70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e80: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
1e90: 20 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c   API allows appl
1ea0: 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69  ications to modi
1eb0: 66 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f  fy the global co
1ec0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a  nfiguration of.*
1ed0: 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62  * the SQLite lib
1ee0: 72 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d 65  rary at run-time
1ef0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1f00: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
1f10: 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
1f20: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
1f30: 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61  standing.** data
1f40: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
1f50: 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   or memory alloc
1f60: 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f  ations.  This ro
1f70: 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20  utine is not.** 
1f80: 74 68 72 65 61 64 73 61 66 65 2e 20 20 46 61 69  threadsafe.  Fai
1f90: 6c 75 72 65 20 74 6f 20 68 65 65 64 20 74 68 65  lure to heed the
1fa0: 73 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e 20  se warnings can 
1fb0: 6c 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69 63  lead to unpredic
1fc0: 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f  table.** behavio
1fd0: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
1fe0: 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c  3_config(int op,
1ff0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
2000: 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   ap;.  int rc = 
2010: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
2020: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
2030: 29 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20 53  ) shall return S
2040: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66 20  QLITE_MISUSE if 
2050: 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 68  it is invoked wh
2060: 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  ile.  ** the SQL
2070: 69 74 65 20 6c 69 62 72 61 72 79 20 69 73 20 69  ite library is i
2080: 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20  n use. */.  if( 
2090: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
20a0: 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74  fig.isInit ) ret
20b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
20c0: 45 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61  E;..  va_start(a
20d0: 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
20e0: 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  ( op ){..    /* 
20f0: 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72 61 74  Mutex configurat
2100: 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72 65 20  ion options are 
2110: 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69  only available i
2120: 6e 20 61 20 74 68 72 65 61 64 73 61 66 65 0a 20  n a threadsafe. 
2130: 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e 20 0a     ** compile. .
2140: 20 20 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54      */.#if SQLIT
2150: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20  E_THREADSAFE.   
2160: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2170: 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44  FIG_SINGLETHREAD
2180: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73  : {.      /* Dis
2190: 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e  able all mutexin
21a0: 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  g */.      sqlit
21b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
21c0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 0a 20  CoreMutex = 0;. 
21d0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
21e0: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
21f0: 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  tex = 0;.      b
2200: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2210: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2220: 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20  IG_MULTITHREAD: 
2230: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62  {.      /* Disab
2240: 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20 64  le mutexing of d
2250: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2260: 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ons */.      /* 
2270: 45 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20  Enable mutexing 
2280: 6f 66 20 63 6f 72 65 20 64 61 74 61 20 73 74 72  of core data str
2290: 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 20  uctures */.     
22a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
22b0: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
22c0: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
22d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
22e0: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20  FullMutex = 0;. 
22f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2300: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2310: 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49  E_CONFIG_SERIALI
2320: 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ZED: {.      /* 
2330: 45 6e 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78  Enable all mutex
2340: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ing */.      sql
2350: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2360: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b  .bCoreMutex = 1;
2370: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2380: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
2390: 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Mutex = 1;.     
23a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
23b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
23c0: 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20  NFIG_MUTEX: {.  
23d0: 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61      /* Specify a
23e0: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 75  n alternative mu
23f0: 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tex implementati
2400: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
2410: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2420: 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67 28  mutex = *va_arg(
2430: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ap, sqlite3_mute
2440: 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20  x_methods*);.   
2450: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2460: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2470: 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45 58 3a  CONFIG_GETMUTEX:
2480: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72   {.      /* Retr
2490: 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  ieve the current
24a0: 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74   mutex implement
24b0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a  ation */.      *
24c0: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
24d0: 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73  e3_mutex_methods
24e0: 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  *) = sqlite3Glob
24f0: 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a  alConfig.mutex;.
2500: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2510: 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20   }.#endif...    
2520: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2530: 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20  IG_MALLOC: {.   
2540: 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e     /* Specify an
2550: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 61 6c   alternative mal
2560: 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  loc implementati
2570: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
2580: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2590: 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  m = *va_arg(ap, 
25a0: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
25b0: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
25c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
25d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
25e0: 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  _GETMALLOC: {.  
25f0: 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20      /* Retrieve 
2600: 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 6c 6c  the current mall
2610: 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74  oc() implementat
2620: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ion */.      if(
2630: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2640: 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d  nfig.m.xMalloc==
2650: 30 20 29 20 73 71 6c 69 74 65 33 4d 65 6d 53 65  0 ) sqlite3MemSe
2660: 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20  tDefault();.    
2670: 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71    *va_arg(ap, sq
2680: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
2690: 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  s*) = sqlite3Glo
26a0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20  balConfig.m;.   
26b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
26c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
26d0: 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53  CONFIG_MEMSTATUS
26e0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61  : {.      /* Ena
26f0: 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74  ble or disable t
2700: 68 65 20 6d 61 6c 6c 6f 63 20 73 74 61 74 75 73  he malloc status
2710: 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 2a 2f 0a 20   collection */. 
2720: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2730: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
2740: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
2750: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
2760: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2770: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
2780: 43 52 41 54 43 48 3a 20 7b 0a 20 20 20 20 20 20  CRATCH: {.      
2790: 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20 62  /* Designate a b
27a0: 75 66 66 65 72 20 66 6f 72 20 73 63 72 61 74 63  uffer for scratc
27b0: 68 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a  h memory space *
27c0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
27d0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72  lobalConfig.pScr
27e0: 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70  atch = va_arg(ap
27f0: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
2800: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2810: 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20  fig.szScratch = 
2820: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
2830: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2840: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61  obalConfig.nScra
2850: 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tch = va_arg(ap,
2860: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
2870: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
2880: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
2890: 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a 20 20  _PAGECACHE: {.  
28a0: 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65      /* Designate
28b0: 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 73 63   a buffer for sc
28c0: 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 73 70 61  ratch memory spa
28d0: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
28e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
28f0: 70 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  pPage = va_arg(a
2900: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
2910: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2920: 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61  nfig.szPage = va
2930: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
2940: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2950: 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d  alConfig.nPage =
2960: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
2970: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2980: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53     }..    case S
2990: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41  QLITE_CONFIG_PCA
29a0: 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  CHE: {.      /* 
29b0: 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72  Specify an alter
29c0: 6e 61 74 69 76 65 20 6d 61 6c 6c 6f 63 20 69 6d  native malloc im
29d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
29e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
29f0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
2a00: 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73   = *va_arg(ap, s
2a10: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
2a20: 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62  thods*);.      b
2a30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
2a40: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2a50: 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20 7b  FIG_GETPCACHE: {
2a60: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2a70: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
2a80: 63 61 63 68 65 2e 78 49 6e 69 74 3d 3d 30 20 29  cache.xInit==0 )
2a90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2aa0: 33 50 43 61 63 68 65 53 65 74 44 65 66 61 75 6c  3PCacheSetDefaul
2ab0: 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t();.      }.   
2ac0: 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73     *va_arg(ap, s
2ad0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
2ae0: 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65  thods*) = sqlite
2af0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63  3GlobalConfig.pc
2b00: 61 63 68 65 3b 0a 20 20 20 20 20 20 62 72 65 61  ache;.      brea
2b10: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65  k;.    }..#if de
2b20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
2b30: 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20  BLE_MEMSYS3) || 
2b40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
2b50: 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20  NABLE_MEMSYS5). 
2b60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2b70: 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20  ONFIG_HEAP: {.  
2b80: 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65      /* Designate
2b90: 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 68 65   a buffer for he
2ba0: 61 70 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  ap memory space 
2bb0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2bc0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
2bd0: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
2be0: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
2bf0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2c00: 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67  g.nHeap = va_arg
2c10: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
2c20: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2c30: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f  nfig.mnReq = va_
2c40: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20  arg(ap, int);.. 
2c50: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2c60: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
2c70: 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ap==0 ){.       
2c80: 20 2f 2a 20 49 66 20 74 68 65 20 68 65 61 70 20   /* If the heap 
2c90: 70 6f 69 6e 74 65 72 20 69 73 20 4e 55 4c 4c 2c  pointer is NULL,
2ca0: 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68   then restore th
2cb0: 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65  e malloc impleme
2cc0: 6e 74 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  ntation.        
2cd0: 2a 2a 20 62 61 63 6b 20 74 6f 20 4e 55 4c 4c 20  ** back to NULL 
2ce0: 70 6f 69 6e 74 65 72 73 20 74 6f 6f 2e 20 20 54  pointers too.  T
2cf0: 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
2d00: 68 65 20 6d 61 6c 6c 6f 63 20 74 6f 20 67 6f 0a  he malloc to go.
2d10: 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20          ** back 
2d20: 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74 20 69  to its default i
2d30: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 68  mplementation wh
2d40: 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  en sqlite3_initi
2d50: 61 6c 69 7a 65 28 29 20 69 73 0a 20 20 20 20 20  alize() is.     
2d60: 20 20 20 2a 2a 20 72 75 6e 2e 0a 20 20 20 20 20     ** run..     
2d70: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65     */.        me
2d80: 6d 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f  mset(&sqlite3Glo
2d90: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20  balConfig.m, 0, 
2da0: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c  sizeof(sqlite3Gl
2db0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a  obalConfig.m));.
2dc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2dd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70       /* The heap
2de0: 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20   pointer is not 
2df0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e 73 74 61  NULL, then insta
2e00: 6c 6c 20 6f 6e 65 20 6f 66 20 74 68 65 0a 20 20  ll one of the.  
2e10: 20 20 20 20 20 20 2a 2a 20 6d 65 6d 35 2e 63 2f        ** mem5.c/
2e20: 6d 65 6d 33 2e 63 20 6d 65 74 68 6f 64 73 2e 20  mem3.c methods. 
2e30: 49 66 20 6e 65 69 74 68 65 72 20 45 4e 41 42 4c  If neither ENABL
2e40: 45 5f 4d 45 4d 53 59 53 33 20 6e 6f 72 0a 20 20  E_MEMSYS3 nor.  
2e50: 20 20 20 20 20 20 2a 2a 20 45 4e 41 42 4c 45 5f        ** ENABLE_
2e60: 4d 45 4d 53 59 53 35 20 69 73 20 64 65 66 69 6e  MEMSYS5 is defin
2e70: 65 64 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  ed, return an er
2e80: 72 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ror..        ** 
2e90: 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 73 65  the default case
2ea0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65   and return an e
2eb0: 72 72 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  rror..        */
2ec0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2ed0: 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20  NABLE_MEMSYS3.  
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 20 3d 20 2a 73  balConfig.m = *s
2f00: 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73  qlite3MemGetMems
2f10: 79 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ys3();.#endif.#i
2f20: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2f30: 4c 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20  LE_MEMSYS5.     
2f40: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2f50: 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69  Config.m = *sqli
2f60: 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35  te3MemGetMemsys5
2f70: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ();.#endif.     
2f80: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
2f90: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
2fa0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2fb0: 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20  NFIG_LOOKASIDE: 
2fc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
2fd0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f  lobalConfig.szLo
2fe0: 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67  okaside = va_arg
2ff0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3000: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3010: 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20  nfig.nLookaside 
3020: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3030: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3040: 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75      }..    defau
3050: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lt: {.      rc =
3060: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
3070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3080: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
3090: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
30a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
30b0: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62   the lookaside b
30c0: 75 66 66 65 72 73 20 66 6f 72 20 61 20 64 61 74  uffers for a dat
30d0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
30e0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
30f0: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
3100: 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73  .  .** If lookas
3110: 69 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ide is already a
3120: 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53 51  ctive, return SQ
3130: 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a  LITE_BUSY..**.**
3140: 20 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74 65   The sz paramete
3150: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
3160: 6f 66 20 62 79 74 65 73 20 69 6e 20 65 61 63 68  of bytes in each
3170: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e   lookaside slot.
3180: 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72 61  .** The cnt para
3190: 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d  meter is the num
31a0: 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49  ber of slots.  I
31b0: 66 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c 4c  f pStart is NULL
31c0: 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f   the.** space fo
31d0: 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  r the lookaside 
31e0: 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69 6e  memory is obtain
31f0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
3200: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20  malloc()..** If 
3210: 70 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e 55  pStart is not NU
3220: 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73 7a  LL then it is sz
3230: 2a 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d 65  *cnt bytes of me
3240: 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72 0a  mory to use for.
3250: 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  ** the lookaside
3260: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
3270: 69 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b  ic int setupLook
3280: 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64  aside(sqlite3 *d
3290: 62 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  b, void *pBuf, i
32a0: 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b  nt sz, int cnt){
32b0: 0a 20 20 76 6f 69 64 20 2a 70 53 74 61 72 74 3b  .  void *pStart;
32c0: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
32d0: 73 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20 20 20  side.nOut ){.   
32e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
32f0: 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 72  USY;.  }.  /* Fr
3300: 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  ee any existing 
3310: 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72  lookaside buffer
3320: 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64 6c 65   for this handle
3330: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c   before.  ** all
3340: 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e  ocating a new on
3350: 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 68 61  e so we don't ha
3360: 76 65 20 74 6f 20 68 61 76 65 20 73 70 61 63 65  ve to have space
3370: 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74 68 20   for .  ** both 
3380: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
3390: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
33a0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
33b0: 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  oced ){.    sqli
33c0: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f  te3_free(db->loo
33d0: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a  kaside.pStart);.
33e0: 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 69 7a    }.  /* The siz
33f0: 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69 64 65  e of a lookaside
3400: 20 73 6c 6f 74 20 6e 65 65 64 73 20 74 6f 20 62   slot needs to b
3410: 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 20  e larger than a 
3420: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74 6f 20  pointer.  ** to 
3430: 62 65 20 75 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a  be useful..  */.
3440: 20 20 69 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73    if( sz<=(int)s
3450: 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53  izeof(LookasideS
3460: 6c 6f 74 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a  lot*) ) sz = 0;.
3470: 20 20 69 66 28 20 63 6e 74 3c 30 20 29 20 63 6e    if( cnt<0 ) cn
3480: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d  t = 0;.  if( sz=
3490: 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a  =0 || cnt==0 ){.
34a0: 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20      sz = 0;.    
34b0: 70 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65  pStart = 0;.  }e
34c0: 6c 73 65 20 69 66 28 20 70 42 75 66 3d 3d 30 20  lse if( pBuf==0 
34d0: 29 7b 0a 20 20 20 20 73 7a 20 3d 20 28 73 7a 20  ){.    sz = (sz 
34e0: 2b 20 37 29 26 7e 37 3b 0a 20 20 20 20 73 71 6c  + 7)&~7;.    sql
34f0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
3500: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74  alloc();.    pSt
3510: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  art = sqlite3Mal
3520: 6c 6f 63 28 20 73 7a 2a 63 6e 74 20 29 3b 0a 20  loc( sz*cnt );. 
3530: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
3540: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d  ignMalloc();.  }
3550: 65 6c 73 65 7b 0a 20 20 20 20 73 7a 20 3d 20 73  else{.    sz = s
3560: 7a 26 7e 37 3b 0a 20 20 20 20 70 53 74 61 72 74  z&~7;.    pStart
3570: 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20 20 64   = pBuf;.  }.  d
3580: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
3590: 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  art = pStart;.  
35a0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46  db->lookaside.pF
35b0: 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c  ree = 0;.  db->l
35c0: 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28 75  ookaside.sz = (u
35d0: 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53 74  16)sz;.  if( pSt
35e0: 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  art ){.    int i
35f0: 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53  ;.    LookasideS
3600: 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73 65  lot *p;.    asse
3610: 72 74 28 20 73 7a 20 3e 20 73 69 7a 65 6f 66 28  rt( sz > sizeof(
3620: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20  LookasideSlot*) 
3630: 29 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b  );.    p = (Look
3640: 61 73 69 64 65 53 6c 6f 74 2a 29 70 53 74 61 72  asideSlot*)pStar
3650: 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74  t;.    for(i=cnt
3660: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
3670: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
3680: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
3690: 46 72 65 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e  Free;.      db->
36a0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20  lookaside.pFree 
36b0: 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 3d 20 28  = p;.      p = (
36c0: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 26  LookasideSlot*)&
36d0: 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20  ((u8*)p)[sz];.  
36e0: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b    }.    db->look
36f0: 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 70 3b 0a  aside.pEnd = p;.
3700: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
3710: 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 31 3b 0a  e.bEnabled = 1;.
3720: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
3730: 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 70 42  e.bMalloced = pB
3740: 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d 65  uf==0 ?1:0;.  }e
3750: 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  lse{.    db->loo
3760: 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 30 3b  kaside.pEnd = 0;
3770: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
3780: 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b  de.bEnabled = 0;
3790: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
37a0: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 30  de.bMalloced = 0
37b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
37c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
37d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 75  ** Return the mu
37e0: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
37f0: 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63  ith a database c
3800: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71  onnection..*/.sq
3810: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c  lite3_mutex *sql
3820: 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 73 71  ite3_db_mutex(sq
3830: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
3840: 74 75 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a  turn db->mutex;.
3850: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
3860: 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20  ration settings 
3870: 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61  for an individua
3880: 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  l database conne
3890: 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ction.*/.int sql
38a0: 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73  ite3_db_config(s
38b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
38c0: 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  op, ...){.  va_l
38d0: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63  ist ap;.  int rc
38e0: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
38f0: 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20   op);.  switch( 
3900: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
3910: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c  QLITE_DBCONFIG_L
3920: 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20  OOKASIDE: {.    
3930: 20 20 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76    void *pBuf = v
3940: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
3950: 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  ;.      int sz =
3960: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
3970: 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20  ;.      int cnt 
3980: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3990: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  );.      rc = se
39a0: 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c  tupLookaside(db,
39b0: 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b   pBuf, sz, cnt);
39c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
39d0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
39e0: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   {.      rc = SQ
39f0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
3a00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3a10: 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b   }.  va_end(ap);
3a20: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3a30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3a40: 72 75 65 20 69 66 20 74 68 65 20 62 75 66 66 65  rue if the buffe
3a50: 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74  r z[0..n-1] cont
3a60: 61 69 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e  ains all spaces.
3a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
3a80: 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63  llSpaces(const c
3a90: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
3aa0: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
3ab0: 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e  z[n-1]==' ' ){ n
3ac0: 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  --; }.  return n
3ad0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ==0;.}../*.** Th
3ae0: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
3af0: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  t collating func
3b00: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41  tion named "BINA
3b10: 52 59 22 20 77 68 69 63 68 20 69 73 20 61 6c 77  RY" which is alw
3b20: 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ays.** available
3b30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
3b40: 61 64 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  adFlag argument 
3b50: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
3b60: 20 73 70 61 63 65 20 70 61 64 64 69 6e 67 20 61   space padding a
3b70: 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20  t the end.** of 
3b80: 73 74 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72  strings is ignor
3b90: 65 64 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d  ed.  This implem
3ba0: 65 6e 74 73 20 74 68 65 20 52 54 52 49 4d 20 63  ents the RTRIM c
3bb0: 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ollation..*/.sta
3bc0: 74 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46  tic int binCollF
3bd0: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64  unc(.  void *pad
3be0: 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Flag,.  int nKey
3bf0: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
3c00: 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
3c10: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
3c20: 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Key2.){.  int rc
3c30: 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31  , n;.  n = nKey1
3c40: 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a  <nKey2 ? nKey1 :
3c50: 20 6e 4b 65 79 32 3b 0a 20 20 72 63 20 3d 20 6d   nKey2;.  rc = m
3c60: 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65  emcmp(pKey1, pKe
3c70: 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63  y2, n);.  if( rc
3c80: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
3c90: 61 64 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61  adFlag.     && a
3ca0: 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a  llSpaces(((char*
3cb0: 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31  )pKey1)+n, nKey1
3cc0: 2d 6e 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53  -n).     && allS
3cd0: 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b  paces(((char*)pK
3ce0: 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29  ey2)+n, nKey2-n)
3cf0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
3d00: 20 4c 65 61 76 65 20 72 63 20 75 6e 63 68 61 6e   Leave rc unchan
3d10: 67 65 64 20 61 74 20 30 20 2a 2f 0a 20 20 20 20  ged at 0 */.    
3d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
3d30: 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
3d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3d50: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3d60: 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69   Another built-i
3d70: 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  n collating sequ
3d80: 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a  ence: NOCASE. .*
3d90: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74  *.** This collat
3da0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
3db0: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
3dc0: 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e  sed for "case in
3dd0: 64 65 70 65 6e 64 61 6e 74 0a 2a 2a 20 63 6f 6d  dependant.** com
3de0: 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65  parison". SQLite
3df0: 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20  's knowledge of 
3e00: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
3e10: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73  case equivalents
3e20: 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79  .** extends only
3e30: 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72 61   to the 26 chara
3e40: 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74 68  cters used in th
3e50: 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e English langua
3e60: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65  ge..**.** At the
3e70: 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73   moment there is
3e80: 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d   only a UTF-8 im
3e90: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
3ea0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61  .static int noca
3eb0: 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28  seCollatingFunc(
3ec0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
3ed0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
3ee0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
3ef0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
3f00: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
3f10: 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71  .){.  int r = sq
3f20: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20  lite3StrNICmp(. 
3f30: 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72       (const char
3f40: 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74   *)pKey1, (const
3f50: 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28   char *)pKey2, (
3f60: 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65  nKey1<nKey2)?nKe
3f70: 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55  y1:nKey2);.  UNU
3f80: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
3f90: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d  tUsed);.  if( 0=
3fa0: 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b  =r ){.    r = nK
3fb0: 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20  ey1-nKey2;.  }. 
3fc0: 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a   return r;.}../*
3fd0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52  .** Return the R
3fe0: 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74  OWID of the most
3ff0: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a   recent insert.*
4000: 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73  /.sqlite_int64 s
4010: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
4020: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
4030: 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20   *db){.  return 
4040: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d  db->lastRowid;.}
4050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4060: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
4070: 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74  nges in the most
4080: 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
4090: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
40a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
40b0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
40c0: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
40d0: 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  ->nChange;.}../*
40e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
40f0: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
4100: 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62   since the datab
4110: 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f  ase handle was o
4120: 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pened..*/.int sq
4130: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
4140: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
4150: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e  {.  return db->n
4160: 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a  TotalChange;.}..
4170: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
4180: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
4190: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f   This function o
41a0: 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 73 20  nly manipulates 
41b0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a  fields of the.**
41c0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
41d0: 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f 65 73   object, it does
41e0: 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20 73   not close any s
41f0: 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 6d  avepoints that m
4200: 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74  ay be open.** at
4210: 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61 67 65   the b-tree/page
4220: 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64  r level..*/.void
4230: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
4240: 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65 33 20  epoints(sqlite3 
4250: 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28 20 64  *db){.  while( d
4260: 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  b->pSavepoint ){
4270: 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  .    Savepoint *
4280: 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65  pTmp = db->pSave
4290: 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70  point;.    db->p
42a0: 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70  Savepoint = pTmp
42b0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
42c0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
42d0: 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  Tmp);.  }.  db->
42e0: 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
42f0: 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
4300: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72   = 0;.  db->isTr
4310: 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69  ansactionSavepoi
4320: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
4330: 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69   Close an existi
4340: 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ng SQLite databa
4350: 73 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  se.*/.int sqlite
4360: 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20  3_close(sqlite3 
4370: 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  *db){.  HashElem
4380: 20 2a 69 3b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20   *i;.  int j;.. 
4390: 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
43a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
43b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
43c0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
43d0: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
43e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
43f0: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73  _MISUSE;.  }.  s
4400: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
4410: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a  er(db->mutex);..
4420: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53  #ifdef SQLITE_SS
4430: 45 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e  E.  {.    extern
4440: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 73 65   void sqlite3Sse
4450: 43 6c 65 61 6e 75 70 28 73 71 6c 69 74 65 33 2a  Cleanup(sqlite3*
4460: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 73  );.    sqlite3Ss
4470: 65 43 6c 65 61 6e 75 70 28 64 62 29 3b 0a 20 20  eCleanup(db);.  
4480: 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 73 71 6c  }.#endif ..  sql
4490: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
44a0: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
44b0: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
44c0: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
44d0: 74 68 65 20 52 65 73 65 74 49 6e 74 65 72 6e 61  the ResetInterna
44e0: 6c 53 63 68 65 6d 61 28 29 20 63 61 6c 6c 20 61  lSchema() call a
44f0: 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  bove.  ** will n
4500: 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74  ot have called t
4510: 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29  he xDisconnect()
4520: 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76   method on any v
4530: 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c  irtual.  ** tabl
4540: 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56  es in the db->aV
4550: 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54  Trans[] array. T
4560: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c  he following sql
4570: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
4580: 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  ().  ** call wil
4590: 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64  l do so. We need
45a0: 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f   to do this befo
45b0: 72 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72  re the check for
45c0: 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c   active.  ** SQL
45d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f   statements belo
45e0: 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c  w, as the v-tabl
45f0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
4600: 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a   may be storing.
4610: 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72    ** some prepar
4620: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ed statements in
4630: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20  ternally..  */. 
4640: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
4650: 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  back(db);..  /* 
4660: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
4670: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 56 4d 73   outstanding VMs
4680: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
4690: 42 55 53 59 2e 20 2a 2f 0a 20 20 69 66 28 20 64  BUSY. */.  if( d
46a0: 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  b->pVdbe ){.    
46b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
46c0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
46d0: 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
46e0: 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75  o close due to u
46f0: 6e 66 69 6e 61 6c 69 73 65 64 20 73 74 61 74 65  nfinalised state
4700: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 73 71 6c  ments");.    sql
4710: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
4720: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
4730: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
4740: 55 53 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  USY;.  }.  asser
4750: 74 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79  t( sqlite3Safety
4760: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
4770: 29 20 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  ) );..  for(j=0;
4780: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
4790: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
47a0: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42   = db->aDb[j].pB
47b0: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  t;.    if( pBt &
47c0: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
47d0: 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29 7b  InBackup(pBt) ){
47e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
47f0: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  ror(db, SQLITE_B
4800: 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 20 20  USY, .          
4810: 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65  "unable to close
4820: 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 69 73 68   due to unfinish
4830: 65 64 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74  ed backup operat
4840: 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c  ion");.      sql
4850: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
4860: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
4870: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4880: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BUSY;.    }.  }
4890: 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
48a0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65  outstanding Save
48b0: 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 73  point structures
48c0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c  . */.  sqlite3Cl
48d0: 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
48e0: 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  );..  for(j=0; j
48f0: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
4900: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
4910: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d  Db = &db->aDb[j]
4920: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
4930: 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Bt ){.      sqli
4940: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44  te3BtreeClose(pD
4950: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70  b->pBt);.      p
4960: 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20  Db->pBt = 0;.   
4970: 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20     if( j!=1 ){. 
4980: 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68         pDb->pSch
4990: 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ema = 0;.      }
49a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
49b0: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
49c0: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
49d0: 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63  .  /* Tell the c
49e0: 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20  ode in notify.c 
49f0: 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74  that the connect
4a00: 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f  ion no longer ho
4a10: 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63  lds any.  ** loc
4a20: 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ks and does not 
4a30: 72 65 71 75 69 72 65 20 61 6e 79 20 66 75 72 74  require any furt
4a40: 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66  her unlock-notif
4a50: 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a  y callbacks..  *
4a60: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  /.  sqlite3Conne
4a70: 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b  ctionClosed(db);
4a80: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ..  assert( db->
4a90: 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65  nDb<=2 );.  asse
4aa0: 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d  rt( db->aDb==db-
4ab0: 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a 20 20  >aDbStatic );.  
4ac0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79  for(j=0; j<Array
4ad0: 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61  Size(db->aFunc.a
4ae0: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e  ); j++){.    Fun
4af0: 63 44 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48  cDef *pNext, *pH
4b00: 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72  ash, *p;.    for
4b10: 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a  (p=db->aFunc.a[j
4b20: 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a  ]; p; p=pHash){.
4b30: 20 20 20 20 20 20 70 48 61 73 68 20 3d 20 70 2d        pHash = p-
4b40: 3e 70 48 61 73 68 3b 0a 20 20 20 20 20 20 77 68  >pHash;.      wh
4b50: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20  ile( p ){.      
4b60: 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
4b70: 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  xt;.        sqli
4b80: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
4b90: 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e  ;.        p = pN
4ba0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
4bb0: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73   }.  }.  for(i=s
4bc0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
4bd0: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69  db->aCollSeq); i
4be0: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
4bf0: 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c  xt(i)){.    Coll
4c00: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f  Seq *pColl = (Co
4c10: 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61  llSeq *)sqliteHa
4c20: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f  shData(i);.    /
4c30: 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73  * Invoke any des
4c40: 74 72 75 63 74 6f 72 73 20 72 65 67 69 73 74 65  tructors registe
4c50: 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f  red for collatio
4c60: 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 72 20  n sequence user 
4c70: 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  data. */.    for
4c80: 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
4c90: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  .      if( pColl
4ca0: 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20  [j].xDel ){.    
4cb0: 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65      pColl[j].xDe
4cc0: 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72  l(pColl[j].pUser
4cd0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4ce0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4cf0: 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20  ee(db, pColl);. 
4d00: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
4d10: 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c  Clear(&db->aColl
4d20: 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Seq);.#ifndef SQ
4d30: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
4d40: 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73  LTABLE.  for(i=s
4d50: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
4d60: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b  db->aModule); i;
4d70: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
4d80: 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c  t(i)){.    Modul
4d90: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
4da0: 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  e *)sqliteHashDa
4db0: 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
4dc0: 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b  Mod->xDestroy ){
4dd0: 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65  .      pMod->xDe
4de0: 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78  stroy(pMod->pAux
4df0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
4e00: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4e10: 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Mod);.  }.  sqli
4e20: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62  te3HashClear(&db
4e30: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64  ->aModule);.#end
4e40: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72  if..  sqlite3Err
4e50: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
4e60: 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63  , 0); /* Dealloc
4e70: 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64 20  ates any cached 
4e80: 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a  error strings. *
4e90: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72  /.  if( db->pErr
4ea0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
4eb0: 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72  alueFree(db->pEr
4ec0: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
4ed0: 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73  3CloseExtensions
4ee0: 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67  (db);..  db->mag
4ef0: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
4f00: 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54  C_ERROR;..  /* T
4f10: 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65  he temp-database
4f20: 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63   schema is alloc
4f30: 61 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  ated differently
4f40: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20   from the other 
4f50: 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65  schema.  ** obje
4f60: 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74  cts (using sqlit
4f70: 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74  eMalloc() direct
4f80: 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73  ly, instead of s
4f90: 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
4fa0: 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74  a())..  ** So it
4fb0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
4fc0: 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57  ed here. Todo: W
4fd0: 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20  hy not roll the 
4fe0: 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f  temp schema into
4ff0: 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73  .  ** the same s
5000: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73  qliteMalloc() as
5010: 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c   the one that al
5020: 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61 74 61  locates the data
5030: 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63  base .  ** struc
5040: 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c  ture?.  */.  sql
5050: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64  ite3DbFree(db, d
5060: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
5070: 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  a);.  sqlite3_mu
5080: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
5090: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69  tex);.  db->magi
50a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
50b0: 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74  _CLOSED;.  sqlit
50c0: 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62  e3_mutex_free(db
50d0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
50e0: 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
50f0: 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a  e.nOut==0 );  /*
5100: 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b   Fails on a look
5110: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61  aside memory lea
5120: 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c  k */.  if( db->l
5130: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
5140: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
5150: 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61  3_free(db->looka
5160: 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20  side.pStart);.  
5170: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
5180: 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (db);.  return S
5190: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
51a0: 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
51b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a  database files..
51c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
51d0: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74  ollbackAll(sqlit
51e0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
51f0: 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20  ;.  int inTrans 
5200: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  = 0;.  assert( s
5210: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5220: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
5230: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
5240: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
5250: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
5260: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
5270: 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
5280: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
5290: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
52a0: 61 6e 73 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  ans(db->aDb[i].p
52b0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Bt) ){.        i
52c0: 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20  nTrans = 1;.    
52d0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
52e0: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 64  3BtreeRollback(d
52f0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  b->aDb[i].pBt);.
5300: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d        db->aDb[i]
5310: 2e 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20  .inTrans = 0;.  
5320: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
5330: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
5340: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42  );.  sqlite3EndB
5350: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
5360: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 26    if( db->flags&
5370: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
5380: 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  nges ){.    sqli
5390: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
53a0: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
53b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
53c0: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
53d0: 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  db, 0);.  }..  /
53e0: 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65  * If one has bee
53f0: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e  n configured, in
5400: 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63  voke the rollbac
5410: 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20  k-hook callback 
5420: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f  */.  if( db->xRo
5430: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26  llbackCallback &
5440: 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64  & (inTrans || !d
5450: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29  b->autoCommit) )
5460: 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62  {.    db->xRollb
5470: 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  ackCallback(db->
5480: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20  pRollbackArg);. 
5490: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
54a0: 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69  rn a static stri
54b0: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
54c0: 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72  s the kind of er
54d0: 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  ror specified in
54e0: 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   the.** argument
54f0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
5500: 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69  *sqlite3ErrStr(i
5510: 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20  nt rc){.  const 
5520: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
5530: 68 28 20 72 63 20 26 20 30 78 66 66 20 29 7b 0a  h( rc & 0xff ){.
5540: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5550: 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20 53 51  ROW:.    case SQ
5560: 4c 49 54 45 5f 44 4f 4e 45 3a 0a 20 20 20 20 63  LITE_DONE:.    c
5570: 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20  ase SQLITE_OK:  
5580: 20 20 20 20 20 20 20 7a 20 3d 20 22 6e 6f 74 20         z = "not 
5590: 61 6e 20 65 72 72 6f 72 22 3b 20 20 20 20 20 20  an error";      
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
55c0: 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ase SQLITE_ERROR
55d0: 3a 20 20 20 20 20 20 7a 20 3d 20 22 53 51 4c 20  :      z = "SQL 
55e0: 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d  logic error or m
55f0: 69 73 73 69 6e 67 20 64 61 74 61 62 61 73 65 22  issing database"
5600: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
5610: 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a  ase SQLITE_PERM:
5620: 20 20 20 20 20 20 20 7a 20 3d 20 22 61 63 63 65         z = "acce
5630: 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65  ss permission de
5640: 6e 69 65 64 22 3b 20 20 20 20 20 20 20 20 20 20  nied";          
5650: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5660: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
5670: 3a 20 20 20 20 20 20 7a 20 3d 20 22 63 61 6c 6c  :      z = "call
5680: 62 61 63 6b 20 72 65 71 75 65 73 74 65 64 20 71  back requested q
5690: 75 65 72 79 20 61 62 6f 72 74 22 3b 20 20 20 20  uery abort";    
56a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
56b0: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a  ase SQLITE_BUSY:
56c0: 20 20 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61         z = "data
56d0: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 3b  base is locked";
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5700: 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ase SQLITE_LOCKE
5710: 44 3a 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61  D:     z = "data
5720: 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f  base table is lo
5730: 63 6b 65 64 22 3b 20 20 20 20 20 20 20 20 20 20  cked";          
5740: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5750: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ase SQLITE_NOMEM
5760: 3a 20 20 20 20 20 20 7a 20 3d 20 22 6f 75 74 20  :      z = "out 
5770: 6f 66 20 6d 65 6d 6f 72 79 22 3b 20 20 20 20 20  of memory";     
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
57a0: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
57b0: 4e 4c 59 3a 20 20 20 7a 20 3d 20 22 61 74 74 65  NLY:   z = "atte
57c0: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72  mpt to write a r
57d0: 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  eadonly database
57e0: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
57f0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  ase SQLITE_INTER
5800: 52 55 50 54 3a 20 20 7a 20 3d 20 22 69 6e 74 65  RUPT:  z = "inte
5810: 72 72 75 70 74 65 64 22 3b 20 20 20 20 20 20 20  rrupted";       
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5840: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
5850: 3a 20 20 20 20 20 20 7a 20 3d 20 22 64 69 73 6b  :      z = "disk
5860: 20 49 2f 4f 20 65 72 72 6f 72 22 3b 20 20 20 20   I/O error";    
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5880: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5890: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ase SQLITE_CORRU
58a0: 50 54 3a 20 20 20 20 7a 20 3d 20 22 64 61 74 61  PT:    z = "data
58b0: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
58c0: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 3b 20 20  is malformed";  
58d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
58e0: 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a  ase SQLITE_FULL:
58f0: 20 20 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61         z = "data
5900: 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20  base or disk is 
5910: 66 75 6c 6c 22 3b 20 20 20 20 20 20 20 20 20 20  full";          
5920: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5930: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
5940: 50 45 4e 3a 20 20 20 7a 20 3d 20 22 75 6e 61 62  PEN:   z = "unab
5950: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
5960: 61 73 65 20 66 69 6c 65 22 3b 20 20 20 20 20 20  ase file";      
5970: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5980: 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  ase SQLITE_EMPTY
5990: 3a 20 20 20 20 20 20 7a 20 3d 20 22 74 61 62 6c  :      z = "tabl
59a0: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  e contains no da
59b0: 74 61 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ta";            
59c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
59d0: 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d  ase SQLITE_SCHEM
59e0: 41 3a 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61  A:     z = "data
59f0: 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
5a00: 63 68 61 6e 67 65 64 22 3b 20 20 20 20 20 20 20  changed";       
5a10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5a20: 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49  ase SQLITE_TOOBI
5a30: 47 3a 20 20 20 20 20 7a 20 3d 20 22 53 74 72 69  G:     z = "Stri
5a40: 6e 67 20 6f 72 20 42 4c 4f 42 20 65 78 63 65 65  ng or BLOB excee
5a50: 64 65 64 20 73 69 7a 65 20 6c 69 6d 69 74 22 3b  ded size limit";
5a60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5a70: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
5a80: 52 41 49 4e 54 3a 20 7a 20 3d 20 22 63 6f 6e 73  RAINT: z = "cons
5a90: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 3b 20  traint failed"; 
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ab0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5ac0: 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41  ase SQLITE_MISMA
5ad0: 54 43 48 3a 20 20 20 7a 20 3d 20 22 64 61 74 61  TCH:   z = "data
5ae0: 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22 3b 20  type mismatch"; 
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5b10: 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  ase SQLITE_MISUS
5b20: 45 3a 20 20 20 20 20 7a 20 3d 20 22 6c 69 62 72  E:     z = "libr
5b30: 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c  ary routine call
5b40: 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e  ed out of sequen
5b50: 63 65 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 63  ce";break;.    c
5b60: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  ase SQLITE_NOLFS
5b70: 3a 20 20 20 20 20 20 7a 20 3d 20 22 6c 61 72 67  :      z = "larg
5b80: 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69  e file support i
5b90: 73 20 64 69 73 61 62 6c 65 64 22 3b 20 20 20 20  s disabled";    
5ba0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5bb0: 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a  ase SQLITE_AUTH:
5bc0: 20 20 20 20 20 20 20 7a 20 3d 20 22 61 75 74 68         z = "auth
5bd0: 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64  orization denied
5be0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
5bf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5c00: 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41  ase SQLITE_FORMA
5c10: 54 3a 20 20 20 20 20 7a 20 3d 20 22 61 75 78 69  T:     z = "auxi
5c20: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
5c30: 6f 72 6d 61 74 20 65 72 72 6f 72 22 3b 20 20 20  ormat error";   
5c40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5c50: 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45  ase SQLITE_RANGE
5c60: 3a 20 20 20 20 20 20 7a 20 3d 20 22 62 69 6e 64  :      z = "bind
5c70: 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78   or column index
5c80: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 3b 20   out of range"; 
5c90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5ca0: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  ase SQLITE_NOTAD
5cb0: 42 3a 20 20 20 20 20 7a 20 3d 20 22 66 69 6c 65  B:     z = "file
5cc0: 20 69 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72   is encrypted or
5cd0: 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61   is not a databa
5ce0: 73 65 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 64  se";break;.    d
5cf0: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
5d00: 20 20 20 20 20 20 20 7a 20 3d 20 22 75 6e 6b 6e         z = "unkn
5d10: 6f 77 6e 20 65 72 72 6f 72 22 3b 20 20 20 20 20  own error";     
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
5d40: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
5d50: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5d60: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75   implements a bu
5d70: 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74  sy callback that
5d80: 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65   sleeps and trie
5d90: 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c  s.** again until
5da0: 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65   a timeout value
5db0: 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68   is reached.  Th
5dc0: 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  e timeout value 
5dd0: 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  is.** an integer
5de0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
5df0: 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69  seconds passed i
5e00: 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n as the first.*
5e10: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  * argument..*/.s
5e20: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
5e30: 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62  DefaultBusyCallb
5e40: 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c  ack(. void *ptr,
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5e60: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
5e70: 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f  ction */. int co
5e80: 75 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  unt             
5e90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5ea0: 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20  times table has 
5eb0: 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a  been busy */.){.
5ec0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
5ed0: 4e 20 7c 7c 20 28 64 65 66 69 6e 65 64 28 48 41  N || (defined(HA
5ee0: 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41  VE_USLEEP) && HA
5ef0: 56 45 5f 55 53 4c 45 45 50 29 0a 20 20 73 74 61  VE_USLEEP).  sta
5f00: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 64 65 6c  tic const u8 del
5f10: 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31  ays[] =.     { 1
5f20: 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20  , 2, 5, 10, 15, 
5f30: 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35 2c  20, 25, 25,  25,
5f40: 20 20 35 30 2c 20 20 35 30 2c 20 31 30 30 20 7d    50,  50, 100 }
5f50: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
5f60: 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20   u8 totals[] =. 
5f70: 20 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20      { 0, 1, 3,  
5f80: 38 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c 20 37  8, 18, 33, 53, 7
5f90: 38 2c 20 31 30 33 2c 20 31 32 38 2c 20 31 37 38  8, 103, 128, 178
5fa0: 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e  , 228 };.# defin
5fb0: 65 20 4e 44 45 4c 41 59 20 28 73 69 7a 65 6f 66  e NDELAY (sizeof
5fc0: 28 64 65 6c 61 79 73 29 2f 73 69 7a 65 6f 66 28  (delays)/sizeof(
5fd0: 64 65 6c 61 79 73 5b 30 5d 29 29 0a 20 20 73 71  delays[0])).  sq
5fe0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c  lite3 *db = (sql
5ff0: 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e  ite3 *)ptr;.  in
6000: 74 20 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d 3e  t timeout = db->
6010: 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69  busyTimeout;.  i
6020: 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b  nt delay, prior;
6030: 0a 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e  ..  assert( coun
6040: 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f  t>=0 );.  if( co
6050: 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a  unt < NDELAY ){.
6060: 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61      delay = dela
6070: 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70  ys[count];.    p
6080: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f  rior = totals[co
6090: 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  unt];.  }else{. 
60a0: 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79     delay = delay
60b0: 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20  s[NDELAY-1];.   
60c0: 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b   prior = totals[
60d0: 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61  NDELAY-1] + dela
60e0: 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59  y*(count-(NDELAY
60f0: 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  -1));.  }.  if( 
6100: 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20  prior + delay > 
6110: 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 64  timeout ){.    d
6120: 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d  elay = timeout -
6130: 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20   prior;.    if( 
6140: 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75 72  delay<=0 ) retur
6150: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
6160: 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56  e3OsSleep(db->pV
6170: 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29 3b  fs, delay*1000);
6180: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c  .  return 1;.#el
6190: 73 65 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  se.  sqlite3 *db
61a0: 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74   = (sqlite3 *)pt
61b0: 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74  r;.  int timeout
61c0: 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70   = ((sqlite3 *)p
61d0: 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74  tr)->busyTimeout
61e0: 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31  ;.  if( (count+1
61f0: 29 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f 75 74  )*1000 > timeout
6200: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
6210: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
6220: 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c  sSleep(db->pVfs,
6230: 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72 65 74   1000000);.  ret
6240: 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 1;.#endif.}.
6250: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
6260: 65 20 67 69 76 65 6e 20 62 75 73 79 20 68 61 6e  e given busy han
6270: 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dler..**.** This
6280: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
6290: 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61  ed when an opera
62a0: 74 69 6f 6e 20 66 61 69 6c 65 64 20 77 69 74 68  tion failed with
62b0: 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74   a lock..** If t
62c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
62d0: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
62e0: 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65  e lock is retrie
62f0: 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74  d.  If it.** ret
6300: 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72  urns 0, the oper
6310: 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74  ation aborts wit
6320: 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  h an SQLITE_BUSY
6330: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73   error..*/.int s
6340: 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
6350: 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64  Handler(BusyHand
6360: 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ler *p){.  int r
6370: 63 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  c;.  if( NEVER(p
6380: 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e 63  ==0) || p->xFunc
6390: 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c  ==0 || p->nBusy<
63a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
63b0: 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70 2d  rc = p->xFunc(p-
63c0: 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29  >pArg, p->nBusy)
63d0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
63e0: 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20  .    p->nBusy = 
63f0: 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
6400: 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d   p->nBusy++;.  }
6410: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d  .  return rc; .}
6420: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6430: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 62 75  tine sets the bu
6440: 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  sy callback for 
6450: 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61  an Sqlite databa
6460: 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76  se to the.** giv
6470: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  en callback func
6480: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69  tion with the gi
6490: 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ven argument..*/
64a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73  .int sqlite3_bus
64b0: 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c  y_handler(.  sql
64c0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20  ite3 *db,.  int 
64d0: 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69  (*xBusy)(void*,i
64e0: 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  nt),.  void *pAr
64f0: 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  g.){.  sqlite3_m
6500: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
6510: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73  utex);.  db->bus
6520: 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d  yHandler.xFunc =
6530: 20 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75   xBusy;.  db->bu
6540: 73 79 48 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d  syHandler.pArg =
6550: 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73   pArg;.  db->bus
6560: 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d  yHandler.nBusy =
6570: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
6580: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
6590: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
65a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
65b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
65c0: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
65d0: 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CK./*.** This ro
65e0: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70  utine sets the p
65f0: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
6600: 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64   for an Sqlite d
6610: 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a  atabase to the.*
6620: 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  * given callback
6630: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
6640: 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e  he given argumen
6650: 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73 20  t. The progress 
6660: 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a  callback will.**
6670: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72   be invoked ever
6680: 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a  y nOps opcodes..
6690: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
66a0: 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
66b0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
66c0: 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20   .  int nOps,.  
66d0: 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29  int (*xProgress)
66e0: 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64  (void*), .  void
66f0: 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69   *pArg.){.  sqli
6700: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
6710: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
6720: 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20  ( nOps>0 ){.    
6730: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20  db->xProgress = 
6740: 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64  xProgress;.    d
6750: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
6760: 3d 20 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e  = nOps;.    db->
6770: 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70  pProgressArg = p
6780: 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Arg;.  }else{.  
6790: 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20    db->xProgress 
67a0: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  = 0;.    db->nPr
67b0: 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20  ogressOps = 0;. 
67c0: 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73     db->pProgress
67d0: 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  Arg = 0;.  }.  s
67e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
67f0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ve(db->mutex);.}
6800: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
6810: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73  This routine ins
6820: 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20  talls a default 
6830: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61  busy handler tha
6840: 74 20 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a  t waits for the.
6850: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d  ** specified num
6860: 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
6870: 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nds before retur
6880: 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  ning 0..*/.int s
6890: 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
68a0: 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  out(sqlite3 *db,
68b0: 20 69 6e 74 20 6d 73 29 7b 0a 20 20 69 66 28 20   int ms){.  if( 
68c0: 6d 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  ms>0 ){.    db->
68d0: 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73  busyTimeout = ms
68e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  ;.    sqlite3_bu
68f0: 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73  sy_handler(db, s
6900: 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79  qliteDefaultBusy
6910: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a  Callback, (void*
6920: 29 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )db);.  }else{. 
6930: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
6940: 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30  handler(db, 0, 0
6950: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6960: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
6970: 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65  .** Cause any pe
6980: 6e 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20  nding operation 
6990: 74 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20 65  to stop at its e
69a0: 61 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e  arliest opportun
69b0: 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ity..*/.void sql
69c0: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73  ite3_interrupt(s
69d0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64  qlite3 *db){.  d
69e0: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
69f0: 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  ted = 1;.}.../*.
6a00: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6a10: 20 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20   is exactly the 
6a20: 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f  same as sqlite3_
6a30: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
6a40: 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61  ), except.** tha
6a50: 74 20 69 74 20 69 73 20 64 65 73 69 67 6e 65 64  t it is designed
6a60: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79   to be called by
6a70: 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20   internal code. 
6a80: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69  The difference i
6a90: 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d  s.** that if a m
6aa0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e  alloc() fails in
6ab0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
6ac0: 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65  function(), an e
6ad0: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
6ae0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
6af0: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c   mallocFailed fl
6b00: 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a  ag cleared. .*/.
6b10: 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61 74  int sqlite3Creat
6b20: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
6b30: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
6b40: 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  ar *zFunctionNam
6b50: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  e,.  int nArg,. 
6b60: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
6b70: 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76   *pUserData,.  v
6b80: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
6b90: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
6ba0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
6bb0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
6bc0: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
6bd0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
6be0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
6bf0: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
6c00: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a  lite3_context*).
6c10: 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b  ){.  FuncDef *p;
6c20: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20  .  int nName;.. 
6c30: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6c40: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
6c50: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
6c60: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30  zFunctionName==0
6c70: 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63   ||.      (xFunc
6c80: 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78   && (xFinal || x
6c90: 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20  Step)) || .     
6ca0: 20 28 21 78 46 75 6e 63 20 26 26 20 28 78 46 69   (!xFunc && (xFi
6cb0: 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29 29 20  nal && !xStep)) 
6cc0: 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63  ||.      (!xFunc
6cd0: 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20   && (!xFinal && 
6ce0: 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20  xStep)) ||.     
6cf0: 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72   (nArg<-1 || nAr
6d00: 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  g>SQLITE_MAX_FUN
6d10: 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20  CTION_ARG) ||.  
6d20: 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20      (255<(nName 
6d30: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 28  = sqlite3Strlen(
6d40: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
6d50: 65 29 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  e))) ){.    sqli
6d60: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
6d70: 49 54 45 5f 45 52 52 4f 52 2c 20 22 62 61 64 20  ITE_ERROR, "bad 
6d80: 70 61 72 61 6d 65 74 65 72 73 22 29 3b 0a 20 20  parameters");.  
6d90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6da0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 23 69  ERROR;.  }.  .#i
6db0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6dc0: 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20  T_UTF16.  /* If 
6dd0: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
6de0: 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65  specified as the
6df0: 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20   encoding type, 
6e00: 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20  transform this. 
6e10: 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51   ** to one of SQ
6e20: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20  LITE_UTF16LE or 
6e30: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75  SQLITE_UTF16BE u
6e40: 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51  sing the.  ** SQ
6e50: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
6e60: 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55   macro. SQLITE_U
6e70: 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64  TF16 is not used
6e80: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
6e90: 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45  *.  ** If SQLITE
6ea0: 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69 65  _ANY is specifie
6eb0: 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65 72  d, add three ver
6ec0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e  sions of the fun
6ed0: 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  ction.  ** to th
6ee0: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20  e hash table..  
6ef0: 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51  */.  if( enc==SQ
6f00: 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20  LITE_UTF16 ){.  
6f10: 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55    enc = SQLITE_U
6f20: 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65  TF16NATIVE;.  }e
6f30: 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c  lse if( enc==SQL
6f40: 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69  ITE_ANY ){.    i
6f50: 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  nt rc;.    rc = 
6f60: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
6f70: 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  c(db, zFunctionN
6f80: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
6f90: 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20  E_UTF8,.        
6fa0: 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e   pUserData, xFun
6fb0: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
6fc0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
6fd0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6fe0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
6ff0: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
7000: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67  nctionName, nArg
7010: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
7020: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65  ,.          pUse
7030: 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53  rData, xFunc, xS
7040: 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20  tep, xFinal);.  
7050: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
7060: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7070: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
7080: 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51    }.    enc = SQ
7090: 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20  LITE_UTF16BE;.  
70a0: 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20  }.#else.  enc = 
70b0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e  SQLITE_UTF8;.#en
70c0: 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63  dif.  .  /* Chec
70d0: 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  k if an existing
70e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
70f0: 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72  ng overridden or
7100: 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c   deleted. If so,
7110: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20  .  ** and there 
7120: 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20  are active VMs, 
7130: 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49  then return SQLI
7140: 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75  TE_BUSY. If a fu
7150: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62  nction.  ** is b
7160: 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f  eing overridden/
7170: 64 65 6c 65 74 65 64 20 62 75 74 20 74 68 65 72  deleted but ther
7180: 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  e are no active 
7190: 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20  VMs, allow the. 
71a0: 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f   ** operation to
71b0: 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e   continue but in
71c0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
71d0: 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
71e0: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  nts..  */.  p = 
71f0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
7200: 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  ion(db, zFunctio
7210: 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41  nName, nName, nA
7220: 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29 3b  rg, (u8)enc, 0);
7230: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69  .  if( p && p->i
7240: 50 72 65 66 45 6e 63 3d 3d 65 6e 63 20 26 26 20  PrefEnc==enc && 
7250: 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b  p->nArg==nArg ){
7260: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 63 74  .    if( db->act
7270: 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a 20 20  iveVdbeCnt ){.  
7280: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7290: 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
72a0: 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62  , .        "unab
72b0: 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64  le to delete/mod
72c0: 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69 6f  ify user-functio
72d0: 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20  n due to active 
72e0: 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20  statements");.  
72f0: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
7300: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
7310: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
7320: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
7330: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
7340: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
7350: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
7360: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20  .    }.  }..  p 
7370: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
7380: 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74  ction(db, zFunct
7390: 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  ionName, nName, 
73a0: 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31  nArg, (u8)enc, 1
73b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c  );.  assert(p ||
73c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
73d0: 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  d);.  if( !p ){.
73e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
73f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
7400: 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70  ->flags = 0;.  p
7410: 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b  ->xFunc = xFunc;
7420: 0a 20 20 70 2d 3e 78 53 74 65 70 20 3d 20 78 53  .  p->xStep = xS
7430: 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c  tep;.  p->xFinal
7440: 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20  ize = xFinal;.  
7450: 70 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70  p->pUserData = p
7460: 55 73 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e  UserData;.  p->n
7470: 41 72 67 20 3d 20 28 75 31 36 29 6e 41 72 67 3b  Arg = (u16)nArg;
7480: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7490: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
74a0: 65 61 74 65 20 6e 65 77 20 75 73 65 72 20 66 75  eate new user fu
74b0: 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  nctions..*/.int 
74c0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
74d0: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
74e0: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
74f0: 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  char *zFunctionN
7500: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  ame,.  int nArg,
7510: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
7520: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
7530: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
7540: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
7550: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
7560: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
7570: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
7580: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
7590: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
75a0: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
75b0: 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69  context*).){.  i
75c0: 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
75d0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
75e0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 63 20 3d 20  >mutex);.  rc = 
75f0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
7600: 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  c(db, zFunctionN
7610: 61 6d 65 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  ame, nArg, enc, 
7620: 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  p, xFunc, xStep,
7630: 20 78 46 69 6e 61 6c 29 3b 0a 20 20 72 63 20 3d   xFinal);.  rc =
7640: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
7650: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
7660: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
7670: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
7680: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
7690: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
76a0: 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33  TF16.int sqlite3
76b0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
76c0: 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
76d0: 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b,.  const void 
76e0: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
76f0: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
7700: 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f  t eTextRep,.  vo
7710: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
7720: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
7730: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
7740: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
7750: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
7760: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
7770: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
7780: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
7790: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
77a0: 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74  ntext*).){.  int
77b0: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75   rc;.  char *zFu
77c0: 6e 63 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  nc8;.  sqlite3_m
77d0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
77e0: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
77f0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
7800: 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d  ed );.  zFunc8 =
7810: 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38   sqlite3Utf16to8
7820: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
7830: 6d 65 2c 20 2d 31 29 3b 0a 20 20 72 63 20 3d 20  me, -1);.  rc = 
7840: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
7850: 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41  c(db, zFunc8, nA
7860: 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c  rg, eTextRep, p,
7870: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
7880: 46 69 6e 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65  Final);.  sqlite
7890: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e  3DbFree(db, zFun
78a0: 63 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  c8);.  rc = sqli
78b0: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
78c0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
78d0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
78e0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
78f0: 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  c;.}.#endif.../*
7900: 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74  .** Declare that
7910: 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20   a function has 
7920: 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  been overloaded 
7930: 62 79 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  by a virtual tab
7940: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
7950: 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64   function alread
7960: 79 20 65 78 69 73 74 73 20 61 73 20 61 20 72 65  y exists as a re
7970: 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e  gular global fun
7980: 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74  ction, then.** t
7990: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
79a0: 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20   no-op.  If the 
79b0: 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
79c0: 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72  t exist, then cr
79d0: 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e  eate.** a new on
79e0: 65 20 74 68 61 74 20 61 6c 77 61 79 73 20 74 68  e that always th
79f0: 72 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  rows a run-time 
7a00: 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57  error.  .**.** W
7a10: 68 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c  hen virtual tabl
7a20: 65 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f  es intend to pro
7a30: 76 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64  vide an overload
7a40: 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  ed function, the
7a50: 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c  y.** should call
7a60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
7a70: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 67   make sure the g
7a80: 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65  lobal function e
7a90: 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62  xists..** A glob
7aa0: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  al function must
7ab0: 20 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20   exist in order 
7ac0: 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  for name resolut
7ad0: 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70  ion to work.** p
7ae0: 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  roperly..*/.int 
7af0: 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64  sqlite3_overload
7b00: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  _function(.  sql
7b10: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
7b20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20  t char *zName,. 
7b30: 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69   int nArg.){.  i
7b40: 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  nt nName = sqlit
7b50: 65 33 53 74 72 6c 65 6e 28 64 62 2c 20 7a 4e 61  e3Strlen(db, zNa
7b60: 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  me);.  int rc;. 
7b70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
7b80: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
7b90: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
7ba0: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
7bb0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
7bc0: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
7bd0: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  0)==0 ){.    sql
7be0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
7bf0: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  b, zName, nArg, 
7c00: 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c20: 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e 76     0, sqlite3Inv
7c30: 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  alidFunction, 0,
7c40: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   0);.  }.  rc = 
7c50: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
7c60: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
7c70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
7c80: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
7c90: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7ca0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7cb0: 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  OMIT_TRACE./*.**
7cc0: 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63   Register a trac
7cd0: 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  e function.  The
7ce0: 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70   pArg from the p
7cf0: 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74  reviously regist
7d00: 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73  ered trace.** is
7d10: 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a   returned.  .**.
7d20: 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20  ** A NULL trace 
7d30: 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74  function means t
7d40: 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69  hat no tracing i
7d50: 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e  s executes.  A n
7d60: 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65  on-NULL.** trace
7d70: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
7d80: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   a function that
7d90: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74   is invoked at t
7da0: 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
7db0: 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  .** SQL statemen
7dc0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  t..*/.void *sqli
7dd0: 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65  te3_trace(sqlite
7de0: 33 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78 54  3 *db, void (*xT
7df0: 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  race)(void*,cons
7e00: 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a  t char*), void *
7e10: 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  pArg){.  void *p
7e20: 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Old;.  sqlite3_m
7e30: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
7e40: 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  utex);.  pOld = 
7e50: 64 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20  db->pTraceArg;. 
7e60: 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54   db->xTrace = xT
7e70: 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61  race;.  db->pTra
7e80: 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ceArg = pArg;.  
7e90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
7ea0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
7eb0: 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d    return pOld;.}
7ec0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
7ed0: 61 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  a profile functi
7ee0: 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72  on.  The pArg fr
7ef0: 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  om the previousl
7f00: 79 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a 2a  y registered .**
7f10: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
7f20: 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  n is returned.  
7f30: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72  .**.** A NULL pr
7f40: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d  ofile function m
7f50: 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72 6f  eans that no pro
7f60: 66 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75 74  filing is execut
7f70: 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a  es.  A non-NULL.
7f80: 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20  ** profile is a 
7f90: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
7fa0: 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e  ction that is in
7fb0: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
7fc0: 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61  clusion of.** ea
7fd0: 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ch SQL statement
7fe0: 20 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f   that is run..*/
7ff0: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70  .void *sqlite3_p
8000: 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  rofile(.  sqlite
8010: 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a  3 *db,.  void (*
8020: 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c  xProfile)(void*,
8030: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69  const char*,sqli
8040: 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f  te_uint64),.  vo
8050: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f  id *pArg.){.  vo
8060: 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69  id *pOld;.  sqli
8070: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
8080: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
8090: 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c  ld = db->pProfil
80a0: 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f  eArg;.  db->xPro
80b0: 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b  file = xProfile;
80c0: 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41  .  db->pProfileA
80d0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
80e0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
80f0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
8100: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65  eturn pOld;.}.#e
8110: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8120: 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  MIT_TRACE */../*
8130: 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20  ** EXPERIMENTAL 
8140: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74  ***.**.** Regist
8150: 65 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f  er a function to
8160: 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e   be invoked when
8170: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
8180: 6f 6d 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66 20 74  omments..** If t
8190: 68 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74  he invoked funct
81a0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ion returns non-
81b0: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63  zero, then the c
81c0: 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20 61 0a  ommit becomes a.
81d0: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  ** rollback..*/.
81e0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f  void *sqlite3_co
81f0: 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  mmit_hook(.  sql
8200: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
8210: 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
8220: 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
8230: 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
8240: 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  int (*xCallback)
8250: 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e  (void*),  /* Fun
8260: 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20  ction to invoke 
8270: 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a  on each commit *
8280: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
82a0: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
82b0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
82c0: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20    void *pOld;.  
82d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
82e0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
82f0: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f    pOld = db->pCo
8300: 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78  mmitArg;.  db->x
8310: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d  CommitCallback =
8320: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
8330: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70  ->pCommitArg = p
8340: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
8350: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
8360: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
8370: 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pOld;.}../*.** R
8380: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
8390: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
83a0: 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77   each time a row
83b0: 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
83c0: 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65  inserted or dele
83d0: 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64  ted using this d
83e0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
83f0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
8400: 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b  ite3_update_hook
8410: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8430: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
8440: 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
8450: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  e */.  void (*xC
8460: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69  allback)(void*,i
8470: 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c  nt,char const *,
8480: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c  char const *,sql
8490: 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f  ite_int64),.  vo
84a0: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
84b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
84c0: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
84d0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
84e0: 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65   *pRet;.  sqlite
84f0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
8500: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
8510: 20 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72   = db->pUpdateAr
8520: 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65  g;.  db->xUpdate
8530: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
8540: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64  back;.  db->pUpd
8550: 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ateArg = pArg;. 
8560: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
8570: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
8580: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
8590: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
85a0: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
85b0: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
85c0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
85d0: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20  on is rolled.** 
85e0: 62 61 63 6b 20 62 79 20 74 68 69 73 20 64 61 74  back by this dat
85f0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8600: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
8610: 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  e3_rollback_hook
8620: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
8630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8640: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
8650: 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
8660: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  e */.  void (*xC
8670: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c  allback)(void*),
8680: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e   /* Callback fun
8690: 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
86a0: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
86b0: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
86c0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
86d0: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
86e0: 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Ret;.  sqlite3_m
86f0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
8700: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
8710: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
8720: 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  ;.  db->xRollbac
8730: 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  kCallback = xCal
8740: 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f  lback;.  db->pRo
8750: 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67  llbackArg = pArg
8760: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
8770: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
8780: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  x);.  return pRe
8790: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
87a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
87b0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 63  ed to create a c
87c0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64  onnection to a d
87d0: 61 74 61 62 61 73 65 20 42 54 72 65 65 0a 2a 2a  atabase BTree.**
87e0: 20 64 72 69 76 65 72 2e 20 20 49 66 20 7a 46 69   driver.  If zFi
87f0: 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
8800: 6d 65 20 6f 66 20 61 20 66 69 6c 65 2c 20 74 68  me of a file, th
8810: 65 6e 20 74 68 61 74 20 66 69 6c 65 20 69 73 0a  en that file is.
8820: 2a 2a 20 6f 70 65 6e 65 64 20 61 6e 64 20 75 73  ** opened and us
8830: 65 64 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ed.  If zFilenam
8840: 65 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 6e  e is the magic n
8850: 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74  ame ":memory:" t
8860: 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  hen.** the datab
8870: 61 73 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ase is stored in
8880: 20 6d 65 6d 6f 72 79 20 28 61 6e 64 20 69 73 20   memory (and is 
8890: 74 68 75 73 20 66 6f 72 67 6f 74 74 65 6e 20 61  thus forgotten a
88a0: 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20 74 68 65  s soon as.** the
88b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63   connection is c
88c0: 6c 6f 73 65 64 2e 29 20 20 49 66 20 7a 46 69 6c  losed.)  If zFil
88d0: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
88e0: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  en the database.
88f0: 2a 2a 20 69 73 20 61 20 22 76 69 72 74 75 61 6c  ** is a "virtual
8900: 22 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 74  " database for t
8910: 72 61 6e 73 69 65 6e 74 20 75 73 65 20 6f 6e 6c  ransient use onl
8920: 79 20 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64  y and is deleted
8930: 20 61 73 0a 2a 2a 20 73 6f 6f 6e 20 61 73 20 74   as.** soon as t
8940: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
8950: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41   closed..**.** A
8960: 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73   virtual databas
8970: 65 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  e can be either 
8980: 61 20 64 69 73 6b 20 66 69 6c 65 20 28 74 68 61  a disk file (tha
8990: 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  t is automatical
89a0: 6c 79 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  ly.** deleted wh
89b0: 65 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  en the file is c
89c0: 6c 6f 73 65 64 29 20 6f 72 20 69 74 20 61 6e 20  losed) or it an 
89d0: 62 65 20 68 65 6c 64 20 65 6e 74 69 72 65 6c 79  be held entirely
89e0: 20 69 6e 20 6d 65 6d 6f 72 79 2c 0a 2a 2a 20 64   in memory,.** d
89f0: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
8a00: 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 53 51  values of the SQ
8a10: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20  LITE_TEMP_STORE 
8a20: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6d 61 63  compile-time mac
8a30: 72 6f 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 62  ro and the.** db
8a40: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 76 61 72  ->temp_store var
8a50: 69 61 62 6c 65 2c 20 61 63 63 6f 72 64 69 6e 67  iable, according
8a60: 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
8a70: 67 20 63 68 61 72 74 3a 0a 2a 2a 0a 2a 2a 20 20  g chart:.**.**  
8a80: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
8a90: 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f  RE     db->temp_
8aa0: 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69  store     Locati
8ab0: 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  on of temporary 
8ac0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d  database.**   --
8ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
8ae0: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
8af0: 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
8b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b10: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
8b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b30: 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
8b40: 20 20 20 20 66 69 6c 65 0a 2a 2a 20 20 20 31 20      file.**   1 
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
8b70: 20 20 20 20 20 20 20 66 69 6c 65 0a 2a 2a 20 20         file.**  
8b80: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
8b90: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
8ba0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
8bb0: 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
8bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
8be0: 69 6c 65 0a 2a 2a 20 20 20 32 20 20 20 20 20 20  ile.**   2      
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c10: 20 20 66 69 6c 65 0a 2a 2a 20 20 20 32 20 20 20    file.**   2   
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c30: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
8c40: 20 20 20 20 20 6d 65 6d 6f 72 79 0a 2a 2a 20 20       memory.**  
8c50: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
8c60: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
8c70: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
8c80: 0a 2a 2a 20 20 20 33 20 20 20 20 20 20 20 20 20  .**   3         
8c90: 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20              any 
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
8cb0: 65 6d 6f 72 79 0a 2a 2f 0a 69 6e 74 20 73 71 6c  emory.*/.int sql
8cc0: 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79  ite3BtreeFactory
8cd0: 28 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  (.  const sqlite
8ce0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a  3 *db,        /*
8cf0: 20 4d 61 69 6e 20 64 61 74 61 62 61 73 65 20 77   Main database w
8d00: 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 75 78 20  hen opening aux 
8d10: 6f 74 68 65 72 77 69 73 65 20 30 20 2a 2f 0a 20  otherwise 0 */. 
8d20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
8d30: 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61  lename,    /* Na
8d40: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
8d50: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
8d60: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
8d70: 20 20 69 6e 74 20 6f 6d 69 74 4a 6f 75 72 6e 61    int omitJourna
8d80: 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  l,          /* i
8d90: 66 20 54 52 55 45 20 74 68 65 6e 20 64 6f 20 6e  f TRUE then do n
8da0: 6f 74 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  ot journal this 
8db0: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  file */.  int nC
8dc0: 61 63 68 65 2c 20 20 20 20 20 20 20 20 20 20 20  ache,           
8dd0: 20 20 20 20 2f 2a 20 48 6f 77 20 6d 61 6e 79 20      /* How many 
8de0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
8df0: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e 74  e cache */.  int
8e00: 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20   vfsFlags,      
8e10: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
8e20: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
8e30: 6f 20 76 66 73 4f 70 65 6e 20 2a 2f 0a 20 20 42  o vfsOpen */.  B
8e40: 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 20 20  tree **ppBtree  
8e50: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8e60: 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
8e70: 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
8e80: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
8e90: 20 62 74 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20   btFlags = 0;.  
8ea0: 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 61 73 73  int rc;.  .  ass
8eb0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
8ec0: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
8ed0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
8ee0: 70 70 42 74 72 65 65 20 21 3d 20 30 29 3b 0a 20  ppBtree != 0);. 
8ef0: 20 69 66 28 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c   if( omitJournal
8f00: 20 29 7b 0a 20 20 20 20 62 74 46 6c 61 67 73 20   ){.    btFlags 
8f10: 7c 3d 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f  |= BTREE_OMIT_JO
8f20: 55 52 4e 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 28  URNAL;.  }.  if(
8f30: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
8f40: 49 54 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 29  ITE_NoReadlock )
8f50: 7b 0a 20 20 20 20 62 74 46 6c 61 67 73 20 7c 3d  {.    btFlags |=
8f60: 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f   BTREE_NO_READLO
8f70: 43 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46  CK;.  }.  if( zF
8f80: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69  ilename==0 ){.#i
8f90: 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
8fa0: 4f 52 45 3d 3d 30 0a 20 20 20 20 2f 2a 20 44 6f  ORE==0.    /* Do
8fb0: 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 23 65 6e 64   nothing */.#end
8fc0: 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
8fd0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
8fe0: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
8ff0: 53 54 4f 52 45 3d 3d 31 0a 20 20 20 20 69 66 28  STORE==1.    if(
9000: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d   db->temp_store=
9010: 3d 32 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  =2 ) zFilename =
9020: 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65 6e   ":memory:";.#en
9030: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  dif.#if SQLITE_T
9040: 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 20  EMP_STORE==2.   
9050: 20 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74   if( db->temp_st
9060: 6f 72 65 21 3d 31 20 29 20 7a 46 69 6c 65 6e 61  ore!=1 ) zFilena
9070: 6d 65 20 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b  me = ":memory:";
9080: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
9090: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33  TE_TEMP_STORE==3
90a0: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
90b0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65 6e   ":memory:";.#en
90c0: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
90d0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
90e0: 44 42 20 2a 2f 0a 20 20 7d 0a 0a 20 20 69 66 28  DB */.  }..  if(
90f0: 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
9100: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
9110: 29 21 3d 30 20 26 26 20 28 7a 46 69 6c 65 6e 61  )!=0 && (zFilena
9120: 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 6c 65 6e  me==0 || *zFilen
9130: 61 6d 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 76  ame==0) ){.    v
9140: 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c  fsFlags = (vfsFl
9150: 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50  ags & ~SQLITE_OP
9160: 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51  EN_MAIN_DB) | SQ
9170: 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
9180: 42 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  B;.  }.  rc = sq
9190: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 7a  lite3BtreeOpen(z
91a0: 46 69 6c 65 6e 61 6d 65 2c 20 28 73 71 6c 69 74  Filename, (sqlit
91b0: 65 33 20 2a 29 64 62 2c 20 70 70 42 74 72 65 65  e3 *)db, ppBtree
91c0: 2c 20 62 74 46 6c 61 67 73 2c 20 76 66 73 46 6c  , btFlags, vfsFl
91d0: 61 67 73 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ags);..  /* If t
91e0: 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75  he B-Tree was su
91f0: 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
9200: 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72  d, set the pager
9210: 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74  -cache size to t
9220: 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  he.  ** default 
9230: 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 69  value. Except, i
9240: 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 42 74  f the call to Bt
9250: 72 65 65 4f 70 65 6e 28 29 20 72 65 74 75 72 6e  reeOpen() return
9260: 65 64 20 61 20 68 61 6e 64 6c 65 0a 20 20 2a 2a  ed a handle.  **
9270: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 65 78 69 73   open on an exis
9280: 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65  ting shared page
9290: 72 2d 63 61 63 68 65 2c 20 64 6f 20 6e 6f 74 20  r-cache, do not 
92a0: 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72  change the pager
92b0: 2d 63 61 63 68 65 20 0a 20 20 2a 2a 20 73 69 7a  -cache .  ** siz
92c0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
92d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
92e0: 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  ==sqlite3BtreeSc
92f0: 68 65 6d 61 28 2a 70 70 42 74 72 65 65 2c 20 30  hema(*ppBtree, 0
9300: 2c 20 30 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  , 0) ){.    sqli
9310: 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
9320: 53 69 7a 65 28 2a 70 70 42 74 72 65 65 2c 20 6e  Size(*ppBtree, n
9330: 43 61 63 68 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Cache);.  }.  re
9340: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9350: 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65  * Return UTF-8 e
9360: 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c  ncoded English l
9370: 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74  anguage explanat
9380: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
9390: 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e  recent.** error.
93a0: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
93b0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73  sqlite3_errmsg(s
93c0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63  qlite3 *db){.  c
93d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
93e0: 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
93f0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
9400: 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
9410: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  );.  }.  if( !sq
9420: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
9430: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
9440: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
9450: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
9460: 4d 49 53 55 53 45 29 3b 0a 20 20 7d 0a 20 20 73  MISUSE);.  }.  s
9470: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
9480: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
9490: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
94a0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d  ailed ){.    z =
94b0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
94c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
94d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 28  }else{.    z = (
94e0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
94f0: 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72  lue_text(db->pEr
9500: 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
9510: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
9520: 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  d );.    if( z==
9530: 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  0 ){.      z = s
9540: 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d  qlite3ErrStr(db-
9550: 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d  >errCode);.    }
9560: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
9570: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
9580: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
9590: 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  z;.}..#ifndef SQ
95a0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
95b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46  /*.** Return UTF
95c0: 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  -16 encoded Engl
95d0: 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
95e0: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
95f0: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
9600: 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  rror..*/.const v
9610: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  oid *sqlite3_err
9620: 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64  msg16(sqlite3 *d
9630: 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  b){.  static con
9640: 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b  st u16 outOfMem[
9650: 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27  ] = {.    'o', '
9660: 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f  u', 't', ' ', 'o
9670: 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27  ', 'f', ' ', 'm'
9680: 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c  , 'e', 'm', 'o',
9690: 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d   'r', 'y', 0.  }
96a0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
96b0: 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20   u16 misuse[] = 
96c0: 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27 2c 20  {.    'l', 'i', 
96d0: 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27  'b', 'r', 'a', '
96e0: 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a 20  r', 'y', ' ', . 
96f0: 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27 75 27     'r', 'o', 'u'
9700: 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c  , 't', 'i', 'n',
9710: 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   'e', ' ', .    
9720: 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27  'c', 'a', 'l', '
9730: 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20 27 20  l', 'e', 'd', ' 
9740: 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 75 27  ', .    'o', 'u'
9750: 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 't', ' ', .   
9760: 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20   'o', 'f', ' ', 
9770: 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c 20 27  .    's', 'e', '
9780: 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20 27 6e  q', 'u', 'e', 'n
9790: 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30 0a 20  ', 'c', 'e', 0. 
97a0: 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69   };..  const voi
97b0: 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20  d *z;.  if( !db 
97c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76  ){.    return (v
97d0: 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a  oid *)outOfMem;.
97e0: 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
97f0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
9800: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
9810: 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29   return (void *)
9820: 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71  misuse;.  }.  sq
9830: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
9840: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
9850: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
9860: 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20  iled ){.    z = 
9870: 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d  (void *)outOfMem
9880: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
9890: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
98a0: 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72  _text16(db->pErr
98b0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
98c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
98d0: 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e  ValueSetStr(db->
98e0: 70 45 72 72 2c 20 2d 31 2c 20 73 71 6c 69 74 65  pErr, -1, sqlite
98f0: 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43  3ErrStr(db->errC
9900: 6f 64 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ode),.          
9910: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
9920: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
9930: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
9940: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d  value_text16(db-
9950: 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  >pErr);.    }.  
9960: 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20    /* A malloc() 
9970: 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20  may have failed 
9980: 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20  within the call 
9990: 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  to sqlite3_value
99a0: 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a  _text16().    **
99b0: 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20   above. If this 
99c0: 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
99d0: 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63  n the db->malloc
99e0: 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64  Failed flag need
99f0: 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63  s to.    ** be c
9a00: 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 72 65  leared before re
9a10: 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73  turning. Do this
9a20: 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65   directly, inste
9a30: 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a  ad of via.    **
9a40: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
9a50: 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74  ), to avoid sett
9a60: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
9a70: 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65   handle error me
9a80: 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssage..    */.  
9a90: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
9aa0: 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  ed = 0;.  }.  sq
9ab0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9ac0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
9ad0: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64  return z;.}.#end
9ae0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
9af0: 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
9b00: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * Return the mos
9b10: 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63  t recent error c
9b20: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
9b30: 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69   an SQLite routi
9b40: 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a  ne. If NULL is.*
9b50: 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  * passed to this
9b60: 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73   function, we as
9b70: 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20  sume a malloc() 
9b80: 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71  failed during sq
9b90: 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f  lite3_open()..*/
9ba0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72  .int sqlite3_err
9bb0: 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  code(sqlite3 *db
9bc0: 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  ){.  if( db && !
9bd0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
9be0: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
9bf0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9c00: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
9c10: 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
9c20: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
9c30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9c40: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
9c50: 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
9c60: 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  de & db->errMask
9c70: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
9c80: 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
9c90: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
9ca0: 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69   if( db && !sqli
9cb0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
9cc0: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
9cd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9ce0: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 69 66  MISUSE;.  }.  if
9cf0: 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ( !db || db->mal
9d00: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
9d10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
9d20: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OMEM;.  }.  retu
9d30: 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a  rn db->errCode;.
9d40: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
9d50: 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20  a new collating 
9d60: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74  function for dat
9d70: 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65  abase "db".  The
9d80: 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a   name is zName.*
9d90: 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69  * and the encodi
9da0: 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74  ng is enc..*/.st
9db0: 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43  atic int createC
9dc0: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69  ollation(.  sqli
9dd0: 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73  te3* db, .  cons
9de0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
9df0: 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f    int enc, .  vo
9e00: 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
9e10: 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
9e20: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
9e30: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
9e40: 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29  ),.  void(*xDel)
9e50: 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c  (void*).){.  Col
9e60: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
9e70: 6e 74 20 65 6e 63 32 3b 0a 20 20 69 6e 74 20 6e  nt enc2;.  int n
9e80: 4e 61 6d 65 3b 0a 20 20 0a 20 20 61 73 73 65 72  Name;.  .  asser
9e90: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
9ea0: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
9eb0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c   );..  /* If SQL
9ec0: 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65  ITE_UTF16 is spe
9ed0: 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e  cified as the en
9ee0: 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61  coding type, tra
9ef0: 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a  nsform this.  **
9f00: 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   to one of SQLIT
9f10: 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c  E_UTF16LE or SQL
9f20: 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e  ITE_UTF16BE usin
9f30: 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  g the.  ** SQLIT
9f40: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61  E_UTF16NATIVE ma
9f50: 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31  cro. SQLITE_UTF1
9f60: 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  6 is not used in
9f70: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20  ternally..  */. 
9f80: 20 65 6e 63 32 20 3d 20 65 6e 63 20 26 20 7e 53   enc2 = enc & ~S
9f90: 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
9fa0: 4e 45 44 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d  NED;.  if( enc2=
9fb0: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b  =SQLITE_UTF16 ){
9fc0: 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49  .    enc2 = SQLI
9fd0: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
9fe0: 20 20 7d 0a 20 20 69 66 28 20 28 65 6e 63 32 26    }.  if( (enc2&
9ff0: 7e 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ~3)!=0 ){.    re
a000: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
a010: 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  SE;.  }..  /* Ch
a020: 65 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c  eck if this call
a030: 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20   is removing or 
a040: 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69  replacing an exi
a050: 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20  sting collation 
a060: 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20  .  ** sequence. 
a070: 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65  If so, and there
a080: 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c   are active VMs,
a090: 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66   return busy. If
a0a0: 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20   there.  ** are 
a0b0: 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69  no active VMs, i
a0c0: 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72  nvalidate any pr
a0d0: 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  e-compiled state
a0e0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 6e 4e  ments..  */.  nN
a0f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
a100: 6c 65 6e 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  len(db, zName);.
a110: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
a120: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
a130: 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
a140: 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69  , nName, 0);.  i
a150: 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
a160: 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69  l->xCmp ){.    i
a170: 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  f( db->activeVdb
a180: 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  eCnt ){.      sq
a190: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
a1a0: 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
a1b0: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
a1c0: 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f  delete/modify co
a1d0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
a1e0: 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73   due to active s
a1f0: 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
a200: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a210: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
a220: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
a230: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
a240: 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  (db);..    /* If
a250: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
a260: 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72  nce pColl was cr
a270: 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62  eated directly b
a280: 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  y a call to.    
a290: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ** sqlite3_creat
a2a0: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64  e_collation, and
a2b0: 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62   not generated b
a2c0: 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
a2d0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e  ,.    ** then an
a2e0: 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79  y copies made by
a2f0: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20   synthCollSeq() 
a300: 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  need to be inval
a310: 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41  idated..    ** A
a320: 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64  lso, collation d
a330: 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c  estructor - Coll
a340: 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e  Seq.xDel() - fun
a350: 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20  ction may need. 
a360: 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c     ** to be call
a370: 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  ed..    */ .    
a380: 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20  if( (pColl->enc 
a390: 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  & ~SQLITE_UTF16_
a3a0: 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29  ALIGNED)==enc2 )
a3b0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
a3c0: 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *aColl = sqlite3
a3d0: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43  HashFind(&db->aC
a3e0: 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e  ollSeq, zName, n
a3f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  Name);.      int
a400: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
a410: 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<3; j++){.  
a420: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
a430: 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20   = &aColl[j];.  
a440: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63        if( p->enc
a450: 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a  ==pColl->enc ){.
a460: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
a470: 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  >xDel ){.       
a480: 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e       p->xDel(p->
a490: 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pUser);.        
a4a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
a4b0: 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  >xCmp = 0;.     
a4c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a4d0: 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20   }.  }..  pColl 
a4e0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
a4f0: 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
a500: 32 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  2, zName, nName,
a510: 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   1);.  if( pColl
a520: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 78   ){.    pColl->x
a530: 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a  Cmp = xCompare;.
a540: 20 20 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72      pColl->pUser
a550: 20 3d 20 70 43 74 78 3b 0a 20 20 20 20 70 43 6f   = pCtx;.    pCo
a560: 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b  ll->xDel = xDel;
a570: 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20  .    pColl->enc 
a580: 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65  = (u8)(enc2 | (e
a590: 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31  nc & SQLITE_UTF1
a5a0: 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 7d  6_ALIGNED));.  }
a5b0: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
a5c0: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
a5d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
a5e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
a5f0: 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69   This array defi
a600: 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62  nes hard upper b
a610: 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76  ounds on limit v
a620: 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69  alues.  The.** i
a630: 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20  nitializer must 
a640: 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20  be kept in sync 
a650: 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
a660: 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69  LIMIT_*.** #defi
a670: 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  nes in sqlite3.h
a680: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
a690: 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74  t int aHardLimit
a6a0: 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f  [] = {.  SQLITE_
a6b0: 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  MAX_LENGTH,.  SQ
a6c0: 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
a6d0: 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
a6e0: 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49  X_COLUMN,.  SQLI
a6f0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
a700: 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
a710: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c  COMPOUND_SELECT,
a720: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  .  SQLITE_MAX_VD
a730: 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f  BE_OP,.  SQLITE_
a740: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
a750: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  ,.  SQLITE_MAX_A
a760: 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54  TTACHED,.  SQLIT
a770: 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
a780: 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  RN_LENGTH,.  SQL
a790: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
a7a0: 5f 4e 55 4d 42 45 52 2c 0a 7d 3b 0a 0a 2f 2a 0a  _NUMBER,.};../*.
a7b0: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
a7c0: 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72 65   hard limits are
a7d0: 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61 62   set to reasonab
a7e0: 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66  le values.*/.#if
a7f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
a800: 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53  TH<100.# error S
a810: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
a820: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
a830: 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66  t 100.#endif.#if
a840: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
a850: 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72  LENGTH<100.# err
a860: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  or SQLITE_MAX_SQ
a870: 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  L_LENGTH must be
a880: 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65   at least 100.#e
a890: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
a8a0: 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53  MAX_SQL_LENGTH>S
a8b0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
a8c0: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
a8d0: 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d  MAX_SQL_LENGTH m
a8e0: 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61 74  ust not be great
a8f0: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d  er than SQLITE_M
a900: 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66  AX_LENGTH.#endif
a910: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
a920: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c  COMPOUND_SELECT<
a930: 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  2.# error SQLITE
a940: 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
a950: 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61 74 20  LECT must be at 
a960: 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a 23  least 2.#endif.#
a970: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  if SQLITE_MAX_VD
a980: 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72  BE_OP<40.# error
a990: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
a9a0: 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20 6c  _OP must be at l
a9b0: 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a 23  east 40.#endif.#
a9c0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  if SQLITE_MAX_FU
a9d0: 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20  NCTION_ARG<0 || 
a9e0: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
a9f0: 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a 23 20 65  ION_ARG>1000.# e
aa00: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
aa10: 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73  FUNCTION_ARG mus
aa20: 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  t be between 0 a
aa30: 6e 64 20 31 30 30 30 0a 23 65 6e 64 69 66 0a 23  nd 1000.#endif.#
aa40: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  if SQLITE_MAX_AT
aa50: 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49  TACHED<0 || SQLI
aa60: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3e  TE_MAX_ATTACHED>
aa70: 33 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  30.# error SQLIT
aa80: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 6d  E_MAX_ATTACHED m
aa90: 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30  ust be between 0
aaa0: 20 61 6e 64 20 33 30 0a 23 65 6e 64 69 66 0a 23   and 30.#endif.#
aab0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  if SQLITE_MAX_LI
aac0: 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
aad0: 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  H<1.# error SQLI
aae0: 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
aaf0: 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  ERN_LENGTH must 
ab00: 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65  be at least 1.#e
ab10: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
ab20: 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
ab30: 42 45 52 3c 31 0a 23 20 65 72 72 6f 72 20 53 51  BER<1.# error SQ
ab40: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
ab50: 45 5f 4e 55 4d 42 45 52 20 6d 75 73 74 20 62 65  E_NUMBER must be
ab60: 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64   at least 1.#end
ab70: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
ab80: 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23  X_COLUMN>32767.#
ab90: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
aba0: 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f  X_COLUMN must no
abb0: 74 20 65 78 63 65 65 64 20 33 32 37 36 37 0a 23  t exceed 32767.#
abc0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  endif.../*.** Ch
abd0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
abe0: 66 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f  f a limit.  Repo
abf0: 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  rt the old value
ac00: 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c  ..** If an inval
ac10: 69 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69  id limit index i
ac20: 73 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f  s supplied, repo
ac30: 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e  rt -1..** Make n
ac40: 6f 20 63 68 61 6e 67 65 73 20 62 75 74 20 73 74  o changes but st
ac50: 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f  ill report the o
ac60: 6c 64 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a  ld value if the.
ac70: 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20  ** new limit is 
ac80: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
ac90: 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69  A new lower limi
aca0: 74 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e  t does not shrin
acb0: 6b 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74  k existing const
acc0: 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72  ructs..** It mer
acd0: 65 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ely prevents new
ace0: 20 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74   constructs that
acf0: 20 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69   exceed the limi
ad00: 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e  t.** from formin
ad10: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
ad20: 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20  3_limit(sqlite3 
ad30: 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64  *db, int limitId
ad40: 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b  , int newLimit){
ad50: 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b  .  int oldLimit;
ad60: 0a 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30  .  if( limitId<0
ad70: 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c   || limitId>=SQL
ad80: 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20  ITE_N_LIMIT ){. 
ad90: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
ada0: 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64  }.  oldLimit = d
adb0: 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  b->aLimit[limitI
adc0: 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d  d];.  if( newLim
add0: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  it>=0 ){.    if(
ade0: 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c   newLimit>aHardL
adf0: 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b  imit[limitId] ){
ae00: 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20  .      newLimit 
ae10: 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  = aHardLimit[lim
ae20: 69 74 49 64 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  itId];.    }.   
ae30: 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69   db->aLimit[limi
ae40: 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  tId] = newLimit;
ae50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c  .  }.  return ol
ae60: 64 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dLimit;.}../*.**
ae70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
ae80: 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f  es the work of o
ae90: 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73  pening a databas
aea0: 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a  e on behalf of.*
aeb0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
aec0: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65   and sqlite3_ope
aed0: 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74 61 62  n16(). The datab
aee0: 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46  ase filename "zF
aef0: 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73  ilename"  .** is
af00: 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a   UTF-8 encoded..
af10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
af20: 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f  enDatabase(.  co
af30: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
af40: 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65  ame, /* Database
af50: 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20   filename UTF-8 
af60: 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c  encoded */.  sql
af70: 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20  ite3 **ppDb,    
af80: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
af90: 72 6e 65 64 20 64 61 74 61 62 61 73 65 20 68 61  rned database ha
afa0: 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ndle */.  unsign
afb0: 65 64 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  ed flags,       
afc0: 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20   /* Operational 
afd0: 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  flags */.  const
afe0: 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20   char *zVfs     
aff0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
b000: 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29   VFS to use */.)
b010: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
b020: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 43 6f 6c  .  int rc;.  Col
b030: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
b040: 6e 74 20 69 73 54 68 72 65 61 64 73 61 66 65 3b  nt isThreadsafe;
b050: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b060: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
b070: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
b080: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
b090: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
b0a0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
b0b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
b0c0: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d  fig.bCoreMutex==
b0d0: 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  0 ){.    isThrea
b0e0: 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
b0f0: 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
b100: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
b110: 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  EX ){.    isThre
b120: 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65  adsafe = 0;.  }e
b130: 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
b140: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
b150: 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54  MUTEX ){.    isT
b160: 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20  hreadsafe = 1;. 
b170: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68   }else{.    isTh
b180: 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74  readsafe = sqlit
b190: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
b1a0: 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 0a  FullMutex;.  }..
b1b0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d    /* Remove harm
b1c0: 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68  ful bits from th
b1d0: 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
b1e0: 72 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20  r */.  flags &= 
b1f0: 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ~( SQLITE_OPEN_
b200: 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
b220: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
b230: 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  DB |.           
b240: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
b250: 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20  TEMP_DB | .     
b260: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
b270: 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
b280: 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
b290: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
b2a0: 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20  _MAIN_JOURNAL | 
b2b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b2c0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
b2d0: 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
b2e0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
b2f0: 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
b300: 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
b310: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
b320: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c  MASTER_JOURNAL |
b330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b340: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
b350: 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEX |.          
b360: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
b370: 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20 20 20 20  _FULLMUTEX.     
b380: 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a          );..  /*
b390: 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
b3a0: 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74  lite data struct
b3b0: 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71  ure */.  db = sq
b3c0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
b3d0: 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29   sizeof(sqlite3)
b3e0: 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20   );.  if( db==0 
b3f0: 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75  ) goto opendb_ou
b400: 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61  t;.  if( isThrea
b410: 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d  dsafe ){.    db-
b420: 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
b430: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
b440: 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56  E_MUTEX_RECURSIV
b450: 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  E);.    if( db->
b460: 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
b470: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
b480: 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30  b);.      db = 0
b490: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
b4a0: 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ndb_out;.    }. 
b4b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
b4c0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
b4d0: 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
b4e0: 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d  sk = 0xff;.  db-
b4f0: 3e 70 72 69 6f 72 4e 65 77 52 6f 77 69 64 20 3d  >priorNewRowid =
b500: 20 30 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20   0;.  db->nDb = 
b510: 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  2;.  db->magic =
b520: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55   SQLITE_MAGIC_BU
b530: 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20  SY;.  db->aDb = 
b540: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a  db->aDbStatic;..
b550: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
b560: 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69  (db->aLimit)==si
b570: 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29  zeof(aHardLimit)
b580: 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d   );.  memcpy(db-
b590: 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69  >aLimit, aHardLi
b5a0: 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e  mit, sizeof(db->
b5b0: 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e  aLimit));.  db->
b5c0: 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
b5d0: 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61    db->nextAutova
b5e0: 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 6e 65  c = -1;.  db->ne
b5f0: 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a  xtPagesize = 0;.
b600: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
b610: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
b620: 6d 65 73 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  mes.#if SQLITE_D
b630: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d  EFAULT_FILE_FORM
b640: 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20  AT<4.           
b650: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c        | SQLITE_L
b660: 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e  egacyFileFmt.#en
b670: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
b680: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58  E_ENABLE_LOAD_EX
b690: 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20  TENSION.        
b6a0: 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
b6b0: 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a  E_LoadExtension.
b6c0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20  #endif.      ;. 
b6d0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
b6e0: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
b6f0: 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
b700: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
b710: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61  ABLE.  sqlite3Ha
b720: 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64  shInit(&db->aMod
b730: 75 6c 65 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ule, 0);.#endif.
b740: 0a 20 20 64 62 2d 3e 70 56 66 73 20 3d 20 73 71  .  db->pVfs = sq
b750: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a  lite3_vfs_find(z
b760: 56 66 73 29 3b 0a 20 20 69 66 28 20 21 64 62 2d  Vfs);.  if( !db-
b770: 3e 70 56 66 73 20 29 7b 0a 20 20 20 20 72 63 20  >pVfs ){.    rc 
b780: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
b790: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b7a0: 28 64 62 2c 20 72 63 2c 20 22 6e 6f 20 73 75 63  (db, rc, "no suc
b7b0: 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73  h vfs: %s", zVfs
b7c0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  );.    goto open
b7d0: 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  db_out;.  }..  /
b7e0: 2a 20 41 64 64 20 74 68 65 20 64 65 66 61 75 6c  * Add the defaul
b7f0: 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  t collation sequ
b800: 65 6e 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e  ence BINARY. BIN
b810: 41 52 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f  ARY works for bo
b820: 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e  th UTF-8.  ** an
b830: 64 20 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64  d UTF-16, so add
b840: 20 61 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65   a version for e
b850: 61 63 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79  ach to avoid any
b860: 20 75 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a   unnecessary.  *
b870: 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54  * conversions. T
b880: 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68  he only error th
b890: 61 74 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72  at can occur her
b8a0: 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20  e is a malloc() 
b8b0: 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  failure..  */.  
b8c0: 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
b8d0: 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51  db, "BINARY", SQ
b8e0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69  LITE_UTF8, 0, bi
b8f0: 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
b900: 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
b910: 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53  (db, "BINARY", S
b920: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 30  QLITE_UTF16BE, 0
b930: 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
b940: 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
b950: 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59  tion(db, "BINARY
b960: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
b970: 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  E, 0, binCollFun
b980: 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
b990: 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54  ollation(db, "RT
b9a0: 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  RIM", SQLITE_UTF
b9b0: 38 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e  8, (void*)1, bin
b9c0: 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
b9d0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
b9e0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
b9f0: 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
ba00: 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  .  db->pDfltColl
ba10: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
ba20: 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45  llSeq(db, SQLITE
ba30: 5f 55 54 46 38 2c 20 22 42 49 4e 41 52 59 22 2c  _UTF8, "BINARY",
ba40: 20 36 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74   6, 0);.  assert
ba50: 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21  ( db->pDfltColl!
ba60: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f  =0 );..  /* Also
ba70: 20 61 64 64 20 61 20 55 54 46 2d 38 20 63 61 73   add a UTF-8 cas
ba80: 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 63 6f  e-insensitive co
ba90: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
baa0: 2e 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c  . */.  createCol
bab0: 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41  lation(db, "NOCA
bac0: 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  SE", SQLITE_UTF8
bad0: 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61  , 0, nocaseColla
bae0: 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 0a 20  tingFunc, 0);.. 
baf0: 20 2f 2a 20 53 65 74 20 66 6c 61 67 73 20 6f 6e   /* Set flags on
bb00: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 63 6f   the built-in co
bb10: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
bb20: 73 20 2a 2f 0a 20 20 64 62 2d 3e 70 44 66 6c 74  s */.  db->pDflt
bb30: 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d 20 53 51 4c  Coll->type = SQL
bb40: 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 3b  ITE_COLL_BINARY;
bb50: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
bb60: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
bb70: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22  , SQLITE_UTF8, "
bb80: 4e 4f 43 41 53 45 22 2c 20 36 2c 20 30 29 3b 0a  NOCASE", 6, 0);.
bb90: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
bba0: 20 20 20 70 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d     pColl->type =
bbb0: 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43   SQLITE_COLL_NOC
bbc0: 41 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  ASE;.  }..  /* O
bbd0: 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20  pen the backend 
bbe0: 64 61 74 61 62 61 73 65 20 64 72 69 76 65 72 20  database driver 
bbf0: 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61  */.  db->openFla
bc00: 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63  gs = flags;.  rc
bc10: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46   = sqlite3BtreeF
bc20: 61 63 74 6f 72 79 28 64 62 2c 20 7a 46 69 6c 65  actory(db, zFile
bc30: 6e 61 6d 65 2c 20 30 2c 20 53 51 4c 49 54 45 5f  name, 0, SQLITE_
bc40: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
bc50: 5a 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ZE, .           
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc70: 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f  flags | SQLITE_O
bc80: 50 45 4e 5f 4d 41 49 4e 5f 44 42 2c 0a 20 20 20  PEN_MAIN_DB,.   
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 20 20 20 20 20 26 64 62 2d 3e 61 44 62          &db->aDb
bcb0: 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20  [0].pBt);.  if( 
bcc0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
bcd0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
bce0: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
bcf0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
bd00: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
bd10: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
bd20: 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20  or(db, rc, 0);. 
bd30: 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
bd40: 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44  ut;.  }.  db->aD
bd50: 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73  b[0].pSchema = s
bd60: 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
bd70: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  db, db->aDb[0].p
bd80: 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31  Bt);.  db->aDb[1
bd90: 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69  ].pSchema = sqli
bda0: 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c  te3SchemaGet(db,
bdb0: 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20   0);...  /* The 
bdc0: 64 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c  default safety_l
bdd0: 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69  evel for the mai
bde0: 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 27 66  n database is 'f
bdf0: 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65  ull'; for the te
be00: 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  mp.  ** database
be10: 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54   it is 'NONE'. T
be20: 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
be30: 70 61 67 65 72 20 6c 61 79 65 72 20 64 65 66 61  pager layer defa
be40: 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64  ults.  .  */.  d
be50: 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20  b->aDb[0].zName 
be60: 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e  = "main";.  db->
be70: 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[0].safety_le
be80: 76 65 6c 20 3d 20 33 3b 0a 23 69 66 6e 64 65 66  vel = 3;.#ifndef
be90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d   SQLITE_OMIT_TEM
bea0: 50 44 42 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  PDB.  db->aDb[1]
beb0: 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b  .zName = "temp";
bec0: 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61  .  db->aDb[1].sa
bed0: 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a  fety_level = 1;.
bee0: 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d 61  #endif..  db->ma
bef0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
bf00: 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64  IC_OPEN;.  if( d
bf10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
bf20: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
bf30: 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  db_out;.  }..  /
bf40: 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62  * Register all b
bf50: 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e  uilt-in function
bf60: 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74  s, but do not at
bf70: 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68  tempt to read th
bf80: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
bf90: 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73  schema yet. This
bfa0: 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69   is delayed unti
bfb0: 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  l the first time
bfc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
bfd0: 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a  ** is accessed..
bfe0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72    */.  sqlite3Er
bff0: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
c000: 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  K, 0);.  sqlite3
c010: 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46  RegisterBuiltinF
c020: 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20  unctions(db);.. 
c030: 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74   /* Load automat
c040: 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20  ic extensions - 
c050: 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20  extensions that 
c060: 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74  have been regist
c070: 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20  ered.  ** using 
c080: 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f  the sqlite3_auto
c090: 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28  matic_extension(
c0a0: 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 28 76  ) API..  */.  (v
c0b0: 6f 69 64 29 73 71 6c 69 74 65 33 41 75 74 6f 4c  oid)sqlite3AutoL
c0c0: 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62  oadExtensions(db
c0d0: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
c0e0: 5f 65 72 72 63 6f 64 65 28 64 62 29 21 3d 53 51  _errcode(db)!=SQ
c0f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
c100: 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
c110: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
c120: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20  TE_ENABLE_FTS1. 
c130: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
c140: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78  Failed ){.    ex
c150: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
c160: 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts1Init(sqlite3
c170: 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
c180: 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29  ite3Fts1Init(db)
c190: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
c1a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
c1b0: 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64  LE_FTS2.  if( !d
c1c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c1d0: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
c1e0: 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69   ){.    extern i
c1f0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e  nt sqlite3Fts2In
c200: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  it(sqlite3*);.  
c210: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
c220: 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s2Init(db);.  }.
c230: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
c240: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
c250: 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  3.  if( !db->mal
c260: 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
c270: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c280: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
c290: 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s3Init(db);.  }.
c2a0: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
c2b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55  QLITE_ENABLE_ICU
c2c0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
c2d0: 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
c2e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c2f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75   rc = sqlite3Icu
c300: 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
c310: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
c320: 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45  ITE_ENABLE_RTREE
c330: 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
c340: 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
c350: 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
c360: 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65  rc = sqlite3Rtre
c370: 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  eInit(db);.  }.#
c380: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
c390: 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
c3a0: 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45  ;..  /* -DSQLITE
c3b0: 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
c3c0: 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58  _MODE=1 makes EX
c3d0: 43 4c 55 53 49 56 45 20 74 68 65 20 64 65 66 61  CLUSIVE the defa
c3e0: 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a  ult locking.  **
c3f0: 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45   mode.  -DSQLITE
c400: 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
c410: 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52  _MODE=0 make NOR
c420: 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20  MAL the default 
c430: 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64  locking.  ** mod
c440: 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e  e.  Doing nothin
c450: 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61  g at all also ma
c460: 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64  kes NORMAL the d
c470: 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66  efault..  */.#if
c480: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
c490: 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a  LT_LOCKING_MODE.
c4a0: 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f    db->dfltLockMo
c4b0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  de = SQLITE_DEFA
c4c0: 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
c4d0: 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
c4e0: 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69  LockingMode(sqli
c4f0: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62  te3BtreePager(db
c500: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20  ->aDb[0].pBt),. 
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c520: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
c530: 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
c540: 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  MODE);.#endif.. 
c550: 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c   /* Enable the l
c560: 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20  ookaside-malloc 
c570: 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73  subsystem */.  s
c580: 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62  etupLookaside(db
c590: 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62  , 0, sqlite3Glob
c5a0: 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61  alConfig.szLooka
c5b0: 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  side,.          
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
c5d0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
c5e0: 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a  g.nLookaside);..
c5f0: 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66  opendb_out:.  if
c600: 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65  ( db ){.    asse
c610: 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30  rt( db->mutex!=0
c620: 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66 65   || isThreadsafe
c630: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c  ==0 || sqlite3Gl
c640: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
c650: 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Mutex==0 );.    
c660: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
c670: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
c680: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
c690: 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
c6a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c6b0: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71  _NOMEM ){.    sq
c6c0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
c6d0: 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d  .    db = 0;.  }
c6e0: 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
c6f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62  ITE_OK ){.    db
c700: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
c710: 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d  _MAGIC_SICK;.  }
c720: 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 20  .  *ppDb = db;. 
c730: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
c740: 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d  piExit(0, rc);.}
c750: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
c760: 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ew database hand
c770: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
c780: 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74  e3_open(.  const
c790: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
c7a0: 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  , .  sqlite3 **p
c7b0: 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e  pDb .){.  return
c7c0: 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46   openDatabase(zF
c7d0: 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20  ilename, ppDb,. 
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7f0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
c800: 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
c810: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
c820: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
c830: 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f  e3_open_v2(.  co
c840: 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61  nst char *filena
c850: 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73  me,   /* Databas
c860: 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d  e filename (UTF-
c870: 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  8) */.  sqlite3 
c880: 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 20  **ppDb,         
c890: 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64  /* OUT: SQLite d
c8a0: 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
c8b0: 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
c8c0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a        /* Flags *
c8d0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
c8e0: 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e  zVfs        /* N
c8f0: 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c  ame of VFS modul
c900: 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20  e to use */.){. 
c910: 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61   return openData
c920: 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70  base(filename, p
c930: 70 44 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73  pDb, flags, zVfs
c940: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
c950: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
c960: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
c970: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
c980: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c990: 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74  _open16(.  const
c9a0: 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65   void *zFilename
c9b0: 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  , .  sqlite3 **p
c9c0: 70 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  pDb.){.  char co
c9d0: 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b  nst *zFilename8;
c9e0: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
c9f0: 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38  encoded in UTF-8
ca00: 20 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d   instead of UTF-
ca10: 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  16 */.  sqlite3_
ca20: 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69  value *pVal;.  i
ca30: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
ca40: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20  ( zFilename );. 
ca50: 20 61 73 73 65 72 74 28 20 70 70 44 62 20 29 3b   assert( ppDb );
ca60: 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
ca70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ca80: 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
ca90: 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
caa0: 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
cab0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
cac0: 6e 64 69 66 0a 20 20 70 56 61 6c 20 3d 20 73 71  ndif.  pVal = sq
cad0: 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
cae0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
caf0: 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
cb00: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49   zFilename, SQLI
cb10: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20  TE_UTF16NATIVE, 
cb20: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
cb30: 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73    zFilename8 = s
cb40: 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
cb50: 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46  pVal, SQLITE_UTF
cb60: 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  8);.  if( zFilen
cb70: 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  ame8 ){.    rc =
cb80: 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46   openDatabase(zF
cb90: 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a  ilename8, ppDb,.
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbb0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
cbc0: 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
cbd0: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
cbe0: 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
cbf0: 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53  ( *ppDb || rc==S
cc00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
cc10: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
cc20: 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72  E_OK && !DbHasPr
cc30: 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c  operty(*ppDb, 0,
cc40: 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
cc50: 29 20 29 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a  ) ){.      ENC(*
cc60: 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55  ppDb) = SQLITE_U
cc70: 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20  TF16NATIVE;.    
cc80: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
cc90: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
cca0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
ccb0: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
ccc0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
ccd0: 33 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b  3ApiExit(0, rc);
cce0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
ccf0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
cd00: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
cd10: 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
cd20: 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
cd30: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
cd40: 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
cd50: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
cd60: 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
cd70: 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
cd80: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
cd90: 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69   int enc, .  voi
cda0: 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
cdb0: 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
cdc0: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
cdd0: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
cde0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
cdf0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
ce00: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
ce10: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
ce20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
ce30: 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
ce40: 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ation(db, zName,
ce50: 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d   enc, pCtx, xCom
ce60: 70 61 72 65 2c 20 30 29 3b 0a 20 20 72 63 20 3d  pare, 0);.  rc =
ce70: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
ce80: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
ce90: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
cea0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
ceb0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
cec0: 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
ced0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
cee0: 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
cef0: 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
cf00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
cf10: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
cf20: 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  v2(.  sqlite3* d
cf30: 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
cf40: 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
cf50: 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
cf60: 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
cf70: 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
cf80: 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
cf90: 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
cfa0: 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
cfb0: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ).){.  int rc;. 
cfc0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
cfd0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
cfe0: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
cff0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
d000: 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c    rc = createCol
d010: 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  lation(db, zName
d020: 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  , enc, pCtx, xCo
d030: 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20  mpare, xDel);.  
d040: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
d050: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
d060: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
d070: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
d080: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
d090: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d0a0: 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
d0b0: 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
d0c0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
d0d0: 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
d0e0: 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
d0f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
d100: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28  ate_collation16(
d110: 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
d120: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
d130: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  Name,.  int enc,
d140: 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
d150: 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
d160: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
d170: 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
d180: 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74   void*).){.  int
d190: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d1a0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b  .  char *zName8;
d1b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
d1c0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
d1d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
d1e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
d1f0: 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c  ;.  zName8 = sql
d200: 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
d210: 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 69   zName, -1);.  i
d220: 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20  f( zName8 ){.   
d230: 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
d240: 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38  ation(db, zName8
d250: 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  , enc, pCtx, xCo
d260: 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73  mpare, 0);.    s
d270: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d280: 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20   zName8);.  }.  
d290: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
d2a0: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
d2b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
d2c0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
d2d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
d2e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d2f0: 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
d300: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
d310: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
d320: 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
d330: 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
d340: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
d350: 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
d360: 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
d370: 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
d380: 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
d390: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
d3a0: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28  ollation_needed(
d3b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
d3c0: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65  .  void *pCollNe
d3d0: 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64  ededArg, .  void
d3e0: 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76  (*xCollNeeded)(v
d3f0: 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
d400: 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74  t eTextRep,const
d410: 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c   char*).){.  sql
d420: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d430: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
d440: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d  b->xCollNeeded =
d450: 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20   xCollNeeded;.  
d460: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
d470: 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f  6 = 0;.  db->pCo
d480: 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
d490: 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
d4a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
d4b0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
d4c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d4d0: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
d4e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
d4f0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
d500: 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
d510: 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c  ence factory cal
d520: 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64  lback with the d
d530: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
d540: 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e  * db. Replace an
d550: 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  y previously ins
d560: 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  talled collation
d570: 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
d580: 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
d590: 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
d5a0: 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20  ed16(.  sqlite3 
d5b0: 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
d5c0: 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
d5d0: 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
d5e0: 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69  ed16)(void*,sqli
d5f0: 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
d600: 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  p,const void*).)
d610: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
d620: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
d630: 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  x);.  db->xCollN
d640: 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d  eeded = 0;.  db-
d650: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
d660: 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a   xCollNeeded16;.
d670: 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
d680: 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
d690: 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
d6a0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
d6b0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
d6c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
d6d0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d6e0: 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23  OMIT_UTF16 */..#
d6f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d700: 49 54 5f 47 4c 4f 42 41 4c 52 45 43 4f 56 45 52  IT_GLOBALRECOVER
d710: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d720: 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
d730: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
d740: 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e  ion is now an an
d750: 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73  achronism. It us
d760: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f  ed to be used to
d770: 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a   recover from a.
d780: 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  ** malloc() fail
d790: 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20  ure, but SQLite 
d7a0: 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61 75  now does this au
d7b0: 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a  tomatically..*/.
d7c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62  int sqlite3_glob
d7d0: 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29  al_recover(void)
d7e0: 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  {.  return SQLIT
d7f0: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23  E_OK;.}.#endif.#
d800: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  endif../*.** Tes
d810: 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72  t to see whether
d820: 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61   or not the data
d830: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
d840: 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
d850: 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72  .** mode.  Retur
d860: 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
d870: 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74  and FALSE if not
d880: 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  .  Autocommit mo
d890: 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64  de is on.** by d
d8a0: 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d  efault.  Autocom
d8b0: 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65 64 20  mit is disabled 
d8c0: 62 79 20 61 20 42 45 47 49 4e 20 73 74 61 74 65  by a BEGIN state
d8d0: 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c  ment and reenabl
d8e0: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78  ed.** by the nex
d8f0: 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c  t COMMIT or ROLL
d900: 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  BACK..**.*******
d910: 20 54 48 49 53 20 49 53 20 41 4e 20 45 58 50 45   THIS IS AN EXPE
d920: 52 49 4d 45 4e 54 41 4c 20 41 50 49 20 41 4e 44  RIMENTAL API AND
d930: 20 49 53 20 53 55 42 4a 45 43 54 20 54 4f 20 43   IS SUBJECT TO C
d940: 48 41 4e 47 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a  HANGE ******.*/.
d950: 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  int sqlite3_get_
d960: 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74  autocommit(sqlit
d970: 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72  e3 *db){.  retur
d980: 6e 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  n db->autoCommit
d990: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
d9a0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
d9b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
d9c0: 74 69 6e 65 20 69 73 20 73 75 62 74 69 74 75 74  tine is subtitut
d9d0: 65 64 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74 20  ed for constant 
d9e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
d9f0: 6e 0a 2a 2a 20 64 65 62 75 67 67 69 6e 67 20 62  n.** debugging b
da00: 75 69 6c 64 73 2e 20 20 54 68 69 73 20 70 72 6f  uilds.  This pro
da10: 76 69 64 65 73 20 61 20 77 61 79 20 74 6f 20 73  vides a way to s
da20: 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20  et a breakpoint 
da30: 66 6f 72 20 77 68 65 6e 0a 2a 2a 20 63 6f 72 72  for when.** corr
da40: 75 70 74 69 6f 6e 20 69 73 20 66 69 72 73 74 20  uption is first 
da50: 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74  detected..*/.int
da60: 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 28   sqlite3Corrupt(
da70: 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
da80: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
da90: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
daa0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
dab0: 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54  PRECATED./*.** T
dac0: 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69  his is a conveni
dad0: 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61  ence routine tha
dae0: 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  t makes sure tha
daf0: 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65  t all thread-spe
db00: 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f  cific.** data fo
db10: 72 20 74 68 69 73 20 74 68 72 65 61 64 20 68 61  r this thread ha
db20: 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74  s been deallocat
db30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  ed..**.** SQLite
db40: 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20   no longer uses 
db50: 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 20  thread-specific 
db60: 64 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75  data so this rou
db70: 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a  tine is now a.**
db80: 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72   no-op.  It is r
db90: 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74  etained for hist
dba0: 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69  orical compatibi
dbb0: 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lity..*/.void sq
dbc0: 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
dbd0: 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65  anup(void){.}.#e
dbe0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
dbf0: 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  rn meta informat
dc00: 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63  ion about a spec
dc10: 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  ific column of a
dc20: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
dc30: 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20  .** See comment 
dc40: 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71  in sqlite3.h (sq
dc50: 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64  lite.h.in) for d
dc60: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65  etails..*/.#ifde
dc70: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
dc80: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
dc90: 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  int sqlite3_tabl
dca0: 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
dcb0: 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  a(.  sqlite3 *db
dcc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dcd0: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
dce0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
dcf0: 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20   char *zDbName, 
dd00: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
dd10: 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20  se name or NULL 
dd20: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
dd30: 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20  *zTableName,    
dd40: 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a   /* Table name *
dd50: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
dd60: 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20  zColumnName,    
dd70: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
dd80: 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
dd90: 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20  *pzDataType,    
dda0: 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61  /* OUTPUT: Decla
ddb0: 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f  red data type */
ddc0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
ddd0: 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f  pzCollSeq,     /
dde0: 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74  * OUTPUT: Collat
ddf0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
de00: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74  e */.  int *pNot
de10: 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Null,           
de20: 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
de30: 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63  ue if NOT NULL c
de40: 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73  onstraint exists
de50: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d   */.  int *pPrim
de60: 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20  aryKey,         
de70: 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
de80: 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74  e if column part
de90: 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20   of PK */.  int 
dea0: 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20  *pAutoinc       
deb0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
dec0: 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
ded0: 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d  n is auto-increm
dee0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
def0: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
df00: 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65  Msg = 0;.  Table
df10: 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f   *pTab = 0;.  Co
df20: 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a  lumn *pCol = 0;.
df30: 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63    int iCol;..  c
df40: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61  har const *zData
df50: 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72  Type = 0;.  char
df60: 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71   const *zCollSeq
df70: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e   = 0;.  int notn
df80: 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70  ull = 0;.  int p
df90: 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20  rimarykey = 0;. 
dfa0: 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30   int autoinc = 0
dfb0: 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74  ;..  /* Ensure t
dfc0: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
dfd0: 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64  ma has been load
dfe0: 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
dff0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
e000: 6d 75 74 65 78 29 3b 0a 20 20 28 76 6f 69 64 29  mutex);.  (void)
e010: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
e020: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  db);.  sqlite3Bt
e030: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
e040: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49  .  rc = sqlite3I
e050: 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67  nit(db, &zErrMsg
e060: 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
e070: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f  OK!=rc ){.    go
e080: 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
e090: 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
e0a0: 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73  he table in ques
e0b0: 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d  tion */.  pTab =
e0c0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
e0d0: 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65  e(db, zTableName
e0e0: 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66  , zDbName);.  if
e0f0: 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d  ( !pTab || pTab-
e100: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
e110: 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f  pTab = 0;.    go
e120: 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
e130: 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  }..  /* Find the
e140: 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63   column for whic
e150: 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73  h info is reques
e160: 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ted */.  if( sql
e170: 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
e180: 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
e190: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
e1a0: 65 79 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  ey;.    if( iCol
e1b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  >=0 ){.      pCo
e1c0: 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
e1d0: 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  iCol];.    }.  }
e1e0: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43  else{.    for(iC
e1f0: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
e200: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
e210: 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
e220: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
e230: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
e240: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
e250: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e  ->zName, zColumn
e260: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
e270: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
e280: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
e290: 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  ol==pTab->nCol )
e2a0: 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 30  {.      pTab = 0
e2b0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72  ;.      goto err
e2c0: 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  or_out;.    }.  
e2d0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
e2e0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72  owing block stor
e2f0: 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f  es the meta info
e300: 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
e310: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20  l be returned.  
e320: 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
e330: 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   in local variab
e340: 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a  les zDataType, z
e350: 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c  CollSeq, notnull
e360: 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a  , primarykey.  *
e370: 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41  * and autoinc. A
e380: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
e390: 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69  re are two possi
e3a0: 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a  bilities:.  ** .
e3b0: 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20    **     1. The 
e3c0: 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e  specified column
e3d0: 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22   name was rowid"
e3e0: 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77  , "oid" or "_row
e3f0: 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20  id_" .  **      
e400: 20 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e    and there is n
e410: 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63  o explicitly dec
e420: 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e  lared IPK column
e430: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  . .  **.  **    
e440: 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73   2. The table is
e450: 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20   not a view and 
e460: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
e470: 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20  identified an . 
e480: 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69   **        expli
e490: 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63  citly declared c
e4a0: 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61  olumn. Copy meta
e4b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
e4c0: 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20  m *pCol..  */ . 
e4d0: 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20   if( pCol ){.   
e4e0: 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f   zDataType = pCo
e4f0: 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43  l->zType;.    zC
e500: 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a  ollSeq = pCol->z
e510: 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c  Coll;.    notnul
e520: 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c  l = pCol->notNul
e530: 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72  l!=0;.    primar
e540: 79 6b 65 79 20 20 3d 20 70 43 6f 6c 2d 3e 69 73  ykey  = pCol->is
e550: 50 72 69 6d 4b 65 79 21 3d 30 3b 0a 20 20 20 20  PrimKey!=0;.    
e560: 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e  autoinc = pTab->
e570: 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28  iPKey==iCol && (
e580: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
e590: 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
e5a0: 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t)!=0;.  }else{.
e5b0: 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20      zDataType = 
e5c0: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70  "INTEGER";.    p
e5d0: 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20  rimarykey = 1;. 
e5e0: 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53   }.  if( !zCollS
e5f0: 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53  eq ){.    zCollS
e600: 65 71 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  eq = "BINARY";. 
e610: 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20   }..error_out:. 
e620: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
e630: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 28 76 6f  veAll(db);.  (vo
e640: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
e650: 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57  Off(db);..  /* W
e660: 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74  hether the funct
e670: 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64  ion call succeed
e680: 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65  ed or failed, se
e690: 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72  t the output par
e6a0: 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20  ameters.  ** to 
e6b0: 77 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c  whatever their l
e6c0: 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74  ocal counterpart
e6d0: 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e  s contain. If an
e6e0: 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72   error did occur
e6f0: 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20  ,.  ** this has 
e700: 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65  the effect of ze
e710: 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74  roing all output
e720: 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a   parameters..  *
e730: 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79  /.  if( pzDataTy
e740: 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65  pe ) *pzDataType
e750: 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20   = zDataType;.  
e760: 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20  if( pzCollSeq ) 
e770: 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f  *pzCollSeq = zCo
e780: 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f  llSeq;.  if( pNo
e790: 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c  tNull ) *pNotNul
e7a0: 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69  l = notnull;.  i
e7b0: 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29  f( pPrimaryKey )
e7c0: 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20   *pPrimaryKey = 
e7d0: 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66  primarykey;.  if
e7e0: 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41  ( pAutoinc ) *pA
e7f0: 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63  utoinc = autoinc
e800: 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
e810: 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20  OK==rc && !pTab 
e820: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
e830: 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
e840: 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  );.    zErrMsg =
e850: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e860: 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  db, "no such tab
e870: 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73  le column: %s.%s
e880: 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20  ", zTableName,. 
e890: 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61         zColumnNa
e8a0: 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
e8b0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
e8c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
e8d0: 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f  b, rc, (zErrMsg?
e8e0: 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67  "%s":0), zErrMsg
e8f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
e900: 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b  ee(db, zErrMsg);
e910: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
e920: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
e930: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
e940: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
e950: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e960: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
e970: 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
e980: 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
e990: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
e9a0: 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e  ime slept..*/.in
e9b0: 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28  t sqlite3_sleep(
e9c0: 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74  int ms){.  sqlit
e9d0: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20  e3_vfs *pVfs;.  
e9e0: 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d  int rc;.  pVfs =
e9f0: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
ea00: 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73  d(0);.  if( pVfs
ea10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
ea20: 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
ea30: 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c  ion works in mil
ea40: 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74  liseconds, but t
ea50: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73  he underlying Os
ea60: 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50  Sleep() .  ** AP
ea70: 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f  I uses microseco
ea80: 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31  nds. Hence the 1
ea90: 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  000's..  */.  rc
eaa0: 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65   = (sqlite3OsSle
eab0: 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73  ep(pVfs, 1000*ms
eac0: 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  )/1000);.  retur
ead0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
eae0: 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
eaf0: 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65   the extended re
eb00: 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69  sult codes..*/.i
eb10: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  nt sqlite3_exten
eb20: 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
eb30: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
eb40: 74 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71 6c 69  t onoff){.  sqli
eb50: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
eb60: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
eb70: 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66  ->errMask = onof
eb80: 66 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a  f ? 0xffffffff :
eb90: 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33   0xff;.  sqlite3
eba0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
ebb0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
ebc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ebd0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
ebe0: 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65   xFileControl me
ebf0: 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63  thod on a partic
ec00: 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a  ular database..*
ec10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69  /.int sqlite3_fi
ec20: 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  le_control(sqlit
ec30: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
ec40: 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74  ar *zDbName, int
ec50: 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
ec60: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
ec70: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69 6e 74  ITE_ERROR;.  int
ec80: 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f   iDb;.  sqlite3_
ec90: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
eca0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44  mutex);.  if( zD
ecb0: 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  bName==0 ){.    
ecc0: 69 44 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  iDb = 0;.  }else
ecd0: 7b 0a 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b  {.    for(iDb=0;
ece0: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
ecf0: 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  b++){.      if( 
ed00: 73 74 72 63 6d 70 28 64 62 2d 3e 61 44 62 5b 69  strcmp(db->aDb[i
ed10: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 4e 61  Db].zName, zDbNa
ed20: 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
ed30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ed40: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 7b 0a 20  iDb<db->nDb ){. 
ed50: 20 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65     Btree *pBtree
ed60: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
ed70: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
ed80: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 50 61 67  ree ){.      Pag
ed90: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
eda0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
edb0: 66 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  fd;.      sqlite
edc0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
edd0: 65 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ee);.      pPage
ede0: 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
edf0: 50 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Pager(pBtree);. 
ee00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
ee10: 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ger!=0 );.      
ee20: 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
ee30: 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20  rFile(pPager);. 
ee40: 20 20 20 20 20 61 73 73 65 72 74 28 20 66 64 21       assert( fd!
ee50: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
ee60: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
ee70: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
ee80: 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
ee90: 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b  l(fd, op, pArg);
eea0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
eeb0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
eec0: 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 7d 0a  (pBtree);.    }.
eed0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
eee0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
eef0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
ef00: 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  c;   .}../*.** I
ef10: 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20  nterface to the 
ef20: 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a  testing logic..*
ef30: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65  /.int sqlite3_te
ef40: 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f  st_control(int o
ef50: 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72  p, ...){.  int r
ef60: 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  c = 0;.#ifndef S
ef70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54  QLITE_OMIT_BUILT
ef80: 49 4e 5f 54 45 53 54 0a 20 20 76 61 5f 6c 69 73  IN_TEST.  va_lis
ef90: 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74  t ap;.  va_start
efa0: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
efb0: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
efc0: 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68  *.    ** Save th
efd0: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
efe0: 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20  of the PRNG..   
eff0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
f000: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
f010: 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20  G_SAVE: {.      
f020: 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53  sqlite3PrngSaveS
f030: 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72  tate();.      br
f040: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
f050: 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72  /*.    ** Restor
f060: 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
f070: 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c  he PRNG to the l
f080: 61 73 74 20 73 74 61 74 65 20 73 61 76 65 64 20  ast state saved 
f090: 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e  using.    ** PRN
f0a0: 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47  G_SAVE.  If PRNG
f0b0: 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65 72 20  _SAVE has never 
f0c0: 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c  before been call
f0d0: 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ed, then.    ** 
f0e0: 74 68 69 73 20 76 65 72 62 20 61 63 74 73 20 6c  this verb acts l
f0f0: 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a  ike PRNG_RESET..
f100: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
f110: 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
f120: 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a  PRNG_RESTORE: {.
f130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
f140: 67 52 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b  gRestoreState();
f150: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f160: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
f170: 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50 52 4e  ** Reset the PRN
f180: 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e  G back to its un
f190: 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74  initialized stat
f1a0: 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c  e.  The next cal
f1b0: 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
f1c0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29  te3_randomness()
f1d0: 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65   will reseed the
f1e0: 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69   PRNG using a si
f1f0: 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  ngle call.    **
f200: 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e   to the xRandomn
f210: 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  ess method of th
f220: 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20  e default VFS.. 
f230: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
f240: 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
f250: 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20  RNG_RESET: {.   
f260: 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65     sqlite3PrngRe
f270: 73 65 74 53 74 61 74 65 28 29 3b 0a 20 20 20 20  setState();.    
f280: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
f290: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
f2a0: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
f2b0: 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c  rol(BITVEC_TEST,
f2c0: 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a   size, program).
f2d0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75      **.    ** Ru
f2e0: 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e 73 74  n a test against
f2f0: 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74   a Bitvec object
f300: 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70   of size.  The p
f310: 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a  rogram argument.
f320: 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72      ** is an arr
f330: 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74  ay of integers t
f340: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
f350: 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31  test.  Return -1
f360: 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d   on a.    ** mem
f370: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
f380: 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65  rror, 0 on succe
f390: 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  ss, or non-zero 
f3a0: 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  for an error..  
f3b0: 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c    ** See the sql
f3c0: 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69  ite3BitvecBuilti
f3d0: 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64 64 69  nTest() for addi
f3e0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
f3f0: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  on..    */.    c
f400: 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
f410: 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a  TRL_BITVEC_TEST:
f420: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20   {.      int sz 
f430: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
f440: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50  );.      int *aP
f450: 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  rog = va_arg(ap,
f460: 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63   int*);.      rc
f470: 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
f480: 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20  BuiltinTest(sz, 
f490: 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72  aProg);.      br
f4a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
f4b0: 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
f4c0: 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
f4d0: 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f  BENIGN_MALLOC_HO
f4e0: 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e  OKS, xBegin, xEn
f4f0: 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d).    **.    **
f500: 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b 73 20   Register hooks 
f510: 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63  to call to indic
f520: 61 74 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63  ate which malloc
f530: 28 29 20 66 61 69 6c 75 72 65 73 20 0a 20 20 20  () failures .   
f540: 20 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a   ** are benign..
f550: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
f560: 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
f570: 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f  BENIGN_MALLOC_HO
f580: 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74 79 70  OKS: {.      typ
f590: 65 64 65 66 20 76 6f 69 64 20 28 2a 76 6f 69 64  edef void (*void
f5a0: 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29  _function)(void)
f5b0: 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e  ;.      void_fun
f5c0: 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67  ction xBenignBeg
f5d0: 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66  in;.      void_f
f5e0: 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45  unction xBenignE
f5f0: 6e 64 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67  nd;.      xBenig
f600: 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61 72 67 28  nBegin = va_arg(
f610: 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f  ap, void_functio
f620: 6e 29 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67  n);.      xBenig
f630: 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67 28 61 70  nEnd = va_arg(ap
f640: 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  , void_function)
f650: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
f660: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73  enignMallocHooks
f670: 28 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78  (xBenignBegin, x
f680: 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20  BenignEnd);.    
f690: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
f6a0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
f6b0: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
f6c0: 72 6f 6c 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  rol(PENDING_BYTE
f6d0: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 58  , unsigned int X
f6e0: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
f6f0: 53 65 74 20 74 68 65 20 50 45 4e 44 49 4e 47 20  Set the PENDING 
f700: 62 79 74 65 20 74 6f 20 74 68 65 20 76 61 6c 75  byte to the valu
f710: 65 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  e in the argumen
f720: 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a  t, if X>0..    *
f730: 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
f740: 73 20 69 66 20 58 3d 3d 30 2e 20 20 52 65 74 75  s if X==0.  Retu
f750: 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
f760: 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74 65  the pending byte
f770: 0a 20 20 20 20 2a 2a 20 61 73 20 69 74 20 65 78  .    ** as it ex
f780: 69 73 74 69 6e 67 20 62 65 66 6f 72 65 20 74 68  isting before th
f790: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
f7a0: 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  alled..    **.  
f7b0: 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20    ** IMPORTANT: 
f7c0: 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45   Changing the PE
f7d0: 4e 44 49 4e 47 20 62 79 74 65 20 66 72 6f 6d 20  NDING byte from 
f7e0: 30 78 34 30 30 30 30 30 30 30 20 72 65 73 75 6c  0x40000000 resul
f7f0: 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20  ts in.    ** an 
f800: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64 61 74  incompatible dat
f810: 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 6d 61  abase file forma
f820: 74 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65  t.  Changing the
f830: 20 50 45 4e 44 49 4e 47 20 62 79 74 65 0a 20 20   PENDING byte.  
f840: 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 64    ** while any d
f850: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
f860: 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65 73 75 6c  on is open resul
f870: 74 73 20 69 6e 20 75 6e 64 65 66 69 6e 65 64 20  ts in undefined 
f880: 61 6e 64 0a 20 20 20 20 2a 2a 20 64 69 6c 65 74  and.    ** dilet
f890: 65 72 69 6f 75 73 20 62 65 68 61 76 69 6f 72 2e  erious behavior.
f8a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
f8b0: 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
f8c0: 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b  _PENDING_BYTE: {
f8d0: 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20  .      unsigned 
f8e0: 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f  int newVal = va_
f8f0: 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64  arg(ap, unsigned
f900: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20   int);.      rc 
f910: 3d 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67  = sqlite3Pending
f920: 42 79 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Byte;.      if( 
f930: 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65 33  newVal ) sqlite3
f940: 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e 65  PendingByte = ne
f950: 77 56 61 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  wVal;.      brea
f960: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
f970: 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69  a_end(ap);.#endi
f980: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
f990: 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f  _BUILTIN_TEST */
f9a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.