/ Hex Artifact Content
Login

Artifact f195bd6fc719bda15c0efb504ca9e250411730de:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
0290: 51 4c 52 52 0a 23 20 69 6e 63 6c 75 64 65 20 22  QLRR.# include "
02a0: 73 71 6c 72 72 2e 68 22 0a 23 65 6e 64 69 66 20  sqlrr.h".#endif 
02b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
02c0: 4e 41 42 4c 45 5f 46 54 53 33 0a 23 20 69 6e 63  NABLE_FTS3.# inc
02d0: 6c 75 64 65 20 22 66 74 73 33 2e 68 22 0a 23 65  lude "fts3.h".#e
02e0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
02f0: 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a  TE_ENABLE_RTREE.
0300: 23 20 69 6e 63 6c 75 64 65 20 22 72 74 72 65 65  # include "rtree
0310: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0320: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0330: 49 43 55 0a 23 20 69 6e 63 6c 75 64 65 20 22 73  ICU.# include "s
0340: 71 6c 69 74 65 69 63 75 2e 68 22 0a 23 65 6e 64  qliteicu.h".#end
0350: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 76 65  if../*.** The ve
0360: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62  rsion of the lib
0370: 72 61 72 79 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  rary.*/.#ifndef 
0380: 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54  SQLITE_AMALGAMAT
0390: 49 4f 4e 0a 63 6f 6e 73 74 20 63 68 61 72 20 73  ION.const char s
03a0: 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d  qlite3_version[]
03b0: 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f   = SQLITE_VERSIO
03c0: 4e 3b 0a 23 65 6e 64 69 66 0a 63 6f 6e 73 74 20  N;.#endif.const 
03d0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 6c 69  char *sqlite3_li
03e0: 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29 7b 20  bversion(void){ 
03f0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 76  return sqlite3_v
0400: 65 72 73 69 6f 6e 3b 20 7d 0a 63 6f 6e 73 74 20  ersion; }.const 
0410: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f  char *sqlite3_so
0420: 75 72 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65  urceid(void){ re
0430: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52  turn SQLITE_SOUR
0440: 43 45 5f 49 44 3b 20 7d 0a 69 6e 74 20 73 71 6c  CE_ID; }.int sql
0450: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  ite3_libversion_
0460: 6e 75 6d 62 65 72 28 76 6f 69 64 29 7b 20 72 65  number(void){ re
0470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 56 45 52 53  turn SQLITE_VERS
0480: 49 4f 4e 5f 4e 55 4d 42 45 52 3b 20 7d 0a 69 6e  ION_NUMBER; }.in
0490: 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  t sqlite3_thread
04a0: 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65 74 75  safe(void){ retu
04b0: 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  rn SQLITE_THREAD
04c0: 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20 21 64 65  SAFE; }..#if !de
04d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
04e0: 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69  T_TRACE) && defi
04f0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
0500: 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a  E_IOTRACE)./*.**
0510: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
0520: 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  g function point
0530: 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61  er is not NULL a
0540: 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45 5f  nd if.** SQLITE_
0550: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 69  ENABLE_IOTRACE i
0560: 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
0570: 6d 65 73 73 61 67 65 73 20 64 65 73 63 72 69 62  messages describ
0580: 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69 76  ing.** I/O activ
0590: 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 75 73  e are written us
05a0: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
05b0: 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61 67  n.  These messag
05c0: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 64  es.** are intend
05d0: 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
05e0: 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e 0a   activity only..
05f0: 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c 69 74 65  */.void (*sqlite
0600: 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20  3IoTrace)(const 
0610: 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b  char*, ...) = 0;
0620: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
0630: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0640: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0650: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
0660: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
0670: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
0680: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
0690: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
06a0: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
06b0: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
06c0: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
06d0: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
06e0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
06f0: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
0700: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
0710: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
0720: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
0730: 49 6e 69 74 69 61 6c 69 7a 65 20 53 51 4c 69 74  Initialize SQLit
0740: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  e.  .**.** This 
0750: 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
0760: 63 61 6c 6c 65 64 20 74 6f 20 69 6e 69 74 69 61  called to initia
0770: 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
0780: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 0a 2a 2a 20 56  allocation,.** V
0790: 46 53 2c 20 61 6e 64 20 6d 75 74 65 78 20 73 75  FS, and mutex su
07a0: 62 73 79 73 74 65 6d 73 20 70 72 69 6f 72 20 74  bsystems prior t
07b0: 6f 20 64 6f 69 6e 67 20 61 6e 79 20 73 65 72 69  o doing any seri
07c0: 6f 75 73 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a  ous work with.**
07d0: 20 53 51 4c 69 74 65 2e 20 20 42 75 74 20 61 73   SQLite.  But as
07e0: 20 6c 6f 6e 67 20 61 73 20 79 6f 75 20 64 6f 20   long as you do 
07f0: 6e 6f 74 20 63 6f 6d 70 69 6c 65 20 77 69 74 68  not compile with
0800: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0810: 4f 49 4e 49 54 0a 2a 2a 20 74 68 69 73 20 72 6f  OINIT.** this ro
0820: 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
0830: 6c 6c 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  lled automatical
0840: 6c 79 20 62 79 20 6b 65 79 20 72 6f 75 74 69 6e  ly by key routin
0850: 65 73 20 73 75 63 68 20 61 73 0a 2a 2a 20 73 71  es such as.** sq
0860: 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 20 20 0a  lite3_open().  .
0870: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
0880: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 65 78  ne is a no-op ex
0890: 63 65 70 74 20 6f 6e 20 69 74 73 20 76 65 72 79  cept on its very
08a0: 20 66 69 72 73 74 20 63 61 6c 6c 20 66 6f 72 20   first call for 
08b0: 74 68 65 20 70 72 6f 63 65 73 73 2c 0a 2a 2a 20  the process,.** 
08c0: 6f 72 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  or for the first
08d0: 20 63 61 6c 6c 20 61 66 74 65 72 20 61 20 63 61   call after a ca
08e0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 68  ll to sqlite3_sh
08f0: 75 74 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  utdown..**.** Th
0900: 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20 74  e first thread t
0910: 6f 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  o call this rout
0920: 69 6e 65 20 72 75 6e 73 20 74 68 65 20 69 6e 69  ine runs the ini
0930: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 6f 0a 2a  tialization to.*
0940: 2a 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49  * completion.  I
0950: 66 20 73 75 62 73 65 71 75 65 6e 74 20 74 68 72  f subsequent thr
0960: 65 61 64 73 20 63 61 6c 6c 20 74 68 69 73 20 72  eads call this r
0970: 6f 75 74 69 6e 65 20 62 65 66 6f 72 65 20 74 68  outine before th
0980: 65 20 66 69 72 73 74 0a 2a 2a 20 74 68 72 65 61  e first.** threa
0990: 64 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 74  d has finished t
09a0: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
09b0: 6e 20 70 72 6f 63 65 73 73 2c 20 74 68 65 6e 20  n process, then 
09c0: 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  the subsequent.*
09d0: 2a 20 74 68 72 65 61 64 73 20 6d 75 73 74 20 62  * threads must b
09e0: 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 66  lock until the f
09f0: 69 72 73 74 20 74 68 72 65 61 64 20 66 69 6e 69  irst thread fini
0a00: 73 68 65 73 20 77 69 74 68 20 74 68 65 20 69 6e  shes with the in
0a10: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 2a 2a  itialization..**
0a20: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 68  .** The first th
0a30: 72 65 61 64 20 6d 69 67 68 74 20 63 61 6c 6c 20  read might call 
0a40: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 63  this routine rec
0a50: 75 72 73 69 76 65 6c 79 2e 20 20 52 65 63 75 72  ursively.  Recur
0a60: 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f  sive.** calls to
0a70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   this routine sh
0a80: 6f 75 6c 64 20 6e 6f 74 20 62 6c 6f 63 6b 2c 20  ould not block, 
0a90: 6f 66 20 63 6f 75 72 73 65 2e 20 20 4f 74 68 65  of course.  Othe
0aa0: 72 77 69 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69  rwise the.** ini
0ab0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63  tialization proc
0ac0: 65 73 73 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  ess would never 
0ad0: 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20  complete..**.** 
0ae0: 4c 65 74 20 58 20 62 65 20 74 68 65 20 66 69 72  Let X be the fir
0af0: 73 74 20 74 68 72 65 61 64 20 74 6f 20 65 6e 74  st thread to ent
0b00: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  er this routine.
0b10: 20 20 4c 65 74 20 59 20 62 65 20 73 6f 6d 65 20    Let Y be some 
0b20: 6f 74 68 65 72 0a 2a 2a 20 74 68 72 65 61 64 2e  other.** thread.
0b30: 20 20 54 68 65 6e 20 77 68 69 6c 65 20 74 68 65    Then while the
0b40: 20 69 6e 69 74 69 61 6c 20 69 6e 76 6f 63 61 74   initial invocat
0b50: 69 6f 6e 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ion of this rout
0b60: 69 6e 65 20 62 79 20 58 20 69 73 0a 2a 2a 20 69  ine by X is.** i
0b70: 6e 63 6f 6d 70 6c 65 74 65 2c 20 69 74 20 69 73  ncomplete, it is
0b80: 20 72 65 71 75 69 72 65 64 20 74 68 61 74 3a 0a   required that:.
0b90: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 61 6c 6c  **.**    *  Call
0ba0: 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  s to this routin
0bb0: 65 20 66 72 6f 6d 20 59 20 6d 75 73 74 20 62 6c  e from Y must bl
0bc0: 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 6f 75  ock until the ou
0bd0: 74 65 72 2d 6d 6f 73 74 0a 2a 2a 20 20 20 20 20  ter-most.**     
0be0: 20 20 63 61 6c 6c 20 62 79 20 58 20 63 6f 6d 70    call by X comp
0bf0: 6c 65 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  letes..**.**    
0c00: 2a 20 20 52 65 63 75 72 73 69 76 65 20 63 61 6c  *  Recursive cal
0c10: 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ls to this routi
0c20: 6e 65 20 66 72 6f 6d 20 74 68 72 65 61 64 20 58  ne from thread X
0c30: 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
0c40: 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  ely.**       wit
0c50: 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a  hout blocking..*
0c60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e  /.int sqlite3_in
0c70: 69 74 69 61 6c 69 7a 65 28 76 6f 69 64 29 7b 0a  itialize(void){.
0c80: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
0c90: 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  *pMaster;       
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0cb0: 2a 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69  * The main stati
0cc0: 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 69 6e 74  c mutex */.  int
0cd0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
0d00: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66  ult code */..#if
0d10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0d20: 57 53 44 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  WSD.  rc = sqlit
0d30: 65 33 5f 77 73 64 5f 69 6e 69 74 28 34 30 39 36  e3_wsd_init(4096
0d40: 2c 20 32 34 29 3b 0a 20 20 69 66 28 20 72 63 21  , 24);.  if( rc!
0d50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
0d60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
0d70: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
0d80: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
0d90: 64 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 6e  dy completely in
0da0: 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20  itialized, then 
0db0: 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74  this call.  ** t
0dc0: 6f 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  o sqlite3_initia
0dd0: 6c 69 7a 65 28 29 20 73 68 6f 75 6c 64 20 62 65  lize() should be
0de0: 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 74   a no-op.  But t
0df0: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
0e00: 6e 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 63  n.  ** must be c
0e10: 6f 6d 70 6c 65 74 65 2e 20 20 53 6f 20 69 73 49  omplete.  So isI
0e20: 6e 69 74 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  nit must not be 
0e30: 73 65 74 20 75 6e 74 69 6c 20 74 68 65 20 76 65  set until the ve
0e40: 72 79 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74  ry end.  ** of t
0e50: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a  his routine..  *
0e60: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  /.  if( sqlite3G
0e70: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
0e80: 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  it ) return SQLI
0e90: 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  TE_OK;..  /* Mak
0ea0: 65 20 73 75 72 65 20 74 68 65 20 6d 75 74 65 78  e sure the mutex
0eb0: 20 73 75 62 73 79 73 74 65 6d 20 69 73 20 69 6e   subsystem is in
0ec0: 69 74 69 61 6c 69 7a 65 64 2e 20 20 49 66 20 75  itialized.  If u
0ed0: 6e 61 62 6c 65 20 74 6f 20 0a 20 20 2a 2a 20 69  nable to .  ** i
0ee0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 75  nitialize the mu
0ef0: 74 65 78 20 73 75 62 73 79 73 74 65 6d 2c 20 72  tex subsystem, r
0f00: 65 74 75 72 6e 20 65 61 72 6c 79 20 77 69 74 68  eturn early with
0f10: 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 2a 2a   the error..  **
0f20: 20 49 66 20 74 68 65 20 73 79 73 74 65 6d 20 69   If the system i
0f30: 73 20 73 6f 20 73 69 63 6b 20 74 68 61 74 20 77  s so sick that w
0f40: 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
0f50: 61 6c 6c 6f 63 61 74 65 20 61 20 6d 75 74 65 78  allocate a mutex
0f60: 2c 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  ,.  ** there is 
0f70: 6e 6f 74 20 6d 75 63 68 20 53 51 4c 69 74 65 20  not much SQLite 
0f80: 69 73 20 67 6f 69 6e 67 20 74 6f 20 62 65 20 61  is going to be a
0f90: 62 6c 65 20 74 6f 20 64 6f 2e 0a 20 20 2a 2a 0a  ble to do..  **.
0fa0: 20 20 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 73    ** The mutex s
0fb0: 75 62 73 79 73 74 65 6d 20 6d 75 73 74 20 74 61  ubsystem must ta
0fc0: 6b 65 20 63 61 72 65 20 6f 66 20 73 65 72 69 61  ke care of seria
0fd0: 6c 69 7a 69 6e 67 20 69 74 73 20 6f 77 6e 0a 20  lizing its own. 
0fe0: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69   ** initializati
0ff0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
1000: 73 71 6c 69 74 65 33 4d 75 74 65 78 49 6e 69 74  sqlite3MutexInit
1010: 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
1020: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
1030: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  Initialize the m
1040: 61 6c 6c 6f 63 28 29 20 73 79 73 74 65 6d 20 61  alloc() system a
1050: 6e 64 20 74 68 65 20 72 65 63 75 72 73 69 76 65  nd the recursive
1060: 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65   pInitMutex mute
1070: 78 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 70 65  x..  ** This ope
1080: 72 61 74 69 6f 6e 20 69 73 20 70 72 6f 74 65 63  ration is protec
1090: 74 65 64 20 62 79 20 74 68 65 20 53 54 41 54 49  ted by the STATI
10a0: 43 5f 4d 41 53 54 45 52 20 6d 75 74 65 78 2e 20  C_MASTER mutex. 
10b0: 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20   Note that.  ** 
10c0: 4d 75 74 65 78 41 6c 6c 6f 63 28 29 20 69 73 20  MutexAlloc() is 
10d0: 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 73 74 61  called for a sta
10e0: 74 69 63 20 6d 75 74 65 78 20 70 72 69 6f 72 20  tic mutex prior 
10f0: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  to initializing 
1100: 74 68 65 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20  the.  ** malloc 
1110: 73 75 62 73 79 73 74 65 6d 20 2d 20 74 68 69 73  subsystem - this
1120: 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
1130: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  e allocation of 
1140: 61 20 73 74 61 74 69 63 0a 20 20 2a 2a 20 6d 75  a static.  ** mu
1150: 74 65 78 20 6d 75 73 74 20 6e 6f 74 20 72 65 71  tex must not req
1160: 75 69 72 65 20 73 75 70 70 6f 72 74 20 66 72 6f  uire support fro
1170: 6d 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 75 62  m the malloc sub
1180: 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 70  system..  */.  p
1190: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
11a0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
11b0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
11c0: 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65  ASTER);.  sqlite
11d0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
11e0: 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  aster);.  sqlite
11f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1200: 4d 75 74 65 78 49 6e 69 74 20 3d 20 31 3b 0a 20  MutexInit = 1;. 
1210: 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f   if( !sqlite3Glo
1220: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c  balConfig.isMall
1230: 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63  ocInit ){.    rc
1240: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
1250: 49 6e 69 74 28 29 3b 0a 20 20 7d 0a 20 20 69 66  Init();.  }.  if
1260: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1270: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  ){.    sqlite3Gl
1280: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c  obalConfig.isMal
1290: 6c 6f 63 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  locInit = 1;.   
12a0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f   if( !sqlite3Glo
12b0: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
12c0: 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 73 71  utex ){.      sq
12d0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
12e0: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 0a 20  g.pInitMutex =. 
12f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1300: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
1310: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
1320: 56 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  VE);.      if( s
1330: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1340: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 26 26  ig.bCoreMutex &&
1350: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
1360: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1370: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1380: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1390: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
13c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
13d0: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b  nRefInitMutex++;
13e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
13f0: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
1400: 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63  er);..  /* If rc
1410: 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
1420: 4b 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  K at this point,
1430: 20 74 68 65 6e 20 65 69 74 68 65 72 20 74 68 65   then either the
1440: 20 6d 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62   malloc.  ** sub
1450: 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74  system could not
1460: 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
1470: 6f 72 20 74 68 65 20 73 79 73 74 65 6d 20 66 61  or the system fa
1480: 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  iled to allocate
1490: 0a 20 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d  .  ** the pInitM
14a0: 75 74 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75  utex mutex. Retu
14b0: 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65  rn an error in e
14c0: 69 74 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a  ither case.  */.
14d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
14f0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
1500: 44 6f 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  Do the rest of t
1510: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
1520: 6e 20 75 6e 64 65 72 20 74 68 65 20 72 65 63 75  n under the recu
1530: 72 73 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20  rsive mutex so. 
1540: 20 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c   ** that we will
1550: 20 62 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64   be able to hand
1560: 6c 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  le recursive cal
1570: 6c 73 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c  ls into.  ** sql
1580: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1590: 29 2e 20 20 54 68 65 20 72 65 63 75 72 73 69 76  ).  The recursiv
15a0: 65 20 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79  e calls normally
15b0: 20 63 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20   come through.  
15c0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  ** sqlite3_os_in
15d0: 69 74 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76  it() when it inv
15e0: 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73  okes sqlite3_vfs
15f0: 5f 72 65 67 69 73 74 65 72 28 29 2c 20 62 75 74  _register(), but
1600: 20 6f 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75   other.  ** recu
1610: 72 73 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68  rsive calls migh
1620: 74 20 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62  t also be possib
1630: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
1640: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
1650: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1660: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a  ig.pInitMutex);.
1670: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1680: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
1690: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 47 6c  ==0 && sqlite3Gl
16a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
16b0: 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20  gress==0 ){.    
16c0: 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70 48 61  FuncDefHash *pHa
16d0: 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46 75 6e  sh = &GLOBAL(Fun
16e0: 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69 74 65  cDefHash, sqlite
16f0: 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73  3GlobalFunctions
1700: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
1710: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1720: 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 6d  gress = 1;.    m
1730: 65 6d 73 65 74 28 70 48 61 73 68 2c 20 30 2c 20  emset(pHash, 0, 
1740: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c  sizeof(sqlite3Gl
1750: 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29 29 3b  obalFunctions));
1760: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69  .    sqlite3Regi
1770: 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e 63 74 69  sterGlobalFuncti
1780: 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73  ons();.    if( s
1790: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
17a0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d  ig.isPCacheInit=
17b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
17c0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e   sqlite3PcacheIn
17d0: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
17e0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
17f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1800: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1810: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
1820: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  t = 1;.      rc 
1830: 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28  = sqlite3OsInit(
1840: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1850: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1860: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1870: 43 61 63 68 65 42 75 66 66 65 72 53 65 74 75 70  CacheBufferSetup
1880: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1890: 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20 0a 20 20  onfig.pPage, .  
18a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
18b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
18c0: 67 65 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ge, sqlite3Globa
18d0: 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 29 3b 0a  lConfig.nPage);.
18e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
18f0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
1900: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
1910: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1920: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d  fig.inProgress =
1930: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
1940: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
1950: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1960: 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a  g.pInitMutex);..
1970: 20 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64    /* Go back und
1980: 65 72 20 74 68 65 20 73 74 61 74 69 63 20 6d 75  er the static mu
1990: 74 65 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70  tex and clean up
19a0: 20 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 20   the recursive. 
19b0: 20 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65   ** mutex to pre
19c0: 76 65 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20  vent a resource 
19d0: 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  leak..  */.  sql
19e0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
19f0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c  (pMaster);.  sql
1a00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1a10: 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d  .nRefInitMutex--
1a20: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ;.  if( sqlite3G
1a30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
1a40: 49 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a  InitMutex<=0 ){.
1a50: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1a60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1a70: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30  nRefInitMutex==0
1a80: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
1a90: 6d 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74  mutex_free(sqlit
1aa0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1ab0: 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20  InitMutex);.    
1ac0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1ad0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d  fig.pInitMutex =
1ae0: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
1af0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
1b00: 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  aster);..  /* Th
1b10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a  e following is j
1b20: 75 73 74 20 61 20 73 61 6e 69 74 79 20 63 68 65  ust a sanity che
1b30: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
1b40: 53 51 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20  SQLite has.  ** 
1b50: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f  been compiled co
1b60: 72 72 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20  rrectly.  It is 
1b70: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e  important to run
1b80: 20 74 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a   this code, but.
1b90: 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61    ** we don't wa
1ba0: 6e 74 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f  nt to run it too
1bb0: 20 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20   often and soak 
1bc0: 75 70 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f  up CPU cycles fo
1bd0: 72 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e  r no.  ** reason
1be0: 2e 20 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20  .  So we run it 
1bf0: 6f 6e 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74  once during init
1c00: 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f  ialization..  */
1c10: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1c20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c30: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1c40: 4e 54 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63  NT.  /* This sec
1c50: 74 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f  tion of code's o
1c60: 6e 6c 79 20 22 6f 75 74 70 75 74 22 20 69 73 20  nly "output" is 
1c70: 76 69 61 20 61 73 73 65 72 74 28 29 20 73 74 61  via assert() sta
1c80: 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66  tements. */.  if
1c90: 20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ( rc==SQLITE_OK
1ca0: 20 29 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20   ){.    u64 x = 
1cb0: 28 28 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31  (((u64)1)<<63)-1
1cc0: 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a  ;.    double y;.
1cd0: 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f      assert(sizeo
1ce0: 66 28 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73  f(x)==8);.    as
1cf0: 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d  sert(sizeof(x)==
1d00: 73 69 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20  sizeof(y));.    
1d10: 6d 65 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38  memcpy(&y, &x, 8
1d20: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1d30: 71 6c 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29  qlite3IsNaN(y) )
1d40: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e  ;.  }.#endif.#en
1d50: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
1d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20  ;.}../*.** Undo 
1d70: 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 73  the effects of s
1d80: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
1d90: 65 28 29 2e 20 20 4d 75 73 74 20 6e 6f 74 20 62  e().  Must not b
1da0: 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 0a 2a  e called while.*
1db0: 2a 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  * there are outs
1dc0: 74 61 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65  tanding database
1dd0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20   connections or 
1de0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1df0: 6e 73 20 6f 72 0a 2a 2a 20 77 68 69 6c 65 20 61  ns or.** while a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 53 51 4c 69 74  ny part of SQLit
1e10: 65 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 69  e is otherwise i
1e20: 6e 20 75 73 65 20 69 6e 20 61 6e 79 20 74 68 72  n use in any thr
1e30: 65 61 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ead.  This.** ro
1e40: 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 72  utine is not thr
1e50: 65 61 64 73 61 66 65 2e 20 20 42 75 74 20 69 74  eadsafe.  But it
1e60: 20 69 73 20 73 61 66 65 20 74 6f 20 69 6e 76 6f   is safe to invo
1e70: 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ke this routine.
1e80: 2a 2a 20 6f 6e 20 77 68 65 6e 20 53 51 4c 69 74  ** on when SQLit
1e90: 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 68 75  e is already shu
1ea0: 74 20 64 6f 77 6e 2e 20 20 49 66 20 53 51 4c 69  t down.  If SQLi
1eb0: 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 68  te is already sh
1ec0: 75 74 20 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20  ut down.** when 
1ed0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1ee0: 69 6e 76 6f 6b 65 64 2c 20 74 68 65 6e 20 74 68  invoked, then th
1ef0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1f00: 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a  harmless no-op..
1f10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
1f20: 68 75 74 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 20  hutdown(void){. 
1f30: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
1f40: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
1f50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f  ){.    sqlite3_o
1f60: 73 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  s_end();.    sql
1f70: 69 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f  ite3_reset_auto_
1f80: 65 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20  extension();.   
1f90: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1fa0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b  nfig.isInit = 0;
1fb0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1fc0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1fd0: 73 50 43 61 63 68 65 49 6e 69 74 20 29 7b 0a 20  sPCacheInit ){. 
1fe0: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1ff0: 53 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20  Shutdown();.    
2000: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2010: 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74  fig.isPCacheInit
2020: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
2030: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2040: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
2050: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d   ){.    sqlite3M
2060: 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20  allocEnd();.    
2070: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2080: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
2090: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
20a0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
20b0: 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20  fig.isMutexInit 
20c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 75  ){.    sqlite3Mu
20d0: 74 65 78 45 6e 64 28 29 3b 0a 20 20 20 20 73 71  texEnd();.    sq
20e0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
20f0: 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d 20  g.isMutexInit = 
2100: 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
2110: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2120: 2a 0a 2a 2a 20 54 68 69 73 20 41 50 49 20 61 6c  *.** This API al
2130: 6c 6f 77 73 20 61 70 70 6c 69 63 61 74 69 6f 6e  lows application
2140: 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  s to modify the 
2150: 67 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75 72 61  global configura
2160: 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 53  tion of.** the S
2170: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 61 74  QLite library at
2180: 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a   run-time..**.**
2190: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
21a0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
21b0: 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61  led when there a
21c0: 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
21d0: 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  g.** database co
21e0: 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d  nnections or mem
21f0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e  ory allocations.
2200: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
2210: 73 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73  s not.** threads
2220: 61 66 65 2e 20 20 46 61 69 6c 75 72 65 20 74 6f  afe.  Failure to
2230: 20 68 65 65 64 20 74 68 65 73 65 20 77 61 72 6e   heed these warn
2240: 69 6e 67 73 20 63 61 6e 20 6c 65 61 64 20 74 6f  ings can lead to
2250: 20 75 6e 70 72 65 64 69 63 74 61 62 6c 65 0a 2a   unpredictable.*
2260: 2a 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69  * behavior..*/.i
2270: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  nt sqlite3_confi
2280: 67 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a  g(int op, ...){.
2290: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
22a0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22b0: 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65  OK;..  /* sqlite
22c0: 33 5f 63 6f 6e 66 69 67 28 29 20 73 68 61 6c 6c  3_config() shall
22d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
22e0: 49 53 55 53 45 20 69 66 20 69 74 20 69 73 20 69  ISUSE if it is i
22f0: 6e 76 6f 6b 65 64 20 77 68 69 6c 65 0a 20 20 2a  nvoked while.  *
2300: 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62  * the SQLite lib
2310: 72 61 72 79 20 69 73 20 69 6e 20 75 73 65 2e 20  rary is in use. 
2320: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
2330: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2340: 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nit ) return SQL
2350: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 0a 20 20 76  ITE_MISUSE;..  v
2360: 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
2370: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
2380: 0a 0a 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 63  ..    /* Mutex c
2390: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
23a0: 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20 61 76  ions are only av
23b0: 61 69 6c 61 62 6c 65 20 69 6e 20 61 20 74 68 72  ailable in a thr
23c0: 65 61 64 73 61 66 65 0a 20 20 20 20 2a 2a 20 63  eadsafe.    ** c
23d0: 6f 6d 70 69 6c 65 2e 20 0a 20 20 20 20 2a 2f 0a  ompile. .    */.
23e0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
23f0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
2400: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
2410: 41 46 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53  AFE>0.    case S
2420: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e  QLITE_CONFIG_SIN
2430: 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20 20 20  GLETHREAD: {.   
2440: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 61 6c     /* Disable al
2450: 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20  l mutexing */.  
2460: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2470: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
2480: 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ex = 0;.      sq
2490: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
24a0: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30  g.bFullMutex = 0
24b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
24c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
24d0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54  LITE_CONFIG_MULT
24e0: 49 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20  ITHREAD: {.     
24f0: 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65   /* Disable mute
2500: 78 69 6e 67 20 6f 66 20 64 61 74 61 62 61 73 65  xing of database
2510: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
2520: 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20        /* Enable 
2530: 6d 75 74 65 78 69 6e 67 20 6f 66 20 63 6f 72 65  mutexing of core
2540: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
2550: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
2570: 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20  oreMutex = 1;.  
2580: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2590: 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
25a0: 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  ex = 0;.      br
25b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
25c0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
25d0: 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a  G_SERIALIZED: {.
25e0: 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20        /* Enable 
25f0: 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a  all mutexing */.
2600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2610: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
2620: 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  utex = 1;.      
2630: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2640: 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d  fig.bFullMutex =
2650: 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
2660: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2670: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55  SQLITE_CONFIG_MU
2680: 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  TEX: {.      /* 
2690: 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72  Specify an alter
26a0: 6e 61 74 69 76 65 20 6d 75 74 65 78 20 69 6d 70  native mutex imp
26b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  lementation */. 
26c0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
26d0: 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d  alConfig.mutex =
26e0: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
26f0: 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f  ite3_mutex_metho
2700: 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ds*);.      brea
2710: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
2720: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
2730: 47 45 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20  GETMUTEX: {.    
2740: 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68    /* Retrieve th
2750: 65 20 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20  e current mutex 
2760: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
2770: 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28  /.      *va_arg(
2780: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ap, sqlite3_mute
2790: 78 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71  x_methods*) = sq
27a0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
27b0: 67 2e 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62  g.mutex;.      b
27c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
27d0: 69 66 0a 0a 0a 20 20 20 20 63 61 73 65 20 53 51  if...    case SQ
27e0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c  LITE_CONFIG_MALL
27f0: 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53  OC: {.      /* S
2800: 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e  pecify an altern
2810: 61 74 69 76 65 20 6d 61 6c 6c 6f 63 20 69 6d 70  ative malloc imp
2820: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  lementation */. 
2830: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2840: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61  alConfig.m = *va
2850: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
2860: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a  _mem_methods*);.
2870: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2880: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
2890: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c  TE_CONFIG_GETMAL
28a0: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
28b0: 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75 72  Retrieve the cur
28c0: 72 65 6e 74 20 6d 61 6c 6c 6f 63 28 29 20 69 6d  rent malloc() im
28d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
28e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
28f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e  3GlobalConfig.m.
2900: 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c  xMalloc==0 ) sql
2910: 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c  ite3MemSetDefaul
2920: 74 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61  t();.      *va_a
2930: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d  rg(ap, sqlite3_m
2940: 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73  em_methods*) = s
2950: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2960: 69 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61  ig.m;.      brea
2970: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
2980: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
2990: 4d 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20  MEMSTATUS: {.   
29a0: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6f 72 20     /* Enable or 
29b0: 64 69 73 61 62 6c 65 20 74 68 65 20 6d 61 6c 6c  disable the mall
29c0: 6f 63 20 73 74 61 74 75 73 20 63 6f 6c 6c 65 63  oc status collec
29d0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
29e0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
29f0: 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f  g.bMemstat = va_
2a00: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
2a10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2a20: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2a30: 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a  _CONFIG_SCRATCH:
2a40: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69   {.      /* Desi
2a50: 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20 66  gnate a buffer f
2a60: 6f 72 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72  or scratch memor
2a70: 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20  y space */.     
2a80: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2a90: 6e 66 69 67 2e 70 53 63 72 61 74 63 68 20 3d 20  nfig.pScratch = 
2aa0: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
2ab0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2ac0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53  GlobalConfig.szS
2ad0: 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28  cratch = va_arg(
2ae0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
2af0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2b00: 66 69 67 2e 6e 53 63 72 61 74 63 68 20 3d 20 76  fig.nScratch = v
2b10: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
2b20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b30: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
2b40: 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41  TE_CONFIG_PAGECA
2b50: 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  CHE: {.      /* 
2b60: 44 65 73 69 67 6e 61 74 65 20 61 20 62 75 66 66  Designate a buff
2b70: 65 72 20 66 6f 72 20 70 61 67 65 20 63 61 63 68  er for page cach
2b80: 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a  e memory space *
2b90: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
2ba0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
2bb0: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  e = va_arg(ap, v
2bc0: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  oid*);.      sql
2bd0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2be0: 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f 61 72 67  .szPage = va_arg
2bf0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
2c00: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2c10: 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76 61 5f  nfig.nPage = va_
2c20: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
2c30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2c40: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
2c50: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a  E_CONFIG_PCACHE:
2c60: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63   {.      /* Spec
2c70: 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  ify an alternati
2c80: 76 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6d  ve page cache im
2c90: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
2ca0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2cb0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
2cc0: 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73   = *va_arg(ap, s
2cd0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
2ce0: 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62  thods*);.      b
2cf0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
2d00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2d10: 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20 7b  FIG_GETPCACHE: {
2d20: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2d30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
2d40: 63 61 63 68 65 2e 78 49 6e 69 74 3d 3d 30 20 29  cache.xInit==0 )
2d50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2d60: 33 50 43 61 63 68 65 53 65 74 44 65 66 61 75 6c  3PCacheSetDefaul
2d70: 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t();.      }.   
2d80: 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73     *va_arg(ap, s
2d90: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
2da0: 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65  thods*) = sqlite
2db0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63  3GlobalConfig.pc
2dc0: 61 63 68 65 3b 0a 20 20 20 20 20 20 62 72 65 61  ache;.      brea
2dd0: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65  k;.    }..#if de
2de0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
2df0: 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20  BLE_MEMSYS3) || 
2e00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
2e10: 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20  NABLE_MEMSYS5). 
2e20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2e30: 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20  ONFIG_HEAP: {.  
2e40: 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65      /* Designate
2e50: 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 68 65   a buffer for he
2e60: 61 70 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  ap memory space 
2e70: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2e80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
2e90: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
2ea0: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
2eb0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2ec0: 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67  g.nHeap = va_arg
2ed0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
2ee0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2ef0: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f  nfig.mnReq = va_
2f00: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20  arg(ap, int);.. 
2f10: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2f20: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
2f30: 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ap==0 ){.       
2f40: 20 2f 2a 20 49 66 20 74 68 65 20 68 65 61 70 20   /* If the heap 
2f50: 70 6f 69 6e 74 65 72 20 69 73 20 4e 55 4c 4c 2c  pointer is NULL,
2f60: 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68   then restore th
2f70: 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65  e malloc impleme
2f80: 6e 74 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  ntation.        
2f90: 2a 2a 20 62 61 63 6b 20 74 6f 20 4e 55 4c 4c 20  ** back to NULL 
2fa0: 70 6f 69 6e 74 65 72 73 20 74 6f 6f 2e 20 20 54  pointers too.  T
2fb0: 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
2fc0: 68 65 20 6d 61 6c 6c 6f 63 20 74 6f 20 67 6f 0a  he malloc to go.
2fd0: 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20          ** back 
2fe0: 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74 20 69  to its default i
2ff0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 68  mplementation wh
3000: 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  en sqlite3_initi
3010: 61 6c 69 7a 65 28 29 20 69 73 0a 20 20 20 20 20  alize() is.     
3020: 20 20 20 2a 2a 20 72 75 6e 2e 0a 20 20 20 20 20     ** run..     
3030: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65     */.        me
3040: 6d 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f  mset(&sqlite3Glo
3050: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20  balConfig.m, 0, 
3060: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c  sizeof(sqlite3Gl
3070: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a  obalConfig.m));.
3080: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3090: 20 20 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70       /* The heap
30a0: 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20   pointer is not 
30b0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e 73 74 61  NULL, then insta
30c0: 6c 6c 20 6f 6e 65 20 6f 66 20 74 68 65 0a 20 20  ll one of the.  
30d0: 20 20 20 20 20 20 2a 2a 20 6d 65 6d 35 2e 63 2f        ** mem5.c/
30e0: 6d 65 6d 33 2e 63 20 6d 65 74 68 6f 64 73 2e 20  mem3.c methods. 
30f0: 49 66 20 6e 65 69 74 68 65 72 20 45 4e 41 42 4c  If neither ENABL
3100: 45 5f 4d 45 4d 53 59 53 33 20 6e 6f 72 0a 20 20  E_MEMSYS3 nor.  
3110: 20 20 20 20 20 20 2a 2a 20 45 4e 41 42 4c 45 5f        ** ENABLE_
3120: 4d 45 4d 53 59 53 35 20 69 73 20 64 65 66 69 6e  MEMSYS5 is defin
3130: 65 64 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  ed, return an er
3140: 72 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ror..        */.
3150: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
3160: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20  ABLE_MEMSYS3.   
3170: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3180: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
3190: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
31a0: 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  s3();.#endif.#if
31b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
31c0: 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20  E_MEMSYS5.      
31d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
31e0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
31f0: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28  e3MemGetMemsys5(
3200: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
3210: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3220: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
3230: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3240: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
3250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3260: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
3270: 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28  kaside = va_arg(
3280: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
3290: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
32a0: 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  fig.nLookaside =
32b0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
32c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
32d0: 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
32e0: 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t: {.      rc = 
32f0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
3300: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3310: 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
3320: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
3330: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
3340: 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75  the lookaside bu
3350: 66 66 65 72 73 20 66 6f 72 20 61 20 64 61 74 61  ffers for a data
3360: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
3370: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
3380: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
3390: 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69    .** If lookasi
33a0: 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  de is already ac
33b0: 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  tive, return SQL
33c0: 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20  ITE_BUSY..**.** 
33d0: 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74 65 72  The sz parameter
33e0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
33f0: 66 20 62 79 74 65 73 20 69 6e 20 65 61 63 68 20  f bytes in each 
3400: 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a  lookaside slot..
3410: 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72 61 6d  ** The cnt param
3420: 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62  eter is the numb
3430: 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66  er of slots.  If
3440: 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c 4c 20   pStart is NULL 
3450: 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72  the.** space for
3460: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d   the lookaside m
3470: 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69 6e 65  emory is obtaine
3480: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
3490: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70  alloc()..** If p
34a0: 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c  Start is not NUL
34b0: 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73 7a 2a  L then it is sz*
34c0: 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d 65 6d  cnt bytes of mem
34d0: 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a  ory to use for.*
34e0: 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  * the lookaside 
34f0: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
3500: 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61  c int setupLooka
3510: 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  side(sqlite3 *db
3520: 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
3530: 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  t sz, int cnt){.
3540: 20 20 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a    void *pStart;.
3550: 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73    if( db->lookas
3560: 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20 20 20 20  ide.nOut ){.    
3570: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
3580: 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 72 65  SY;.  }.  /* Fre
3590: 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6c  e any existing l
35a0: 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 20  ookaside buffer 
35b0: 66 6f 72 20 74 68 69 73 20 68 61 6e 64 6c 65 20  for this handle 
35c0: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f  before.  ** allo
35d0: 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65  cating a new one
35e0: 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 68 61 76   so we don't hav
35f0: 65 20 74 6f 20 68 61 76 65 20 73 70 61 63 65 20  e to have space 
3600: 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74 68 20 61  for .  ** both a
3610: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3620: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
3630: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
3640: 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ced ){.    sqlit
3650: 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b  e3_free(db->look
3660: 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20  aside.pStart);. 
3670: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 69 7a 65   }.  /* The size
3680: 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20   of a lookaside 
3690: 73 6c 6f 74 20 6e 65 65 64 73 20 74 6f 20 62 65  slot needs to be
36a0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 20 70   larger than a p
36b0: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74 6f 20 62  ointer.  ** to b
36c0: 65 20 75 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20  e useful..  */. 
36d0: 20 69 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69   if( sz<=(int)si
36e0: 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  zeof(LookasideSl
36f0: 6f 74 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20  ot*) ) sz = 0;. 
3700: 20 69 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74   if( cnt<0 ) cnt
3710: 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d   = 0;.  if( sz==
3720: 30 20 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20  0 || cnt==0 ){. 
3730: 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70     sz = 0;.    p
3740: 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  Start = 0;.  }el
3750: 73 65 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29  se if( pBuf==0 )
3760: 7b 0a 20 20 20 20 73 7a 20 3d 20 52 4f 55 4e 44  {.    sz = ROUND
3770: 38 28 73 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  8(sz);.    sqlit
3780: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
3790: 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72  loc();.    pStar
37a0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
37b0: 63 28 20 73 7a 2a 63 6e 74 20 29 3b 0a 20 20 20  c( sz*cnt );.   
37c0: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
37d0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 65 6c  nMalloc();.  }el
37e0: 73 65 7b 0a 20 20 20 20 73 7a 20 3d 20 52 4f 55  se{.    sz = ROU
37f0: 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 0a 20 20 20  NDDOWN8(sz);.   
3800: 20 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a   pStart = pBuf;.
3810: 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73    }.  db->lookas
3820: 69 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74  ide.pStart = pSt
3830: 61 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  art;.  db->looka
3840: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a  side.pFree = 0;.
3850: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
3860: 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20  sz = (u16)sz;.  
3870: 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
3880: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f    int i;.    Loo
3890: 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20  kasideSlot *p;. 
38a0: 20 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20     assert( sz > 
38b0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b  (int)sizeof(Look
38c0: 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20  asideSlot*) );. 
38d0: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
38e0: 65 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20  eSlot*)pStart;. 
38f0: 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20     for(i=cnt-1; 
3900: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
3910: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
3920: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65  >lookaside.pFree
3930: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  ;.      db->look
3940: 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b  aside.pFree = p;
3950: 0a 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b  .      p = (Look
3960: 61 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38  asideSlot*)&((u8
3970: 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a  *)p)[sz];.    }.
3980: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
3990: 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20  e.pEnd = p;.    
39a0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
39b0: 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  nabled = 1;.    
39c0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
39d0: 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d  alloced = pBuf==
39e0: 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b  0 ?1:0;.  }else{
39f0: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
3a00: 64 65 2e 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20  de.pEnd = 0;.   
3a10: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
3a20: 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20  Enabled = 0;.   
3a30: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
3a40: 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20  Malloced = 0;.  
3a50: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
3a60: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
3a70: 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20  eturn the mutex 
3a80: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3a90: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
3aa0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65  ction..*/.sqlite
3ab0: 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33  3_mutex *sqlite3
3ac0: 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65  _db_mutex(sqlite
3ad0: 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  3 *db){.  return
3ae0: 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f   db->mutex;.}../
3af0: 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69  *.** Configurati
3b00: 6f 6e 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20  on settings for 
3b10: 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20 64 61  an individual da
3b20: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
3b30: 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  n.*/.int sqlite3
3b40: 5f 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74  _db_config(sqlit
3b50: 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20  e3 *db, int op, 
3b60: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
3b70: 61 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ap;.  int rc;.  
3b80: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29  va_start(ap, op)
3b90: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
3ba0: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
3bb0: 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41  E_DBCONFIG_LOOKA
3bc0: 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f  SIDE: {.      vo
3bd0: 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f 61 72  id *pBuf = va_ar
3be0: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
3bf0: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f      int sz = va_
3c00: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3c10: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76 61      int cnt = va
3c20: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3c30: 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c       rc = setupL
3c40: 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75  ookaside(db, pBu
3c50: 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20  f, sz, cnt);.   
3c60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3c70: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
3c80: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
3c90: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
3ca0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
3cb0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
3cc0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
3cd0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
3ce0: 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b  if the buffer z[
3cf0: 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  0..n-1] contains
3d00: 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a   all spaces..*/.
3d10: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70  static int allSp
3d20: 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  aces(const char 
3d30: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68  *z, int n){.  wh
3d40: 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
3d50: 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20  1]==' ' ){ n--; 
3d60: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b  }.  return n==0;
3d70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
3d80: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
3d90: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
3da0: 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20   named "BINARY" 
3db0: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a  which is always.
3dc0: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ** available..**
3dd0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c  .** If the padFl
3de0: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ag argument is n
3df0: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61  ot NULL then spa
3e00: 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68  ce padding at th
3e10: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69  e end.** of stri
3e20: 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ngs is ignored. 
3e30: 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73   This implements
3e40: 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61   the RTRIM colla
3e50: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
3e60: 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28  int binCollFunc(
3e70: 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67  .  void *padFlag
3e80: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
3e90: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
3ea0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
3eb0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
3ec0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
3ed0: 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
3ee0: 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
3ef0: 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d  y2;.  rc = memcm
3f00: 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  p(pKey1, pKey2, 
3f10: 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
3f20: 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c  ){.    if( padFl
3f30: 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  ag.     && allSp
3f40: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
3f50: 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a  y1)+n, nKey1-n).
3f60: 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65       && allSpace
3f70: 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29  s(((char*)pKey2)
3f80: 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20  +n, nKey2-n).   
3f90: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61   ){.      /* Lea
3fa0: 76 65 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20  ve rc unchanged 
3fb0: 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  at 0 */.    }els
3fc0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b  e{.      rc = nK
3fd0: 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20  ey1 - nKey2;.   
3fe0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3ff0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  rc;.}../*.** Ano
4000: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
4010: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
4020: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
4030: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
4040: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
4050: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
4060: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
4070: 6e 64 61 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndant.** compari
4080: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
4090: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
40a0: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
40b0: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
40c0: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
40d0: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
40e0: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
40f0: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
4100: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
4110: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
4120: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
4130: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
4140: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
4150: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
4160: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
4170: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
4180: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
4190: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
41a0: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
41b0: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
41c0: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
41d0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
41e0: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
41f0: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
4200: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
4210: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
4220: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
4230: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
4240: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
4250: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
4260: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
4270: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
4280: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
4290: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
42a0: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
42b0: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
42c0: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
42d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
42e0: 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  lastRowid;.}../*
42f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
4300: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
4310: 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   in the most rec
4320: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
4330: 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69  te3_exec()..*/.i
4340: 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  nt sqlite3_chang
4350: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
4360: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
4370: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
4380: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
4390: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
43a0: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
43b0: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
43c0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
43d0: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
43e0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
43f0: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61  return db->nTota
4400: 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  lChange;.}../*.*
4410: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e  * Close all open
4420: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69   savepoints. Thi
4430: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
4440: 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c  manipulates fiel
4450: 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ds of the.** dat
4460: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a  abase handle obj
4470: 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  ect, it does not
4480: 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70   close any savep
4490: 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62  oints that may b
44a0: 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65  e open.** at the
44b0: 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65   b-tree/pager le
44c0: 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  vel..*/.void sql
44d0: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
44e0: 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
44f0: 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70  {.  while( db->p
4500: 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
4510: 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70   Savepoint *pTmp
4520: 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
4530: 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65  t;.    db->pSave
4540: 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e  point = pTmp->pN
4550: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
4560: 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29  DbFree(db, pTmp)
4570: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76  ;.  }.  db->nSav
4580: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62  epoint = 0;.  db
4590: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
45a0: 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61  ;.  db->isTransa
45b0: 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
45c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
45d0: 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53  se an existing S
45e0: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a  QLite database.*
45f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  /.int sqlite3_cl
4600: 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ose(sqlite3 *db)
4610: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
4620: 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 69 66 28  .  int j;..  if(
4630: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
4640: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
4650: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
4660: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
4670: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
4680: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
4690: 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  USE;.  }.  sqlit
46a0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
46b0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 73 71  b->mutex);..  sq
46c0: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
46d0: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  alSchema(db, 0);
46e0: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e  ..  /* If a tran
46f0: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c  saction is open,
4700: 20 74 68 65 20 52 65 73 65 74 49 6e 74 65 72 6e   the ResetIntern
4710: 61 6c 53 63 68 65 6d 61 28 29 20 63 61 6c 6c 20  alSchema() call 
4720: 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  above.  ** will 
4730: 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20  not have called 
4740: 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28  the xDisconnect(
4750: 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20  ) method on any 
4760: 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62  virtual.  ** tab
4770: 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61  les in the db->a
4780: 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20  VTrans[] array. 
4790: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  The following sq
47a0: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
47b0: 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69  k().  ** call wi
47c0: 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65  ll do so. We nee
47d0: 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66  d to do this bef
47e0: 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f  ore the check fo
47f0: 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51  r active.  ** SQ
4800: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c  L statements bel
4810: 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62  ow, as the v-tab
4820: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
4830: 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67  n may be storing
4840: 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61  .  ** some prepa
4850: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69  red statements i
4860: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
4870: 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c    sqlite3VtabRol
4880: 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a  lback(db);..  /*
4890: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
48a0: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 56 4d  y outstanding VM
48b0: 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
48c0: 5f 42 55 53 59 2e 20 2a 2f 0a 20 20 69 66 28 20  _BUSY. */.  if( 
48d0: 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  db->pVdbe ){.   
48e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
48f0: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a  , SQLITE_BUSY, .
4900: 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20          "unable 
4910: 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20  to close due to 
4920: 75 6e 66 69 6e 61 6c 69 73 65 64 20 73 74 61 74  unfinalised stat
4930: 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 73 71  ements");.    sq
4940: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
4950: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
4960: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4970: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BUSY;.  }.  asse
4980: 72 74 28 20 73 71 6c 69 74 65 33 53 61 66 65 74  rt( sqlite3Safet
4990: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
49a0: 62 29 20 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30  b) );..  for(j=0
49b0: 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b  ; j<db->nDb; j++
49c0: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  ){.    Btree *pB
49d0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  t = db->aDb[j].p
49e0: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20  Bt;.    if( pBt 
49f0: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  && sqlite3BtreeI
4a00: 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29  sInBackup(pBt) )
4a10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
4a20: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
4a30: 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 20  BUSY, .         
4a40: 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73   "unable to clos
4a50: 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 69 73  e due to unfinis
4a60: 68 65 64 20 62 61 63 6b 75 70 20 6f 70 65 72 61  hed backup opera
4a70: 74 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 73 71  tion");.      sq
4a80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
4a90: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
4aa0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4ab0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
4ac0: 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  }..  /* Free any
4ad0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76   outstanding Sav
4ae0: 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65  epoint structure
4af0: 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  s. */.  sqlite3C
4b00: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
4b10: 62 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  b);..  for(j=0; 
4b20: 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b  j<db->nDb; j++){
4b30: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
4b40: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a  pDb = &db->aDb[j
4b50: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
4b60: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pBt ){.      sql
4b70: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
4b80: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Db->pBt);.      
4b90: 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20  pDb->pBt = 0;.  
4ba0: 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a      if( j!=1 ){.
4bb0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63          pDb->pSc
4bc0: 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  hema = 0;.      
4bd0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
4be0: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
4bf0: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  alSchema(db, 0);
4c00: 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20  ..  /* Tell the 
4c10: 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63  code in notify.c
4c20: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63   that the connec
4c30: 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68  tion no longer h
4c40: 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f  olds any.  ** lo
4c50: 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  cks and does not
4c60: 20 72 65 71 75 69 72 65 20 61 6e 79 20 66 75 72   require any fur
4c70: 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69  ther unlock-noti
4c80: 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20  fy callbacks..  
4c90: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  */.  sqlite3Conn
4ca0: 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29  ectionClosed(db)
4cb0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  ;..  assert( db-
4cc0: 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73  >nDb<=2 );.  ass
4cd0: 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62  ert( db->aDb==db
4ce0: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a 20  ->aDbStatic );. 
4cf0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61   for(j=0; j<Arra
4d00: 79 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e  ySize(db->aFunc.
4d10: 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75  a); j++){.    Fu
4d20: 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70  ncDef *pNext, *p
4d30: 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f  Hash, *p;.    fo
4d40: 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b  r(p=db->aFunc.a[
4d50: 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68 29 7b  j]; p; p=pHash){
4d60: 0a 20 20 20 20 20 20 70 48 61 73 68 20 3d 20 70  .      pHash = p
4d70: 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 20 20 77  ->pHash;.      w
4d80: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 20  hile( p ){.     
4d90: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
4da0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ext;.        sql
4db0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4dc0: 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70  );.        p = p
4dd0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
4de0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
4df0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
4e00: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20  &db->aCollSeq); 
4e10: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
4e20: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c  ext(i)){.    Col
4e30: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43  lSeq *pColl = (C
4e40: 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48  ollSeq *)sqliteH
4e50: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
4e60: 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65  /* Invoke any de
4e70: 73 74 72 75 63 74 6f 72 73 20 72 65 67 69 73 74  structors regist
4e80: 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69  ered for collati
4e90: 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 72  on sequence user
4ea0: 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f   data. */.    fo
4eb0: 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
4ec0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  {.      if( pCol
4ed0: 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20  l[j].xDel ){.   
4ee0: 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44       pColl[j].xD
4ef0: 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65  el(pColl[j].pUse
4f00: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
4f10: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
4f20: 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a  ree(db, pColl);.
4f30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
4f40: 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c  hClear(&db->aCol
4f50: 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53  lSeq);.#ifndef S
4f60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4f70: 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d  ALTABLE.  for(i=
4f80: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
4f90: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69  &db->aModule); i
4fa0: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
4fb0: 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75  xt(i)){.    Modu
4fc0: 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  le *pMod = (Modu
4fd0: 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  le *)sqliteHashD
4fe0: 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
4ff0: 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20 29  pMod->xDestroy )
5000: 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44  {.      pMod->xD
5010: 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75  estroy(pMod->pAu
5020: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  x);.    }.    sq
5030: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5040: 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pMod);.  }.  sql
5050: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
5060: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
5070: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72  dif..  sqlite3Er
5080: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
5090: 4b 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f  K, 0); /* Deallo
50a0: 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64  cates any cached
50b0: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20   error strings. 
50c0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 45 72  */.  if( db->pEr
50d0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
50e0: 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45  ValueFree(db->pE
50f0: 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  rr);.  }.  sqlit
5100: 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e  e3CloseExtension
5110: 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61  s(db);..  db->ma
5120: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
5130: 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20  IC_ERROR;..  /* 
5140: 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73  The temp-databas
5150: 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f  e schema is allo
5160: 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c  cated differentl
5170: 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  y from the other
5180: 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a   schema.  ** obj
5190: 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69  ects (using sqli
51a0: 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63  teMalloc() direc
51b0: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
51c0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
51d0: 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69  ma())..  ** So i
51e0: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
51f0: 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20  eed here. Todo: 
5200: 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65  Why not roll the
5210: 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74   temp schema int
5220: 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20  o.  ** the same 
5230: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
5240: 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61  s the one that a
5250: 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61 74  llocates the dat
5260: 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75  abase .  ** stru
5270: 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71  cture?.  */.  sq
5280: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5290: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
52a0: 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ma);.  sqlite3_m
52b0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
52c0: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67  utex);.  db->mag
52d0: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
52e0: 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69  C_CLOSED;.  sqli
52f0: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64  te3_mutex_free(d
5300: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
5310: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
5320: 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f  de.nOut==0 );  /
5330: 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f  * Fails on a loo
5340: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65  kaside memory le
5350: 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  ak */.  if( db->
5360: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
5370: 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ced ){.    sqlit
5380: 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b  e3_free(db->look
5390: 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20  aside.pStart);. 
53a0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
53b0: 5f 45 4e 41 42 4c 45 5f 53 51 4c 52 52 0a 20 20  _ENABLE_SQLRR.  
53c0: 53 52 52 65 63 43 6c 6f 73 65 28 64 62 29 3b 0a  SRRecClose(db);.
53d0: 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 71 6c 69  #endif.  .  sqli
53e0: 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20  te3_free(db);.  
53f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5400: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
5410: 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ack all database
5420: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20   files..*/.void 
5430: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
5440: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ll(sqlite3 *db){
5450: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
5460: 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 61  inTrans = 0;.  a
5470: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5480: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
5490: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
54a0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
54b0: 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  oc();.  for(i=0;
54c0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
54d0: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44  {.    if( db->aD
54e0: 62 5b 69 5d 2e 70 42 74 20 29 7b 0a 20 20 20 20  b[i].pBt ){.    
54f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
5500: 65 65 49 73 49 6e 54 72 61 6e 73 28 64 62 2d 3e  eeIsInTrans(db->
5510: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20  aDb[i].pBt) ){. 
5520: 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d         inTrans =
5530: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
5540: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
5550: 6c 6c 62 61 63 6b 28 64 62 2d 3e 61 44 62 5b 69  llback(db->aDb[i
5560: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20 20 64 62  ].pBt);.      db
5570: 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72 61 6e 73  ->aDb[i].inTrans
5580: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
5590: 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c    sqlite3VtabRol
55a0: 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c  lback(db);.  sql
55b0: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
55c0: 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 64 62  loc();..  if( db
55d0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49  ->flags&SQLITE_I
55e0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a  nternChanges ){.
55f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
5600: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
5610: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  nts(db);.    sql
5620: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
5630: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
5640: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65    }..  /* Any de
5650: 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
5660: 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76  t violations hav
5670: 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c  e now been resol
5680: 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44  ved. */.  db->nD
5690: 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b  eferredCons = 0;
56a0: 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61  ..  /* If one ha
56b0: 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65  s been configure
56c0: 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f  d, invoke the ro
56d0: 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c  llback-hook call
56e0: 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62  back */.  if( db
56f0: 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
5700: 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20  ack && (inTrans 
5710: 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  || !db->autoComm
5720: 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78  it) ){.    db->x
5730: 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
5740: 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72  (db->pRollbackAr
5750: 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  g);.  }.}../*.**
5760: 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63   Return a static
5770: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
5780: 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20  cribes the kind 
5790: 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69  of error specifi
57a0: 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67  ed in the.** arg
57b0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ument..*/.const 
57c0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72  char *sqlite3Err
57d0: 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73  Str(int rc){.  s
57e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
57f0: 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d  * const aMsg[] =
5800: 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45   {.    /* SQLITE
5810: 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20  _OK          */ 
5820: 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a  "not an error",.
5830: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52      /* SQLITE_ER
5840: 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51  ROR       */ "SQ
5850: 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72  L logic error or
5860: 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61 73   missing databas
5870: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
5880: 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f  E_INTERNAL    */
5890: 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54   0,.    /* SQLIT
58a0: 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f  E_PERM        */
58b0: 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73 73   "access permiss
58c0: 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20  ion denied",.   
58d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54   /* SQLITE_ABORT
58e0: 20 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62         */ "callb
58f0: 61 63 6b 20 72 65 71 75 65 73 74 65 64 20 71 75  ack requested qu
5900: 65 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20 20  ery abort",.    
5910: 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20  /* SQLITE_BUSY  
5920: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
5930: 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20  se is locked",. 
5940: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43     /* SQLITE_LOC
5950: 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74  KED      */ "dat
5960: 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c  abase table is l
5970: 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ocked",.    /* S
5980: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20  QLITE_NOMEM     
5990: 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d    */ "out of mem
59a0: 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ory",.    /* SQL
59b0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20  ITE_READONLY    
59c0: 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77  */ "attempt to w
59d0: 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20  rite a readonly 
59e0: 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f  database",.    /
59f0: 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  * SQLITE_INTERRU
5a00: 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75  PT   */ "interru
5a10: 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  pted",.    /* SQ
5a20: 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20  LITE_IOERR      
5a30: 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72   */ "disk I/O er
5a40: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
5a50: 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20  ITE_CORRUPT     
5a60: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69 73  */ "database dis
5a70: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
5a80: 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rmed",.    /* SQ
5a90: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20  LITE_NOTFOUND   
5aa0: 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51   */ 0,.    /* SQ
5ab0: 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20  LITE_FULL       
5ac0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72   */ "database or
5ad0: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a   disk is full",.
5ae0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41      /* SQLITE_CA
5af0: 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e  NTOPEN    */ "un
5b00: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
5b10: 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20  abase file",.   
5b20: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f   /* SQLITE_PROTO
5b30: 43 4f 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20  COL    */ 0,.   
5b40: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59   /* SQLITE_EMPTY
5b50: 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62 6c 65         */ "table
5b60: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
5b70: 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  a",.    /* SQLIT
5b80: 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20 2a 2f  E_SCHEMA      */
5b90: 20 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d   "database schem
5ba0: 61 20 68 61 73 20 63 68 61 6e 67 65 64 22 2c 0a  a has changed",.
5bb0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f      /* SQLITE_TO
5bc0: 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22 73 74  OBIG      */ "st
5bd0: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f  ring or blob too
5be0: 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51   big",.    /* SQ
5bf0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
5c00: 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74 20   */ "constraint 
5c10: 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20  failed",.    /* 
5c20: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20  SQLITE_MISMATCH 
5c30: 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70 65 20     */ "datatype 
5c40: 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f  mismatch",.    /
5c50: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  * SQLITE_MISUSE 
5c60: 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61 72 79       */ "library
5c70: 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20   routine called 
5c80: 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65 22  out of sequence"
5c90: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
5ca0: 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22  NOLFS       */ "
5cb0: 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f  large file suppo
5cc0: 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c  rt is disabled",
5cd0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41  .    /* SQLITE_A
5ce0: 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61  UTH        */ "a
5cf0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e  uthorization den
5d00: 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ied",.    /* SQL
5d10: 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20  ITE_FORMAT      
5d20: 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20 64 61  */ "auxiliary da
5d30: 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72  tabase format er
5d40: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
5d50: 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20  ITE_RANGE       
5d60: 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75  */ "bind or colu
5d70: 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20  mn index out of 
5d80: 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53  range",.    /* S
5d90: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20  QLITE_NOTADB    
5da0: 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 65 6e    */ "file is en
5db0: 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f  crypted or is no
5dc0: 74 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20  t a database",. 
5dd0: 20 7d 3b 0a 20 20 72 63 20 26 3d 20 30 78 66 66   };.  rc &= 0xff
5de0: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 72  ;.  if( ALWAYS(r
5df0: 63 3e 3d 30 29 20 26 26 20 72 63 3c 28 69 6e 74  c>=0) && rc<(int
5e00: 29 28 73 69 7a 65 6f 66 28 61 4d 73 67 29 2f 73  )(sizeof(aMsg)/s
5e10: 69 7a 65 6f 66 28 61 4d 73 67 5b 30 5d 29 29 20  izeof(aMsg[0])) 
5e20: 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29  && aMsg[rc]!=0 )
5e30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 4d 73  {.    return aMs
5e40: 67 5b 72 63 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g[rc];.  }else{.
5e50: 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e 6b 6e      return "unkn
5e60: 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 7d 0a  own error";.  }.
5e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5e80: 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
5e90: 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b   a busy callback
5ea0: 20 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64   that sleeps and
5eb0: 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20   tries.** again 
5ec0: 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20  until a timeout 
5ed0: 76 61 6c 75 65 20 69 73 20 72 65 61 63 68 65 64  value is reached
5ee0: 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76  .  The timeout v
5ef0: 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e  alue is.** an in
5f00: 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
5f10: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73  milliseconds pas
5f20: 73 65 64 20 69 6e 20 61 73 20 74 68 65 20 66 69  sed in as the fi
5f30: 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  rst.** argument.
5f40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5f50: 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79  qliteDefaultBusy
5f60: 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20  Callback(. void 
5f70: 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  *ptr,           
5f80: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
5f90: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69  connection */. i
5fa0: 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20  nt count        
5fb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5fc0: 72 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65  r of times table
5fd0: 20 68 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a   has been busy *
5fe0: 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.){.#if SQLITE_
5ff0: 4f 53 5f 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e  OS_WIN || (defin
6000: 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20  ed(HAVE_USLEEP) 
6010: 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 29 0a  && HAVE_USLEEP).
6020: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
6030: 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20  8 delays[] =.   
6040: 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c    { 1, 2, 5, 10,
6050: 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c   15, 20, 25, 25,
6060: 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20    25,  50,  50, 
6070: 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  100 };.  static 
6080: 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b  const u8 totals[
6090: 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c  ] =.     { 0, 1,
60a0: 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20   3,  8, 18, 33, 
60b0: 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38  53, 78, 103, 128
60c0: 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20  , 178, 228 };.# 
60d0: 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 28 73  define NDELAY (s
60e0: 69 7a 65 6f 66 28 64 65 6c 61 79 73 29 2f 73 69  izeof(delays)/si
60f0: 7a 65 6f 66 28 64 65 6c 61 79 73 5b 30 5d 29 29  zeof(delays[0]))
6100: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
6110: 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b   (sqlite3 *)ptr;
6120: 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d  .  int timeout =
6130: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
6140: 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70  ;.  int delay, p
6150: 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  rior;..  assert(
6160: 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69   count>=0 );.  i
6170: 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41  f( count < NDELA
6180: 59 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  Y ){.    delay =
6190: 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a   delays[count];.
61a0: 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61      prior = tota
61b0: 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c  ls[count];.  }el
61c0: 73 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20  se{.    delay = 
61d0: 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d  delays[NDELAY-1]
61e0: 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f  ;.    prior = to
61f0: 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b  tals[NDELAY-1] +
6200: 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e   delay*(count-(N
6210: 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20  DELAY-1));.  }. 
6220: 20 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c   if( prior + del
6230: 61 79 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a  ay > timeout ){.
6240: 20 20 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65      delay = time
6250: 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20  out - prior;.   
6260: 20 69 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20   if( delay<=0 ) 
6270: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
6280: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64  sqlite3OsSleep(d
6290: 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31  b->pVfs, delay*1
62a0: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
62b0: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
62c0: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
62d0: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69   *)ptr;.  int ti
62e0: 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65  meout = ((sqlite
62f0: 33 20 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69  3 *)ptr)->busyTi
6300: 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f  meout;.  if( (co
6310: 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69  unt+1)*1000 > ti
6320: 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74  meout ){.    ret
6330: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
6340: 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e  ite3OsSleep(db->
6350: 70 56 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a  pVfs, 1000000);.
6360: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
6370: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  if.}../*.** Invo
6380: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 62 75 73  ke the given bus
6390: 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a  y handler..**.**
63a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
63b0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
63c0: 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64  operation failed
63d0: 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a   with a lock..**
63e0: 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
63f0: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
6400: 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72  o, the lock is r
6410: 65 74 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a  etried.  If it.*
6420: 2a 20 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65  * returns 0, the
6430: 20 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74   operation abort
6440: 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45  s with an SQLITE
6450: 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a  _BUSY error..*/.
6460: 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  int sqlite3Invok
6470: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73  eBusyHandler(Bus
6480: 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20  yHandler *p){.  
6490: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45  int rc;.  if( NE
64a0: 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e  VER(p==0) || p->
64b0: 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e  xFunc==0 || p->n
64c0: 42 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20  Busy<0 ) return 
64d0: 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75  0;.  rc = p->xFu
64e0: 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e  nc(p->pArg, p->n
64f0: 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d  Busy);.  if( rc=
6500: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75  =0 ){.    p->nBu
6510: 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  sy = -1;.  }else
6520: 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b  {.    p->nBusy++
6530: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6540: 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c; .}../*.** Thi
6550: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
6560: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
6570: 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64   for an Sqlite d
6580: 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a  atabase to the.*
6590: 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  * given callback
65a0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
65b0: 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e  he given argumen
65c0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
65d0: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a  3_busy_handler(.
65e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
65f0: 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f   int (*xBusy)(vo
6600: 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  id*,int),.  void
6610: 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69   *pArg.){.  sqli
6620: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
6630: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
6640: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 46  ->busyHandler.xF
6650: 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a 20 20 64  unc = xBusy;.  d
6660: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70  b->busyHandler.p
6670: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62  Arg = pArg;.  db
6680: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42  ->busyHandler.nB
6690: 75 73 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  usy = 0;.  sqlit
66a0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
66b0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
66c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
66d0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
66e0: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
66f0: 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68  ALLBACK./*.** Th
6700: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
6710: 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  the progress cal
6720: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
6730: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
6740: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
6750: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
6760: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
6770: 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67  gument. The prog
6780: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69  ress callback wi
6790: 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ll.** be invoked
67a0: 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f   every nOps opco
67b0: 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  des..*/.void sql
67c0: 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
67d0: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
67e0: 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70   *db, .  int nOp
67f0: 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67  s,.  int (*xProg
6800: 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20  ress)(void*), . 
6810: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
6820: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
6830: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
6840: 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b  .  if( nOps>0 ){
6850: 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65  .    db->xProgre
6860: 73 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a  ss = xProgress;.
6870: 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73      db->nProgres
6880: 73 4f 70 73 20 3d 20 6e 4f 70 73 3b 0a 20 20 20  sOps = nOps;.   
6890: 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72   db->pProgressAr
68a0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73  g = pArg;.  }els
68b0: 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67  e{.    db->xProg
68c0: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62  ress = 0;.    db
68d0: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d  ->nProgressOps =
68e0: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f   0;.    db->pPro
68f0: 67 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20  gressArg = 0;.  
6900: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
6910: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
6920: 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  x);.}.#endif.../
6930: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6940: 65 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66  e installs a def
6950: 61 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65  ault busy handle
6960: 72 20 74 68 61 74 20 77 61 69 74 73 20 66 6f 72  r that waits for
6970: 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65   the.** specifie
6980: 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  d number of mill
6990: 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20  iseconds before 
69a0: 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a  returning 0..*/.
69b0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79  int sqlite3_busy
69c0: 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33  _timeout(sqlite3
69d0: 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 20   *db, int ms){. 
69e0: 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20   if( ms>0 ){.   
69f0: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
6a00: 20 3d 20 6d 73 3b 0a 20 20 20 20 73 71 6c 69 74   = ms;.    sqlit
6a10: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
6a20: 64 62 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c  db, sqliteDefaul
6a30: 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28  tBusyCallback, (
6a40: 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 7d 65 6c  void*)db);.  }el
6a50: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
6a60: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c  busy_handler(db,
6a70: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   0, 0);.  }.  re
6a80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61  }../*.** Cause a
6aa0: 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61  ny pending opera
6ab0: 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20  tion to stop at 
6ac0: 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70  its earliest opp
6ad0: 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69  ortunity..*/.voi
6ae0: 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  d sqlite3_interr
6af0: 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  upt(sqlite3 *db)
6b00: 7b 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74  {.  db->u1.isInt
6b10: 65 72 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a  errupted = 1;.}.
6b20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
6b30: 63 74 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79  ction is exactly
6b40: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
6b50: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
6b60: 74 69 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a  tion(), except.*
6b70: 2a 20 74 68 61 74 20 69 74 20 69 73 20 64 65 73  * that it is des
6b80: 69 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c  igned to be call
6b90: 65 64 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63  ed by internal c
6ba0: 6f 64 65 2e 20 54 68 65 20 64 69 66 66 65 72 65  ode. The differe
6bb0: 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69  nce is.** that i
6bc0: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  f a malloc() fai
6bd0: 6c 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72  ls in sqlite3_cr
6be0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c  eate_function(),
6bf0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a   an error code.*
6c00: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  * is returned an
6c10: 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c  d the mallocFail
6c20: 65 64 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e  ed flag cleared.
6c30: 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
6c40: 43 72 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71  CreateFunc(.  sq
6c50: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
6c60: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69  st char *zFuncti
6c70: 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41  onName,.  int nA
6c80: 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20  rg,.  int enc,. 
6c90: 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61   void *pUserData
6ca0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63  ,.  void (*xFunc
6cb0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
6cc0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
6cd0: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
6ce0: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
6cf0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
6d00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
6d10: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
6d20: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
6d30: 78 74 2a 29 0a 29 7b 0a 20 20 46 75 6e 63 44 65  xt*).){.  FuncDe
6d40: 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  f *p;.  int nNam
6d50: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
6d60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6d70: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
6d80: 20 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61   if( zFunctionNa
6d90: 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28  me==0 ||.      (
6da0: 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c  xFunc && (xFinal
6db0: 20 7c 7c 20 78 53 74 65 70 29 29 20 7c 7c 20 0a   || xStep)) || .
6dc0: 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26 26        (!xFunc &&
6dd0: 20 28 78 46 69 6e 61 6c 20 26 26 20 21 78 53 74   (xFinal && !xSt
6de0: 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 21  ep)) ||.      (!
6df0: 78 46 75 6e 63 20 26 26 20 28 21 78 46 69 6e 61  xFunc && (!xFina
6e00: 6c 20 26 26 20 78 53 74 65 70 29 29 20 7c 7c 0a  l && xStep)) ||.
6e10: 20 20 20 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c        (nArg<-1 |
6e20: 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41  | nArg>SQLITE_MA
6e30: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20  X_FUNCTION_ARG) 
6e40: 7c 7c 0a 20 20 20 20 20 20 28 32 35 35 3c 28 6e  ||.      (255<(n
6e50: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
6e60: 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f  rlen30( zFunctio
6e70: 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20  nName))) ){.    
6e80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
6e90: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 0a 23 69 66  SUSE;.  }.  .#if
6ea0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6eb0: 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53  _UTF16.  /* If S
6ec0: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73  QLITE_UTF16 is s
6ed0: 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20  pecified as the 
6ee0: 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74  encoding type, t
6ef0: 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20  ransform this.  
6f00: 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c  ** to one of SQL
6f10: 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
6f20: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73  QLITE_UTF16BE us
6f30: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  ing the.  ** SQL
6f40: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
6f50: 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54  macro. SQLITE_UT
6f60: 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20  F16 is not used 
6f70: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a  internally..  **
6f80: 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  ** If SQLITE_
6f90: 41 4e 59 20 69 73 20 73 70 65 63 69 66 69 65 64  ANY is specified
6fa0: 2c 20 61 64 64 20 74 68 72 65 65 20 76 65 72 73  , add three vers
6fb0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63  ions of the func
6fc0: 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tion.  ** to the
6fd0: 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a   hash table..  *
6fe0: 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c  /.  if( enc==SQL
6ff0: 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20  ITE_UTF16 ){.   
7000: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
7010: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c  F16NATIVE;.  }el
7020: 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49  se if( enc==SQLI
7030: 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e  TE_ANY ){.    in
7040: 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  t rc;.    rc = s
7050: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
7060: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
7070: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
7080: 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20  _UTF8,.         
7090: 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63  pUserData, xFunc
70a0: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 29  , xStep, xFinal)
70b0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
70c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
70d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
70e0: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
70f0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
7100: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
7110: 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72  .          pUser
7120: 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74  Data, xFunc, xSt
7130: 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 20  ep, xFinal);.   
7140: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
7150: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7160: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
7170: 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c   }.    enc = SQL
7180: 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d  ITE_UTF16BE;.  }
7190: 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53  .#else.  enc = S
71a0: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64  QLITE_UTF8;.#end
71b0: 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  if.  .  /* Check
71c0: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
71d0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
71e0: 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20  g overridden or 
71f0: 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a  deleted. If so,.
7200: 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61    ** and there a
7210: 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74  re active VMs, t
7220: 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
7230: 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e  E_BUSY. If a fun
7240: 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65  ction.  ** is be
7250: 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64  ing overridden/d
7260: 65 6c 65 74 65 64 20 62 75 74 20 74 68 65 72 65  eleted but there
7270: 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
7280: 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20  Ms, allow the.  
7290: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
72a0: 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76  continue but inv
72b0: 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63  alidate all prec
72c0: 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
72d0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73  ts..  */.  p = s
72e0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
72f0: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
7300: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
7310: 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a  g, (u8)enc, 0);.
7320: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 50    if( p && p->iP
7330: 72 65 66 45 6e 63 3d 3d 65 6e 63 20 26 26 20 70  refEnc==enc && p
7340: 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a  ->nArg==nArg ){.
7350: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 63 74 69      if( db->acti
7360: 76 65 56 64 62 65 43 6e 74 20 29 7b 0a 20 20 20  veVdbeCnt ){.   
7370: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
7380: 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
7390: 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c   .        "unabl
73a0: 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69  e to delete/modi
73b0: 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e  fy user-function
73c0: 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73   due to active s
73d0: 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
73e0: 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
73f0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
7400: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7410: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65  ITE_BUSY;.    }e
7420: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
7430: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
7440: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
7450: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d      }.  }..  p =
7460: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
7470: 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69  tion(db, zFuncti
7480: 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e  onName, nName, n
7490: 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29  Arg, (u8)enc, 1)
74a0: 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20  ;.  assert(p || 
74b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
74c0: 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
74d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
74e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d  _NOMEM;.  }.  p-
74f0: 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 2d  >flags = 0;.  p-
7500: 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a  >xFunc = xFunc;.
7510: 20 20 70 2d 3e 78 53 74 65 70 20 3d 20 78 53 74    p->xStep = xSt
7520: 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69  ep;.  p->xFinali
7530: 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70  ze = xFinal;.  p
7540: 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 55  ->pUserData = pU
7550: 73 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41  serData;.  p->nA
7560: 72 67 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a  rg = (u16)nArg;.
7570: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7580: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
7590: 61 74 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e  ate new user fun
75a0: 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ctions..*/.int s
75b0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
75c0: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
75d0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
75e0: 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61  har *zFunctionNa
75f0: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  me,.  int nArg,.
7600: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
7610: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
7620: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
7630: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
7640: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
7650: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
7660: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
7670: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
7680: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
7690: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
76a0: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e  ontext*).){.  in
76b0: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
76c0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
76d0: 6d 75 74 65 78 29 3b 0a 20 20 72 63 20 3d 20 73  mutex);.  rc = s
76e0: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
76f0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
7700: 6d 65 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70  me, nArg, enc, p
7710: 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20  , xFunc, xStep, 
7720: 78 46 69 6e 61 6c 29 3b 0a 20 20 72 63 20 3d 20  xFinal);.  rc = 
7730: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
7740: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
7750: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
7760: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
7770: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
7780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
7790: 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  F16.int sqlite3_
77a0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31  create_function1
77b0: 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
77c0: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
77d0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
77e0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
77f0: 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69   eTextRep,.  voi
7800: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
7810: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
7820: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
7830: 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76  e3_value**),.  v
7840: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
7850: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
7860: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
7870: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
7880: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
7890: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  text*).){.  int 
78a0: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e  rc;.  char *zFun
78b0: 63 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c8;.  sqlite3_mu
78c0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
78d0: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
78e0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
78f0: 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20  d );.  zFunc8 = 
7900: 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28  sqlite3Utf16to8(
7910: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
7920: 65 2c 20 2d 31 29 3b 0a 20 20 72 63 20 3d 20 73  e, -1);.  rc = s
7930: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
7940: 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72  (db, zFunc8, nAr
7950: 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20  g, eTextRep, p, 
7960: 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  xFunc, xStep, xF
7970: 69 6e 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  inal);.  sqlite3
7980: 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63  DbFree(db, zFunc
7990: 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  8);.  rc = sqlit
79a0: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
79b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
79c0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
79d0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
79e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
79f0: 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20  ** Declare that 
7a00: 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  a function has b
7a10: 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62  een overloaded b
7a20: 79 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  y a virtual tabl
7a30: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
7a40: 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  function already
7a50: 20 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67   exists as a reg
7a60: 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ular global func
7a70: 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tion, then.** th
7a80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
7a90: 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66  no-op.  If the f
7aa0: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
7ab0: 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65   exist, then cre
7ac0: 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65  ate.** a new one
7ad0: 20 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72   that always thr
7ae0: 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65  ows a run-time e
7af0: 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  rror.  .**.** Wh
7b00: 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  en virtual table
7b10: 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76  s intend to prov
7b20: 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65  ide an overloade
7b30: 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79  d function, they
7b40: 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  .** should call 
7b50: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
7b60: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c  make sure the gl
7b70: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78  obal function ex
7b80: 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61  ists..** A globa
7b90: 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  l function must 
7ba0: 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66  exist in order f
7bb0: 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  or name resoluti
7bc0: 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72  on to work.** pr
7bd0: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  operly..*/.int s
7be0: 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
7bf0: 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
7c00: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
7c10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
7c20: 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e  int nArg.){.  in
7c30: 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t nName = sqlite
7c40: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
7c50: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  ;.  int rc;.  sq
7c60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
7c70: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
7c80: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46  if( sqlite3FindF
7c90: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  unction(db, zNam
7ca0: 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  e, nName, nArg, 
7cb0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d  SQLITE_UTF8, 0)=
7cc0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
7cd0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
7ce0: 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  zName, nArg, SQL
7cf0: 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 30 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69  0, sqlite3Invali
7d20: 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29  dFunction, 0, 0)
7d30: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
7d40: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
7d50: 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71  SQLITE_OK);.  sq
7d60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
7d70: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
7d80: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
7d90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7da0: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65  T_TRACE./*.** Re
7db0: 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66  gister a trace f
7dc0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
7dd0: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
7de0: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
7df0: 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65  d trace.** is re
7e00: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
7e10: 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e  A NULL trace fun
7e20: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
7e30: 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65   no tracing is e
7e40: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
7e50: 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73  NULL.** trace is
7e60: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
7e70: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
7e80: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
7e90: 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a  start of each.**
7ea0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
7eb0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
7ec0: 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a  _trace(sqlite3 *
7ed0: 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63  db, void (*xTrac
7ee0: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
7ef0: 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
7f00: 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  g){.  void *pOld
7f10: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
7f20: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
7f30: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
7f40: 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62  >pTraceArg;.  db
7f50: 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63  ->xTrace = xTrac
7f60: 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
7f70: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
7f80: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
7f90: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
7fa0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a  eturn pOld;.}./*
7fb0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70  .** Register a p
7fc0: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e  rofile function.
7fd0: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
7fe0: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
7ff0: 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72  egistered .** pr
8000: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69  ofile function i
8010: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
8020: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69  .** A NULL profi
8030: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  le function mean
8040: 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c  s that no profil
8050: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
8060: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
8070: 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69  profile is a poi
8080: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
8090: 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
80a0: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
80b0: 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20  sion of.** each 
80c0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68  SQL statement th
80d0: 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f  at is run..*/.vo
80e0: 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66  id *sqlite3_prof
80f0: 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ile(.  sqlite3 *
8100: 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72  db,.  void (*xPr
8110: 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  ofile)(void*,con
8120: 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f  st char*,sqlite_
8130: 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  uint64),.  void 
8140: 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20  *pArg.){.  void 
8150: 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  *pOld;.  sqlite3
8160: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
8170: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
8180: 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72  = db->pProfileAr
8190: 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c  g;.  db->xProfil
81a0: 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20  e = xProfile;.  
81b0: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20  db->pProfileArg 
81c0: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
81d0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
81e0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
81f0: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69  rn pOld;.}.#endi
8200: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
8210: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 20  _TRACE */../*** 
8220: 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 2a 2a 2a  EXPERIMENTAL ***
8230: 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  .**.** Register 
8240: 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  a function to be
8250: 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20   invoked when a 
8260: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
8270: 65 6e 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ents..** If the 
8280: 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e  invoked function
8290: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
82a0: 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d  o, then the comm
82b0: 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20  it becomes a.** 
82c0: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  rollback..*/.voi
82d0: 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69  d *sqlite3_commi
82e0: 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  t_hook(.  sqlite
82f0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
8300: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
8310: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
8320: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
8330: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
8340: 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69  id*),  /* Functi
8350: 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20  on to invoke on 
8360: 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  each commit */. 
8370: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
8380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
8390: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
83a0: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
83b0: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c  oid *pOld;.  sql
83c0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
83d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
83e0: 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69  Old = db->pCommi
83f0: 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d  tArg;.  db->xCom
8400: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  mitCallback = xC
8410: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
8420: 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67  CommitArg = pArg
8430: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
8440: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
8450: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
8460: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  d;.}../*.** Regi
8470: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
8480: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
8490: 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73  ch time a row is
84a0: 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73   updated,.** ins
84b0: 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64  erted or deleted
84c0: 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61   using this data
84d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
84e0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
84f0: 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20  3_update_hook(. 
8500: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
8510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
8520: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
8530: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
8540: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
8550: 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  back)(void*,int,
8560: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61  char const *,cha
8570: 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65  r const *,sqlite
8580: 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  _int64),.  void 
8590: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
85a0: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
85b0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
85c0: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
85d0: 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Ret;.  sqlite3_m
85e0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
85f0: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
8600: 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a  db->pUpdateArg;.
8610: 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c    db->xUpdateCal
8620: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
8630: 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65  k;.  db->pUpdate
8640: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
8650: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
8660: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
8670: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
8680: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
8690: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
86a0: 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
86b0: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
86c0: 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  is rolled.** bac
86d0: 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  k by this databa
86e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
86f0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
8700: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20  rollback_hook(. 
8710: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
8720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
8730: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
8740: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
8750: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
8760: 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a  back)(void*), /*
8770: 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   Callback functi
8780: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  on */.  void *pA
8790: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
87a0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
87b0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
87c0: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
87d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
87e0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
87f0: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
8800: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20  >pRollbackArg;. 
8810: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
8820: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
8830: 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62  ck;.  db->pRollb
8840: 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ackArg = pArg;. 
8850: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
8860: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
8870: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
8880: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
8890: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
88a0: 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f  rue if main-memo
88b0: 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  ry should be use
88c0: 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
88d0: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
88e0: 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70   for transient p
88f0: 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73  ager files and s
8900: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
8910: 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  s..** The value 
8920: 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73  returned depends
8930: 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
8940: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
8950: 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61  (runtime.** para
8960: 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63  meter) and the c
8970: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75  ompile time valu
8980: 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  e of SQLITE_TEMP
8990: 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66  _STORE. The.** f
89a0: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
89b0: 65 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c  escribes the rel
89c0: 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65  ationship betwee
89d0: 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75  n these two valu
89e0: 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66  es.** and this f
89f0: 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
8a00: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  value..**.**   S
8a10: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
8a20: 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74       db->temp_st
8a30: 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e  ore     Location
8a40: 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61   of temporary da
8a50: 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d  tabase.**   ----
8a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
8a70: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
8a80: 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
8a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8aa0: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
8ac0: 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
8ad0: 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
8ae0: 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20  urn 0).**   1   
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b00: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
8b10: 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
8b20: 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31  return 0).**   1
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b40: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
8b50: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
8b60: 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
8b70: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
8b80: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
8b90: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
8ba0: 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
8bb0: 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
8bc0: 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
8bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
8be0: 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
8bf0: 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  0).**   2       
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c20: 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
8c30: 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 1).**   2    
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c50: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
8c60: 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
8c70: 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20  eturn 1).**   3 
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c90: 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
8ca0: 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
8cb0: 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69   (return 1).*/.i
8cc0: 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  nt sqlite3TempIn
8cd0: 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c  Memory(const sql
8ce0: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53  ite3 *db){.#if S
8cf0: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
8d00: 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==1.  return ( d
8d10: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32  b->temp_store==2
8d20: 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
8d30: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
8d40: 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==2.  return ( d
8d50: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31  b->temp_store!=1
8d60: 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
8d70: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
8d80: 3d 3d 33 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ==3.  return 1;.
8d90: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
8da0: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c  E_TEMP_STORE<1 |
8db0: 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  | SQLITE_TEMP_ST
8dc0: 4f 52 45 3e 33 0a 20 20 72 65 74 75 72 6e 20 30  ORE>3.  return 0
8dd0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
8de0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8df0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
8e00: 74 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  te a connection 
8e10: 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 42 54  to a database BT
8e20: 72 65 65 0a 2a 2a 20 64 72 69 76 65 72 2e 20 20  ree.** driver.  
8e30: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
8e40: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 66 69  the name of a fi
8e50: 6c 65 2c 20 74 68 65 6e 20 74 68 61 74 20 66 69  le, then that fi
8e60: 6c 65 20 69 73 0a 2a 2a 20 6f 70 65 6e 65 64 20  le is.** opened 
8e70: 61 6e 64 20 75 73 65 64 2e 20 20 49 66 20 7a 46  and used.  If zF
8e80: 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6d  ilename is the m
8e90: 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f  agic name ":memo
8ea0: 72 79 3a 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ry:" then.** the
8eb0: 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 6f   database is sto
8ec0: 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 28 61  red in memory (a
8ed0: 6e 64 20 69 73 20 74 68 75 73 20 66 6f 72 67 6f  nd is thus forgo
8ee0: 74 74 65 6e 20 61 73 20 73 6f 6f 6e 20 61 73 0a  tten as soon as.
8ef0: 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ** the connectio
8f00: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 29 20 20 49  n is closed.)  I
8f10: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
8f20: 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ULL then the dat
8f30: 61 62 61 73 65 0a 2a 2a 20 69 73 20 61 20 22 76  abase.** is a "v
8f40: 69 72 74 75 61 6c 22 20 64 61 74 61 62 61 73 65  irtual" database
8f50: 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 75   for transient u
8f60: 73 65 20 6f 6e 6c 79 20 61 6e 64 20 69 73 20 64  se only and is d
8f70: 65 6c 65 74 65 64 20 61 73 0a 2a 2a 20 73 6f 6f  eleted as.** soo
8f80: 6e 20 61 73 20 74 68 65 20 63 6f 6e 6e 65 63 74  n as the connect
8f90: 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  ion is closed..*
8fa0: 2a 0a 2a 2a 20 41 20 76 69 72 74 75 61 6c 20 64  *.** A virtual d
8fb0: 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 65  atabase can be e
8fc0: 69 74 68 65 72 20 61 20 64 69 73 6b 20 66 69 6c  ither a disk fil
8fd0: 65 20 28 74 68 61 74 20 69 73 20 61 75 74 6f 6d  e (that is autom
8fe0: 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 64 65 6c 65  atically.** dele
8ff0: 74 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 6c  ted when the fil
9000: 65 20 69 73 20 63 6c 6f 73 65 64 29 20 6f 72 20  e is closed) or 
9010: 69 74 20 61 6e 20 62 65 20 68 65 6c 64 20 65 6e  it an be held en
9020: 74 69 72 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79  tirely in memory
9030: 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  ..** The sqlite3
9040: 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 29 20 66  TempInMemory() f
9050: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
9060: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69  to determine whi
9070: 63 68 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ch..*/.int sqlit
9080: 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 0a  e3BtreeFactory(.
9090: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
90b0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 77 68 65  ain database whe
90c0: 6e 20 6f 70 65 6e 69 6e 67 20 61 75 78 20 6f 74  n opening aux ot
90d0: 68 65 72 77 69 73 65 20 30 20 2a 2f 0a 20 20 63  herwise 0 */.  c
90e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
90f0: 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  name,    /* Name
9100: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
9110: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
9120: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
9130: 69 6e 74 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c 2c  int omitJournal,
9140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20            /* if 
9150: 54 52 55 45 20 74 68 65 6e 20 64 6f 20 6e 6f 74  TRUE then do not
9160: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 66 69   journal this fi
9170: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 61 63  le */.  int nCac
9180: 68 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  he,             
9190: 20 20 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 70 61    /* How many pa
91a0: 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
91b0: 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 76  cache */.  int v
91c0: 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
91d0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
91e0: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
91f0: 76 66 73 4f 70 65 6e 20 2a 2f 0a 20 20 42 74 72  vfsOpen */.  Btr
9200: 65 65 20 2a 2a 70 70 42 74 72 65 65 20 20 20 20  ee **ppBtree    
9210: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
9220: 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
9230: 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
9240: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62  re */.){.  int b
9250: 74 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 69 6e  tFlags = 0;.  in
9260: 74 20 72 63 3b 0a 20 20 0a 20 20 61 73 73 65 72  t rc;.  .  asser
9270: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
9280: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
9290: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70   );.  assert( pp
92a0: 42 74 72 65 65 20 21 3d 20 30 29 3b 0a 20 20 69  Btree != 0);.  i
92b0: 66 28 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c 20 29  f( omitJournal )
92c0: 7b 0a 20 20 20 20 62 74 46 6c 61 67 73 20 7c 3d  {.    btFlags |=
92d0: 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
92e0: 4e 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  NAL;.  }.  if( d
92f0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
9300: 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  E_NoReadlock ){.
9310: 20 20 20 20 62 74 46 6c 61 67 73 20 7c 3d 20 42      btFlags |= B
9320: 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  TREE_NO_READLOCK
9330: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
9340: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
9350: 44 42 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  DB.  if( zFilena
9360: 6d 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  me==0 && sqlite3
9370: 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
9380: 20 29 7b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d   ){.    zFilenam
9390: 65 20 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a  e = ":memory:";.
93a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
93b0: 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  ( (vfsFlags & SQ
93c0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
93d0: 42 29 21 3d 30 20 26 26 20 28 7a 46 69 6c 65 6e  B)!=0 && (zFilen
93e0: 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 6c 65  ame==0 || *zFile
93f0: 6e 61 6d 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  name==0) ){.    
9400: 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46  vfsFlags = (vfsF
9410: 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f  lags & ~SQLITE_O
9420: 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53  PEN_MAIN_DB) | S
9430: 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
9440: 44 42 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  DB;.  }.  rc = s
9450: 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
9460: 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 73 71 6c 69  zFilename, (sqli
9470: 74 65 33 20 2a 29 64 62 2c 20 70 70 42 74 72 65  te3 *)db, ppBtre
9480: 65 2c 20 62 74 46 6c 61 67 73 2c 20 76 66 73 46  e, btFlags, vfsF
9490: 6c 61 67 73 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  lags);..  /* If 
94a0: 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73  the B-Tree was s
94b0: 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
94c0: 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65  ed, set the page
94d0: 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20  r-cache size to 
94e0: 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74  the.  ** default
94f0: 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20   value. Except, 
9500: 69 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 42  if the call to B
9510: 74 72 65 65 4f 70 65 6e 28 29 20 72 65 74 75 72  treeOpen() retur
9520: 6e 65 64 20 61 20 68 61 6e 64 6c 65 0a 20 20 2a  ned a handle.  *
9530: 2a 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 65 78 69  * open on an exi
9540: 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
9550: 65 72 2d 63 61 63 68 65 2c 20 64 6f 20 6e 6f 74  er-cache, do not
9560: 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   change the page
9570: 72 2d 63 61 63 68 65 20 0a 20 20 2a 2a 20 73 69  r-cache .  ** si
9580: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ze..  */.  if( r
9590: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
95a0: 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  0==sqlite3BtreeS
95b0: 63 68 65 6d 61 28 2a 70 70 42 74 72 65 65 2c 20  chema(*ppBtree, 
95c0: 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 73 71 6c  0, 0) ){.    sql
95d0: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
95e0: 65 53 69 7a 65 28 2a 70 70 42 74 72 65 65 2c 20  eSize(*ppBtree, 
95f0: 6e 43 61 63 68 65 29 3b 0a 20 20 7d 0a 20 20 72  nCache);.  }.  r
9600: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9610: 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20  ** Return UTF-8 
9620: 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20  encoded English 
9630: 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61  language explana
9640: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
9650: 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72   recent.** error
9660: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
9670: 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  *sqlite3_errmsg(
9680: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
9690: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
96a0: 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
96b0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
96c0: 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  rStr(SQLITE_NOME
96d0: 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  M);.  }.  if( !s
96e0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
96f0: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
9700: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
9710: 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
9720: 5f 4d 49 53 55 53 45 29 3b 0a 20 20 7d 0a 20 20  _MISUSE);.  }.  
9730: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
9740: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
9750: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
9760: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
9770: 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  = sqlite3ErrStr(
9780: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
9790: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20   }else{.    z = 
97a0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
97b0: 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45  alue_text(db->pE
97c0: 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rr);.    assert(
97d0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
97e0: 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  ed );.    if( z=
97f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  =0 ){.      z = 
9800: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
9810: 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20  ->errCode);.    
9820: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
9830: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
9840: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
9850: 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   z;.}..#ifndef S
9860: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
9870: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
9880: 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67  F-16 encoded Eng
9890: 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
98a0: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  planation of the
98b0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
98c0: 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  error..*/.const 
98d0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72  void *sqlite3_er
98e0: 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a  rmsg16(sqlite3 *
98f0: 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  db){.  static co
9900: 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d  nst u16 outOfMem
9910: 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20  [] = {.    'o', 
9920: 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27  'u', 't', ' ', '
9930: 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d  o', 'f', ' ', 'm
9940: 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27  ', 'e', 'm', 'o'
9950: 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20  , 'r', 'y', 0.  
9960: 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
9970: 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d  t u16 misuse[] =
9980: 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27 2c   {.    'l', 'i',
9990: 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c 20   'b', 'r', 'a', 
99a0: 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a  'r', 'y', ' ', .
99b0: 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27 75      'r', 'o', 'u
99c0: 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e 27  ', 't', 'i', 'n'
99d0: 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'e', ' ', .   
99e0: 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20   'c', 'a', 'l', 
99f0: 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20 27  'l', 'e', 'd', '
9a00: 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 75   ', .    'o', 'u
9a10: 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20 20  ', 't', ' ', .  
9a20: 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c    'o', 'f', ' ',
9a30: 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c 20   .    's', 'e', 
9a40: 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20 27  'q', 'u', 'e', '
9a50: 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30 0a  n', 'c', 'e', 0.
9a60: 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f    };..  const vo
9a70: 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62  id *z;.  if( !db
9a80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
9a90: 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b  void *)outOfMem;
9aa0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
9ab0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
9ac0: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
9ad0: 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a    return (void *
9ae0: 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73  )misuse;.  }.  s
9af0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
9b00: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
9b10: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
9b20: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d  ailed ){.    z =
9b30: 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65   (void *)outOfMe
9b40: 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  m;.  }else{.    
9b50: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
9b60: 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72  e_text16(db->pEr
9b70: 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  r);.    if( z==0
9b80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9b90: 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
9ba0: 3e 70 45 72 72 2c 20 2d 31 2c 20 73 71 6c 69 74  >pErr, -1, sqlit
9bb0: 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72  e3ErrStr(db->err
9bc0: 43 6f 64 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Code),.         
9bd0: 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53    SQLITE_UTF8, S
9be0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
9bf0: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
9c00: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
9c10: 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20  ->pErr);.    }. 
9c20: 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29     /* A malloc()
9c30: 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65 64   may have failed
9c40: 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
9c50: 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   to sqlite3_valu
9c60: 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a  e_text16().    *
9c70: 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73  * above. If this
9c80: 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
9c90: 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  en the db->mallo
9ca0: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65  cFailed flag nee
9cb0: 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
9cc0: 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 72  cleared before r
9cd0: 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69  eturning. Do thi
9ce0: 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  s directly, inst
9cf0: 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a  ead of via.    *
9d00: 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  * sqlite3ApiExit
9d10: 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74  (), to avoid set
9d20: 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
9d30: 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d  e handle error m
9d40: 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  essage..    */. 
9d50: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
9d60: 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  led = 0;.  }.  s
9d70: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
9d80: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
9d90: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e   return z;.}.#en
9da0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
9db0: 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
9dc0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** Return the mo
9dd0: 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20  st recent error 
9de0: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
9df0: 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74  y an SQLite rout
9e00: 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a  ine. If NULL is.
9e10: 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ** passed to thi
9e20: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61  s function, we a
9e30: 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29  ssume a malloc()
9e40: 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73   failed during s
9e50: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a  qlite3_open()..*
9e60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72  /.int sqlite3_er
9e70: 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
9e80: 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
9e90: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
9ea0: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
9eb0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9ec0: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
9ed0: 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
9ee0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9ef0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9f00: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
9f10: 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
9f20: 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  ode & db->errMas
9f30: 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  k;.}.int sqlite3
9f40: 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
9f50: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
9f60: 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c    if( db && !sql
9f70: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
9f80: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
9f90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9fa0: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 69  _MISUSE;.  }.  i
9fb0: 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61  f( !db || db->ma
9fc0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
9fd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9fe0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74  NOMEM;.  }.  ret
9ff0: 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b  urn db->errCode;
a000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
a010: 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67   a new collating
a020: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61   function for da
a030: 74 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68  tabase "db".  Th
a040: 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a  e name is zName.
a050: 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64  ** and the encod
a060: 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73  ing is enc..*/.s
a070: 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65  tatic int create
a080: 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c  Collation(.  sql
a090: 69 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73  ite3* db,.  cons
a0a0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
a0b0: 20 20 75 38 20 65 6e 63 2c 0a 20 20 75 38 20 63    u8 enc,.  u8 c
a0c0: 6f 6c 6c 54 79 70 65 2c 0a 20 20 76 6f 69 64 2a  ollType,.  void*
a0d0: 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
a0e0: 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
a0f0: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
a100: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
a110: 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
a120: 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  id*).){.  CollSe
a130: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
a140: 65 6e 63 32 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  enc2;.  int nNam
a150: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
a160: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20  n30(zName);.  . 
a170: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a180: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
a190: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
a1a0: 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  If SQLITE_UTF16 
a1b0: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
a1c0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  the encoding typ
a1d0: 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69  e, transform thi
a1e0: 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66  s.  ** to one of
a1f0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
a200: 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  or SQLITE_UTF16B
a210: 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  E using the.  **
a220: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
a230: 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54  IVE macro. SQLIT
a240: 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75  E_UTF16 is not u
a250: 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  sed internally..
a260: 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e    */.  enc2 = en
a270: 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65  c;.  testcase( e
a280: 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
a290: 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6 );.  testcase(
a2a0: 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
a2b0: 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20  F16_ALIGNED );. 
a2c0: 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54   if( enc2==SQLIT
a2d0: 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d  E_UTF16 || enc2=
a2e0: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  =SQLITE_UTF16_AL
a2f0: 49 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63  IGNED ){.    enc
a300: 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  2 = SQLITE_UTF16
a310: 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66  NATIVE;.  }.  if
a320: 28 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54  ( enc2<SQLITE_UT
a330: 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54  F8 || enc2>SQLIT
a340: 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20  E_UTF16BE ){.   
a350: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
a360: 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ISUSE;.  }..  /*
a370: 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63   Check if this c
a380: 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20  all is removing 
a390: 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20  or replacing an 
a3a0: 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69  existing collati
a3b0: 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  on .  ** sequenc
a3c0: 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68  e. If so, and th
a3d0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
a3e0: 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e  Ms, return busy.
a3f0: 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61   If there.  ** a
a400: 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
a410: 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  , invalidate any
a420: 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
a430: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
a440: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
a450: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
a460: 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
a470: 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   0);.  if( pColl
a480: 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   && pColl->xCmp 
a490: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  ){.    if( db->a
a4a0: 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a  ctiveVdbeCnt ){.
a4b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
a4c0: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
a4d0: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
a4e0: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
a4f0: 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  odify collation 
a500: 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20  sequence due to 
a510: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
a520: 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
a530: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
a540: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
a550: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
a560: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20  atements(db);.. 
a570: 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69     /* If collati
a580: 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
a590: 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69  l was created di
a5a0: 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c  rectly by a call
a5b0: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
a5c0: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
a5d0: 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e  ion, and not gen
a5e0: 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43  erated by synthC
a5f0: 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a  ollSeq(),.    **
a600: 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73   then any copies
a610: 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f   made by synthCo
a620: 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20  llSeq() need to 
a630: 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  be invalidated..
a640: 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c      ** Also, col
a650: 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f  lation destructo
a660: 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c  r - CollSeq.xDel
a670: 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61  () - function ma
a680: 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  y need.    ** to
a690: 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20   be called..    
a6a0: 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f  */ .    if( (pCo
a6b0: 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54  ll->enc & ~SQLIT
a6c0: 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
a6d0: 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20  ==enc2 ){.      
a6e0: 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d  CollSeq *aColl =
a6f0: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
a700: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
a710: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
a720: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
a730: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
a740: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
a750: 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c  llSeq *p = &aCol
a760: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
a770: 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  ( p->enc==pColl-
a780: 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  >enc ){.        
a790: 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b    if( p->xDel ){
a7a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
a7b0: 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a  xDel(p->pUser);.
a7c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a7d0: 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20        p->xCmp = 
a7e0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
a7f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
a800: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
a810: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
a820: 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
a830: 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 1);.  if( pCol
a840: 6c 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e  l ){.    pColl->
a850: 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b  xCmp = xCompare;
a860: 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65  .    pColl->pUse
a870: 72 20 3d 20 70 43 74 78 3b 0a 20 20 20 20 70 43  r = pCtx;.    pC
a880: 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c  oll->xDel = xDel
a890: 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63  ;.    pColl->enc
a8a0: 20 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28   = (u8)(enc2 | (
a8b0: 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46  enc & SQLITE_UTF
a8c0: 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20  16_ALIGNED));.  
a8d0: 20 20 70 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d 20    pColl->type = 
a8e0: 63 6f 6c 6c 54 79 70 65 3b 0a 20 20 7d 0a 20 20  collType;.  }.  
a8f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
a900: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
a910: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a920: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK;.}.../*.** Th
a930: 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65 73  is array defines
a940: 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e   hard upper boun
a950: 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75  ds on limit valu
a960: 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74  es.  The.** init
a970: 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20  ializer must be 
a980: 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74  kept in sync wit
a990: 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d  h the SQLITE_LIM
a9a0: 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73  IT_*.** #defines
a9b0: 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a   in sqlite3.h..*
a9c0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69  /.static const i
a9d0: 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20  nt aHardLimit[] 
a9e0: 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  = {.  SQLITE_MAX
a9f0: 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
aa00: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
aa10: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
aa20: 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f  OLUMN,.  SQLITE_
aa30: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a  MAX_EXPR_DEPTH,.
aa40: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d    SQLITE_MAX_COM
aa50: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20  POUND_SELECT,.  
aa60: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
aa70: 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  OP,.  SQLITE_MAX
aa80: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20  _FUNCTION_ARG,. 
aa90: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
aaa0: 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  CHED,.  SQLITE_M
aab0: 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
aac0: 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
aad0: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
aae0: 4d 42 45 52 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  MBER,.  SQLITE_M
aaf0: 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
ab00: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ,.};../*.** Make
ab10: 20 73 75 72 65 20 74 68 65 20 68 61 72 64 20 6c   sure the hard l
ab20: 69 6d 69 74 73 20 61 72 65 20 73 65 74 20 74 6f  imits are set to
ab30: 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75   reasonable valu
ab40: 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  es.*/.#if SQLITE
ab50: 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a  _MAX_LENGTH<100.
ab60: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
ab70: 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  AX_LENGTH must b
ab80: 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
ab90: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
aba0: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c  _MAX_SQL_LENGTH<
abb0: 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  100.# error SQLI
abc0: 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
abd0: 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
abe0: 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
abf0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
ac00: 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d  _LENGTH>SQLITE_M
ac10: 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f  AX_LENGTH.# erro
ac20: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  r SQLITE_MAX_SQL
ac30: 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74  _LENGTH must not
ac40: 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
ac50: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
ac60: 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  TH.#endif.#if SQ
ac70: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
ac80: 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72  D_SELECT<2.# err
ac90: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  or SQLITE_MAX_CO
aca0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75  MPOUND_SELECT mu
acb0: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 32  st be at least 2
acc0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
acd0: 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34  TE_MAX_VDBE_OP<4
ace0: 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
acf0: 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73  _MAX_VDBE_OP mus
ad00: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 34 30  t be at least 40
ad10: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
ad20: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
ad30: 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  ARG<0 || SQLITE_
ad40: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
ad50: 3e 31 30 30 30 0a 23 20 65 72 72 6f 72 20 53 51  >1000.# error SQ
ad60: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
ad70: 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62 65  N_ARG must be be
ad80: 74 77 65 65 6e 20 30 20 61 6e 64 20 31 30 30 30  tween 0 and 1000
ad90: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
ada0: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c  TE_MAX_ATTACHED<
adb0: 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
adc0: 41 54 54 41 43 48 45 44 3e 33 30 0a 23 20 65 72  ATTACHED>30.# er
add0: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  ror SQLITE_MAX_A
ade0: 54 54 41 43 48 45 44 20 6d 75 73 74 20 62 65 20  TTACHED must be 
adf0: 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 33 30  between 0 and 30
ae00: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
ae10: 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
ae20: 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65  ERN_LENGTH<1.# e
ae30: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
ae40: 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
ae50: 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
ae60: 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69  east 1.#endif.#i
ae70: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
ae80: 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f  UMN>32767.# erro
ae90: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  r SQLITE_MAX_COL
aea0: 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63  UMN must not exc
aeb0: 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66  eed 32767.#endif
aec0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
aed0: 54 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a  TRIGGER_DEPTH<1.
aee0: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
aef0: 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
af00: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
af10: 74 20 31 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  t 1.#endif.../*.
af20: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
af30: 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20  lue of a limit. 
af40: 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20   Report the old 
af50: 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20  value..** If an 
af60: 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e  invalid limit in
af70: 64 65 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c  dex is supplied,
af80: 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d   report -1..** M
af90: 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62  ake no changes b
afa0: 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20  ut still report 
afb0: 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66  the old value if
afc0: 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69   the.** new limi
afd0: 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a  t is negative..*
afe0: 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72  *.** A new lower
aff0: 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20   limit does not 
b000: 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20  shrink existing 
b010: 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49  constructs..** I
b020: 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74  t merely prevent
b030: 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73  s new constructs
b040: 20 74 68 61 74 20 65 78 63 65 65 64 20 74 68 65   that exceed the
b050: 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66   limit.** from f
b060: 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  orming..*/.int s
b070: 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c  qlite3_limit(sql
b080: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69  ite3 *db, int li
b090: 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69  mitId, int newLi
b0a0: 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c  mit){.  int oldL
b0b0: 69 6d 69 74 3b 0a 20 20 69 66 28 20 6c 69 6d 69  imit;.  if( limi
b0c0: 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64  tId<0 || limitId
b0d0: 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54  >=SQLITE_N_LIMIT
b0e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   ){.    return -
b0f0: 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69  1;.  }.  oldLimi
b100: 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c  t = db->aLimit[l
b110: 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e  imitId];.  if( n
b120: 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20  ewLimit>=0 ){.  
b130: 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61    if( newLimit>a
b140: 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  HardLimit[limitI
b150: 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  d] ){.      newL
b160: 69 6d 69 74 20 3d 20 61 48 61 72 64 4c 69 6d 69  imit = aHardLimi
b170: 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 20 20  t[limitId];.    
b180: 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74  }.    db->aLimit
b190: 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c  [limitId] = newL
b1a0: 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  imit;.  }.  retu
b1b0: 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 0a 7d 0a 23  rn oldLimit;.}.#
b1c0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
b1d0: 45 5f 45 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52  E_ENABLE_AUTO_PR
b1e0: 4f 46 49 4c 45 29 0a 73 74 61 74 69 63 20 76 6f  OFILE).static vo
b1f0: 69 64 20 70 72 6f 66 69 6c 65 5f 73 71 6c 28 76  id profile_sql(v
b200: 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20  oid *aux, const 
b210: 63 68 61 72 20 2a 73 71 6c 2c 20 75 69 6e 74 36  char *sql, uint6
b220: 34 5f 74 20 6e 73 29 20 7b 0a 23 70 72 61 67 6d  4_t ns) {.#pragm
b230: 61 20 75 6e 75 73 65 64 28 61 75 78 29 0a 09 66  a unused(aux)..f
b240: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
b250: 51 75 65 72 79 3a 20 25 73 5c 6e 20 45 78 65 63  Query: %s\n Exec
b260: 75 74 69 6f 6e 20 54 69 6d 65 3a 20 25 6c 6c 75  ution Time: %llu
b270: 20 6d 73 5c 6e 22 2c 20 73 71 6c 2c 20 6e 73 20   ms\n", sql, ns 
b280: 2f 20 31 30 30 30 30 30 30 29 3b 0a 7d 0a 23 65  / 1000000);.}.#e
b290: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
b2a0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
b2b0: 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e  e work of openin
b2c0: 67 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20  g a database on 
b2d0: 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c  behalf of.** sql
b2e0: 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20  ite3_open() and 
b2f0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29  sqlite3_open16()
b300: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  . The database f
b310: 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61  ilename "zFilena
b320: 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d  me"  .** is UTF-
b330: 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74  8 encoded..*/.st
b340: 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74  atic int openDat
b350: 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63  abase(.  const c
b360: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
b370: 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
b380: 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64  name UTF-8 encod
b390: 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
b3a0: 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f  **ppDb,        /
b3b0: 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20  * OUT: Returned 
b3c0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
b3d0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 6c  */.  unsigned fl
b3e0: 61 67 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  ags,        /* O
b3f0: 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73  perational flags
b400: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
b410: 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20   *zVfs       /* 
b420: 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  Name of the VFS 
b430: 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73  to use */.){.  s
b440: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
b450: 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 73 54 68  t rc;.  int isTh
b460: 72 65 61 64 73 61 66 65 3b 0a 0a 20 20 2a 70 70  readsafe;..  *pp
b470: 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  Db = 0;.#ifndef 
b480: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
b490: 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69  INIT.  rc = sqli
b4a0: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
b4b0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
b4c0: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a  urn rc;.#endif..
b4d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
b4e0: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
b4f0: 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  utex==0 ){.    i
b500: 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
b510: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
b520: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
b530: 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20  _NOMUTEX ){.    
b540: 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30  isThreadsafe = 0
b550: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
b560: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
b570: 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20  N_FULLMUTEX ){. 
b580: 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
b590: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
b5a0: 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
b5b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
b5c0: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b  nfig.bFullMutex;
b5d0: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
b5e0: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50   & SQLITE_OPEN_P
b5f0: 52 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20  RIVATECACHE ){. 
b600: 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
b610: 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
b620: 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ACHE;.  }else if
b630: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
b640: 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68  onfig.sharedCach
b650: 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20  eEnabled ){.    
b660: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
b670: 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
b680: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ;.  }..  /* Remo
b690: 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20  ve harmful bits 
b6a0: 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70  from the flags p
b6b0: 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20  arameter.  **.  
b6c0: 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50  ** The SQLITE_OP
b6d0: 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53  EN_NOMUTEX and S
b6e0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
b6f0: 55 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a  UTEX flags were.
b700: 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20    ** dealt with 
b710: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
b720: 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73  code block.  Bes
b730: 69 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20  ides these, the 
b740: 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20  only.  ** valid 
b750: 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20  input flags for 
b760: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
b770: 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45  ) are SQLITE_OPE
b780: 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a  N_READONLY,.  **
b790: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
b7a0: 44 57 52 49 54 45 2c 20 61 6e 64 20 53 51 4c 49  DWRITE, and SQLI
b7b0: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2e 20  TE_OPEN_CREATE. 
b7c0: 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20   Silently mask. 
b7d0: 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65   ** off all othe
b7e0: 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20  r flags..  */.  
b7f0: 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c  flags &=  ~( SQL
b800: 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
b810: 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20  NCLOSE |.       
b820: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
b830: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a  PEN_EXCLUSIVE |.
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
b850: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
b860: 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  DB |.           
b870: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
b880: 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20  TEMP_DB | .     
b890: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
b8a0: 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
b8b0: 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
b8c0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
b8d0: 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20  _MAIN_JOURNAL | 
b8e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b8f0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
b900: 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
b910: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
b920: 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
b930: 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
b940: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
b950: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c  MASTER_JOURNAL |
b960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b970: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
b980: 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEX |.          
b990: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
b9a0: 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20 20 20 20  _FULLMUTEX.     
b9b0: 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a          );..  /*
b9c0: 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
b9d0: 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74  lite data struct
b9e0: 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71  ure */.  db = sq
b9f0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
ba00: 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29   sizeof(sqlite3)
ba10: 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20   );.  if( db==0 
ba20: 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75  ) goto opendb_ou
ba30: 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61  t;.  if( isThrea
ba40: 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d  dsafe ){.    db-
ba50: 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
ba60: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
ba70: 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56  E_MUTEX_RECURSIV
ba80: 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  E);.    if( db->
ba90: 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
baa0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
bab0: 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30  b);.      db = 0
bac0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
bad0: 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ndb_out;.    }. 
bae0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
baf0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
bb00: 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
bb10: 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d  sk = 0xff;.  db-
bb20: 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e  >nDb = 2;.  db->
bb30: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
bb40: 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d  AGIC_BUSY;.  db-
bb50: 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
bb60: 61 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  atic;..  assert(
bb70: 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d   sizeof(db->aLim
bb80: 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72  it)==sizeof(aHar
bb90: 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d  dLimit) );.  mem
bba0: 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20  cpy(db->aLimit, 
bbb0: 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65  aHardLimit, size
bbc0: 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b  of(db->aLimit));
bbd0: 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  .  db->autoCommi
bbe0: 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78  t = 1;.  db->nex
bbf0: 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20  tAutovac = -1;. 
bc00: 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
bc10: 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61  e = 0;.  db->fla
bc20: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
bc30: 72 74 43 6f 6c 4e 61 6d 65 73 0a 23 69 66 20 53  rtColNames.#if S
bc40: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
bc50: 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20  LE_FORMAT<4.    
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
bc70: 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65  QLITE_LegacyFile
bc80: 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  Fmt.#endif.#ifde
bc90: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
bca0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcc0: 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74  | SQLITE_LoadExt
bcd0: 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69  ension.#endif.#i
bce0: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
bcf0: 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49 47 47  _RECURSIVE_TRIGG
bd00: 45 52 53 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERS.            
bd10: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65       | SQLITE_Re
bd20: 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66  cTriggers.#endif
bd30: 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74  .      ;.  sqlit
bd40: 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e  e3HashInit(&db->
bd50: 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64  aCollSeq);.#ifnd
bd60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
bd70: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71  IRTUALTABLE.  sq
bd80: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
bd90: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
bda0: 64 69 66 0a 0a 20 20 64 62 2d 3e 70 56 66 73 20  dif..  db->pVfs 
bdb0: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
bdc0: 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20  nd(zVfs);.  if( 
bdd0: 21 64 62 2d 3e 70 56 66 73 20 29 7b 0a 20 20 20  !db->pVfs ){.   
bde0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
bdf0: 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  OR;.    sqlite3E
be00: 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 22 6e 6f  rror(db, rc, "no
be10: 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20   such vfs: %s", 
be20: 7a 56 66 73 29 3b 0a 20 20 20 20 67 6f 74 6f 20  zVfs);.    goto 
be30: 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
be40: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65  .  /* Add the de
be50: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
be60: 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e  sequence BINARY.
be70: 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f   BINARY works fo
be80: 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a  r both UTF-8.  *
be90: 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f  * and UTF-16, so
bea0: 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66   add a version f
beb0: 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64  or each to avoid
bec0: 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79   any unnecessary
bed0: 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e  .  ** conversion
bee0: 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f  s. The only erro
bef0: 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72  r that can occur
bf00: 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f   here is a mallo
bf10: 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a  c() failure..  *
bf20: 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  /.  createCollat
bf30: 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22  ion(db, "BINARY"
bf40: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
bf50: 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52  QLITE_COLL_BINAR
bf60: 59 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  Y, 0,.          
bf70: 20 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46          binCollF
bf80: 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
bf90: 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
bfa0: 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f  BINARY", SQLITE_
bfb0: 55 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45 5f  UTF16BE, SQLITE_
bfc0: 43 4f 4c 4c 5f 42 49 4e 41 52 59 2c 20 30 2c 0a  COLL_BINARY, 0,.
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfe0: 20 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30    binCollFunc, 0
bff0: 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
c000: 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59  tion(db, "BINARY
c010: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
c020: 45 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42  E, SQLITE_COLL_B
c030: 49 4e 41 52 59 2c 20 30 2c 0a 20 20 20 20 20 20  INARY, 0,.      
c040: 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 43              binC
c050: 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
c060: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
c070: 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49  b, "RTRIM", SQLI
c080: 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
c090: 43 4f 4c 4c 5f 55 53 45 52 2c 20 28 76 6f 69 64  COLL_USER, (void
c0a0: 2a 29 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  *)1,.           
c0b0: 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46 75         binCollFu
c0c0: 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  nc, 0);.  if( db
c0d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c0e0: 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  {.    goto opend
c0f0: 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d  b_out;.  }.  db-
c100: 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c  >pDfltColl = sql
c110: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
c120: 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  db, SQLITE_UTF8,
c130: 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20   "BINARY", 0);. 
c140: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66   assert( db->pDf
c150: 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20  ltColl!=0 );..  
c160: 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61 20 55 54  /* Also add a UT
c170: 46 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e 73 69  F-8 case-insensi
c180: 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  tive collation s
c190: 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72  equence. */.  cr
c1a0: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
c1b0: 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49  , "NOCASE", SQLI
c1c0: 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
c1d0: 43 4f 4c 4c 5f 4e 4f 43 41 53 45 2c 20 30 2c 0a  COLL_NOCASE, 0,.
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1f0: 20 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e    nocaseCollatin
c200: 67 46 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a  gFunc, 0);..  /*
c210: 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e   Open the backen
c220: 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65  d database drive
c230: 72 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46  r */.  db->openF
c240: 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
c250: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
c260: 65 46 61 63 74 6f 72 79 28 64 62 2c 20 7a 46 69  eFactory(db, zFi
c270: 6c 65 6e 61 6d 65 2c 20 30 2c 20 53 51 4c 49 54  lename, 0, SQLIT
c280: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
c290: 53 49 5a 45 2c 20 0a 20 20 20 20 20 20 20 20 20  SIZE, .         
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2b0: 20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45    flags | SQLITE
c2c0: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 2c 0a 20  _OPEN_MAIN_DB,. 
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2e0: 20 20 20 20 20 20 20 20 20 20 26 64 62 2d 3e 61            &db->a
c2f0: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66  Db[0].pBt);.  if
c300: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c310: 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
c320: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
c330: 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  M ){.      rc = 
c340: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c350: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
c360: 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b  rror(db, rc, 0);
c370: 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
c380: 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  _out;.  }.  db->
c390: 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[0].pSchema =
c3a0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
c3b0: 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d  t(db, db->aDb[0]
c3c0: 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62  .pBt);.  db->aDb
c3d0: 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71  [1].pSchema = sq
c3e0: 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
c3f0: 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68  b, 0);...  /* Th
c400: 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74 79  e default safety
c410: 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d  _level for the m
c420: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
c430: 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20  'full'; for the 
c440: 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61  temp.  ** databa
c450: 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e  se it is 'NONE'.
c460: 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
c470: 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64 65  e pager layer de
c480: 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  faults.  .  */. 
c490: 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d   db->aDb[0].zNam
c4a0: 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62  e = "main";.  db
c4b0: 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f  ->aDb[0].safety_
c4c0: 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62 2d  level = 3;.  db-
c4d0: 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20  >aDb[1].zName = 
c4e0: 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44  "temp";.  db->aD
c4f0: 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[1].safety_leve
c500: 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61  l = 1;..  db->ma
c510: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
c520: 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64  IC_OPEN;.  if( d
c530: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c540: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
c550: 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  db_out;.  }..  /
c560: 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62  * Register all b
c570: 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e  uilt-in function
c580: 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74  s, but do not at
c590: 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68  tempt to read th
c5a0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
c5b0: 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73  schema yet. This
c5c0: 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69   is delayed unti
c5d0: 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  l the first time
c5e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
c5f0: 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a  ** is accessed..
c600: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72    */.  sqlite3Er
c610: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
c620: 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  K, 0);.  sqlite3
c630: 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46  RegisterBuiltinF
c640: 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20  unctions(db);.. 
c650: 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74   /* Load automat
c660: 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20  ic extensions - 
c670: 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20  extensions that 
c680: 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74  have been regist
c690: 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20  ered.  ** using 
c6a0: 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f  the sqlite3_auto
c6b0: 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28  matic_extension(
c6c0: 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 73 71  ) API..  */.  sq
c6d0: 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74  lite3AutoLoadExt
c6e0: 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 72  ensions(db);.  r
c6f0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
c700: 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72  ode(db);.  if( r
c710: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c720: 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
c730: 6f 75 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  out;.  }..#ifdef
c740: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
c750: 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS1.  if( !db->m
c760: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
c770: 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
c780: 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 73 71  lite3Fts1Init(sq
c790: 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20  lite3*);.    rc 
c7a0: 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69  = sqlite3Fts1Ini
c7b0: 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
c7c0: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
c7d0: 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69  _ENABLE_FTS2.  i
c7e0: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
c7f0: 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
c800: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74  TE_OK ){.    ext
c810: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46  ern int sqlite3F
c820: 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a  ts2Init(sqlite3*
c830: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
c840: 74 65 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b  te3Fts2Init(db);
c850: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
c860: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c870: 45 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64 62  E_FTS3.  if( !db
c880: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
c890: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
c8a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
c8b0: 74 65 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b  te3Fts3Init(db);
c8c0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
c8d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c8e0: 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d  E_ICU.  if( !db-
c8f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
c900: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c910: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
c920: 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20  e3IcuInit(db);. 
c930: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
c940: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c950: 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d  RTREE.  if( !db-
c960: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
c970: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b   rc==SQLITE_OK){
c980: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
c990: 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a  3RtreeInit(db);.
c9a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
c9b0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
c9c0: 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 2d 44 53  c, 0);..  /* -DS
c9d0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
c9e0: 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b  CKING_MODE=1 mak
c9f0: 65 73 20 45 58 43 4c 55 53 49 56 45 20 74 68 65  es EXCLUSIVE the
ca00: 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
ca10: 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53  .  ** mode.  -DS
ca20: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
ca30: 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b  CKING_MODE=0 mak
ca40: 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  e NORMAL the def
ca50: 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
ca60: 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e  * mode.  Doing n
ca70: 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c  othing at all al
ca80: 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20  so makes NORMAL 
ca90: 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a  the default..  *
caa0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
cab0: 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
cac0: 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c  MODE.  db->dfltL
cad0: 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45  ockMode = SQLITE
cae0: 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
caf0: 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33  _MODE;.  sqlite3
cb00: 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
cb10: 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
cb20: 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  er(db->aDb[0].pB
cb30: 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
cb50: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
cb60: 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64  KING_MODE);.#end
cb70: 69 66 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20  if..  /* Enable 
cb80: 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61  the lookaside-ma
cb90: 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a  lloc subsystem *
cba0: 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69  /.  setupLookasi
cbb0: 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65  de(db, 0, sqlite
cbc0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
cbd0: 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20  Lookaside,.     
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbf0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
cc00: 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64  Config.nLookasid
cc10: 65 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a  e);..opendb_out:
cc20: 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20  .  if( db ){.   
cc30: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74   assert( db->mut
cc40: 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61  ex!=0 || isThrea
cc50: 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  dsafe==0 || sqli
cc60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
cc70: 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b  bFullMutex==0 );
cc80: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
cc90: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
cca0: 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ex);.  }.  rc = 
ccb0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
ccc0: 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  db);.  if( rc==S
ccd0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
cce0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
ccf0: 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30  (db);.    db = 0
cd00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
cd10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
cd20: 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
cd30: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b  QLITE_MAGIC_SICK
cd40: 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65  ;.  }.#if define
cd50: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
cd60: 41 55 54 4f 5f 50 52 4f 46 49 4c 45 29 0a 20 20  AUTO_PROFILE).  
cd70: 69 66 28 20 64 62 20 26 26 20 21 72 63 20 29 7b  if( db && !rc ){
cd80: 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76 70 72  .    char *envpr
cd90: 6f 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22  ofile = getenv("
cda0: 53 51 4c 49 54 45 5f 41 55 54 4f 5f 50 52 4f 46  SQLITE_AUTO_PROF
cdb0: 49 4c 45 22 29 3b 0a 20 20 20 20 0a 20 20 20 20  ILE");.    .    
cdc0: 69 66 28 20 65 6e 76 70 72 6f 66 69 6c 65 21 3d  if( envprofile!=
cdd0: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 73 71  NULL ){.      sq
cde0: 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 64 62  lite3_profile(db
cdf0: 2c 20 70 72 6f 66 69 6c 65 5f 73 71 6c 2c 20 4e  , profile_sql, N
ce00: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ULL);.    }.  }.
ce10: 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d  #endif.  *ppDb =
ce20: 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   db;.#ifdef SQLI
ce30: 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 52 52 0a  TE_ENABLE_SQLRR.
ce40: 20 20 53 52 52 65 63 4f 70 65 6e 28 64 62 2c 20    SRRecOpen(db, 
ce50: 7a 46 69 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73  zFilename, flags
ce60: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
ce70: 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  rn sqlite3ApiExi
ce80: 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  t(0, rc);.}../*.
ce90: 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
cea0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
ceb0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  /.int sqlite3_op
cec0: 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
ced0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20   *zFilename, .  
cee0: 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a  sqlite3 **ppDb .
cef0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e  ){.  return open
cf00: 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61  Database(zFilena
cf10: 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20  me, ppDb,.      
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
cf40: 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
cf50: 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a  PEN_CREATE, 0);.
cf60: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  }.int sqlite3_op
cf70: 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63  en_v2(.  const c
cf80: 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20  har *filename,  
cf90: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
cfa0: 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f  ename (UTF-8) */
cfb0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
cfc0: 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  b,         /* OU
cfd0: 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e  T: SQLite db han
cfe0: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  dle */.  int fla
cff0: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
d000: 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63   /* Flags */.  c
d010: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
d020: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
d030: 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20  f VFS module to 
d040: 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  use */.){.  retu
d050: 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  rn openDatabase(
d060: 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20  filename, ppDb, 
d070: 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a  flags, zVfs);.}.
d080: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d090: 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
d0a0: 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
d0b0: 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
d0c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
d0d0: 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  16(.  const void
d0e0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20   *zFilename, .  
d0f0: 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29  sqlite3 **ppDb.)
d100: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
d110: 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a  zFilename8;   /*
d120: 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64   zFilename encod
d130: 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74  ed in UTF-8 inst
d140: 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f  ead of UTF-16 */
d150: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
d160: 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63   *pVal;.  int rc
d170: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  ;..  assert( zFi
d180: 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65  lename );.  asse
d190: 72 74 28 20 70 70 44 62 20 29 3b 0a 20 20 2a 70  rt( ppDb );.  *p
d1a0: 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  pDb = 0;.#ifndef
d1b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
d1c0: 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c  OINIT.  rc = sql
d1d0: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
d1e0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
d1f0: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
d200: 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
d210: 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
d220: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
d230: 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c  r(pVal, -1, zFil
d240: 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  ename, SQLITE_UT
d250: 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54  F16NATIVE, SQLIT
d260: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69  E_STATIC);.  zFi
d270: 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65  lename8 = sqlite
d280: 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c  3ValueText(pVal,
d290: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
d2a0: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20   if( zFilename8 
d2b0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  ){.    rc = open
d2c0: 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61  Database(zFilena
d2d0: 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20  me8, ppDb,.     
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
d300: 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
d310: 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b  OPEN_CREATE, 0);
d320: 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70  .    assert( *pp
d330: 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  Db || rc==SQLITE
d340: 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66  _NOMEM );.    if
d350: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d360: 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  && !DbHasPropert
d370: 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53  y(*ppDb, 0, DB_S
d380: 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a  chemaLoaded) ){.
d390: 20 20 20 20 20 20 45 4e 43 28 2a 70 70 44 62 29        ENC(*ppDb)
d3a0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   = SQLITE_UTF16N
d3b0: 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  ATIVE;.    }.  }
d3c0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
d3d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
d3e0: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
d3f0: 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65  ree(pVal);..  re
d400: 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45  turn sqlite3ApiE
d410: 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 23 65  xit(0, rc);.}.#e
d420: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d430: 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
d440: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
d450: 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
d460: 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
d470: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
d480: 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
d490: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
d4a0: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  on(.  sqlite3* d
d4b0: 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
d4c0: 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
d4d0: 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
d4e0: 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
d4f0: 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
d500: 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
d510: 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
d520: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
d530: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
d540: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
d550: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
d560: 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d  Failed );.  rc =
d570: 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
d580: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29  (db, zName, (u8)
d590: 65 6e 63 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c  enc, SQLITE_COLL
d5a0: 5f 55 53 45 52 2c 20 70 43 74 78 2c 20 78 43 6f  _USER, pCtx, xCo
d5b0: 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 72 63 20  mpare, 0);.  rc 
d5c0: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
d5d0: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
d5e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
d5f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
d600: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d610: 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
d620: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
d630: 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
d640: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
d650: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
d660: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
d670: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  _v2(.  sqlite3* 
d680: 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
d690: 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
d6a0: 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
d6b0: 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
d6c0: 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
d6d0: 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
d6e0: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20  const void*),.  
d6f0: 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64  void(*xDel)(void
d700: 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
d710: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d720: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
d730: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
d740: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
d750: 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f  .  rc = createCo
d760: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
d770: 65 2c 20 28 75 38 29 65 6e 63 2c 20 53 51 4c 49  e, (u8)enc, SQLI
d780: 54 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20 70 43  TE_COLL_USER, pC
d790: 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44  tx, xCompare, xD
d7a0: 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  el);.  rc = sqli
d7b0: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
d7c0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
d7d0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
d7e0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
d7f0: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
d800: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
d810: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
d820: 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
d830: 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
d840: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
d850: 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
d860: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
d870: 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65  tion16(.  sqlite
d880: 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
d890: 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  void *zName,.  i
d8a0: 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
d8b0: 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
d8c0: 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
d8d0: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
d8e0: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
d8f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
d900: 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
d910: 7a 4e 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65  zName8;.  sqlite
d920: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
d930: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
d940: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
d950: 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65  ailed );.  zName
d960: 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36  8 = sqlite3Utf16
d970: 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d  to8(db, zName, -
d980: 31 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38  1);.  if( zName8
d990: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65   ){.    rc = cre
d9a0: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
d9b0: 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63   zName8, (u8)enc
d9c0: 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53  , SQLITE_COLL_US
d9d0: 45 52 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  ER, pCtx, xCompa
d9e0: 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  re, 0);.    sqli
d9f0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
da00: 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20  ame8);.  }.  rc 
da10: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
da20: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
da30: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
da40: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
da50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
da60: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
da70: 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
da80: 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
da90: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
daa0: 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
dab0: 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
dac0: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
dad0: 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
dae0: 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
daf0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
db00: 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
db10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
db20: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20  ation_needed(.  
db30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
db40: 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
db50: 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
db60: 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64  CollNeeded)(void
db70: 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
db80: 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68  TextRep,const ch
db90: 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ar*).){.  sqlite
dba0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
dbb0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
dbc0: 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43  xCollNeeded = xC
dbd0: 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d  ollNeeded;.  db-
dbe0: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
dbf0: 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e   0;.  db->pCollN
dc00: 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
dc10: 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
dc20: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
dc30: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
dc40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dc50: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
dc60: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
dc70: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
dc80: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
dc90: 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
dca0: 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
dcb0: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
dcc0: 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
dcd0: 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
dce0: 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
dcf0: 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
dd00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
dd10: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
dd20: 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
dd30: 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
dd40: 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
dd50: 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31  id(*xCollNeeded1
dd60: 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  6)(void*,sqlite3
dd70: 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
dd80: 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
dd90: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
dda0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
ddb0: 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
ddc0: 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43  ed = 0;.  db->xC
ddd0: 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43  ollNeeded16 = xC
dde0: 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64  ollNeeded16;.  d
ddf0: 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
de00: 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
de10: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
de20: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
de30: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
de40: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
de50: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
de60: 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e  T_UTF16 */..#ifn
de70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
de80: 47 4c 4f 42 41 4c 52 45 43 4f 56 45 52 0a 23 69  GLOBALRECOVER.#i
de90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
dea0: 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
deb0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
dec0: 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68   is now an anach
ded0: 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20  ronism. It used 
dee0: 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  to be used to re
def0: 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20  cover from a.** 
df00: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
df10: 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77  , but SQLite now
df20: 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d   does this autom
df30: 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  atically..*/.int
df40: 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f   sqlite3_global_
df50: 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20  recover(void){. 
df60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
df70: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64  K;.}.#endif.#end
df80: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  if../*.** Test t
df90: 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72  o see whether or
dfa0: 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
dfb0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
dfc0: 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a  in autocommit.**
dfd0: 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54   mode.  Return T
dfe0: 52 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64  RUE if it is and
dff0: 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20   FALSE if not.  
e000: 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20  Autocommit mode 
e010: 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61  is on.** by defa
e020: 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74  ult.  Autocommit
e030: 20 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20   is disabled by 
e040: 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e  a BEGIN statemen
e050: 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a  t and reenabled.
e060: 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43  ** by the next C
e070: 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43  OMMIT or ROLLBAC
e080: 4b 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48  K..**.******* TH
e090: 49 53 20 49 53 20 41 4e 20 45 58 50 45 52 49 4d  IS IS AN EXPERIM
e0a0: 45 4e 54 41 4c 20 41 50 49 20 41 4e 44 20 49 53  ENTAL API AND IS
e0b0: 20 53 55 42 4a 45 43 54 20 54 4f 20 43 48 41 4e   SUBJECT TO CHAN
e0c0: 47 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74  GE ******.*/.int
e0d0: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
e0e0: 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  ocommit(sqlite3 
e0f0: 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  *db){.  return d
e100: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d  b->autoCommit;.}
e110: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e120: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 65 20  DEBUG./*.** The 
e130: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
e140: 65 20 69 73 20 73 75 62 74 69 74 75 74 65 64 20  e is subtituted 
e150: 66 6f 72 20 63 6f 6e 73 74 61 6e 74 20 53 51 4c  for constant SQL
e160: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 6e 0a 2a  ITE_CORRUPT in.*
e170: 2a 20 64 65 62 75 67 67 69 6e 67 20 62 75 69 6c  * debugging buil
e180: 64 73 2e 20 20 54 68 69 73 20 70 72 6f 76 69 64  ds.  This provid
e190: 65 73 20 61 20 77 61 79 20 74 6f 20 73 65 74 20  es a way to set 
e1a0: 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 66 6f 72  a breakpoint for
e1b0: 20 77 68 65 6e 0a 2a 2a 20 63 6f 72 72 75 70 74   when.** corrupt
e1c0: 69 6f 6e 20 69 73 20 66 69 72 73 74 20 64 65 74  ion is first det
e1d0: 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ected..*/.int sq
e1e0: 6c 69 74 65 33 43 6f 72 72 75 70 74 28 76 6f 69  lite3Corrupt(voi
e1f0: 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d){.  return SQL
e200: 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 23  ITE_CORRUPT;.}.#
e210: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
e220: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
e230: 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CATED./*.** This
e240: 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63   is a convenienc
e250: 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d  e routine that m
e260: 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61  akes sure that a
e270: 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  ll thread-specif
e280: 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74  ic.** data for t
e290: 68 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62  his thread has b
e2a0: 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e  een deallocated.
e2b0: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f  .**.** SQLite no
e2c0: 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72   longer uses thr
e2d0: 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74  ead-specific dat
e2e0: 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  a so this routin
e2f0: 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f  e is now a.** no
e300: 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61  -op.  It is reta
e310: 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69  ined for histori
e320: 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  cal compatibilit
e330: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
e340: 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
e350: 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69  p(void){.}.#endi
e360: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
e370: 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
e380: 20 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 69   about a specifi
e390: 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61  c column of a da
e3a0: 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a  tabase table..**
e3b0: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20   See comment in 
e3c0: 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74  sqlite3.h (sqlit
e3d0: 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61  e.h.in) for deta
e3e0: 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ils..*/.#ifdef S
e3f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
e400: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 69 6e 74  UMN_METADATA.int
e410: 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
e420: 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
e430: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e450: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   Connection hand
e460: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
e470: 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20  ar *zDbName,    
e480: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
e490: 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  name or NULL */.
e4a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
e4b0: 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  ableName,     /*
e4c0: 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   Table name */. 
e4d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
e4e0: 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  lumnName,    /* 
e4f0: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
e500: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
e510: 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20  DataType,    /* 
e520: 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64  OUTPUT: Declared
e530: 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20   data type */.  
e540: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43  char const **pzC
e550: 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f  ollSeq,     /* O
e560: 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e  UTPUT: Collation
e570: 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
e580: 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c  /.  int *pNotNul
e590: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
e5a0: 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
e5b0: 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  if NOT NULL cons
e5c0: 74 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f  traint exists */
e5d0: 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79  .  int *pPrimary
e5e0: 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
e5f0: 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
e600: 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66  f column part of
e610: 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41   PK */.  int *pA
e620: 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20  utoinc          
e630: 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
e640: 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69  True if column i
e650: 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74  s auto-increment
e660: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
e670: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
e680: 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70   = 0;.  Table *p
e690: 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d  Tab = 0;.  Colum
e6a0: 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  n *pCol = 0;.  i
e6b0: 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68 61 72  nt iCol;..  char
e6c0: 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70   const *zDataTyp
e6d0: 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
e6e0: 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20  nst *zCollSeq = 
e6f0: 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c  0;.  int notnull
e700: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d   = 0;.  int prim
e710: 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  arykey = 0;.  in
e720: 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a  t autoinc = 0;..
e730: 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20    /* Ensure the 
e740: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
e750: 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20  has been loaded 
e760: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
e770: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
e780: 65 78 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c  ex);.  (void)sql
e790: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29  ite3SafetyOn(db)
e7a0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
e7b0: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
e7c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74  rc = sqlite3Init
e7d0: 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  (db, &zErrMsg);.
e7e0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
e7f0: 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =rc ){.    goto 
e800: 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  error_out;.  }..
e810: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
e820: 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f  table in questio
e830: 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71  n */.  pTab = sq
e840: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
e850: 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a  b, zTableName, z
e860: 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21  DbName);.  if( !
e870: 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53  pTab || pTab->pS
e880: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61  elect ){.    pTa
e890: 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  b = 0;.    goto 
e8a0: 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  error_out;.  }..
e8b0: 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f    /* Find the co
e8c0: 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69  lumn for which i
e8d0: 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74 65 64  nfo is requested
e8e0: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
e8f0: 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e  3IsRowid(zColumn
e900: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 69 43 6f  Name) ){.    iCo
e910: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
e920: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30  .    if( iCol>=0
e930: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d   ){.      pCol =
e940: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
e950: 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  l];.    }.  }els
e960: 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  e{.    for(iCol=
e970: 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  0; iCol<pTab->nC
e980: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
e990: 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d     pCol = &pTab-
e9a0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20  >aCol[iCol];.   
e9b0: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
e9c0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
e9d0: 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d  Name, zColumnNam
e9e0: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
e9f0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
ea00: 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d   }.    if( iCol=
ea10: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
ea20: 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20       pTab = 0;. 
ea30: 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
ea40: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
ea50: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
ea60: 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20  ng block stores 
ea70: 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  the meta informa
ea80: 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62  tion that will b
ea90: 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20  e returned.  ** 
eaa0: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e  to the caller in
eab0: 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
eac0: 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c   zDataType, zCol
ead0: 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70  lSeq, notnull, p
eae0: 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61  rimarykey.  ** a
eaf0: 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74  nd autoinc. At t
eb00: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
eb10: 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c  are two possibil
eb20: 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a  ities:.  ** .  *
eb30: 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73 70 65  *     1. The spe
eb40: 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  cified column na
eb50: 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22  me was rowid", "
eb60: 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f  oid" or "_rowid_
eb70: 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61  " .  **        a
eb80: 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65  nd there is no e
eb90: 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72  xplicitly declar
eba0: 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a  ed IPK column. .
ebb0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e    **.  **     2.
ebc0: 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f   The table is no
ebd0: 74 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65  t a view and the
ebe0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65   column name ide
ebf0: 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a  ntified an .  **
ec00: 20 20 20 20 20 20 20 20 65 78 70 6c 69 63 69 74          explicit
ec10: 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75  ly declared colu
ec20: 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e  mn. Copy meta in
ec30: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a  formation from *
ec40: 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  pCol..  */ .  if
ec50: 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44  ( pCol ){.    zD
ec60: 61 74 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e  ataType = pCol->
ec70: 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c  zType;.    zColl
ec80: 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c  Seq = pCol->zCol
ec90: 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d  l;.    notnull =
eca0: 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d   pCol->notNull!=
ecb0: 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65  0;.    primaryke
ecc0: 79 20 20 3d 20 70 43 6f 6c 2d 3e 69 73 50 72 69  y  = pCol->isPri
ecd0: 6d 4b 65 79 21 3d 30 3b 0a 20 20 20 20 61 75 74  mKey!=0;.    aut
ece0: 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b  oinc = pTab->iPK
ecf0: 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61  ey==iCol && (pTa
ed00: 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
ed10: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21  _Autoincrement)!
ed20: 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
ed30: 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e   zDataType = "IN
ed40: 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d  TEGER";.    prim
ed50: 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a  arykey = 1;.  }.
ed60: 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20    if( !zCollSeq 
ed70: 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  ){.    zCollSeq 
ed80: 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a  = "BINARY";.  }.
ed90: 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71  .error_out:.  sq
eda0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
edb0: 6c 6c 28 64 62 29 3b 0a 20 20 28 76 6f 69 64 29  ll(db);.  (void)
edc0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66  sqlite3SafetyOff
edd0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74  (db);..  /* Whet
ede0: 68 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  her the function
edf0: 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20   call succeeded 
ee00: 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74  or failed, set t
ee10: 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  he output parame
ee20: 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61  ters.  ** to wha
ee30: 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61  tever their loca
ee40: 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63  l counterparts c
ee50: 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72  ontain. If an er
ee60: 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20  ror did occur,. 
ee70: 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68 65   ** this has the
ee80: 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69   effect of zeroi
ee90: 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61  ng all output pa
eea0: 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20  rameters..  */. 
eeb0: 20 69 66 28 20 70 7a 44 61 74 61 54 79 70 65 20   if( pzDataType 
eec0: 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20  ) *pzDataType = 
eed0: 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28  zDataType;.  if(
eee0: 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a   pzCollSeq ) *pz
eef0: 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53  CollSeq = zCollS
ef00: 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75  eq;.  if( pNotNu
ef10: 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d  ll ) *pNotNull =
ef20: 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20   notnull;.  if( 
ef30: 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70  pPrimaryKey ) *p
ef40: 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69  PrimaryKey = pri
ef50: 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70  marykey;.  if( p
ef60: 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f  Autoinc ) *pAuto
ef70: 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a  inc = autoinc;..
ef80: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
ef90: 3d 72 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a  =rc && !pTab ){.
efa0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
efb0: 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  e(db, zErrMsg);.
efc0: 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71      zErrMsg = sq
efd0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
efe0: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20   "no such table 
eff0: 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20  column: %s.%s", 
f000: 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20  zTableName,.    
f010: 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29      zColumnName)
f020: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
f030: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73  E_ERROR;.  }.  s
f040: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
f050: 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73  rc, (zErrMsg?"%s
f060: 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  ":0), zErrMsg);.
f070: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
f080: 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
f090: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
f0a0: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
f0b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f0c0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f0d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
f0e0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ndif../*.** Slee
f0f0: 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
f100: 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
f110: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
f120: 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73   slept..*/.int s
f130: 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74  qlite3_sleep(int
f140: 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   ms){.  sqlite3_
f150: 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74  vfs *pVfs;.  int
f160: 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71   rc;.  pVfs = sq
f170: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
f180: 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30  );.  if( pVfs==0
f190: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
f1a0: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
f1b0: 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73   works in millis
f1c0: 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20  econds, but the 
f1d0: 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65  underlying OsSle
f1e0: 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75  ep() .  ** API u
f1f0: 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  ses microseconds
f200: 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30 30 30  . Hence the 1000
f210: 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  's..  */.  rc = 
f220: 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28  (sqlite3OsSleep(
f230: 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31  pVfs, 1000*ms)/1
f240: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  000);.  return r
f250: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  c;.}../*.** Enab
f260: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
f270: 65 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c  e extended resul
f280: 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t codes..*/.int 
f290: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
f2a0: 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71  _result_codes(sq
f2b0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f  lite3 *db, int o
f2c0: 6e 6f 66 66 29 7b 0a 20 20 73 71 6c 69 74 65 33  noff){.  sqlite3
f2d0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
f2e0: 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65  >mutex);.  db->e
f2f0: 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f  rrMask = onoff ?
f300: 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78   0xffffffff : 0x
f310: 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ff;.  sqlite3_mu
f320: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
f330: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
f340: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f350: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46  ** Invoke the xF
f360: 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  ileControl metho
f370: 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d on a particula
f380: 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  r database..*/.i
f390: 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  nt sqlite3_file_
f3a0: 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20  control(sqlite3 
f3b0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
f3c0: 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70  *zDbName, int op
f3d0: 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
f3e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f3f0: 5f 45 52 52 4f 52 3b 0a 20 20 69 6e 74 20 69 44  _ERROR;.  int iD
f400: 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  b;.  sqlite3_mut
f410: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
f420: 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 4e 61  ex);.  if( zDbNa
f430: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 44 62  me==0 ){.    iDb
f440: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
f450: 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69 44     for(iDb=0; iD
f460: 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b  b<db->nDb; iDb++
f470: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
f480: 63 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  cmp(db->aDb[iDb]
f490: 2e 7a 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29  .zName, zDbName)
f4a0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
f4b0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62   }.  }.  if( iDb
f4c0: 3c 64 62 2d 3e 6e 44 62 20 29 7b 0a 20 20 20 20  <db->nDb ){.    
f4d0: 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20  Btree *pBtree = 
f4e0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
f4f0: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 72 65 65  ;.    if( pBtree
f500: 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20   ){.      Pager 
f510: 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 73  *pPager;.      s
f520: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
f530: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
f540: 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
f550: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 20 3d  ;.      pPager =
f560: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
f570: 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
f580: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
f590: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 64 20  !=0 );.      fd 
f5a0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
f5b0: 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  le(pPager);.    
f5c0: 20 20 61 73 73 65 72 74 28 20 66 64 21 3d 30 20    assert( fd!=0 
f5d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 64 2d  );.      if( fd-
f5e0: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
f5f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f600: 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66  3OsFileControl(f
f610: 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20  d, op, pArg);.  
f620: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
f630: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
f640: 74 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  tree);.    }.  }
f650: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f660: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
f670: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20  );.  return rc; 
f680: 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65    .}../*.** Inte
f690: 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65 73  rface to the tes
f6a0: 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69  ting logic..*/.i
f6b0: 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  nt sqlite3_test_
f6c0: 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20  control(int op, 
f6d0: 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ...){.  int rc =
f6e0: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
f6f0: 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f  TE_OMIT_BUILTIN_
f700: 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74 20 61  TEST.  va_list a
f710: 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
f720: 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
f730: 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20   op ){..    /*. 
f740: 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63     ** Save the c
f750: 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
f760: 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f  the PRNG..    */
f770: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
f780: 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53  _TESTCTRL_PRNG_S
f790: 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  AVE: {.      sql
f7a0: 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61 74  ite3PrngSaveStat
f7b0: 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
f7c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
f7d0: 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74      ** Restore t
f7e0: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
f7f0: 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74  PRNG to the last
f800: 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73 69   state saved usi
f810: 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53  ng.    ** PRNG_S
f820: 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41  AVE.  If PRNG_SA
f830: 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65 66  VE has never bef
f840: 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ore been called,
f850: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69   then.    ** thi
f860: 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65  s verb acts like
f870: 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20   PRNG_RESET..   
f880: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
f890: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
f8a0: 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20  G_RESTORE: {.   
f8b0: 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65     sqlite3PrngRe
f8c0: 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20  storeState();.  
f8d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f8e0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
f8f0: 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20 62  Reset the PRNG b
f900: 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69  ack to its unini
f910: 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20  tialized state. 
f920: 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20   The next call. 
f930: 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
f940: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69  _randomness() wi
f950: 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50 52  ll reseed the PR
f960: 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  NG using a singl
f970: 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  e call.    ** to
f980: 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73   the xRandomness
f990: 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64   method of the d
f9a0: 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20  efault VFS..    
f9b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
f9c0: 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
f9d0: 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20  _RESET: {.      
f9e0: 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 65 74  sqlite3PrngReset
f9f0: 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
fa00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
fa10: 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
fa20: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
fa30: 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69  (BITVEC_TEST, si
fa40: 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20  ze, program).   
fa50: 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61   **.    ** Run a
fa60: 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61 20   test against a 
fa70: 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66  Bitvec object of
fa80: 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67   size.  The prog
fa90: 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20  ram argument.   
faa0: 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20   ** is an array 
fab0: 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74  of integers that
fac0: 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65 73   defines the tes
fad0: 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e  t.  Return -1 on
fae0: 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79   a.    ** memory
faf0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
fb00: 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c  r, 0 on success,
fb10: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72   or non-zero for
fb20: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a   an error..    *
fb30: 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65  * See the sqlite
fb40: 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
fb50: 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  st() for additio
fb60: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
fb70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
fb80: 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
fb90: 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a  _BITVEC_TEST: {.
fba0: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
fbb0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
fbc0: 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67        int *aProg
fbd0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
fbe0: 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t*);.      rc = 
fbf0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
fc00: 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72  ltinTest(sz, aPr
fc10: 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  og);.      break
fc20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
fc30: 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
fc40: 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e  test_control(BEN
fc50: 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
fc60: 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a  , xBegin, xEnd).
fc70: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65      **.    ** Re
fc80: 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20  gister hooks to 
fc90: 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65  call to indicate
fca0: 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20   which malloc() 
fcb0: 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a  failures .    **
fcc0: 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20   are benign..   
fcd0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
fce0: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e  ITE_TESTCTRL_BEN
fcf0: 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
fd00: 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65  : {.      typede
fd10: 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75  f void (*void_fu
fd20: 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20  nction)(void);. 
fd30: 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69       void_functi
fd40: 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b  on xBenignBegin;
fd50: 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63  .      void_func
fd60: 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b  tion xBenignEnd;
fd70: 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65  .      xBenignBe
fd80: 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  gin = va_arg(ap,
fd90: 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b   void_function);
fda0: 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e  .      xBenignEn
fdb0: 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  d = va_arg(ap, v
fdc0: 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20  oid_function);. 
fdd0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69       sqlite3Beni
fde0: 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42  gnMallocHooks(xB
fdf0: 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e  enignBegin, xBen
fe00: 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62  ignEnd);.      b
fe10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
fe20: 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
fe30: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
fe40: 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
fe50: 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75  _PENDING_BYTE, u
fe60: 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20  nsigned int X). 
fe70: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
fe80: 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
fe90: 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  e to the value i
fea0: 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20  n the argument, 
feb0: 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d  if X>0..    ** M
fec0: 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
fed0: 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20  f X==0.  Return 
fee0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
fef0: 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20   pending byte.  
ff00: 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74    ** as it exist
ff10: 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73 20  ing before this 
ff20: 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
ff30: 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
ff40: 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68  * IMPORTANT:  Ch
ff50: 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49  anging the PENDI
ff60: 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34  NG byte from 0x4
ff70: 30 30 30 30 30 30 30 20 72 65 73 75 6c 74 73 20  0000000 results 
ff80: 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  in.    ** an inc
ff90: 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62 61  ompatible databa
ffa0: 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20  se file format. 
ffb0: 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45   Changing the PE
ffc0: 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a  NDING byte.    *
ffd0: 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61  * while any data
ffe0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
fff0: 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20  is open results 
10000 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  in undefined and
10010 0a 20 20 20 20 2a 2a 20 64 69 6c 65 74 65 72 69  .    ** dileteri
10020 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20  ous behavior..  
10030 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
10040 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
10050 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20  NDING_BYTE: {.  
10060 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
10070 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72 67   newVal = va_arg
10080 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  (ap, unsigned in
10090 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
100a0 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74  qlite3PendingByt
100b0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  e;.      if( new
100c0 56 61 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e  Val ) sqlite3Pen
100d0 64 69 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61  dingByte = newVa
100e0 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
100f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
10100 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
10110 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
10120 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
10130 54 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  T, int X).    **
10140 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74  .    ** This act
10150 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72  ion provides a r
10160 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20  un-time test to 
10170 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  see whether or n
10180 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74  ot.    ** assert
10190 28 29 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61  () was enabled a
101a0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
101b0 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e   If X is true an
101c0 64 20 61 73 73 65 72 74 28 29 0a 20 20 20 20 2a  d assert().    *
101d0 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  * is enabled, th
101e0 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
101f0 6c 75 65 20 69 73 20 74 72 75 65 2e 20 20 49 66  lue is true.  If
10200 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 0a 20   X is true and. 
10210 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 69     ** assert() i
10220 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  s disabled, then
10230 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
10240 65 20 69 73 20 7a 65 72 6f 2e 20 20 49 66 20 58  e is zero.  If X
10250 20 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65   is.    ** false
10260 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69 73   and assert() is
10270 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
10280 68 65 20 61 73 73 65 72 74 69 6f 6e 20 66 69 72  he assertion fir
10290 65 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  es and the.    *
102a0 2a 20 70 72 6f 63 65 73 73 20 61 62 6f 72 74 73  * process aborts
102b0 2e 20 20 49 66 20 58 20 69 73 20 66 61 6c 73 65  .  If X is false
102c0 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69 73   and assert() is
102d0 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
102e0 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  the.    ** retur
102f0 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e  n value is zero.
10300 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
10310 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
10320 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20 20 20 20  _ASSERT: {.     
10330 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78 20   volatile int x 
10340 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
10350 74 28 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61  t( (x = va_arg(a
10360 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20  p,int))!=0 );.  
10370 20 20 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20      rc = x;.    
10380 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
10390 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
103a0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
103b0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
103c0 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74  CTRL_ALWAYS, int
103d0 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   X).    **.    *
103e0 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72  * This action pr
103f0 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d  ovides a run-tim
10400 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f  e test to see ho
10410 77 20 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64  w the ALWAYS and
10420 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61  .    ** NEVER ma
10430 63 72 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65  cros were define
10440 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
10450 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
10460 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
10470 65 20 69 73 20 41 4c 57 41 59 53 28 58 29 2e 20  e is ALWAYS(X). 
10480 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
10490 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20  The recommended 
104a0 74 65 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49  test is X==2.  I
104b0 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
104c0 75 65 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65  ue is 2, that me
104d0 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59  ans.    ** ALWAY
104e0 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20  S() and NEVER() 
104f0 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70  are both no-op p
10500 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72  ass-through macr
10510 6f 73 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  os, which is the
10520 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  .    ** default 
10530 73 65 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65  setting.  If the
10540 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
10550 20 31 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28   1, then ALWAYS(
10560 29 20 69 73 20 65 69 74 68 65 72 0a 20 20 20 20  ) is either.    
10570 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f  ** hard-coded to
10580 20 74 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74   true or else it
10590 20 61 73 73 65 72 74 73 20 69 66 20 69 74 73 20   asserts if its 
105a0 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73  argument is fals
105b0 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69  e..    ** The fi
105c0 72 73 74 20 62 65 68 61 76 69 6f 72 20 28 68 61  rst behavior (ha
105d0 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65  rd-coded to true
105e0 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66  ) is the case if
105f0 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54  .    ** SQLITE_T
10600 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73  ESTCTRL_ASSERT s
10610 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74  hows that assert
10620 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 20 61  () is disabled a
10630 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20  nd the second.  
10640 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61    ** behavior (a
10650 73 73 65 72 74 20 69 66 20 74 68 65 20 61 72 67  ssert if the arg
10660 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28  ument to ALWAYS(
10670 29 20 69 73 20 66 61 6c 73 65 29 20 69 73 20 74  ) is false) is t
10680 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a  he case if.    *
10690 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  * SQLITE_TESTCTR
106a0 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74  L_ASSERT shows t
106b0 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20  hat assert() is 
106c0 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a  enabled..    **.
106d0 20 20 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74      ** The run-t
106e0 69 6d 65 20 74 65 73 74 20 70 72 6f 63 65 64 75  ime test procedu
106f0 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f  re might look so
10700 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69  mething like thi
10710 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
10720 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
10730 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
10740 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
10750 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20  AYS, 2)==2 ){.  
10760 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
10770 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28  AYS() and NEVER(
10780 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73  ) are no-op pass
10790 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a  -through macros.
107a0 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20      **    }else 
107b0 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74  if( sqlite3_test
107c0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
107d0 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c  TESTCTRL_ASSERT,
107e0 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20   1) ){.    **   
107f0 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20     // ALWAYS(x) 
10800 61 73 73 65 72 74 73 20 74 68 61 74 20 78 20 69  asserts that x i
10810 73 20 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29  s true. NEVER(x)
10820 20 61 73 73 65 72 74 73 20 78 20 69 73 20 66 61   asserts x is fa
10830 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d  lse..    **    }
10840 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20  else{.    **    
10850 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69    // ALWAYS(x) i
10860 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20  s a constant 1. 
10870 20 4e 45 56 45 52 28 78 29 20 69 73 20 61 20 63   NEVER(x) is a c
10880 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a  onstant 0..    *
10890 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20  *    }.    */.  
108a0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
108b0 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b  STCTRL_ALWAYS: {
108c0 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76  .      int x = v
108d0 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
108e0 20 20 20 20 20 72 63 20 3d 20 41 4c 57 41 59 53       rc = ALWAYS
108f0 28 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  (x);.      break
10900 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10910 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
10920 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
10930 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20  STCTRL_RESERVE, 
10940 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
10950 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   N).    **.    *
10960 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73 65 72  * Set the nReser
10970 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72  ve size to N for
10980 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
10990 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  se on the databa
109a0 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63  se.    ** connec
109b0 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a  tion db..    */.
109c0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
109d0 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45  TESTCTRL_RESERVE
109e0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
109f0 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61  3 *db = va_arg(a
10a00 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  p, sqlite3*);.  
10a10 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61      int x = va_a
10a20 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
10a30 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10a40 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
10a50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
10a60 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
10a70 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20  db->aDb[0].pBt, 
10a80 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, x, 0);.      
10a90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10aa0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
10ab0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10ac0 20 7d 0a 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64   }..  }.  va_end
10ad0 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  (ap);.#endif /* 
10ae0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c  SQLITE_OMIT_BUIL
10af0 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65  TIN_TEST */.  re
10b00 74 75 72 6e 20 72 63 3b 0a 7d 0a                 turn rc;.}.