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

Artifact da51988dd4d75de4ccc66d2c99dd1b5b3b266e6c:


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 32 35 20 32 30 30 39 2f 30 32  ,v 1.525 2009/02
0280: 2f 30 33 20 31 36 3a 35 31 3a 32 35 20 64 61 6e  /03 16:51:25 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 20 20 2f 2a 20 54 68 69 73 20 73 65  BUG.  /* This se
1b40: 63 74 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20  ction of code's 
1b50: 6f 6e 6c 79 20 22 6f 75 74 70 75 74 22 20 69 73  only "output" is
1b60: 20 76 69 61 20 61 73 73 65 72 74 28 29 20 73 74   via assert() st
1b70: 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69  atements. */.  i
1b80: 66 20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  f ( rc==SQLITE_O
1b90: 4b 20 29 7b 0a 20 20 20 20 75 36 34 20 78 20 3d  K ){.    u64 x =
1ba0: 20 28 28 28 75 36 34 29 31 29 3c 3c 36 33 29 2d   (((u64)1)<<63)-
1bb0: 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 3b  1;.    double y;
1bc0: 0a 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65  .    assert(size
1bd0: 6f 66 28 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61  of(x)==8);.    a
1be0: 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29 3d  ssert(sizeof(x)=
1bf0: 3d 73 69 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20  =sizeof(y));.   
1c00: 20 6d 65 6d 63 70 79 28 26 79 2c 20 26 78 2c 20   memcpy(&y, &x, 
1c10: 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  8);.    assert( 
1c20: 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 79 29 20  sqlite3IsNaN(y) 
1c30: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1c40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c50: 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66  *.** Undo the ef
1c60: 66 65 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33  fects of sqlite3
1c70: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20  _initialize().  
1c80: 4d 75 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c  Must not be call
1c90: 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72  ed while.** ther
1ca0: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
1cb0: 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  g database conne
1cc0: 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79  ctions or memory
1cd0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a   allocations or.
1ce0: 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72  ** while any par
1cf0: 74 20 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f  t of SQLite is o
1d00: 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 20  therwise in use 
1d10: 69 6e 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20  in any thread.  
1d20: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
1d30: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
1d40: 65 2e 20 20 4e 6f 74 20 62 79 20 61 20 6c 6f 6e  e.  Not by a lon
1d50: 67 20 73 68 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73  g shot..*/.int s
1d60: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
1d70: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
1d80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
1d90: 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b 0a 20  allocInit = 0;. 
1da0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68   sqlite3PcacheSh
1db0: 75 74 64 6f 77 6e 28 29 3b 0a 20 20 69 66 28 20  utdown();.  if( 
1dc0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1dd0: 66 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a 20 20  fig.isInit ){.  
1de0: 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64    sqlite3_os_end
1df0: 28 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ();.  }.  sqlite
1e00: 33 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20  3MallocEnd();.  
1e10: 73 71 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28  sqlite3MutexEnd(
1e20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  );.  sqlite3Glob
1e30: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
1e40: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
1e50: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1e60: 2a 20 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77  * This API allow
1e70: 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74  s applications t
1e80: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f  o modify the glo
1e90: 62 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  bal configuratio
1ea0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69  n of.** the SQLi
1eb0: 74 65 20 6c 69 62 72 61 72 79 20 61 74 20 72 75  te library at ru
1ec0: 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-time..**.** Th
1ed0: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
1ee0: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
1ef0: 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
1f00: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a  no outstanding.*
1f10: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
1f20: 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79  ctions or memory
1f30: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54   allocations.  T
1f40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
1f50: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65  ot.** threadsafe
1f60: 2e 20 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65  .  Failure to he
1f70: 65 64 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67  ed these warning
1f80: 73 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e  s can lead to un
1f90: 70 72 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62  predictable.** b
1fa0: 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  ehavior..*/.int 
1fb0: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69  sqlite3_config(i
1fc0: 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76  nt op, ...){.  v
1fd0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74  a_list ap;.  int
1fe0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ff0: 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63  ..  /* sqlite3_c
2000: 6f 6e 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65  onfig() shall re
2010: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
2020: 53 45 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f  SE if it is invo
2030: 6b 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74  ked while.  ** t
2040: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
2050: 79 20 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a  y is in use. */.
2060: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2070: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
2080: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2090: 5f 4d 49 53 55 53 45 3b 0a 0a 20 20 76 61 5f 73  _MISUSE;..  va_s
20a0: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
20b0: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
20c0: 20 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66     /* Mutex conf
20d0: 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
20e0: 73 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  s are only avail
20f0: 61 62 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64  able in a thread
2100: 73 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  safe.    ** comp
2110: 69 6c 65 2e 20 0a 20 20 20 20 2a 2f 0a 23 69 66  ile. .    */.#if
2120: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
2130: 46 45 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  FE.    case SQLI
2140: 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45  TE_CONFIG_SINGLE
2150: 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20  THREAD: {.      
2160: 2f 2a 20 44 69 73 61 62 6c 65 20 61 6c 6c 20 6d  /* Disable all m
2170: 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20  utexing */.     
2180: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2190: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
21a0: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
21b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
21c0: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20  FullMutex = 0;. 
21d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21e0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
21f0: 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48  E_CONFIG_MULTITH
2200: 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  READ: {.      /*
2210: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 69 6e   Disable mutexin
2220: 67 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  g of database co
2230: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
2240: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74     /* Enable mut
2250: 65 78 69 6e 67 20 6f 66 20 63 6f 72 65 20 64 61  exing of core da
2260: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
2270: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2280: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
2290: 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Mutex = 1;.     
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 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
22c0: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
22d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
22e0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
22f0: 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20  ERIALIZED: {.   
2300: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c     /* Enable all
2310: 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20   mutexing */.   
2320: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2330: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
2340: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  x = 1;.      sql
2350: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2360: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b  .bFullMutex = 1;
2370: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2380: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2390: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58  ITE_CONFIG_MUTEX
23a0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65  : {.      /* Spe
23b0: 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74  cify an alternat
23c0: 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d  ive mutex implem
23d0: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
23e0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
23f0: 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76  onfig.mutex = *v
2400: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
2410: 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a  3_mutex_methods*
2420: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2430: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2440: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
2450: 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f  MUTEX: {.      /
2460: 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63  * Retrieve the c
2470: 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70  urrent mutex imp
2480: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  lementation */. 
2490: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
24a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d   sqlite3_mutex_m
24b0: 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74  ethods*) = sqlit
24c0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
24d0: 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61  utex;.      brea
24e0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
24f0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
2500: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
2510: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63   {.      /* Spec
2520: 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  ify an alternati
2530: 76 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d  ve malloc implem
2540: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
2550: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2560: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72  onfig.m = *va_ar
2570: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
2580: 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20  m_methods*);.   
2590: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
25a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
25b0: 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43  CONFIG_GETMALLOC
25c0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74  : {.      /* Ret
25d0: 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e  rieve the curren
25e0: 74 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65  t malloc() imple
25f0: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  mentation */.   
2600: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
2610: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61  obalConfig.m.xMa
2620: 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65  lloc==0 ) sqlite
2630: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29  3MemSetDefault()
2640: 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28  ;.      *va_arg(
2650: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  ap, sqlite3_mem_
2660: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
2670: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2680: 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  m;.      break;.
2690: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
26a0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d  QLITE_CONFIG_MEM
26b0: 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20  STATUS: {.      
26c0: 2f 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  /* Enable or dis
26d0: 61 62 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20  able the malloc 
26e0: 73 74 61 74 75 73 20 63 6f 6c 6c 65 63 74 69 6f  status collectio
26f0: 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  n */.      sqlit
2700: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2710: 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67  Memstat = va_arg
2720: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
2730: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2740: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2750: 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a  NFIG_SCRATCH: {.
2760: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61        /* Designa
2770: 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20  te a buffer for 
2780: 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 73  scratch memory s
2790: 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  pace */.      sq
27a0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
27b0: 67 2e 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f  g.pScratch = va_
27c0: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
27d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
27e0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61  balConfig.szScra
27f0: 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tch = va_arg(ap,
2800: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
2810: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2820: 2e 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61  .nScratch = va_a
2830: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
2840: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2850: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2860: 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45  CONFIG_PAGECACHE
2870: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73  : {.      /* Des
2880: 69 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20  ignate a buffer 
2890: 66 6f 72 20 73 63 72 61 74 63 68 20 6d 65 6d 6f  for scratch memo
28a0: 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  ry space */.    
28b0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
28c0: 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76 61  onfig.pPage = va
28d0: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
28e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
28f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67  obalConfig.szPag
2900: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
2910: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
2920: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2930: 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70  Page = va_arg(ap
2940: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
2950: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
2960: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2970: 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20 20 20  IG_PCACHE: {.   
2980: 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e     /* Specify an
2990: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 61 6c   alternative mal
29a0: 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  loc implementati
29b0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
29c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
29d0: 70 63 61 63 68 65 20 3d 20 2a 76 61 5f 61 72 67  pcache = *va_arg
29e0: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61  (ap, sqlite3_pca
29f0: 63 68 65 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20  che_methods*);. 
2a00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a10: 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  }..    case SQLI
2a20: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
2a30: 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  CHE: {.      if(
2a40: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2a50: 6e 66 69 67 2e 70 63 61 63 68 65 2e 78 49 6e 69  nfig.pcache.xIni
2a60: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
2a70: 73 71 6c 69 74 65 33 50 43 61 63 68 65 53 65 74  sqlite3PCacheSet
2a80: 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20  Default();.     
2a90: 20 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67   }.      *va_arg
2aa0: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61  (ap, sqlite3_pca
2ab0: 63 68 65 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20  che_methods*) = 
2ac0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2ad0: 66 69 67 2e 70 63 61 63 68 65 3b 0a 20 20 20 20  fig.pcache;.    
2ae0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
2af0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2b00: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
2b10: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  3) || defined(SQ
2b20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
2b30: 59 53 35 29 0a 20 20 20 20 63 61 73 65 20 53 51  YS5).    case SQ
2b40: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50  LITE_CONFIG_HEAP
2b50: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73  : {.      /* Des
2b60: 69 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20  ignate a buffer 
2b70: 66 6f 72 20 68 65 61 70 20 6d 65 6d 6f 72 79 20  for heap memory 
2b80: 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73  space */.      s
2b90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2ba0: 69 67 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72  ig.pHeap = va_ar
2bb0: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
2bc0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2bd0: 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20  lConfig.nHeap = 
2be0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
2bf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2c00: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71  obalConfig.mnReq
2c10: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
2c20: 74 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73  t);..      if( s
2c30: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2c40: 69 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20  ig.pHeap==0 ){. 
2c50: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
2c60: 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73   heap pointer is
2c70: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 72 65 73 74   NULL, then rest
2c80: 6f 72 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 69  ore the malloc i
2c90: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20  mplementation.  
2ca0: 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f        ** back to
2cb0: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 74   NULL pointers t
2cc0: 6f 6f 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  oo.  This will c
2cd0: 61 75 73 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20  ause the malloc 
2ce0: 74 6f 20 67 6f 0a 20 20 20 20 20 20 20 20 2a 2a  to go.        **
2cf0: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 64 65 66   back to its def
2d00: 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ault implementat
2d10: 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65 33  ion when sqlite3
2d20: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73  _initialize() is
2d30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6e 2e  .        ** run.
2d40: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2d50: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c 69      memset(&sqli
2d60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2d70: 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c  m, 0, sizeof(sql
2d80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d90: 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  .m));.      }els
2da0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
2db0: 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69  e heap pointer i
2dc0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
2dd0: 20 69 6e 73 74 61 6c 6c 20 6f 6e 65 20 6f 66 20   install one of 
2de0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  the.        ** m
2df0: 65 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65 74  em5.c/mem3.c met
2e00: 68 6f 64 73 2e 20 49 66 20 6e 65 69 74 68 65 72  hods. If neither
2e10: 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20   ENABLE_MEMSYS3 
2e20: 6e 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 45  nor.        ** E
2e30: 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 69 73  NABLE_MEMSYS5 is
2e40: 20 64 65 66 69 6e 65 64 2c 20 72 65 74 75 72 6e   defined, return
2e50: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 20   an error..     
2e60: 20 20 20 2a 2a 20 74 68 65 20 64 65 66 61 75 6c     ** the defaul
2e70: 74 20 63 61 73 65 20 61 6e 64 20 72 65 74 75 72  t case and retur
2e80: 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  n an error..    
2e90: 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
2ea0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
2eb0: 59 53 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69  YS3.        sqli
2ec0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2ed0: 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  m = *sqlite3MemG
2ee0: 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e  etMemsys3();.#en
2ef0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
2f00: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
2f10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f20: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
2f30: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d   *sqlite3MemGetM
2f40: 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64 69 66  emsys5();.#endif
2f50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
2f60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
2f70: 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  if..    case SQL
2f80: 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41  ITE_CONFIG_LOOKA
2f90: 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SIDE: {.      sq
2fa0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2fb0: 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  g.szLookaside = 
2fc0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
2fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2fe0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b  obalConfig.nLook
2ff0: 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61  aside = va_arg(a
3000: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3010: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3020: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
3030: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
3040: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
3050: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
3060: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
3070: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3080: 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61  Set up the looka
3090: 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f 72  side buffers for
30a0: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
30b0: 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72  ection..** Retur
30c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
30d0: 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20  uccess.  .** If 
30e0: 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c 72  lookaside is alr
30f0: 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65 74  eady active, ret
3100: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
3110: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61  .**.** The sz pa
3120: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e  rameter is the n
3130: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
3140: 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65  n each lookaside
3150: 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e   slot..** The cn
3160: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
3170: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f  he number of slo
3180: 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20 69  ts.  If pStart i
3190: 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70  s NULL the.** sp
31a0: 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b  ace for the look
31b0: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20  aside memory is 
31c0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
31d0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
31e0: 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73 20  ** If pStart is 
31f0: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
3200: 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65 73   is sz*cnt bytes
3210: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73   of memory to us
3220: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f  e for.** the loo
3230: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a  kaside memory..*
3240: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
3250: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69  upLookaside(sqli
3260: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70  te3 *db, void *p
3270: 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  Buf, int sz, int
3280: 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20 2a 70   cnt){.  void *p
3290: 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64 62 2d  Start;.  if( db-
32a0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
32b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
32c0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
32d0: 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65 78 69   /* Free any exi
32e0: 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  sting lookaside 
32f0: 62 75 66 66 65 72 20 66 6f 72 20 74 68 69 73 20  buffer for this 
3300: 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a 20 20  handle before.  
3310: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** allocating a 
3320: 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20 64 6f  new one so we do
3330: 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61 76 65  n't have to have
3340: 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20 2a 2a   space for .  **
3350: 20 62 6f 74 68 20 61 74 20 74 68 65 20 73 61 6d   both at the sam
3360: 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  e time..  */.  i
3370: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
3380: 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  .bMalloced ){.  
3390: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
33a0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
33b0: 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  art);.  }.  /* T
33c0: 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c 6f 6f  he size of a loo
33d0: 6b 61 73 69 64 65 20 73 6c 6f 74 20 6e 65 65 64  kaside slot need
33e0: 73 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74  s to be larger t
33f0: 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 0a 20 20  han a pointer.  
3400: 2a 2a 20 74 6f 20 62 65 20 75 73 65 66 75 6c 2e  ** to be useful.
3410: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d  .  */.  if( sz<=
3420: 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b  (int)sizeof(Look
3430: 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a  asideSlot*) ) sz
3440: 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c   = 0;.  if( cnt<
3450: 30 20 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  0 ) cnt = 0;.  i
3460: 66 28 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d  f( sz==0 || cnt=
3470: 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30  =0 ){.    sz = 0
3480: 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 30  ;.    pStart = 0
3490: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
34a0: 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20  uf==0 ){.    sz 
34b0: 3d 20 28 73 7a 20 2b 20 37 29 26 7e 37 3b 0a 20  = (sz + 7)&~7;. 
34c0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
34d0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
34e0: 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69     pStart = sqli
34f0: 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e  te3Malloc( sz*cn
3500: 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
3510: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
3520: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3530: 73 7a 20 3d 20 73 7a 26 7e 37 3b 0a 20 20 20 20  sz = sz&~7;.    
3540: 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20  pStart = pBuf;. 
3550: 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   }.  db->lookasi
3560: 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61  de.pStart = pSta
3570: 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  rt;.  db->lookas
3580: 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20  ide.pFree = 0;. 
3590: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73   db->lookaside.s
35a0: 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69  z = (u16)sz;.  i
35b0: 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
35c0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b   int i;.    Look
35d0: 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20  asideSlot *p;.  
35e0: 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20 73    assert( sz > s
35f0: 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53  izeof(LookasideS
3600: 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70 20 3d  lot*) );.    p =
3610: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
3620: 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72  )pStart;.    for
3630: 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20  (i=cnt-1; i>=0; 
3640: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  i--){.      p->p
3650: 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  Next = db->looka
3660: 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20 20  side.pFree;.    
3670: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
3680: 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20  pFree = p;.     
3690: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
36a0: 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73  lot*)&((u8*)p)[s
36b0: 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  z];.    }.    db
36c0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
36d0: 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = p;.    db->lo
36e0: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
36f0: 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 1;.    db->lo
3700: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
3710: 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30  d = pBuf==0 ?1:0
3720: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
3730: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e  b->lookaside.pEn
3740: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
3750: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
3760: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
3770: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
3780: 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ed = 0;.  }.  re
3790: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
37a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
37b0: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
37c0: 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
37d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
37e0: 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65  .*/.sqlite3_mute
37f0: 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75  x *sqlite3_db_mu
3800: 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29  tex(sqlite3 *db)
3810: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d  {.  return db->m
3820: 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  utex;.}../*.** C
3830: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74  onfiguration set
3840: 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e 64  tings for an ind
3850: 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73 65  ividual database
3860: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69   connection.*/.i
3870: 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f  nt sqlite3_db_co
3880: 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62  nfig(sqlite3 *db
3890: 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a  , int op, ...){.
38a0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
38b0: 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61  int rc;.  va_sta
38c0: 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
38d0: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
38e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f  case SQLITE_DBCO
38f0: 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20  NFIG_LOOKASIDE: 
3900: 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42  {.      void *pB
3910: 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  uf = va_arg(ap, 
3920: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 6e  void*);.      in
3930: 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  t sz = va_arg(ap
3940: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e  , int);.      in
3950: 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61  t cnt = va_arg(a
3960: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 72  p, int);.      r
3970: 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69  c = setupLookasi
3980: 64 65 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c  de(db, pBuf, sz,
3990: 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   cnt);.      bre
39a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
39b0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
39c0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
39d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
39e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e     }.  }.  va_en
39f0: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
3a00: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
3a10: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
3a20: 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31   buffer z[0..n-1
3a30: 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73  ] contains all s
3a40: 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  paces..*/.static
3a50: 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63   int allSpaces(c
3a60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
3a70: 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e  t n){.  while( n
3a80: 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20  >0 && z[n-1]==' 
3a90: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65  ' ){ n--; }.  re
3aa0: 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  turn n==0;.}../*
3ab0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
3ac0: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
3ad0: 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  g function named
3ae0: 20 22 42 49 4e 41 52 59 22 20 77 68 69 63 68 20   "BINARY" which 
3af0: 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61  is always.** ava
3b00: 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ilable..**.** If
3b10: 20 74 68 65 20 70 61 64 46 6c 61 67 20 61 72 67   the padFlag arg
3b20: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
3b30: 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70 61 64  L then space pad
3b40: 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  ding at the end.
3b50: 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73  ** of strings is
3b60: 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
3b70: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52  implements the R
3b80: 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a  TRIM collation..
3b90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69  */.static int bi
3ba0: 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69  nCollFunc(.  voi
3bb0: 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e  d *padFlag,.  in
3bc0: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
3bd0: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
3be0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
3bf0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
3c00: 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d  int rc, n;.  n =
3c10: 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e   nKey1<nKey2 ? n
3c20: 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20  Key1 : nKey2;.  
3c30: 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79  rc = memcmp(pKey
3c40: 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20  1, pKey2, n);.  
3c50: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
3c60: 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20 20   if( padFlag.   
3c70: 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28    && allSpaces((
3c80: 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c  (char*)pKey1)+n,
3c90: 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20 26   nKey1-n).     &
3ca0: 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68  & allSpaces(((ch
3cb0: 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b  ar*)pKey2)+n, nK
3cc0: 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20  ey2-n).    ){.  
3cd0: 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 20      /* Leave rc 
3ce0: 75 6e 63 68 61 6e 67 65 64 20 61 74 20 30 20 2a  unchanged at 0 *
3cf0: 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
3d00: 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20     rc = nKey1 - 
3d10: 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  nKey2;.    }.  }
3d20: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3d30: 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62  ./*.** Another b
3d40: 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e  uilt-in collatin
3d50: 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41  g sequence: NOCA
3d60: 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SE. .**.** This 
3d70: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
3d80: 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ce is intended t
3d90: 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 22 63  o be used for "c
3da0: 61 73 65 20 69 6e 64 65 70 65 6e 64 61 6e 74 0a  ase independant.
3db0: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20  ** comparison". 
3dc0: 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64  SQLite's knowled
3dd0: 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64 20  ge of upper and 
3de0: 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75 69 76  lower case equiv
3df0: 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64  alents.** extend
3e00: 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32 36  s only to the 26
3e10: 20 63 68 61 72 61 63 74 65 72 73 20 75 73 65 64   characters used
3e20: 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68 20   in the English 
3e30: 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  language..**.** 
3e40: 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68  At the moment th
3e50: 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55 54  ere is only a UT
3e60: 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  F-8 implementati
3e70: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
3e80: 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e  t nocaseCollatin
3e90: 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e  gFunc(.  void *N
3ea0: 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b  otUsed,.  int nK
3eb0: 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
3ec0: 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b  *pKey1,.  int nK
3ed0: 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey2, const void 
3ee0: 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20  *pKey2.){.  int 
3ef0: 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 49  r = sqlite3StrNI
3f00: 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e 73  Cmp(.      (cons
3f10: 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c 20  t char *)pKey1, 
3f20: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b  (const char *)pK
3f30: 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79  ey2, (nKey1<nKey
3f40: 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b  2)?nKey1:nKey2);
3f50: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
3f60: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
3f70: 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20  if( 0==r ){.    
3f80: 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b  r = nKey1-nKey2;
3f90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
3fa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3fb0: 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 68   the ROWID of th
3fc0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e  e most recent in
3fd0: 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69  sert.*/.sqlite_i
3fe0: 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61 73  nt64 sqlite3_las
3ff0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73  t_insert_rowid(s
4000: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
4010: 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f  eturn db->lastRo
4020: 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  wid;.}../*.** Re
4030: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
4040: 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68  of changes in th
4050: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61  e most recent ca
4060: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78  ll to sqlite3_ex
4070: 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ec()..*/.int sql
4080: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71 6c  ite3_changes(sql
4090: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74  ite3 *db){.  ret
40a0: 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b  urn db->nChange;
40b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
40c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
40d0: 68 61 6e 67 65 73 20 73 69 6e 63 65 20 74 68 65  hanges since the
40e0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
40f0: 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a   was opened..*/.
4100: 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 61  int sqlite3_tota
4110: 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  l_changes(sqlite
4120: 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  3 *db){.  return
4130: 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67   db->nTotalChang
4140: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  e;.}../*.** Clos
4150: 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  e all open savep
4160: 6f 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e 63  oints. This func
4170: 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75  tion only manipu
4180: 6c 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66 20  lates fields of 
4190: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
41a0: 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69  handle object, i
41b0: 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65  t does not close
41c0: 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20   any savepoints 
41d0: 74 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65 6e  that may be open
41e0: 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72 65  .** at the b-tre
41f0: 65 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a  e/pager level..*
4200: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  /.void sqlite3Cl
4210: 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73 71  oseSavepoints(sq
4220: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77 68  lite3 *db){.  wh
4230: 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f  ile( db->pSavepo
4240: 69 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65 70  int ){.    Savep
4250: 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d  oint *pTmp = db-
4260: 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20  >pSavepoint;.   
4270: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
4280: 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20  = pTmp->pNext;. 
4290: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
42a0: 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a  (db, pTmp);.  }.
42b0: 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74    db->nSavepoint
42c0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72   = 0;.  db->isTr
42d0: 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69  ansactionSavepoi
42e0: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
42f0: 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69   Close an existi
4300: 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ng SQLite databa
4310: 73 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  se.*/.int sqlite
4320: 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20  3_close(sqlite3 
4330: 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  *db){.  HashElem
4340: 20 2a 69 3b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20   *i;.  int j;.. 
4350: 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
4360: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4370: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
4380: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
4390: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
43a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
43b0: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73  _MISUSE;.  }.  s
43c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
43d0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a  er(db->mutex);..
43e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53  #ifdef SQLITE_SS
43f0: 45 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e  E.  {.    extern
4400: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 73 65   void sqlite3Sse
4410: 43 6c 65 61 6e 75 70 28 73 71 6c 69 74 65 33 2a  Cleanup(sqlite3*
4420: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 73  );.    sqlite3Ss
4430: 65 43 6c 65 61 6e 75 70 28 64 62 29 3b 0a 20 20  eCleanup(db);.  
4440: 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 73 71 6c  }.#endif ..  sql
4450: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
4460: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
4470: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
4480: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
4490: 74 68 65 20 52 65 73 65 74 49 6e 74 65 72 6e 61  the ResetInterna
44a0: 6c 53 63 68 65 6d 61 28 29 20 63 61 6c 6c 20 61  lSchema() call a
44b0: 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  bove.  ** will n
44c0: 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74  ot have called t
44d0: 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29  he xDisconnect()
44e0: 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76   method on any v
44f0: 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c  irtual.  ** tabl
4500: 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56  es in the db->aV
4510: 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54  Trans[] array. T
4520: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c  he following sql
4530: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
4540: 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  ().  ** call wil
4550: 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64  l do so. We need
4560: 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f   to do this befo
4570: 72 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72  re the check for
4580: 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c   active.  ** SQL
4590: 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f   statements belo
45a0: 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c  w, as the v-tabl
45b0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
45c0: 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a   may be storing.
45d0: 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72    ** some prepar
45e0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ed statements in
45f0: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20  ternally..  */. 
4600: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
4610: 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  back(db);..  /* 
4620: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
4630: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 56 4d 73   outstanding VMs
4640: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
4650: 42 55 53 59 2e 20 2a 2f 0a 20 20 69 66 28 20 64  BUSY. */.  if( d
4660: 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  b->pVdbe ){.    
4670: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
4680: 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
4690: 20 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74         "Unable t
46a0: 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75  o close due to u
46b0: 6e 66 69 6e 61 6c 69 73 65 64 20 73 74 61 74 65  nfinalised state
46c0: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 73 71 6c  ments");.    sql
46d0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
46e0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
46f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
4700: 55 53 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  USY;.  }.  asser
4710: 74 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79  t( sqlite3Safety
4720: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
4730: 29 20 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  ) );..  for(j=0;
4740: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
4750: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
4760: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42   = db->aDb[j].pB
4770: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  t;.    if( pBt &
4780: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
4790: 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29 7b  InBackup(pBt) ){
47a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
47b0: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  ror(db, SQLITE_B
47c0: 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 20 20  USY, .          
47d0: 22 55 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65  "Unable to close
47e0: 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 69 73 68   due to unfinish
47f0: 65 64 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74  ed backup operat
4800: 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c  ion");.      sql
4810: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
4820: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
4830: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4840: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BUSY;.    }.  }
4850: 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
4860: 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65  outstanding Save
4870: 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 73  point structures
4880: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c  . */.  sqlite3Cl
4890: 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
48a0: 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  );..  for(j=0; j
48b0: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
48c0: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
48d0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d  Db = &db->aDb[j]
48e0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
48f0: 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Bt ){.      sqli
4900: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44  te3BtreeClose(pD
4910: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70  b->pBt);.      p
4920: 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20  Db->pBt = 0;.   
4930: 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20     if( j!=1 ){. 
4940: 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68         pDb->pSch
4950: 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ema = 0;.      }
4960: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
4970: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
4980: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
4990: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44    assert( db->nD
49a0: 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74  b<=2 );.  assert
49b0: 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61  ( db->aDb==db->a
49c0: 44 62 53 74 61 74 69 63 20 29 3b 0a 20 20 66 6f  DbStatic );.  fo
49d0: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
49e0: 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b  ze(db->aFunc.a);
49f0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44   j++){.    FuncD
4a00: 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73  ef *pNext, *pHas
4a10: 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  h, *p;.    for(p
4a20: 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b  =db->aFunc.a[j];
4a30: 20 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20   p; p=pHash){.  
4a40: 20 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70      pHash = p->p
4a50: 48 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c  Hash;.      whil
4a60: 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e( p ){.        
4a70: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
4a80: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4a90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
4aa0: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
4ab0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
4ac0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c  .  }.  for(i=sql
4ad0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
4ae0: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20  ->aCollSeq); i; 
4af0: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
4b00: 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  (i)){.    CollSe
4b10: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
4b20: 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68  Seq *)sqliteHash
4b30: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20  Data(i);.    /* 
4b40: 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72  Invoke any destr
4b50: 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65  uctors registere
4b60: 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20  d for collation 
4b70: 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61  sequence user da
4b80: 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a  ta. */.    for(j
4b90: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
4ba0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a       if( pColl[j
4bb0: 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ].xDel ){.      
4bc0: 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28    pColl[j].xDel(
4bd0: 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b  pColl[j].pUser);
4be0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4bf0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4c00: 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, pColl);.  }
4c10: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
4c20: 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ear(&db->aCollSe
4c30: 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
4c40: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
4c50: 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ABLE.  for(i=sql
4c60: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
4c70: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69  ->aModule); i; i
4c80: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
4c90: 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20  i)){.    Module 
4ca0: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20  *pMod = (Module 
4cb0: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
4cc0: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  (i);.    if( pMo
4cd0: 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20  d->xDestroy ){. 
4ce0: 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74       pMod->xDest
4cf0: 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b  roy(pMod->pAux);
4d00: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4d10: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f  e3DbFree(db, pMo
4d20: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
4d30: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
4d40: 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
4d50: 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ..  sqlite3Error
4d60: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
4d70: 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  0); /* Deallocat
4d80: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
4d90: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
4da0: 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29    if( db->pErr )
4db0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  {.    sqlite3Val
4dc0: 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29  ueFree(db->pErr)
4dd0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43  ;.  }.  sqlite3C
4de0: 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64  loseExtensions(d
4df0: 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63  b);..  db->magic
4e00: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
4e10: 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65  ERROR;..  /* The
4e20: 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73   temp-database s
4e30: 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74  chema is allocat
4e40: 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66  ed differently f
4e50: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63  rom the other sc
4e60: 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  hema.  ** object
4e70: 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d  s (using sqliteM
4e80: 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79  alloc() directly
4e90: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c  , instead of sql
4ea0: 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
4eb0: 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e  ))..  ** So it n
4ec0: 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
4ed0: 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79   here. Todo: Why
4ee0: 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65   not roll the te
4ef0: 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20  mp schema into. 
4f00: 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c   ** the same sql
4f10: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74  iteMalloc() as t
4f20: 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f  he one that allo
4f30: 63 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61  cates the databa
4f40: 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  se .  ** structu
4f50: 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  re?.  */.  sqlit
4f60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
4f70: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
4f80: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
4f90: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
4fa0: 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  x);.  db->magic 
4fb0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43  = SQLITE_MAGIC_C
4fc0: 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  LOSED;.  sqlite3
4fd0: 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e  _mutex_free(db->
4fe0: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
4ff0: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
5000: 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46  nOut==0 );  /* F
5010: 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73  ails on a lookas
5020: 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20  ide memory leak 
5030: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  */.  if( db->loo
5040: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
5050: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5060: 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69  free(db->lookasi
5070: 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  de.pStart);.  }.
5080: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
5090: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  b);.  return SQL
50a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
50b0: 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61   Rollback all da
50c0: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f  tabase files..*/
50d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
50e0: 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33  lbackAll(sqlite3
50f0: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *db){.  int i;.
5100: 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20    int inTrans = 
5110: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  0;.  assert( sql
5120: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5130: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
5140: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
5150: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f  gnMalloc();.  fo
5160: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
5170: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
5180: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 20 29  db->aDb[i].pBt )
5190: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
51a0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
51b0: 73 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  s(db->aDb[i].pBt
51c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54  ) ){.        inT
51d0: 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  rans = 1;.      
51e0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
51f0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 64 62 2d  treeRollback(db-
5200: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[i].pBt);.  
5210: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69      db->aDb[i].i
5220: 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20  nTrans = 0;.    
5230: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
5240: 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b  tabRollback(db);
5250: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
5260: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20  ignMalloc();..  
5270: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51  if( db->flags&SQ
5280: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
5290: 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  es ){.    sqlite
52a0: 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
52b0: 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
52c0: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
52d0: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
52e0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
52f0: 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20  If one has been 
5300: 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f  configured, invo
5310: 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d  ke the rollback-
5320: 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f  hook callback */
5330: 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c  .  if( db->xRoll
5340: 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20  backCallback && 
5350: 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d  (inTrans || !db-
5360: 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a  >autoCommit) ){.
5370: 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63      db->xRollbac
5380: 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52  kCallback(db->pR
5390: 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d  ollbackArg);.  }
53a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
53b0: 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
53c0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
53d0: 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  the kind of erro
53e0: 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  r specified in t
53f0: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  he.** argument..
5400: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
5410: 71 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e 74  qlite3ErrStr(int
5420: 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68   rc){.  const ch
5430: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
5440: 20 72 63 20 26 20 30 78 66 66 20 29 7b 0a 20 20   rc & 0xff ){.  
5450: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f    case SQLITE_RO
5460: 57 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  W:.    case SQLI
5470: 54 45 5f 44 4f 4e 45 3a 0a 20 20 20 20 63 61 73  TE_DONE:.    cas
5480: 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20  e SQLITE_OK:    
5490: 20 20 20 20 20 7a 20 3d 20 22 6e 6f 74 20 61 6e       z = "not an
54a0: 20 65 72 72 6f 72 22 3b 20 20 20 20 20 20 20 20   error";        
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
54d0: 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20  e SQLITE_ERROR: 
54e0: 20 20 20 20 20 7a 20 3d 20 22 53 51 4c 20 6c 6f       z = "SQL lo
54f0: 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73  gic error or mis
5500: 73 69 6e 67 20 64 61 74 61 62 61 73 65 22 3b 20  sing database"; 
5510: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5520: 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20  e SQLITE_PERM:  
5530: 20 20 20 20 20 7a 20 3d 20 22 61 63 63 65 73 73       z = "access
5540: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
5550: 65 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ed";            
5560: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5570: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20  e SQLITE_ABORT: 
5580: 20 20 20 20 20 7a 20 3d 20 22 63 61 6c 6c 62 61       z = "callba
5590: 63 6b 20 72 65 71 75 65 73 74 65 64 20 71 75 65  ck requested que
55a0: 72 79 20 61 62 6f 72 74 22 3b 20 20 20 20 20 20  ry abort";      
55b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
55c0: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20  e SQLITE_BUSY:  
55d0: 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61       z = "databa
55e0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 3b 20 20  se is locked";  
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5600: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5610: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a  e SQLITE_LOCKED:
5620: 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61       z = "databa
5630: 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
5640: 65 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ed";            
5650: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5660: 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20  e SQLITE_NOMEM: 
5670: 20 20 20 20 20 7a 20 3d 20 22 6f 75 74 20 6f 66       z = "out of
5680: 20 6d 65 6d 6f 72 79 22 3b 20 20 20 20 20 20 20   memory";       
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
56b0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
56c0: 59 3a 20 20 20 7a 20 3d 20 22 61 74 74 65 6d 70  Y:   z = "attemp
56d0: 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61  t to write a rea
56e0: 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22 3b  donly database";
56f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5700: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  e SQLITE_INTERRU
5710: 50 54 3a 20 20 7a 20 3d 20 22 69 6e 74 65 72 72  PT:  z = "interr
5720: 75 70 74 65 64 22 3b 20 20 20 20 20 20 20 20 20  upted";         
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5740: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5750: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20  e SQLITE_IOERR: 
5760: 20 20 20 20 20 7a 20 3d 20 22 64 69 73 6b 20 49       z = "disk I
5770: 2f 4f 20 65 72 72 6f 72 22 3b 20 20 20 20 20 20  /O error";      
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
57a0: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
57b0: 3a 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61  :    z = "databa
57c0: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
57d0: 20 6d 61 6c 66 6f 72 6d 65 64 22 3b 20 20 20 20   malformed";    
57e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
57f0: 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20  e SQLITE_FULL:  
5800: 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61       z = "databa
5810: 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75  se or disk is fu
5820: 6c 6c 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ll";            
5830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5840: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
5850: 4e 3a 20 20 20 7a 20 3d 20 22 75 6e 61 62 6c 65  N:   z = "unable
5860: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
5870: 65 20 66 69 6c 65 22 3b 20 20 20 20 20 20 20 20  e file";        
5880: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5890: 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20  e SQLITE_EMPTY: 
58a0: 20 20 20 20 20 7a 20 3d 20 22 74 61 62 6c 65 20       z = "table 
58b0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
58c0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
58d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
58e0: 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a  e SQLITE_SCHEMA:
58f0: 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61       z = "databa
5900: 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63 68  se schema has ch
5910: 61 6e 67 65 64 22 3b 20 20 20 20 20 20 20 20 20  anged";         
5920: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5930: 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a  e SQLITE_TOOBIG:
5940: 20 20 20 20 20 7a 20 3d 20 22 53 74 72 69 6e 67       z = "String
5950: 20 6f 72 20 42 4c 4f 42 20 65 78 63 65 65 64 65   or BLOB exceede
5960: 64 20 73 69 7a 65 20 6c 69 6d 69 74 22 3b 20 20  d size limit";  
5970: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5980: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
5990: 49 4e 54 3a 20 7a 20 3d 20 22 63 6f 6e 73 74 72  INT: z = "constr
59a0: 61 69 6e 74 20 66 61 69 6c 65 64 22 3b 20 20 20  aint failed";   
59b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
59d0: 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  e SQLITE_MISMATC
59e0: 48 3a 20 20 20 7a 20 3d 20 22 64 61 74 61 74 79  H:   z = "dataty
59f0: 70 65 20 6d 69 73 6d 61 74 63 68 22 3b 20 20 20  pe mismatch";   
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5a20: 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a  e SQLITE_MISUSE:
5a30: 20 20 20 20 20 7a 20 3d 20 22 6c 69 62 72 61 72       z = "librar
5a40: 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64  y routine called
5a50: 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65   out of sequence
5a60: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ";break;.    cas
5a70: 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20  e SQLITE_NOLFS: 
5a80: 20 20 20 20 20 7a 20 3d 20 22 6c 61 72 67 65 20       z = "large 
5a90: 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20  file support is 
5aa0: 64 69 73 61 62 6c 65 64 22 3b 20 20 20 20 20 20  disabled";      
5ab0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5ac0: 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20  e SQLITE_AUTH:  
5ad0: 20 20 20 20 20 7a 20 3d 20 22 61 75 74 68 6f 72       z = "author
5ae0: 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 3b  ization denied";
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5b10: 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a  e SQLITE_FORMAT:
5b20: 20 20 20 20 20 7a 20 3d 20 22 61 75 78 69 6c 69       z = "auxili
5b30: 61 72 79 20 64 61 74 61 62 61 73 65 20 66 6f 72  ary database for
5b40: 6d 61 74 20 65 72 72 6f 72 22 3b 20 20 20 20 20  mat error";     
5b50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5b60: 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20  e SQLITE_RANGE: 
5b70: 20 20 20 20 20 7a 20 3d 20 22 62 69 6e 64 20 6f       z = "bind o
5b80: 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f  r column index o
5b90: 75 74 20 6f 66 20 72 61 6e 67 65 22 3b 20 20 20  ut of range";   
5ba0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5bb0: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a  e SQLITE_NOTADB:
5bc0: 20 20 20 20 20 7a 20 3d 20 22 66 69 6c 65 20 69       z = "file i
5bd0: 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69  s encrypted or i
5be0: 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65  s not a database
5bf0: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66  ";break;.    def
5c00: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
5c10: 20 20 20 20 20 7a 20 3d 20 22 75 6e 6b 6e 6f 77       z = "unknow
5c20: 6e 20 65 72 72 6f 72 22 3b 20 20 20 20 20 20 20  n error";       
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c40: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
5c50: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
5c60: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
5c70: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79  mplements a busy
5c80: 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73   callback that s
5c90: 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a  leeps and tries.
5ca0: 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61  ** again until a
5cb0: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
5cc0: 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20  s reached.  The 
5cd0: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
5ce0: 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e  .** an integer n
5cf0: 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
5d00: 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20  conds passed in 
5d10: 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  as the first.** 
5d20: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
5d30: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65  tic int sqliteDe
5d40: 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63  faultBusyCallbac
5d50: 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20  k(. void *ptr,  
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5d70: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
5d80: 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e  ion */. int coun
5d90: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
5da0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
5db0: 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20 62 65  mes table has be
5dc0: 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69  en busy */.){.#i
5dd0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20  f SQLITE_OS_WIN 
5de0: 7c 7c 20 28 64 65 66 69 6e 65 64 28 48 41 56 45  || (defined(HAVE
5df0: 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45  _USLEEP) && HAVE
5e00: 5f 55 53 4c 45 45 50 29 0a 20 20 73 74 61 74 69  _USLEEP).  stati
5e10: 63 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79  c const u8 delay
5e20: 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20  s[] =.     { 1, 
5e30: 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30  2, 5, 10, 15, 20
5e40: 2c 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20  , 25, 25,  25,  
5e50: 35 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a  50,  50, 100 };.
5e60: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
5e70: 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20  8 totals[] =.   
5e80: 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c    { 0, 1, 3,  8,
5e90: 20 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c   18, 33, 53, 78,
5ea0: 20 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20   103, 128, 178, 
5eb0: 32 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20  228 };.# define 
5ec0: 4e 44 45 4c 41 59 20 28 73 69 7a 65 6f 66 28 64  NDELAY (sizeof(d
5ed0: 65 6c 61 79 73 29 2f 73 69 7a 65 6f 66 28 64 65  elays)/sizeof(de
5ee0: 6c 61 79 73 5b 30 5d 29 29 0a 20 20 73 71 6c 69  lays[0])).  sqli
5ef0: 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74  te3 *db = (sqlit
5f00: 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20  e3 *)ptr;.  int 
5f10: 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75  timeout = db->bu
5f20: 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74  syTimeout;.  int
5f30: 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a   delay, prior;..
5f40: 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e    assert( count>
5f50: 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e  =0 );.  if( coun
5f60: 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20  t < NDELAY ){.  
5f70: 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73    delay = delays
5f80: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69  [count];.    pri
5f90: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e  or = totals[coun
5fa0: 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
5fb0: 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b   delay = delays[
5fc0: 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70  NDELAY-1];.    p
5fd0: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44  rior = totals[ND
5fe0: 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a  ELAY-1] + delay*
5ff0: 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31  (count-(NDELAY-1
6000: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72  ));.  }.  if( pr
6010: 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69  ior + delay > ti
6020: 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c  meout ){.    del
6030: 61 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70  ay = timeout - p
6040: 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65  rior;.    if( de
6050: 6c 61 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20  lay<=0 ) return 
6060: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
6070: 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73  OsSleep(db->pVfs
6080: 2c 20 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20  , delay*1000);. 
6090: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65   return 1;.#else
60a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
60b0: 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b   (sqlite3 *)ptr;
60c0: 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d  .  int timeout =
60d0: 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72   ((sqlite3 *)ptr
60e0: 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a  )->busyTimeout;.
60f0: 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a    if( (count+1)*
6100: 31 30 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29  1000 > timeout )
6110: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
6120: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
6130: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31  leep(db->pVfs, 1
6140: 30 30 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72  000000);.  retur
6150: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
6160: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
6170: 67 69 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c  given busy handl
6180: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
6190: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
61a0: 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69   when an operati
61b0: 6f 6e 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  on failed with a
61c0: 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69   lock..** If thi
61d0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
61e0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
61f0: 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e  lock is retried.
6200: 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72    If it.** retur
6210: 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74  ns 0, the operat
6220: 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20  ion aborts with 
6230: 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65  an SQLITE_BUSY e
6240: 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rror..*/.int sql
6250: 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
6260: 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65  ndler(BusyHandle
6270: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  r *p){.  int rc;
6280: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
6290: 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d  0) || p->xFunc==
62a0: 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20  0 || p->nBusy<0 
62b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63  ) return 0;.  rc
62c0: 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70   = p->xFunc(p->p
62d0: 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a  Arg, p->nBusy);.
62e0: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
62f0: 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31     p->nBusy = -1
6300: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6310: 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20  ->nBusy++;.  }. 
6320: 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a   return rc; .}..
6330: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
6340: 6e 65 20 73 65 74 73 20 74 68 65 20 62 75 73 79  ne sets the busy
6350: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
6360: 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65   Sqlite database
6370: 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e   to the.** given
6380: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
6390: 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65  on with the give
63a0: 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  n argument..*/.i
63b0: 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  nt sqlite3_busy_
63c0: 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74  handler(.  sqlit
63d0: 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a  e3 *db,.  int (*
63e0: 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74  xBusy)(void*,int
63f0: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  ),.  void *pArg.
6400: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
6410: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
6420: 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  ex);.  db->busyH
6430: 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78  andler.xFunc = x
6440: 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79  Busy;.  db->busy
6450: 48 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70  Handler.pArg = p
6460: 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  Arg;.  db->busyH
6470: 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
6480: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
6490: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
64a0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
64b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
64c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
64d0: 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b  ROGRESS_CALLBACK
64e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
64f0: 69 6e 65 20 73 65 74 73 20 74 68 65 20 70 72 6f  ine sets the pro
6500: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66  gress callback f
6510: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
6520: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
6530: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
6540: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
6550: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
6560: 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   The progress ca
6570: 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62  llback will.** b
6580: 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20  e invoked every 
6590: 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f  nOps opcodes..*/
65a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72  .void sqlite3_pr
65b0: 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a  ogress_handler(.
65c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
65d0: 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e    int nOps,.  in
65e0: 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76  t (*xProgress)(v
65f0: 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a  oid*), .  void *
6600: 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65  pArg.){.  sqlite
6610: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
6620: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
6630: 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62  nOps>0 ){.    db
6640: 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50  ->xProgress = xP
6650: 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d  rogress;.    db-
6660: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20  >nProgressOps = 
6670: 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50  nOps;.    db->pP
6680: 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72  rogressArg = pAr
6690: 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
66a0: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20  db->xProgress = 
66b0: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67  0;.    db->nProg
66c0: 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20  ressOps = 0;.   
66d0: 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72   db->pProgressAr
66e0: 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  g = 0;.  }.  sql
66f0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6700: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23  (db->mutex);.}.#
6710: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
6720: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61  is routine insta
6730: 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75  lls a default bu
6740: 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20  sy handler that 
6750: 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a  waits for the.**
6760: 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65   specified numbe
6770: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
6780: 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
6790: 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ng 0..*/.int sql
67a0: 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
67b0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
67c0: 6e 74 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73  nt ms){.  if( ms
67d0: 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 75  >0 ){.    db->bu
67e0: 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a  syTimeout = ms;.
67f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
6800: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c  _handler(db, sql
6810: 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61  iteDefaultBusyCa
6820: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64  llback, (void*)d
6830: 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
6840: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
6850: 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b  ndler(db, 0, 0);
6860: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6870: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6880: 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64  * Cause any pend
6890: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  ing operation to
68a0: 20 73 74 6f 70 20 61 74 20 69 74 73 20 65 61 72   stop at its ear
68b0: 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74  liest opportunit
68c0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
68d0: 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c  e3_interrupt(sql
68e0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d  ite3 *db){.  db-
68f0: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
6900: 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  d = 1;.}.../*.**
6910: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6920: 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61  s exactly the sa
6930: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72  me as sqlite3_cr
6940: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c  eate_function(),
6950: 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20   except.** that 
6960: 69 74 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  it is designed t
6970: 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69  o be called by i
6980: 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68  nternal code. Th
6990: 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a  e difference is.
69a0: 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c  ** that if a mal
69b0: 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73  loc() fails in s
69c0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
69d0: 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72  nction(), an err
69e0: 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65  or code.** is re
69f0: 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d  turned and the m
6a00: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
6a10: 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e   cleared. .*/.in
6a20: 74 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  t sqlite3CreateF
6a30: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  unc(.  sqlite3 *
6a40: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
6a50: 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c   *zFunctionName,
6a60: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
6a70: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
6a80: 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69  pUserData,.  voi
6a90: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
6aa0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
6ab0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6ac0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
6ad0: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
6ae0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
6af0: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
6b00: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
6b10: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
6b20: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20  .  FuncDef *p;. 
6b30: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61   int nName;..  a
6b40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6b50: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
6b60: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46  tex) );.  if( zF
6b70: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c  unctionName==0 |
6b80: 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63 20 26  |.      (xFunc &
6b90: 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74  & (xFinal || xSt
6ba0: 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28  ep)) || .      (
6bb0: 21 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61  !xFunc && (xFina
6bc0: 6c 20 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c  l && !xStep)) ||
6bd0: 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26  .      (!xFunc &
6be0: 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53  & (!xFinal && xS
6bf0: 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28  tep)) ||.      (
6c00: 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e  nArg<-1 || nArg>
6c10: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
6c20: 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20  ION_ARG) ||.    
6c30: 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20    (255<(nName = 
6c40: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 28 64 62  sqlite3Strlen(db
6c50: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29  , zFunctionName)
6c60: 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
6c70: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
6c80: 45 5f 45 52 52 4f 52 2c 20 22 62 61 64 20 70 61  E_ERROR, "bad pa
6c90: 72 61 6d 65 74 65 72 73 22 29 3b 0a 20 20 20 20  rameters");.    
6ca0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
6cb0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 6e  ROR;.  }.  .#ifn
6cc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6cd0: 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51  UTF16.  /* If SQ
6ce0: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70  LITE_UTF16 is sp
6cf0: 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65  ecified as the e
6d00: 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72  ncoding type, tr
6d10: 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a  ansform this.  *
6d20: 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49  * to one of SQLI
6d30: 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51  TE_UTF16LE or SQ
6d40: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69  LITE_UTF16BE usi
6d50: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ng the.  ** SQLI
6d60: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d  TE_UTF16NATIVE m
6d70: 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46  acro. SQLITE_UTF
6d80: 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  16 is not used i
6d90: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a  nternally..  **.
6da0: 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41    ** If SQLITE_A
6db0: 4e 59 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  NY is specified,
6dc0: 20 61 64 64 20 74 68 72 65 65 20 76 65 72 73 69   add three versi
6dd0: 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ons of the funct
6de0: 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ion.  ** to the 
6df0: 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  hash table..  */
6e00: 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49  .  if( enc==SQLI
6e10: 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20  TE_UTF16 ){.    
6e20: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
6e30: 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73  16NATIVE;.  }els
6e40: 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54  e if( enc==SQLIT
6e50: 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74  E_ANY ){.    int
6e60: 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
6e70: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
6e80: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
6e90: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
6ea0: 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 70  UTF8,.         p
6eb0: 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c  UserData, xFunc,
6ec0: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b   xStep, xFinal);
6ed0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
6ee0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6ef0: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
6f00: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
6f10: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  tionName, nArg, 
6f20: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 0a  SQLITE_UTF16LE,.
6f30: 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44            pUserD
6f40: 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  ata, xFunc, xSte
6f50: 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 20 20  p, xFinal);.    
6f60: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
6f70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6f80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
6f90: 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49  }.    enc = SQLI
6fa0: 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a  TE_UTF16BE;.  }.
6fb0: 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51  #else.  enc = SQ
6fc0: 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69  LITE_UTF8;.#endi
6fd0: 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  f.  .  /* Check 
6fe0: 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66  if an existing f
6ff0: 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
7000: 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64   overridden or d
7010: 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20  eleted. If so,. 
7020: 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
7030: 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68  e active VMs, th
7040: 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  en return SQLITE
7050: 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63  _BUSY. If a func
7060: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69  tion.  ** is bei
7070: 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65  ng overridden/de
7080: 6c 65 74 65 64 20 62 75 74 20 74 68 65 72 65 20  leted but there 
7090: 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d  are no active VM
70a0: 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a  s, allow the.  *
70b0: 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63  * operation to c
70c0: 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61  ontinue but inva
70d0: 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f  lidate all preco
70e0: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
70f0: 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  s..  */.  p = sq
7100: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
7110: 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  n(db, zFunctionN
7120: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67  ame, nName, nArg
7130: 2c 20 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20  , (u8)enc, 0);. 
7140: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 50 72   if( p && p->iPr
7150: 65 66 45 6e 63 3d 3d 65 6e 63 20 26 26 20 70 2d  efEnc==enc && p-
7160: 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20  >nArg==nArg ){. 
7170: 20 20 20 69 66 28 20 64 62 2d 3e 61 63 74 69 76     if( db->activ
7180: 65 56 64 62 65 43 6e 74 20 29 7b 0a 20 20 20 20  eVdbeCnt ){.    
7190: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
71a0: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
71b0: 0a 20 20 20 20 20 20 20 20 22 55 6e 61 62 6c 65  .        "Unable
71c0: 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66   to delete/modif
71d0: 79 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20  y user-function 
71e0: 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74  due to active st
71f0: 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20  atements");.    
7200: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
7210: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
7220: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7230: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c  TE_BUSY;.    }el
7240: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
7250: 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
7260: 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
7270: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20     }.  }..  p = 
7280: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
7290: 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  ion(db, zFunctio
72a0: 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41  nName, nName, nA
72b0: 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29 3b  rg, (u8)enc, 1);
72c0: 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20 64  .  assert(p || d
72d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
72e0: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
72f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7300: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
7310: 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 2d 3e  flags = 0;.  p->
7320: 78 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20  xFunc = xFunc;. 
7330: 20 70 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65   p->xStep = xSte
7340: 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a  p;.  p->xFinaliz
7350: 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d  e = xFinal;.  p-
7360: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 55 73  >pUserData = pUs
7370: 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72  erData;.  p->nAr
7380: 67 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20  g = (u16)nArg;. 
7390: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
73a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
73b0: 74 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63  te new user func
73c0: 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tions..*/.int sq
73d0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
73e0: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
73f0: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
7400: 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  ar *zFunctionNam
7410: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  e,.  int nArg,. 
7420: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
7430: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
7440: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
7450: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
7460: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
7470: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
7480: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
7490: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
74a0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
74b0: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
74c0: 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74  ntext*).){.  int
74d0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d   rc;.  sqlite3_m
74e0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
74f0: 75 74 65 78 29 3b 0a 20 20 72 63 20 3d 20 73 71  utex);.  rc = sq
7500: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
7510: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
7520: 65 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  e, nArg, enc, p,
7530: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
7540: 46 69 6e 61 6c 29 3b 0a 20 20 72 63 20 3d 20 73  Final);.  rc = s
7550: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
7560: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
7570: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
7580: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
7590: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
75a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
75b0: 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  16.int sqlite3_c
75c0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
75d0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
75e0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
75f0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
7600: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
7610: 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64  eTextRep,.  void
7620: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
7630: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
7640: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
7650: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
7660: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
7670: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
7680: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
7690: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
76a0: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
76b0: 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  ext*).){.  int r
76c0: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63  c;.  char *zFunc
76d0: 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  8;.  sqlite3_mut
76e0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
76f0: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
7700: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7710: 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73   );.  zFunc8 = s
7720: 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
7730: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
7740: 2c 20 2d 31 29 3b 0a 20 20 72 63 20 3d 20 73 71  , -1);.  rc = sq
7750: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
7760: 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67  db, zFunc8, nArg
7770: 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78  , eTextRep, p, x
7780: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
7790: 6e 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  nal);.  sqlite3D
77a0: 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38  bFree(db, zFunc8
77b0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
77c0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
77d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
77e0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
77f0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
7800: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
7810: 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61  * Declare that a
7820: 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65   function has be
7830: 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79  en overloaded by
7840: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
7850: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
7860: 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20  unction already 
7870: 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75  exists as a regu
7880: 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  lar global funct
7890: 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ion, then.** thi
78a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
78b0: 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75  o-op.  If the fu
78c0: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
78d0: 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61  exist, then crea
78e0: 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20  te.** a new one 
78f0: 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f  that always thro
7900: 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72  ws a run-time er
7910: 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  ror.  .**.** Whe
7920: 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  n virtual tables
7930: 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69   intend to provi
7940: 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64  de an overloaded
7950: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a   function, they.
7960: 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74  ** should call t
7970: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d  his routine to m
7980: 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f  ake sure the glo
7990: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69  bal function exi
79a0: 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  sts..** A global
79b0: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65   function must e
79c0: 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f  xist in order fo
79d0: 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
79e0: 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f  n to work.** pro
79f0: 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  perly..*/.int sq
7a00: 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
7a10: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
7a20: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
7a30: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
7a40: 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74  nt nArg.){.  int
7a50: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
7a60: 53 74 72 6c 65 6e 28 64 62 2c 20 7a 4e 61 6d 65  Strlen(db, zName
7a70: 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  );.  int rc;.  s
7a80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
7a90: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
7aa0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
7ab0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  Function(db, zNa
7ac0: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
7ad0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
7ae0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
7af0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
7b00: 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51   zName, nArg, SQ
7b10: 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20  LITE_UTF8,.     
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b30: 20 30 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c   0, sqlite3Inval
7b40: 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  idFunction, 0, 0
7b50: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
7b60: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
7b70: 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73   SQLITE_OK);.  s
7b80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
7b90: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
7ba0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
7bb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7bc0: 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52  IT_TRACE./*.** R
7bd0: 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20  egister a trace 
7be0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  function.  The p
7bf0: 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65  Arg from the pre
7c00: 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
7c10: 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72  ed trace.** is r
7c20: 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a  eturned.  .**.**
7c30: 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75   A NULL trace fu
7c40: 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  nction means tha
7c50: 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20  t no tracing is 
7c60: 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e  executes.  A non
7c70: 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69  -NULL.** trace i
7c80: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
7c90: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
7ca0: 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
7cb0: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a   start of each.*
7cc0: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  * SQL statement.
7cd0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
7ce0: 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20  3_trace(sqlite3 
7cf0: 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61  *db, void (*xTra
7d00: 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  ce)(void*,const 
7d10: 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41  char*), void *pA
7d20: 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  rg){.  void *pOl
7d30: 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  d;.  sqlite3_mut
7d40: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
7d50: 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62  ex);.  pOld = db
7d60: 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64  ->pTraceArg;.  d
7d70: 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61  b->xTrace = xTra
7d80: 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65  ce;.  db->pTrace
7d90: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
7da0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
7db0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
7dc0: 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f  return pOld;.}./
7dd0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
7de0: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
7df0: 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d  .  The pArg from
7e00: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
7e10: 72 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70  registered .** p
7e20: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20  rofile function 
7e30: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a  is returned.  .*
7e40: 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66  *.** A NULL prof
7e50: 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61  ile function mea
7e60: 6e 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69  ns that no profi
7e70: 6c 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73  ling is executes
7e80: 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  .  A non-NULL.**
7e90: 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f   profile is a po
7ea0: 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
7eb0: 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f  ion that is invo
7ec0: 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  ked at the concl
7ed0: 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68  usion of.** each
7ee0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
7ef0: 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76  hat is run..*/.v
7f00: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f  oid *sqlite3_pro
7f10: 66 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20  file(.  sqlite3 
7f20: 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50  *db,.  void (*xP
7f30: 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f  rofile)(void*,co
7f40: 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65  nst char*,sqlite
7f50: 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64  _uint64),.  void
7f60: 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64   *pArg.){.  void
7f70: 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65   *pOld;.  sqlite
7f80: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
7f90: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
7fa0: 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41   = db->pProfileA
7fb0: 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69  rg;.  db->xProfi
7fc0: 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20  le = xProfile;. 
7fd0: 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67   db->pProfileArg
7fe0: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
7ff0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
8000: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
8010: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64  urn pOld;.}.#end
8020: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
8030: 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a  T_TRACE */../***
8040: 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 2a 2a   EXPERIMENTAL **
8050: 2a 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  *.**.** Register
8060: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62   a function to b
8070: 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61  e invoked when a
8080: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
8090: 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65  ments..** If the
80a0: 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f   invoked functio
80b0: 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  n returns non-ze
80c0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d  ro, then the com
80d0: 6d 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a  mit becomes a.**
80e0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f   rollback..*/.vo
80f0: 69 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d  id *sqlite3_comm
8100: 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  it_hook(.  sqlit
8110: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
8120: 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
8130: 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
8140: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
8150: 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  t (*xCallback)(v
8160: 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74  oid*),  /* Funct
8170: 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e  ion to invoke on
8180: 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a   each commit */.
8190: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
81b0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
81c0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
81d0: 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71  void *pOld;.  sq
81e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
81f0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
8200: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d  pOld = db->pComm
8210: 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f  itArg;.  db->xCo
8220: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78  mmitCallback = x
8230: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
8240: 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72  pCommitArg = pAr
8250: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
8260: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
8270: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
8280: 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  ld;.}../*.** Reg
8290: 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
82a0: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
82b0: 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69  ach time a row i
82c0: 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e  s updated,.** in
82d0: 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65  serted or delete
82e0: 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74  d using this dat
82f0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8300: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
8310: 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a  e3_update_hook(.
8320: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
8330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8340: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
8350: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
8360: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
8370: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74  lback)(void*,int
8380: 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68  ,char const *,ch
8390: 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74  ar const *,sqlit
83a0: 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64  e_int64),.  void
83b0: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
83c0: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
83d0: 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
83e0: 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
83f0: 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pRet;.  sqlite3_
8400: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
8410: 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
8420: 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b   db->pUpdateArg;
8430: 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61  .  db->xUpdateCa
8440: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
8450: 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74  ck;.  db->pUpdat
8460: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
8470: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
8480: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
8490: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
84a0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
84b0: 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
84c0: 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
84d0: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
84e0: 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   is rolled.** ba
84f0: 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ck by this datab
8500: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
8510: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
8520: 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a  _rollback_hook(.
8530: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
8540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8550: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
8560: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
8570: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
8580: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f  lback)(void*), /
8590: 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  * Callback funct
85a0: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
85b0: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
85c0: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
85d0: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
85e0: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
85f0: 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  t;.  sqlite3_mut
8600: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
8610: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
8620: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a  ->pRollbackArg;.
8630: 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43    db->xRollbackC
8640: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
8650: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c  ack;.  db->pRoll
8660: 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a  backArg = pArg;.
8670: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
8680: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
8690: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
86a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
86b0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
86c0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 6e   to create a con
86d0: 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74  nection to a dat
86e0: 61 62 61 73 65 20 42 54 72 65 65 0a 2a 2a 20 64  abase BTree.** d
86f0: 72 69 76 65 72 2e 20 20 49 66 20 7a 46 69 6c 65  river.  If zFile
8700: 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
8710: 20 6f 66 20 61 20 66 69 6c 65 2c 20 74 68 65 6e   of a file, then
8720: 20 74 68 61 74 20 66 69 6c 65 20 69 73 0a 2a 2a   that file is.**
8730: 20 6f 70 65 6e 65 64 20 61 6e 64 20 75 73 65 64   opened and used
8740: 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
8750: 69 73 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d  is the magic nam
8760: 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  e ":memory:" the
8770: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
8780: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d  e is stored in m
8790: 65 6d 6f 72 79 20 28 61 6e 64 20 69 73 20 74 68  emory (and is th
87a0: 75 73 20 66 6f 72 67 6f 74 74 65 6e 20 61 73 20  us forgotten as 
87b0: 73 6f 6f 6e 20 61 73 0a 2a 2a 20 74 68 65 20 63  soon as.** the c
87c0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f  onnection is clo
87d0: 73 65 64 2e 29 20 20 49 66 20 7a 46 69 6c 65 6e  sed.)  If zFilen
87e0: 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
87f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
8800: 20 69 73 20 61 20 22 76 69 72 74 75 61 6c 22 20   is a "virtual" 
8810: 64 61 74 61 62 61 73 65 20 66 6f 72 20 74 72 61  database for tra
8820: 6e 73 69 65 6e 74 20 75 73 65 20 6f 6e 6c 79 20  nsient use only 
8830: 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 20 61  and is deleted a
8840: 73 0a 2a 2a 20 73 6f 6f 6e 20 61 73 20 74 68 65  s.** soon as the
8850: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63   connection is c
8860: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 76  losed..**.** A v
8870: 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
8880: 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 61 20  can be either a 
8890: 64 69 73 6b 20 66 69 6c 65 20 28 74 68 61 74 20  disk file (that 
88a0: 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
88b0: 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
88c0: 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f   the file is clo
88d0: 73 65 64 29 20 6f 72 20 69 74 20 61 6e 20 62 65  sed) or it an be
88e0: 20 68 65 6c 64 20 65 6e 74 69 72 65 6c 79 20 69   held entirely i
88f0: 6e 20 6d 65 6d 6f 72 79 2c 0a 2a 2a 20 64 65 70  n memory,.** dep
8900: 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
8910: 6c 75 65 73 20 6f 66 20 74 68 65 20 53 51 4c 49  lues of the SQLI
8920: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 63 6f  TE_TEMP_STORE co
8930: 6d 70 69 6c 65 2d 74 69 6d 65 20 6d 61 63 72 6f  mpile-time macro
8940: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 62 2d 3e   and the.** db->
8950: 74 65 6d 70 5f 73 74 6f 72 65 20 76 61 72 69 61  temp_store varia
8960: 62 6c 65 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ble, according t
8970: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
8980: 63 68 61 72 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 53  chart:.**.**   S
8990: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
89a0: 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74       db->temp_st
89b0: 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e  ore     Location
89c0: 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61   of temporary da
89d0: 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d  tabase.**   ----
89e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
89f0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
8a00: 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
8a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a20: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
8a40: 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
8a50: 20 20 66 69 6c 65 0a 2a 2a 20 20 20 31 20 20 20    file.**   1   
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a70: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
8a80: 20 20 20 20 20 66 69 6c 65 0a 2a 2a 20 20 20 31       file.**   1
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8aa0: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
8ab0: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 0a 2a          memory.*
8ac0: 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
8ad0: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
8af0: 65 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  e.**   2        
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b20: 66 69 6c 65 0a 2a 2a 20 20 20 32 20 20 20 20 20  file.**   2     
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b40: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
8b50: 20 20 20 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 32     memory.**   2
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b70: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
8b80: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 0a 2a          memory.*
8b90: 2a 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20  *   3           
8ba0: 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20            any   
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
8bc0: 6f 72 79 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ory.*/.int sqlit
8bd0: 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 0a  e3BtreeFactory(.
8be0: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20    const sqlite3 
8bf0: 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d  *db,        /* M
8c00: 61 69 6e 20 64 61 74 61 62 61 73 65 20 77 68 65  ain database whe
8c10: 6e 20 6f 70 65 6e 69 6e 67 20 61 75 78 20 6f 74  n opening aux ot
8c20: 68 65 72 77 69 73 65 20 30 20 2a 2f 0a 20 20 63  herwise 0 */.  c
8c30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
8c40: 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  name,    /* Name
8c50: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
8c60: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
8c70: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
8c80: 69 6e 74 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c 2c  int omitJournal,
8c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20            /* if 
8ca0: 54 52 55 45 20 74 68 65 6e 20 64 6f 20 6e 6f 74  TRUE then do not
8cb0: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 66 69   journal this fi
8cc0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 61 63  le */.  int nCac
8cd0: 68 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  he,             
8ce0: 20 20 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 70 61    /* How many pa
8cf0: 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
8d00: 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 76  cache */.  int v
8d10: 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
8d20: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
8d30: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
8d40: 76 66 73 4f 70 65 6e 20 2a 2f 0a 20 20 42 74 72  vfsOpen */.  Btr
8d50: 65 65 20 2a 2a 70 70 42 74 72 65 65 20 20 20 20  ee **ppBtree    
8d60: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
8d70: 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
8d80: 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
8d90: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62  re */.){.  int b
8da0: 74 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 69 6e  tFlags = 0;.  in
8db0: 74 20 72 63 3b 0a 20 20 0a 20 20 61 73 73 65 72  t rc;.  .  asser
8dc0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8dd0: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
8de0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70   );.  assert( pp
8df0: 42 74 72 65 65 20 21 3d 20 30 29 3b 0a 20 20 69  Btree != 0);.  i
8e00: 66 28 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c 20 29  f( omitJournal )
8e10: 7b 0a 20 20 20 20 62 74 46 6c 61 67 73 20 7c 3d  {.    btFlags |=
8e20: 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
8e30: 4e 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  NAL;.  }.  if( d
8e40: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
8e50: 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  E_NoReadlock ){.
8e60: 20 20 20 20 62 74 46 6c 61 67 73 20 7c 3d 20 42      btFlags |= B
8e70: 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  TREE_NO_READLOCK
8e80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c  ;.  }.  if( zFil
8e90: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 20  ename==0 ){.#if 
8ea0: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
8eb0: 45 3d 3d 30 0a 20 20 20 20 2f 2a 20 44 6f 20 6e  E==0.    /* Do n
8ec0: 6f 74 68 69 6e 67 20 2a 2f 0a 23 65 6e 64 69 66  othing */.#endif
8ed0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8ee0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 69  OMIT_MEMORYDB.#i
8ef0: 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
8f00: 4f 52 45 3d 3d 31 0a 20 20 20 20 69 66 28 20 64  ORE==1.    if( d
8f10: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32  b->temp_store==2
8f20: 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22   ) zFilename = "
8f30: 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65 6e 64 69  :memory:";.#endi
8f40: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
8f50: 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 20 20 69  P_STORE==2.    i
8f60: 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  f( db->temp_stor
8f70: 65 21 3d 31 20 29 20 7a 46 69 6c 65 6e 61 6d 65  e!=1 ) zFilename
8f80: 20 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23   = ":memory:";.#
8f90: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
8fa0: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20  _TEMP_STORE==3. 
8fb0: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22     zFilename = "
8fc0: 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65 6e 64 69  :memory:";.#endi
8fd0: 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  f.#endif /* SQLI
8fe0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
8ff0: 20 2a 2f 0a 20 20 7d 0a 0a 20 20 69 66 28 20 28   */.  }..  if( (
9000: 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
9010: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21  E_OPEN_MAIN_DB)!
9020: 3d 30 20 26 26 20 28 7a 46 69 6c 65 6e 61 6d 65  =0 && (zFilename
9030: 3d 3d 30 20 7c 7c 20 2a 7a 46 69 6c 65 6e 61 6d  ==0 || *zFilenam
9040: 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 76 66 73  e==0) ){.    vfs
9050: 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67  Flags = (vfsFlag
9060: 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  s & ~SQLITE_OPEN
9070: 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49  _MAIN_DB) | SQLI
9080: 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b  TE_OPEN_TEMP_DB;
9090: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
90a0: 74 65 33 42 74 72 65 65 4f 70 65 6e 28 7a 46 69  te3BtreeOpen(zFi
90b0: 6c 65 6e 61 6d 65 2c 20 28 73 71 6c 69 74 65 33  lename, (sqlite3
90c0: 20 2a 29 64 62 2c 20 70 70 42 74 72 65 65 2c 20   *)db, ppBtree, 
90d0: 62 74 46 6c 61 67 73 2c 20 76 66 73 46 6c 61 67  btFlags, vfsFlag
90e0: 73 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  s);..  /* If the
90f0: 20 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63   B-Tree was succ
9100: 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c  essfully opened,
9110: 20 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63   set the pager-c
9120: 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65  ache size to the
9130: 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61  .  ** default va
9140: 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 69 66 20  lue. Except, if 
9150: 74 68 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65  the call to Btre
9160: 65 4f 70 65 6e 28 29 20 72 65 74 75 72 6e 65 64  eOpen() returned
9170: 20 61 20 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 6f   a handle.  ** o
9180: 70 65 6e 20 6f 6e 20 61 6e 20 65 78 69 73 74 69  pen on an existi
9190: 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d  ng shared pager-
91a0: 63 61 63 68 65 2c 20 64 6f 20 6e 6f 74 20 63 68  cache, do not ch
91b0: 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d 63  ange the pager-c
91c0: 61 63 68 65 20 0a 20 20 2a 2a 20 73 69 7a 65 2e  ache .  ** size.
91d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
91e0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
91f0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
9200: 6d 61 28 2a 70 70 42 74 72 65 65 2c 20 30 2c 20  ma(*ppBtree, 0, 
9210: 30 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  0) ){.    sqlite
9220: 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
9230: 7a 65 28 2a 70 70 42 74 72 65 65 2c 20 6e 43 61  ze(*ppBtree, nCa
9240: 63 68 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  che);.  }.  retu
9250: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9260: 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63  Return UTF-8 enc
9270: 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e  oded English lan
9280: 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f  guage explanatio
9290: 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
92a0: 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  cent.** error..*
92b0: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
92c0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c  lite3_errmsg(sql
92d0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e  ite3 *db){.  con
92e0: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  st char *z;.  if
92f0: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
9300: 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
9310: 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  r(SQLITE_NOMEM);
9320: 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
9330: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
9340: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
9350: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
9360: 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49  ErrStr(SQLITE_MI
9370: 53 55 53 45 29 3b 0a 20 20 7d 0a 20 20 69 66 28  SUSE);.  }.  if(
9380: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9390: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
93a0: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
93b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d  LITE_NOMEM);.  }
93c0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
93d0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
93e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
93f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9400: 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73  ;.  z = (char*)s
9410: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
9420: 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 61  t(db->pErr);.  a
9430: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
9440: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
9450: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 20  ( z==0 ){.    z 
9460: 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  = sqlite3ErrStr(
9470: 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20  db->errCode);.  
9480: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
9490: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
94a0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  x);.  return z;.
94b0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
94c0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
94d0: 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36  ** Return UTF-16
94e0: 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68   encoded English
94f0: 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
9500: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
9510: 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f  t recent.** erro
9520: 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  r..*/.const void
9530: 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   *sqlite3_errmsg
9540: 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  16(sqlite3 *db){
9550: 0a 20 20 2f 2a 20 42 65 63 61 75 73 65 20 61 6c  .  /* Because al
9560: 6c 20 74 68 65 20 63 68 61 72 61 63 74 65 72 73  l the characters
9570: 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67 20 61   in the string a
9580: 72 65 20 69 6e 20 74 68 65 20 75 6e 69 63 6f 64  re in the unicod
9590: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 20 30 78 30  e.  ** range 0x0
95a0: 30 2d 30 78 46 46 2c 20 69 66 20 77 65 20 70 61  0-0xFF, if we pa
95b0: 64 20 74 68 65 20 62 69 67 2d 65 6e 64 69 61 6e  d the big-endian
95c0: 20 73 74 72 69 6e 67 20 77 69 74 68 20 61 20 0a   string with a .
95d0: 20 20 2a 2a 20 7a 65 72 6f 20 62 79 74 65 2c 20    ** zero byte, 
95e0: 77 65 20 63 61 6e 20 6f 62 74 61 69 6e 20 74 68  we can obtain th
95f0: 65 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20  e little-endian 
9600: 73 74 72 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a  string with.  **
9610: 20 26 62 69 67 5f 65 6e 64 69 61 6e 5b 31 5d 2e   &big_endian[1].
9620: 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  .  */.  static c
9630: 6f 6e 73 74 20 63 68 61 72 20 6f 75 74 4f 66 4d  onst char outOfM
9640: 65 6d 42 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 30  emBe[] = {.    0
9650: 2c 20 27 6f 27 2c 20 30 2c 20 27 75 27 2c 20 30  , 'o', 0, 'u', 0
9660: 2c 20 27 74 27 2c 20 30 2c 20 27 20 27 2c 20 0a  , 't', 0, ' ', .
9670: 20 20 20 20 30 2c 20 27 6f 27 2c 20 30 2c 20 27      0, 'o', 0, '
9680: 66 27 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20 20  f', 0, ' ', .   
9690: 20 30 2c 20 27 6d 27 2c 20 30 2c 20 27 65 27 2c   0, 'm', 0, 'e',
96a0: 20 30 2c 20 27 6d 27 2c 20 30 2c 20 27 6f 27 2c   0, 'm', 0, 'o',
96b0: 20 30 2c 20 27 72 27 2c 20 30 2c 20 27 79 27 2c   0, 'r', 0, 'y',
96c0: 20 30 2c 20 30 2c 20 30 0a 20 20 7d 3b 0a 20 20   0, 0, 0.  };.  
96d0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
96e0: 72 20 6d 69 73 75 73 65 42 65 20 5b 5d 20 3d 20  r misuseBe [] = 
96f0: 7b 0a 20 20 20 20 30 2c 20 27 6c 27 2c 20 30 2c  {.    0, 'l', 0,
9700: 20 27 69 27 2c 20 30 2c 20 27 62 27 2c 20 30 2c   'i', 0, 'b', 0,
9710: 20 27 72 27 2c 20 30 2c 20 27 61 27 2c 20 30 2c   'r', 0, 'a', 0,
9720: 20 27 72 27 2c 20 30 2c 20 27 79 27 2c 20 30 2c   'r', 0, 'y', 0,
9730: 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 72   ' ', .    0, 'r
9740: 27 2c 20 30 2c 20 27 6f 27 2c 20 30 2c 20 27 75  ', 0, 'o', 0, 'u
9750: 27 2c 20 30 2c 20 27 74 27 2c 20 30 2c 20 27 69  ', 0, 't', 0, 'i
9760: 27 2c 20 30 2c 20 27 6e 27 2c 20 30 2c 20 27 65  ', 0, 'n', 0, 'e
9770: 27 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20 20 20  ', 0, ' ', .    
9780: 30 2c 20 27 63 27 2c 20 30 2c 20 27 61 27 2c 20  0, 'c', 0, 'a', 
9790: 30 2c 20 27 6c 27 2c 20 30 2c 20 27 6c 27 2c 20  0, 'l', 0, 'l', 
97a0: 30 2c 20 27 65 27 2c 20 30 2c 20 27 64 27 2c 20  0, 'e', 0, 'd', 
97b0: 30 2c 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20  0, ' ', .    0, 
97c0: 27 6f 27 2c 20 30 2c 20 27 75 27 2c 20 30 2c 20  'o', 0, 'u', 0, 
97d0: 27 74 27 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20  't', 0, ' ', .  
97e0: 20 20 30 2c 20 27 6f 27 2c 20 30 2c 20 27 66 27    0, 'o', 0, 'f'
97f0: 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20 20 20 30  , 0, ' ', .    0
9800: 2c 20 27 73 27 2c 20 30 2c 20 27 65 27 2c 20 30  , 's', 0, 'e', 0
9810: 2c 20 27 71 27 2c 20 30 2c 20 27 75 27 2c 20 30  , 'q', 0, 'u', 0
9820: 2c 20 27 65 27 2c 20 30 2c 20 27 6e 27 2c 20 30  , 'e', 0, 'n', 0
9830: 2c 20 27 63 27 2c 20 30 2c 20 27 65 27 2c 20 30  , 'c', 0, 'e', 0
9840: 2c 20 30 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63  , 0, 0.  };..  c
9850: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20  onst void *z;.  
9860: 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
9870: 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 28 26  eturn (void *)(&
9880: 6f 75 74 4f 66 4d 65 6d 42 65 5b 53 51 4c 49 54  outOfMemBe[SQLIT
9890: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3d 3d 53  E_UTF16NATIVE==S
98a0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3f 31 3a  QLITE_UTF16LE?1:
98b0: 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  0]);.  }.  if( !
98c0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
98d0: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
98e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
98f0: 69 64 20 2a 29 28 26 6d 69 73 75 73 65 42 65 5b  id *)(&misuseBe[
9900: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
9910: 56 45 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  VE==SQLITE_UTF16
9920: 4c 45 3f 31 3a 30 5d 29 3b 0a 20 20 7d 0a 20 20  LE?1:0]);.  }.  
9930: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
9940: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
9950: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
9960: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
9970: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
9980: 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
9990: 72 72 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  rr);.  if( z==0 
99a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  ){.    sqlite3Va
99b0: 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
99c0: 72 72 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 45  rr, -1, sqlite3E
99d0: 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64  rrStr(db->errCod
99e0: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  e),.         SQL
99f0: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
9a00: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 20  _STATIC);.    z 
9a10: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
9a20: 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
9a30: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 20 6d 61 6c  ;.  }.  /* A mal
9a40: 6c 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20 66  loc() may have f
9a50: 61 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65  ailed within the
9a60: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
9a70: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a  _value_text16().
9a80: 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74    ** above. If t
9a90: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
9aa0: 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61   then the db->ma
9ab0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
9ac0: 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 62 65  needs to.  ** be
9ad0: 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
9ae0: 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68  returning. Do th
9af0: 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73  is directly, ins
9b00: 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 2a 2a  tead of via.  **
9b10: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
9b20: 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74  ), to avoid sett
9b30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
9b40: 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65   handle error me
9b50: 73 73 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 64 62  ssage..  */.  db
9b60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
9b70: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
9b80: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9b90: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  tex);.  return z
9ba0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9bb0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
9bc0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
9bd0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
9be0: 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65 6e 65   error code gene
9bf0: 72 61 74 65 64 20 62 79 20 61 6e 20 53 51 4c 69  rated by an SQLi
9c00: 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e  te routine. If N
9c10: 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65 64  ULL is.** passed
9c20: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
9c30: 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61 20 6d  n, we assume a m
9c40: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 64  alloc() failed d
9c50: 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70  uring sqlite3_op
9c60: 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  en()..*/.int sql
9c70: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73 71 6c  ite3_errcode(sql
9c80: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28  ite3 *db){.  if(
9c90: 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53   db && !sqlite3S
9ca0: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
9cb0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
9cc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
9cd0: 53 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  SE;.  }.  if( !d
9ce0: 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
9cf0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
9d00: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9d10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
9d20: 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d  b->errCode & db-
9d30: 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20  >errMask;.}.int 
9d40: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
9d50: 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
9d60: 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
9d70: 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
9d80: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
9d90: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
9da0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
9db0: 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c    }.  if( !db ||
9dc0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9dd0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
9de0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9df0: 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65  }.  return db->e
9e00: 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrCode;.}../*.**
9e10: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f   Create a new co
9e20: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
9e30: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 22 64   for database "d
9e40: 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73  b".  The name is
9e50: 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68   zName.** and th
9e60: 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e  e encoding is en
9e70: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
9e80: 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
9e90: 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
9ea0: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
9eb0: 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
9ec0: 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
9ed0: 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
9ee0: 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
9ef0: 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
9f00: 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
9f10: 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
9f20: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
9f30: 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b  oll;.  int enc2;
9f40: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20  .  int nName;.  
9f50: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9f60: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
9f70: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
9f80: 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31  * If SQLITE_UTF1
9f90: 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  6 is specified a
9fa0: 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74  s the encoding t
9fb0: 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74  ype, transform t
9fc0: 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20  his.  ** to one 
9fd0: 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  of SQLITE_UTF16L
9fe0: 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31  E or SQLITE_UTF1
9ff0: 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20  6BE using the.  
a000: 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  ** SQLITE_UTF16N
a010: 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c  ATIVE macro. SQL
a020: 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74  ITE_UTF16 is not
a030: 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
a040: 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20  ..  */.  enc2 = 
a050: 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54  enc & ~SQLITE_UT
a060: 46 31 36 5f 41 4c 49 47 4e 45 44 3b 0a 20 20 69  F16_ALIGNED;.  i
a070: 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  f( enc2==SQLITE_
a080: 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63  UTF16 ){.    enc
a090: 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  2 = SQLITE_UTF16
a0a0: 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66  NATIVE;.  }.  if
a0b0: 28 20 28 65 6e 63 32 26 7e 33 29 21 3d 30 20 29  ( (enc2&~3)!=0 )
a0c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a0d0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
a0e0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
a0f0: 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f  his call is remo
a100: 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e  ving or replacin
a110: 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f  g an existing co
a120: 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65  llation .  ** se
a130: 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61  quence. If so, a
a140: 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74  nd there are act
a150: 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20  ive VMs, return 
a160: 62 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20  busy. If there. 
a170: 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76   ** are no activ
a180: 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74  e VMs, invalidat
a190: 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c  e any pre-compil
a1a0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
a1b0: 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71   */.  nName = sq
a1c0: 6c 69 74 65 33 53 74 72 6c 65 6e 28 64 62 2c 20  lite3Strlen(db, 
a1d0: 7a 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c 20  zName);.  pColl 
a1e0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
a1f0: 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
a200: 32 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  2, zName, nName,
a210: 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   0);.  if( pColl
a220: 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   && pColl->xCmp 
a230: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  ){.    if( db->a
a240: 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a  ctiveVdbeCnt ){.
a250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
a260: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
a270: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 55 6e  SY, .        "Un
a280: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
a290: 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  odify collation 
a2a0: 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20  sequence due to 
a2b0: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
a2c0: 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
a2d0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
a2e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
a2f0: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
a300: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20  atements(db);.. 
a310: 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69     /* If collati
a320: 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
a330: 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69  l was created di
a340: 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c  rectly by a call
a350: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
a360: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
a370: 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e  ion, and not gen
a380: 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43  erated by synthC
a390: 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a  ollSeq(),.    **
a3a0: 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73   then any copies
a3b0: 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f   made by synthCo
a3c0: 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20  llSeq() need to 
a3d0: 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  be invalidated..
a3e0: 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c      ** Also, col
a3f0: 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f  lation destructo
a400: 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c  r - CollSeq.xDel
a410: 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61  () - function ma
a420: 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  y need.    ** to
a430: 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20   be called..    
a440: 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f  */ .    if( (pCo
a450: 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54  ll->enc & ~SQLIT
a460: 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
a470: 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20  ==enc2 ){.      
a480: 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d  CollSeq *aColl =
a490: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
a4a0: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
a4b0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
a4c0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
a4d0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
a4e0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
a4f0: 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c  llSeq *p = &aCol
a500: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
a510: 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  ( p->enc==pColl-
a520: 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  >enc ){.        
a530: 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b    if( p->xDel ){
a540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
a550: 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a  xDel(p->pUser);.
a560: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a570: 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20        p->xCmp = 
a580: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
a590: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
a5a0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
a5b0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
a5c0: 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
a5d0: 2c 20 6e 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69  , nName, 1);.  i
a5e0: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
a5f0: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43  pColl->xCmp = xC
a600: 6f 6d 70 61 72 65 3b 0a 20 20 20 20 70 43 6f 6c  ompare;.    pCol
a610: 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b  l->pUser = pCtx;
a620: 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c  .    pColl->xDel
a630: 20 3d 20 78 44 65 6c 3b 0a 20 20 20 20 70 43 6f   = xDel;.    pCo
a640: 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65  ll->enc = (u8)(e
a650: 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c  nc2 | (enc & SQL
a660: 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
a670: 44 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  D));.  }.  sqlit
a680: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
a690: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74  TE_OK, 0);.  ret
a6a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
a6b0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72  .../*.** This ar
a6c0: 72 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64  ray defines hard
a6d0: 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e   upper bounds on
a6e0: 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20   limit values.  
a6f0: 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  The.** initializ
a700: 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20  er must be kept 
a710: 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65  in sync with the
a720: 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a   SQLITE_LIMIT_*.
a730: 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73  ** #defines in s
a740: 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61  qlite3.h..*/.sta
a750: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48  tic const int aH
a760: 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20  ardLimit[] = {. 
a770: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
a780: 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
a790: 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  _SQL_LENGTH,.  S
a7a0: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
a7b0: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ,.  SQLITE_MAX_E
a7c0: 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c  XPR_DEPTH,.  SQL
a7d0: 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
a7e0: 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54  _SELECT,.  SQLIT
a7f0: 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20  E_MAX_VDBE_OP,. 
a800: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
a810: 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49  TION_ARG,.  SQLI
a820: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c  TE_MAX_ATTACHED,
a830: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  .  SQLITE_MAX_LI
a840: 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
a850: 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
a860: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c  VARIABLE_NUMBER,
a870: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  .};../*.** Make 
a880: 73 75 72 65 20 74 68 65 20 68 61 72 64 20 6c 69  sure the hard li
a890: 6d 69 74 73 20 61 72 65 20 73 65 74 20 74 6f 20  mits are set to 
a8a0: 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65  reasonable value
a8b0: 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  s.*/.#if SQLITE_
a8c0: 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23  MAX_LENGTH<100.#
a8d0: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
a8e0: 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  X_LENGTH must be
a8f0: 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65   at least 100.#e
a900: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
a910: 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31  MAX_SQL_LENGTH<1
a920: 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
a930: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
a940: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
a950: 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66  t 100.#endif.#if
a960: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
a970: 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41  LENGTH>SQLITE_MA
a980: 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72  X_LENGTH.# error
a990: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
a9a0: 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20  LENGTH must not 
a9b0: 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
a9c0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
a9d0: 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  H.#endif.#if SQL
a9e0: 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
a9f0: 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f  _SELECT<2.# erro
aa00: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  r SQLITE_MAX_COM
aa10: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73  POUND_SELECT mus
aa20: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a  t be at least 2.
aa30: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
aa40: 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30  E_MAX_VDBE_OP<40
aa50: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
aa60: 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74  MAX_VDBE_OP must
aa70: 20 62 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a   be at least 40.
aa80: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
aa90: 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
aaa0: 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  RG<0 || SQLITE_M
aab0: 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e  AX_FUNCTION_ARG>
aac0: 31 30 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  1000.# error SQL
aad0: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
aae0: 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62 65 74  _ARG must be bet
aaf0: 77 65 65 6e 20 30 20 61 6e 64 20 31 30 30 30 0a  ween 0 and 1000.
ab00: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
ab10: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30  E_MAX_ATTACHED<0
ab20: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41   || SQLITE_MAX_A
ab30: 54 54 41 43 48 45 44 3e 33 30 0a 23 20 65 72 72  TTACHED>30.# err
ab40: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  or SQLITE_MAX_AT
ab50: 54 41 43 48 45 44 20 6d 75 73 74 20 62 65 20 62  TACHED must be b
ab60: 65 74 77 65 65 6e 20 30 20 61 6e 64 20 33 30 0a  etween 0 and 30.
ab70: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
ab80: 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
ab90: 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72  RN_LENGTH<1.# er
aba0: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
abb0: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
abc0: 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
abd0: 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  ast 1.#endif.#if
abe0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49   SQLITE_MAX_VARI
abf0: 41 42 4c 45 5f 4e 55 4d 42 45 52 3c 31 0a 23 20  ABLE_NUMBER<1.# 
ac00: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
ac10: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
ac20: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
ac30: 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 1.#endif.#if S
ac40: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
ac50: 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53  >32767.# error S
ac60: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
ac70: 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64   must not exceed
ac80: 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 0a 0a   32767.#endif...
ac90: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
aca0: 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69   value of a limi
acb0: 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f  t.  Report the o
acc0: 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20  ld value..** If 
acd0: 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74  an invalid limit
ace0: 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69   index is suppli
acf0: 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a  ed, report -1..*
ad00: 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
ad10: 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f  s but still repo
ad20: 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  rt the old value
ad30: 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c   if the.** new l
ad40: 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
ad50: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f  ..**.** A new lo
ad60: 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e  wer limit does n
ad70: 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69  ot shrink existi
ad80: 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a  ng constructs..*
ad90: 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76  * It merely prev
ada0: 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75  ents new constru
adb0: 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64 20  cts that exceed 
adc0: 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f  the limit.** fro
add0: 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e  m forming..*/.in
ade0: 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28  t sqlite3_limit(
adf0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
ae00: 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65   limitId, int ne
ae10: 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f  wLimit){.  int o
ae20: 6c 64 4c 69 6d 69 74 3b 0a 20 20 69 66 28 20 6c  ldLimit;.  if( l
ae30: 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69  imitId<0 || limi
ae40: 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49  tId>=SQLITE_N_LI
ae50: 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  MIT ){.    retur
ae60: 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c  n -1;.  }.  oldL
ae70: 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  imit = db->aLimi
ae80: 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66  t[limitId];.  if
ae90: 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b  ( newLimit>=0 ){
aea0: 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  .    if( newLimi
aeb0: 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  t>aHardLimit[lim
aec0: 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e  itId] ){.      n
aed0: 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c  ewLimit = aHardL
aee0: 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20  imit[limitId];. 
aef0: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69     }.    db->aLi
af00: 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e  mit[limitId] = n
af10: 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72  ewLimit;.  }.  r
af20: 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 0a  eturn oldLimit;.
af30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
af40: 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
af50: 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61  ork of opening a
af60: 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68   database on beh
af70: 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  alf of.** sqlite
af80: 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c  3_open() and sql
af90: 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54  ite3_open16(). T
afa0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
afb0: 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22  name "zFilename"
afc0: 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65    .** is UTF-8 e
afd0: 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
afe0: 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61  c int openDataba
aff0: 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  se(.  const char
b000: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20   *zFilename, /* 
b010: 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
b020: 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
b030: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
b040: 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  pDb,        /* O
b050: 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74  UT: Returned dat
b060: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
b070: 20 20 75 6e 73 69 67 6e 65 64 20 66 6c 61 67 73    unsigned flags
b080: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72  ,        /* Oper
b090: 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f  ational flags */
b0a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b0b0: 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Vfs       /* Nam
b0c0: 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
b0d0: 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  use */.){.  sqli
b0e0: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
b0f0: 63 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  c;.  CollSeq *pC
b100: 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 73 54 68 72  oll;.  int isThr
b110: 65 61 64 73 61 66 65 3b 0a 0a 23 69 66 6e 64 65  eadsafe;..#ifnde
b120: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
b130: 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71  TOINIT.  rc = sq
b140: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
b150: 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
b160: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
b170: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ..  if( sqlite3G
b180: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
b190: 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  eMutex==0 ){.   
b1a0: 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
b1b0: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  0;.  }else if( f
b1c0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
b1d0: 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20  EN_NOMUTEX ){.  
b1e0: 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
b1f0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
b200: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
b210: 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b  PEN_FULLMUTEX ){
b220: 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
b230: 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
b240: 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
b250: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
b260: 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
b270: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d  x;.  }..  /* Rem
b280: 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73  ove harmful bits
b290: 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20   from the flags 
b2a0: 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 66  parameter */.  f
b2b0: 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49  lags &=  ~( SQLI
b2c0: 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
b2d0: 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
b2e0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
b2f0: 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20  EN_MAIN_DB |.   
b300: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
b310: 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
b320: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
b330: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52    SQLITE_OPEN_TR
b340: 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20  ANSIENT_DB | .  
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
b360: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
b370: 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
b380: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
b390: 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
b3a0: 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
b3b0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53     SQLITE_OPEN_S
b3c0: 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  UBJOURNAL | .   
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
b3e0: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
b3f0: 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20  OURNAL |.       
b400: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
b410: 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20  PEN_NOMUTEX |.  
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
b430: 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
b440: 45 58 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  EX.             
b450: 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
b460: 65 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74  e the sqlite dat
b470: 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  a structure */. 
b480: 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c   db = sqlite3Mal
b490: 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
b4a0: 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66  sqlite3) );.  if
b4b0: 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f  ( db==0 ) goto o
b4c0: 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28  pendb_out;.  if(
b4d0: 20 69 73 54 68 72 65 61 64 73 61 66 65 20 29 7b   isThreadsafe ){
b4e0: 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d  .    db->mutex =
b4f0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
b500: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
b510: 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20  RECURSIVE);.    
b520: 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30  if( db->mutex==0
b530: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b540: 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20  3_free(db);.    
b550: 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20    db = 0;.      
b560: 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
b570: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
b580: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
b590: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
b5a0: 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66  b->errMask = 0xf
b5b0: 66 3b 0a 20 20 64 62 2d 3e 70 72 69 6f 72 4e 65  f;.  db->priorNe
b5c0: 77 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 64 62  wRowid = 0;.  db
b5d0: 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d  ->nDb = 2;.  db-
b5e0: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
b5f0: 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62  MAGIC_BUSY;.  db
b600: 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
b610: 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74  tatic;..  assert
b620: 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69  ( sizeof(db->aLi
b630: 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61  mit)==sizeof(aHa
b640: 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65  rdLimit) );.  me
b650: 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c  mcpy(db->aLimit,
b660: 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a   aHardLimit, siz
b670: 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29  eof(db->aLimit))
b680: 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  ;.  db->autoComm
b690: 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65  it = 1;.  db->ne
b6a0: 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a  xtAutovac = -1;.
b6b0: 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69    db->nextPagesi
b6c0: 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c  ze = 0;.  db->fl
b6d0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
b6e0: 6f 72 74 43 6f 6c 4e 61 6d 65 73 0a 23 69 66 20  ortColNames.#if 
b6f0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
b700: 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20  ILE_FORMAT<4.   
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
b720: 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
b730: 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64  eFmt.#endif.#ifd
b740: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
b750: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
b760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b770: 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78   | SQLITE_LoadEx
b780: 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 20  tension.#endif. 
b790: 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33       ;.  sqlite3
b7a0: 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 43  HashInit(&db->aC
b7b0: 6f 6c 6c 53 65 71 2c 20 30 29 3b 0a 23 69 66 6e  ollSeq, 0);.#ifn
b7c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b7d0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
b7e0: 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
b7f0: 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 30 29 3b  db->aModule, 0);
b800: 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 70  .#endif..  db->p
b810: 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
b820: 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20  s_find(zVfs);.  
b830: 69 66 28 20 21 64 62 2d 3e 70 56 66 73 20 29 7b  if( !db->pVfs ){
b840: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
b850: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
b860: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c  te3Error(db, rc,
b870: 20 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25   "no such vfs: %
b880: 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 67  s", zVfs);.    g
b890: 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
b8a0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
b8b0: 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
b8c0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e  ion sequence BIN
b8d0: 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b  ARY. BINARY work
b8e0: 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38  s for both UTF-8
b8f0: 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36  .  ** and UTF-16
b900: 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72 73 69  , so add a versi
b910: 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61  on for each to a
b920: 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73  void any unneces
b930: 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72  sary.  ** conver
b940: 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20  sions. The only 
b950: 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f  error that can o
b960: 63 63 75 72 20 68 65 72 65 20 69 73 20 61 20 6d  ccur here is a m
b970: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e  alloc() failure.
b980: 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f  .  */.  createCo
b990: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e  llation(db, "BIN
b9a0: 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ARY", SQLITE_UTF
b9b0: 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  8, 0, binCollFun
b9c0: 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
b9d0: 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49  ollation(db, "BI
b9e0: 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54  NARY", SQLITE_UT
b9f0: 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c  F16BE, 0, binCol
ba00: 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
ba10: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
ba20: 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
ba30: 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69  E_UTF16LE, 0, bi
ba40: 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
ba50: 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
ba60: 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51  (db, "RTRIM", SQ
ba70: 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64  LITE_UTF8, (void
ba80: 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  *)1, binCollFunc
ba90: 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  , 0);.  if( db->
baa0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
bab0: 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
bac0: 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 70  out;.  }.  db->p
bad0: 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  DfltColl = sqlit
bae0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
baf0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22  , SQLITE_UTF8, "
bb00: 42 49 4e 41 52 59 22 2c 20 36 2c 20 30 29 3b 0a  BINARY", 6, 0);.
bb10: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44    assert( db->pD
bb20: 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20  fltColl!=0 );.. 
bb30: 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61 20 55   /* Also add a U
bb40: 54 46 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e 73  TF-8 case-insens
bb50: 69 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  itive collation 
bb60: 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63  sequence. */.  c
bb70: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
bb80: 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c  b, "NOCASE", SQL
bb90: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63  ITE_UTF8, 0, noc
bba0: 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63  aseCollatingFunc
bbb0: 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  , 0);..  /* Set 
bbc0: 66 6c 61 67 73 20 6f 6e 20 74 68 65 20 62 75 69  flags on the bui
bbd0: 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20  lt-in collating 
bbe0: 73 65 71 75 65 6e 63 65 73 20 2a 2f 0a 20 20 64  sequences */.  d
bbf0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 74 79  b->pDfltColl->ty
bc00: 70 65 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4c 4c  pe = SQLITE_COLL
bc10: 5f 42 49 4e 41 52 59 3b 0a 20 20 70 43 6f 6c 6c  _BINARY;.  pColl
bc20: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
bc30: 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45  llSeq(db, SQLITE
bc40: 5f 55 54 46 38 2c 20 22 4e 4f 43 41 53 45 22 2c  _UTF8, "NOCASE",
bc50: 20 36 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43   6, 0);.  if( pC
bc60: 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  oll ){.    pColl
bc70: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
bc80: 43 4f 4c 4c 5f 4e 4f 43 41 53 45 3b 0a 20 20 7d  COLL_NOCASE;.  }
bc90: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
bca0: 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61 73 65  backend database
bcb0: 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 64 62 2d   driver */.  db-
bcc0: 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61  >openFlags = fla
bcd0: 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  gs;.  rc = sqlit
bce0: 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 64  e3BtreeFactory(d
bcf0: 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 2c  b, zFilename, 0,
bd00: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
bd10: 43 41 43 48 45 5f 53 49 5a 45 2c 20 0a 20 20 20  CACHE_SIZE, .   
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd30: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20          flags | 
bd40: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
bd50: 5f 44 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _DB,.           
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd70: 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  &db->aDb[0].pBt)
bd80: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
bd90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
bda0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
bdb0: 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  R_NOMEM ){.     
bdc0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
bdd0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  EM;.    }.    sq
bde0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
bdf0: 63 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  c, 0);.    goto 
be00: 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
be10: 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63    db->aDb[0].pSc
be20: 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63  hema = sqlite3Sc
be30: 68 65 6d 61 47 65 74 28 64 62 2c 20 64 62 2d 3e  hemaGet(db, db->
be40: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64  aDb[0].pBt);.  d
be50: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
be60: 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
be70: 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 0a 20  aGet(db, 0);... 
be80: 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   /* The default 
be90: 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72  safety_level for
bea0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
beb0: 73 65 20 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f  se is 'full'; fo
bec0: 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20  r the temp.  ** 
bed0: 64 61 74 61 62 61 73 65 20 69 74 20 69 73 20 27  database it is '
bee0: 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d 61 74 63  NONE'. This matc
bef0: 68 65 73 20 74 68 65 20 70 61 67 65 72 20 6c 61  hes the pager la
bf00: 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a  yer defaults.  .
bf10: 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30    */.  db->aDb[0
bf20: 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22  ].zName = "main"
bf30: 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73  ;.  db->aDb[0].s
bf40: 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b  afety_level = 3;
bf50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bf60: 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 64 62  OMIT_TEMPDB.  db
bf70: 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d  ->aDb[1].zName =
bf80: 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61   "temp";.  db->a
bf90: 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[1].safety_lev
bfa0: 65 6c 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  el = 1;.#endif..
bfb0: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
bfc0: 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b  LITE_MAGIC_OPEN;
bfd0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
bfe0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
bff0: 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
c000: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74    }..  /* Regist
c010: 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20  er all built-in 
c020: 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64  functions, but d
c030: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
c040: 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64   read the.  ** d
c050: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 79  atabase schema y
c060: 65 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61  et. This is dela
c070: 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  yed until the fi
c080: 72 73 74 20 74 69 6d 65 20 74 68 65 20 64 61 74  rst time the dat
c090: 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63  abase.  ** is ac
c0a0: 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  cessed..  */.  s
c0b0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
c0c0: 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
c0d0: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
c0e0: 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73  BuiltinFunctions
c0f0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64  (db);..  /* Load
c100: 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e   automatic exten
c110: 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f  sions - extensio
c120: 6e 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  ns that have bee
c130: 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a  n registered.  *
c140: 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
c150: 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78  te3_automatic_ex
c160: 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20  tension() API.. 
c170: 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69   */.  (void)sqli
c180: 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e  te3AutoLoadExten
c190: 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 69 66 28  sions(db);.  if(
c1a0: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
c1b0: 28 64 62 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  (db)!=SQLITE_OK 
c1c0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
c1d0: 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 23 69 66  db_out;.  }..#if
c1e0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c1f0: 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62  E_FTS1.  if( !db
c200: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c210: 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
c220: 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
c230: 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
c240: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31  rc = sqlite3Fts1
c250: 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
c260: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
c270: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a  ITE_ENABLE_FTS2.
c280: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
c290: 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
c2a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c2b0: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
c2c0: 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74  e3Fts2Init(sqlit
c2d0: 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  e3*);.    rc = s
c2e0: 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64  qlite3Fts2Init(d
c2f0: 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
c300: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c310: 41 42 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20  ABLE_FTS3.  if( 
c320: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
c330: 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
c340: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
c350: 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28 64  qlite3Fts3Init(d
c360: 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
c370: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c380: 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21  ABLE_ICU.  if( !
c390: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c3a0: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
c3b0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
c3c0: 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62 29  lite3IcuInit(db)
c3d0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
c3e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
c3f0: 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21  LE_RTREE.  if( !
c400: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c410: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
c420: 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
c430: 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64 62  ite3RtreeInit(db
c440: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
c450: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
c460: 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  , rc, 0);..  /* 
c470: 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
c480: 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20  _LOCKING_MODE=1 
c490: 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20  makes EXCLUSIVE 
c4a0: 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  the default lock
c4b0: 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20  ing.  ** mode.  
c4c0: 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
c4d0: 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20  _LOCKING_MODE=0 
c4e0: 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20  make NORMAL the 
c4f0: 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a  default locking.
c500: 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e    ** mode.  Doin
c510: 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c  g nothing at all
c520: 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d   also makes NORM
c530: 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a  AL the default..
c540: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
c550: 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
c560: 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66  NG_MODE.  db->df
c570: 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c  ltLockMode = SQL
c580: 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
c590: 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69  ING_MODE;.  sqli
c5a0: 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
c5b0: 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65  ode(sqlite3Btree
c5c0: 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d  Pager(db->aDb[0]
c5d0: 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20  .pBt),.         
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5f0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
c600: 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23  LOCKING_MODE);.#
c610: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 61 62  endif..  /* Enab
c620: 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  le the lookaside
c630: 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65  -malloc subsyste
c640: 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b  m */.  setupLook
c650: 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c  aside(db, 0, sql
c660: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
c670: 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20  .szLookaside,.  
c680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c690: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
c6a0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61  balConfig.nLooka
c6b0: 73 69 64 65 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f  side);..opendb_o
c6c0: 75 74 3a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a  ut:.  if( db ){.
c6d0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
c6e0: 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68  mutex!=0 || isTh
c6f0: 72 65 61 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73  readsafe==0 || s
c700: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
c710: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30  ig.bFullMutex==0
c720: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
c730: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
c740: 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63  mutex);.  }.  rc
c750: 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
c760: 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63  de(db);.  if( rc
c770: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
c780: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  {.    sqlite3_cl
c790: 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20  ose(db);.    db 
c7a0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
c7b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c7c0: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
c7d0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53  = SQLITE_MAGIC_S
c7e0: 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62  ICK;.  }.  *ppDb
c7f0: 20 3d 20 64 62 3b 0a 20 20 72 65 74 75 72 6e 20   = db;.  return 
c800: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30  sqlite3ApiExit(0
c810: 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , rc);.}../*.** 
c820: 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
c830: 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
c840: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  nt sqlite3_open(
c850: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c860: 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
c870: 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a  ite3 **ppDb .){.
c880: 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
c890: 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c  abase(zFilename,
c8a0: 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
c8c0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
c8d0: 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
c8e0: 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69  _CREATE, 0);.}.i
c8f0: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  nt sqlite3_open_
c900: 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  v2(.  const char
c910: 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a   *filename,   /*
c920: 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
c930: 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  me (UTF-8) */.  
c940: 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
c950: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
c960: 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65  SQLite db handle
c970: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c990: 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   Flags */.  cons
c9a0: 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20  t char *zVfs    
c9b0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56      /* Name of V
c9c0: 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65  FS module to use
c9d0: 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
c9e0: 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c  openDatabase(fil
c9f0: 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 66 6c 61  ename, ppDb, fla
ca00: 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69  gs, zVfs);.}..#i
ca10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ca20: 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70  T_UTF16./*.** Op
ca30: 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
ca40: 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
ca50: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
ca60: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
ca70: 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
ca80: 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20  ite3 **ppDb.){. 
ca90: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
caa0: 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46  lename8;   /* zF
cab0: 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20  ilename encoded 
cac0: 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64  in UTF-8 instead
cad0: 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20   of UTF-16 */.  
cae0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
caf0: 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Val;.  int rc;..
cb00: 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
cb10: 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ame );.  assert(
cb20: 20 70 70 44 62 20 29 3b 0a 20 20 2a 70 70 44 62   ppDb );.  *ppDb
cb30: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
cb40: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
cb50: 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  IT.  rc = sqlite
cb60: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
cb70: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
cb80: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70  n rc;.#endif.  p
cb90: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
cba0: 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69  ueNew(0);.  sqli
cbb0: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
cbc0: 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  Val, -1, zFilena
cbd0: 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  me, SQLITE_UTF16
cbe0: 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53  NATIVE, SQLITE_S
cbf0: 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e  TATIC);.  zFilen
cc00: 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61  ame8 = sqlite3Va
cc10: 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
cc20: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66  LITE_UTF8);.  if
cc30: 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a  ( zFilename8 ){.
cc40: 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74      rc = openDat
cc50: 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38  abase(zFilename8
cc60: 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
cc80: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
cc90: 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
cca0: 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20  N_CREATE, 0);.  
ccb0: 20 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20    assert( *ppDb 
ccc0: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
ccd0: 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72  MEM );.    if( r
cce0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
ccf0: 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a  !DbHasProperty(*
cd00: 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65  ppDb, 0, DB_Sche
cd10: 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20  maLoaded) ){.   
cd20: 20 20 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20     ENC(*ppDb) = 
cd30: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
cd40: 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  VE;.    }.  }els
cd50: 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
cd60: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
cd70: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
cd80: 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72  (pVal);..  retur
cd90: 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  n sqlite3ApiExit
cda0: 28 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69  (0, rc);.}.#endi
cdb0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
cdc0: 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
cdd0: 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
cde0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
cdf0: 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
ce00: 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
ce10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
ce20: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
ce30: 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
ce40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
ce50: 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
ce60: 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
ce70: 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
ce80: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
ce90: 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
cea0: 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  t void*).){.  in
ceb0: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
cec0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
ced0: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
cee0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
cef0: 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72  led );.  rc = cr
cf00: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
cf10: 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43  , zName, enc, pC
cf20: 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
cf30: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
cf40: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
cf50: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
cf60: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
cf70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
cf80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
cf90: 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
cfa0: 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
cfb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
cfc0: 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
cfd0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
cfe0: 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71  llation_v2(.  sq
cff0: 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
d000: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
d010: 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20   .  int enc, .  
d020: 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
d030: 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
d040: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
d050: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
d060: 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65  d*),.  void(*xDe
d070: 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  l)(void*).){.  i
d080: 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
d090: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
d0a0: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
d0b0: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
d0c0: 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63  iled );.  rc = c
d0d0: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
d0e0: 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70  b, zName, enc, p
d0f0: 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78  Ctx, xCompare, x
d100: 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Del);.  rc = sql
d110: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
d120: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
d130: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
d140: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
d150: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
d160: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
d170: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
d180: 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
d190: 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
d1a0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
d1b0: 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
d1c0: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
d1d0: 61 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74  ation16(.  sqlit
d1e0: 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
d1f0: 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20   void *zName,.  
d200: 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
d210: 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
d220: 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
d230: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
d240: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  nt,const void*).
d250: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
d260: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20  LITE_OK;.  char 
d270: 2a 7a 4e 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74  *zName8;.  sqlit
d280: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
d290: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
d2a0: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
d2b0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d  Failed );.  zNam
d2c0: 65 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31  e8 = sqlite3Utf1
d2d0: 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  6to8(db, zName, 
d2e0: 2d 31 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  -1);.  if( zName
d2f0: 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72  8 ){.    rc = cr
d300: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
d310: 2c 20 7a 4e 61 6d 65 38 2c 20 65 6e 63 2c 20 70  , zName8, enc, p
d320: 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30  Ctx, xCompare, 0
d330: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
d340: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29  Free(db, zName8)
d350: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
d360: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
d370: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
d380: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
d390: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
d3a0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
d3b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
d3c0: 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  6 */../*.** Regi
d3d0: 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  ster a collation
d3e0: 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
d3f0: 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  y callback with 
d400: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
d410: 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61  dle.** db. Repla
d420: 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c  ce any previousl
d430: 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c  y installed coll
d440: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
d450: 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73  actory..*/.int s
d460: 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
d470: 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74  _needed(.  sqlit
d480: 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20  e3 *db, .  void 
d490: 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c  *pCollNeededArg,
d4a0: 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e   .  void(*xCollN
d4b0: 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c  eeded)(void*,sql
d4c0: 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52  ite3*,int eTextR
d4d0: 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a  ep,const char*).
d4e0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
d4f0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
d500: 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ex);.  db->xColl
d510: 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65  Needed = xCollNe
d520: 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  eded;.  db->xCol
d530: 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20  lNeeded16 = 0;. 
d540: 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
d550: 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
d560: 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
d570: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
d580: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
d590: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
d5a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d5b0: 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
d5c0: 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74  egister a collat
d5d0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
d5e0: 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69  tory callback wi
d5f0: 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
d600: 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65  handle.** db. Re
d610: 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f  place any previo
d620: 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63  usly installed c
d630: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
d640: 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e  e factory..*/.in
d650: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  t sqlite3_collat
d660: 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20  ion_needed16(.  
d670: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
d680: 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
d690: 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
d6a0: 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f  CollNeeded16)(vo
d6b0: 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
d6c0: 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20   eTextRep,const 
d6d0: 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69  void*).){.  sqli
d6e0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
d6f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
d700: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20  ->xCollNeeded = 
d710: 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  0;.  db->xCollNe
d720: 65 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65  eded16 = xCollNe
d730: 65 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43  eded16;.  db->pC
d740: 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70  ollNeededArg = p
d750: 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20  CollNeededArg;. 
d760: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d770: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
d780: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d790: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
d7a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
d7b0: 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  16 */..#ifndef S
d7c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c 4f 42 41  QLITE_OMIT_GLOBA
d7d0: 4c 52 45 43 4f 56 45 52 0a 23 69 66 6e 64 65 66  LRECOVER.#ifndef
d7e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
d7f0: 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68  RECATED./*.** Th
d800: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
d810: 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73  ow an anachronis
d820: 6d 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  m. It used to be
d830: 20 75 73 65 64 20 74 6f 20 72 65 63 6f 76 65 72   used to recover
d840: 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f   from a.** mallo
d850: 63 28 29 20 66 61 69 6c 75 72 65 2c 20 62 75 74  c() failure, but
d860: 20 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73   SQLite now does
d870: 20 74 68 69 73 20 61 75 74 6f 6d 61 74 69 63 61   this automatica
d880: 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lly..*/.int sqli
d890: 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  te3_global_recov
d8a0: 65 72 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  er(void){.  retu
d8b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d8c0: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f  #endif.#endif../
d8d0: 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65  *.** Test to see
d8e0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
d8f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
d900: 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75  nection is in au
d910: 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65  tocommit.** mode
d920: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
d930: 66 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53  f it is and FALS
d940: 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63  E if not.  Autoc
d950: 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e  ommit mode is on
d960: 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20  .** by default. 
d970: 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64   Autocommit is d
d980: 69 73 61 62 6c 65 64 20 62 79 20 61 20 42 45 47  isabled by a BEG
d990: 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  IN statement and
d9a0: 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79   reenabled.** by
d9b0: 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54   the next COMMIT
d9c0: 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a   or ROLLBACK..**
d9d0: 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48 49 53 20 49 53  .******* THIS IS
d9e0: 20 41 4e 20 45 58 50 45 52 49 4d 45 4e 54 41 4c   AN EXPERIMENTAL
d9f0: 20 41 50 49 20 41 4e 44 20 49 53 20 53 55 42 4a   API AND IS SUBJ
da00: 45 43 54 20 54 4f 20 43 48 41 4e 47 45 20 2a 2a  ECT TO CHANGE **
da10: 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ****.*/.int sqli
da20: 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
da30: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
da40: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75  .  return db->au
da50: 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 23 69 66  toCommit;.}..#if
da60: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
da70: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
da80: 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  wing routine is 
da90: 73 75 62 74 69 74 75 74 65 64 20 66 6f 72 20 63  subtituted for c
daa0: 6f 6e 73 74 61 6e 74 20 53 51 4c 49 54 45 5f 43  onstant SQLITE_C
dab0: 4f 52 52 55 50 54 20 69 6e 0a 2a 2a 20 64 65 62  ORRUPT in.** deb
dac0: 75 67 67 69 6e 67 20 62 75 69 6c 64 73 2e 20 20  ugging builds.  
dad0: 54 68 69 73 20 70 72 6f 76 69 64 65 73 20 61 20  This provides a 
dae0: 77 61 79 20 74 6f 20 73 65 74 20 61 20 62 72 65  way to set a bre
daf0: 61 6b 70 6f 69 6e 74 20 66 6f 72 20 77 68 65 6e  akpoint for when
db00: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  .** corruption i
db10: 73 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64  s first detected
db20: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
db30: 43 6f 72 72 75 70 74 28 76 6f 69 64 29 7b 0a 20  Corrupt(void){. 
db40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
db50: 4f 52 52 55 50 54 3b 0a 7d 0a 23 65 6e 64 69 66  ORRUPT;.}.#endif
db60: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
db70: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
db80: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
db90: 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75   convenience rou
dba0: 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20  tine that makes 
dbb0: 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68  sure that all th
dbc0: 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a  read-specific.**
dbd0: 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74   data for this t
dbe0: 68 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64  hread has been d
dbf0: 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a  eallocated..**.*
dc00: 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67  * SQLite no long
dc10: 65 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73  er uses thread-s
dc20: 70 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20  pecific data so 
dc30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
dc40: 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20  now a.** no-op. 
dc50: 20 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20   It is retained 
dc60: 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63  for historical c
dc70: 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f  ompatibility..*/
dc80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68  .void sqlite3_th
dc90: 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69  read_cleanup(voi
dca0: 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  d){.}.#endif../*
dcb0: 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20  .** Return meta 
dcc0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
dcd0: 74 20 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c  t a specific col
dce0: 75 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73  umn of a databas
dcf0: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20  e table..** See 
dd00: 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74  comment in sqlit
dd10: 65 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69  e3.h (sqlite.h.i
dd20: 6e 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  n) for details..
dd30: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
dd40: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
dd50: 45 54 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69  ETADATA.int sqli
dd60: 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
dd70: 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c  _metadata(.  sql
dd80: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
dd90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e           /* Conn
dda0: 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f  ection handle */
ddb0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
ddc0: 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f  DbName,        /
ddd0: 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * Database name 
dde0: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
ddf0: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e  st char *zTableN
de00: 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c  ame,     /* Tabl
de10: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73  e name */.  cons
de20: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e  t char *zColumnN
de30: 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  ame,    /* Colum
de40: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72  n name */.  char
de50: 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54   const **pzDataT
de60: 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55  ype,    /* OUTPU
de70: 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61  T: Declared data
de80: 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20   type */.  char 
de90: 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65  const **pzCollSe
dea0: 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54  q,     /* OUTPUT
deb0: 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  : Collation sequ
dec0: 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  ence name */.  i
ded0: 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20  nt *pNotNull,   
dee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
def0: 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f  TPUT: True if NO
df00: 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
df10: 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e  t exists */.  in
df20: 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20  t *pPrimaryKey, 
df30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
df40: 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c  PUT: True if col
df50: 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a  umn part of PK *
df60: 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e  /.  int *pAutoin
df70: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
df80: 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
df90: 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74  if column is aut
dfa0: 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29  o-increment */.)
dfb0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
dfc0: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
dfd0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
dfe0: 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   0;.  Column *pC
dff0: 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43  ol = 0;.  int iC
e000: 6f 6c 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73  ol;..  char cons
e010: 74 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30  t *zDataType = 0
e020: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
e030: 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20  zCollSeq = 0;.  
e040: 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b  int notnull = 0;
e050: 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65  .  int primaryke
e060: 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74  y = 0;.  int aut
e070: 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  oinc = 0;..  /* 
e080: 45 6e 73 75 72 65 20 74 68 65 20 64 61 74 61 62  Ensure the datab
e090: 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 62  ase schema has b
e0a0: 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20  een loaded */.  
e0b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
e0c0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
e0d0: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
e0e0: 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73  afetyOn(db);.  s
e0f0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
e100: 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20  All(db);.  rc = 
e110: 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20  sqlite3Init(db, 
e120: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  &zErrMsg);.  sql
e130: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
e140: 6c 28 64 62 29 3b 0a 20 20 69 66 28 20 53 51 4c  l(db);.  if( SQL
e150: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
e160: 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
e170: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
e180: 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  te the table in 
e190: 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54  question */.  pT
e1a0: 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
e1b0: 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65  Table(db, zTable
e1c0: 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  Name, zDbName);.
e1d0: 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70    if( !pTab || p
e1e0: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
e1f0: 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20      pTab = 0;.  
e200: 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
e210: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64  ;.  }..  /* Find
e220: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20   the column for 
e230: 77 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65  which info is re
e240: 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28  quested */.  if(
e250: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
e260: 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
e270: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
e280: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 69 66 28 20  >iPKey;.    if( 
e290: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
e2a0: 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
e2b0: 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d  Col[iCol];.    }
e2c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
e2d0: 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
e2e0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
e2f0: 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d  +){.      pCol =
e300: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
e310: 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  l];.      if( 0=
e320: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
e330: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
e340: 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20  lumnName) ){.   
e350: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e360: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
e370: 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43  ( iCol==pTab->nC
e380: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ol ){.      pTab
e390: 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 0;.      goto
e3a0: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
e3b0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
e3c0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
e3d0: 73 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20  stores the meta 
e3e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74  information that
e3f0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
e400: 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61  d.  ** to the ca
e410: 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61  ller in local va
e420: 72 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70  riables zDataTyp
e430: 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74  e, zCollSeq, not
e440: 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79  null, primarykey
e450: 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e  .  ** and autoin
e460: 63 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  c. At this point
e470: 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
e480: 6f 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20  ossibilities:.  
e490: 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20  ** .  **     1. 
e4a0: 54 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f  The specified co
e4b0: 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f  lumn name was ro
e4c0: 77 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22  wid", "oid" or "
e4d0: 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20  _rowid_" .  **  
e4e0: 20 20 20 20 20 20 61 6e 64 20 74 68 65 72 65 20        and there 
e4f0: 69 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79  is no explicitly
e500: 20 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f   declared IPK co
e510: 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  lumn. .  **.  **
e520: 20 20 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c       2. The tabl
e530: 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
e540: 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  and the column n
e550: 61 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20 61  ame identified a
e560: 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65  n .  **        e
e570: 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72  xplicitly declar
e580: 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20  ed column. Copy 
e590: 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
e5a0: 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a   from *pCol..  *
e5b0: 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b  / .  if( pCol ){
e5c0: 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d  .    zDataType =
e5d0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20   pCol->zType;.  
e5e0: 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f    zCollSeq = pCo
e5f0: 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f  l->zColl;.    no
e600: 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f  tnull = pCol->no
e610: 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72  tNull!=0;.    pr
e620: 69 6d 61 72 79 6b 65 79 20 20 3d 20 70 43 6f 6c  imarykey  = pCol
e630: 2d 3e 69 73 50 72 69 6d 4b 65 79 21 3d 30 3b 0a  ->isPrimKey!=0;.
e640: 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54      autoinc = pT
e650: 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20  ab->iPKey==iCol 
e660: 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
e670: 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
e680: 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c  ement)!=0;.  }el
e690: 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70  se{.    zDataTyp
e6a0: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
e6b0: 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20     primarykey = 
e6c0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43  1;.  }.  if( !zC
e6d0: 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43  ollSeq ){.    zC
e6e0: 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59  ollSeq = "BINARY
e6f0: 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75  ";.  }..error_ou
e700: 74 3a 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74  t:.  (void)sqlit
e710: 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b  e3SafetyOff(db);
e720: 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74  ..  /* Whether t
e730: 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  he function call
e740: 20 73 75 63 63 65 65 64 65 64 20 6f 72 20 66 61   succeeded or fa
e750: 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75  iled, set the ou
e760: 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a  tput parameters.
e770: 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72    ** to whatever
e780: 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75   their local cou
e790: 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69  nterparts contai
e7a0: 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  n. If an error d
e7b0: 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74  id occur,.  ** t
e7c0: 68 69 73 20 68 61 73 20 74 68 65 20 65 66 66 65  his has the effe
e7d0: 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c  ct of zeroing al
e7e0: 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  l output paramet
e7f0: 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ers..  */.  if( 
e800: 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a  pzDataType ) *pz
e810: 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61  DataType = zData
e820: 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f  Type;.  if( pzCo
e830: 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53  llSeq ) *pzCollS
e840: 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20  eq = zCollSeq;. 
e850: 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20   if( pNotNull ) 
e860: 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e  *pNotNull = notn
e870: 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d  ull;.  if( pPrim
e880: 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61  aryKey ) *pPrima
e890: 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b  ryKey = primaryk
e8a0: 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69  ey;.  if( pAutoi
e8b0: 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d  nc ) *pAutoinc =
e8c0: 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28   autoinc;..  if(
e8d0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26   SQLITE_OK==rc &
e8e0: 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73  & !pTab ){.    s
e8f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e900: 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a   zErrMsg);.    z
e910: 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
e920: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20  MPrintf(db, "no 
e930: 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d  such table colum
e940: 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c  n: %s.%s", zTabl
e950: 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a  eName,.        z
e960: 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20  ColumnName);.   
e970: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
e980: 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OR;.  }.  sqlite
e990: 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 28  3Error(db, rc, (
e9a0: 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c  zErrMsg?"%s":0),
e9b0: 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c   zErrMsg);.  sql
e9c0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
e9d0: 45 72 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20  ErrMsg);.  rc = 
e9e0: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
e9f0: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
ea00: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
ea10: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
ea20: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
ea30: 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
ea40: 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
ea50: 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
ea60: 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
ea70: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
ea80: 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b  3_sleep(int ms){
ea90: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
eaa0: 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pVfs;.  int rc;.
eab0: 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33    pVfs = sqlite3
eac0: 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
ead0: 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65  if( pVfs==0 ) re
eae0: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  turn 0;..  /* Th
eaf0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  is function work
eb00: 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  s in millisecond
eb10: 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65 72  s, but the under
eb20: 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20  lying OsSleep() 
eb30: 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d  .  ** API uses m
eb40: 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e  icroseconds. Hen
eb50: 63 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20  ce the 1000's.. 
eb60: 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69   */.  rc = (sqli
eb70: 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c  te3OsSleep(pVfs,
eb80: 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b   1000*ms)/1000);
eb90: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
eba0: 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72  ./*.** Enable or
ebb0: 20 64 69 73 61 62 6c 65 20 74 68 65 20 65 78 74   disable the ext
ebc0: 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64  ended result cod
ebd0: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
ebe0: 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
ebf0: 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33  lt_codes(sqlite3
ec00: 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29   *db, int onoff)
ec10: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
ec20: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
ec30: 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73  x);.  db->errMas
ec40: 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66  k = onoff ? 0xff
ec50: 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20  ffffff : 0xff;. 
ec60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
ec70: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
ec80: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ec90: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
eca0: 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f  voke the xFileCo
ecb0: 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20  ntrol method on 
ecc0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
ecd0: 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
ece0: 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
ecf0: 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ol(sqlite3 *db, 
ed00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
ed10: 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  ame, int op, voi
ed20: 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20  d *pArg){.  int 
ed30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
ed40: 52 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  R;.  int iDb;.  
ed50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
ed60: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
ed70: 20 20 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30    if( zDbName==0
ed80: 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 30 3b   ){.    iDb = 0;
ed90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
eda0: 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d  r(iDb=0; iDb<db-
edb0: 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20  >nDb; iDb++){.  
edc0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 64      if( strcmp(d
edd0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
ede0: 65 2c 20 7a 44 62 4e 61 6d 65 29 3d 3d 30 20 29  e, zDbName)==0 )
edf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ee00: 7d 0a 20 20 69 66 28 20 69 44 62 3c 64 62 2d 3e  }.  if( iDb<db->
ee10: 6e 44 62 20 29 7b 0a 20 20 20 20 42 74 72 65 65  nDb ){.    Btree
ee20: 20 2a 70 42 74 72 65 65 20 3d 20 64 62 2d 3e 61   *pBtree = db->a
ee30: 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
ee40: 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
ee50: 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67       Pager *pPag
ee60: 65 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  er;.      sqlite
ee70: 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20  3_file *fd;.    
ee80: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
ee90: 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
eea0: 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
eeb0: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
eec0: 74 72 65 65 29 3b 0a 20 20 20 20 20 20 61 73 73  tree);.      ass
eed0: 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
eee0: 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 73 71 6c  ;.      fd = sql
eef0: 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50  ite3PagerFile(pP
ef00: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
ef10: 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20  ert( fd!=0 );.  
ef20: 20 20 20 20 69 66 28 20 66 64 2d 3e 70 4d 65 74      if( fd->pMet
ef30: 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20  hods ){.        
ef40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
ef50: 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70  leControl(fd, op
ef60: 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20 20 7d  , pArg);.      }
ef70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
ef80: 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
ef90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
efa0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
efb0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
efc0: 72 65 74 75 72 6e 20 72 63 3b 20 20 20 0a 7d 0a  return rc;   .}.
efd0: 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
efe0: 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20   to the testing 
eff0: 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71  logic..*/.int sq
f000: 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
f010: 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  ol(int op, ...){
f020: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23  .  int rc = 0;.#
f030: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f040: 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a  IT_BUILTIN_TEST.
f050: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
f060: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29  va_start(ap, op)
f070: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
f080: 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  {..    /*.    **
f090: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
f0a0: 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  t state of the P
f0b0: 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  RNG..    */.    
f0c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
f0d0: 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20  CTRL_PRNG_SAVE: 
f0e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
f0f0: 72 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a  rngSaveState();.
f100: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f110: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
f120: 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 73 74  * Restore the st
f130: 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20  ate of the PRNG 
f140: 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61 74  to the last stat
f150: 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20  e saved using.  
f160: 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20    ** PRNG_SAVE. 
f170: 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61   If PRNG_SAVE ha
f180: 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62  s never before b
f190: 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  een called, then
f1a0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72  .    ** this ver
f1b0: 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47  b acts like PRNG
f1c0: 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20  _RESET..    */. 
f1d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
f1e0: 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
f1f0: 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  TORE: {.      sq
f200: 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65  lite3PrngRestore
f210: 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
f220: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
f230: 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74   /*.    ** Reset
f240: 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74   the PRNG back t
f250: 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69  o its uninitiali
f260: 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68 65 20  zed state.  The 
f270: 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  next call.    **
f280: 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   to sqlite3_rand
f290: 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65  omness() will re
f2a0: 73 65 65 64 20 74 68 65 20 50 52 4e 47 20 75 73  seed the PRNG us
f2b0: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c  ing a single cal
f2c0: 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  l.    ** to the 
f2d0: 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68  xRandomness meth
f2e0: 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  od of the defaul
f2f0: 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20  t VFS..    */.  
f300: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
f310: 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45  STCTRL_PRNG_RESE
f320: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
f330: 65 33 50 72 6e 67 52 65 73 65 74 53 74 61 74 65  e3PrngResetState
f340: 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
f350: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
f360: 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
f370: 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56  est_control(BITV
f380: 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70  EC_TEST, size, p
f390: 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20  rogram).    **. 
f3a0: 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74     ** Run a test
f3b0: 20 61 67 61 69 6e 73 74 20 61 20 42 69 74 76 65   against a Bitve
f3c0: 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65  c object of size
f3d0: 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61  .  The program a
f3e0: 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69  rgument.    ** i
f3f0: 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e  s an array of in
f400: 74 65 67 65 72 73 20 74 68 61 74 20 64 65 66 69  tegers that defi
f410: 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20 20 52  nes the test.  R
f420: 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20  eturn -1 on a.  
f430: 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f    ** memory allo
f440: 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20  cation error, 0 
f450: 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e  on success, or n
f460: 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65  on-zero for an e
f470: 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65  rror..    ** See
f480: 20 74 68 65 20 73 71 6c 69 74 65 33 42 69 74 76   the sqlite3Bitv
f490: 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20  ecBuiltinTest() 
f4a0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
f4b0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20  nformation..    
f4c0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
f4d0: 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56  TE_TESTCTRL_BITV
f4e0: 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20  EC_TEST: {.     
f4f0: 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67   int sz = va_arg
f500: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
f510: 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61   int *aProg = va
f520: 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a  _arg(ap, int*);.
f530: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f540: 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
f550: 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a  est(sz, aProg);.
f560: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f570: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
f580: 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
f590: 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d  control(BENIGN_M
f5a0: 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65  ALLOC_HOOKS, xBe
f5b0: 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a  gin, xEnd).    *
f5c0: 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65  *.    ** Registe
f5d0: 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20  r hooks to call 
f5e0: 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63  to indicate whic
f5f0: 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  h malloc() failu
f600: 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20  res .    ** are 
f610: 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20  benign..    */. 
f620: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
f630: 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d  ESTCTRL_BENIGN_M
f640: 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20  ALLOC_HOOKS: {. 
f650: 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
f660: 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f  d (*void_functio
f670: 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20  n)(void);.      
f680: 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
f690: 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20  enignBegin;.    
f6a0: 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
f6b0: 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20  xBenignEnd;.    
f6c0: 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d    xBenignBegin =
f6d0: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
f6e0: 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
f6f0: 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76    xBenignEnd = v
f700: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
f710: 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
f720: 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c  sqlite3BenignMal
f730: 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e  locHooks(xBenign
f740: 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e  Begin, xBenignEn
f750: 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
f760: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
f770: 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66 20  end(ap);.#endif 
f780: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
f790: 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20  UILTIN_TEST */. 
f7a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a         return rc;.}.