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

Artifact 854dabef0de7653234b22a4431c93a50c8513af3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2a 0a 2a 2a 20 24 49 64 3a 20 6d 61 69 6e 2e 63  *.** $Id: main.c
0270: 2c 76 20 31 2e 34 36 34 20 32 30 30 38 2f 30 36  ,v 1.464 2008/06
0280: 2f 32 36 20 31 30 3a 34 31 3a 31 39 20 64 61 6e  /26 10:41:19 dan
0290: 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 2a  ielk1977 Exp $.*
02a0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
02b0: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
02c0: 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 23 69 66  e <ctype.h>..#if
02d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
02e0: 45 5f 46 54 53 33 0a 23 20 69 6e 63 6c 75 64 65  E_FTS3.# include
02f0: 20 22 66 74 73 33 2e 68 22 0a 23 65 6e 64 69 66   "fts3.h".#endif
0300: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
0310: 4e 41 42 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e  NABLE_RTREE.# in
0320: 63 6c 75 64 65 20 22 72 74 72 65 65 2e 68 22 0a  clude "rtree.h".
0330: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
0340: 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  e version of the
0350: 20 6c 69 62 72 61 72 79 0a 2a 2f 0a 63 6f 6e 73   library.*/.cons
0360: 74 20 63 68 61 72 20 73 71 6c 69 74 65 33 5f 76  t char sqlite3_v
0370: 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c 49 54  ersion[] = SQLIT
0380: 45 5f 56 45 52 53 49 4f 4e 3b 0a 63 6f 6e 73 74  E_VERSION;.const
0390: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 6c   char *sqlite3_l
03a0: 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29 7b  ibversion(void){
03b0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
03c0: 76 65 72 73 69 6f 6e 3b 20 7d 0a 69 6e 74 20 73  version; }.int s
03d0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
03e0: 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64 29 7b 20  n_number(void){ 
03f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 56 45  return SQLITE_VE
0400: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b 20 7d 0a  RSION_NUMBER; }.
0410: 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65  int sqlite3_thre
0420: 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65  adsafe(void){ re
0430: 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45  turn SQLITE_THRE
0440: 41 44 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20 21  ADSAFE; }..#if !
0450: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
0460: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
0470: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
0480: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
0490: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
04a0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  ing function poi
04b0: 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  nter is not NULL
04c0: 20 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54   and if.** SQLIT
04d0: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
04e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
04f0: 6e 20 6d 65 73 73 61 67 65 73 20 64 65 73 63 72  n messages descr
0500: 69 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74  ibing.** I/O act
0510: 69 76 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ive are written 
0520: 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  using this funct
0530: 69 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73  ion.  These mess
0540: 61 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65  ages.** are inte
0550: 6e 64 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  nded for debuggi
0560: 6e 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79  ng activity only
0570: 2e 0a 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c 69  ..*/.void (*sqli
0580: 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73  te3IoTrace)(cons
0590: 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20  t char*, ...) = 
05a0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
05b0: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
05c0: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
05d0: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  e points to a st
05e0: 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68  ring which is th
05f0: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64  e.** name of a d
0600: 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74  irectory, then t
0610: 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69  hat directory wi
0620: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74  ll be used to st
0630: 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79  ore.** temporary
0640: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65   files..**.** Se
0650: 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47  e also the "PRAG
0660: 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69  MA temp_store_di
0670: 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d  rectory" SQL com
0680: 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  mand..*/.char *s
0690: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
06a0: 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  ctory = 0;../*.*
06b0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 53 51 4c  * Initialize SQL
06c0: 69 74 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  ite.  .**.** Thi
06d0: 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
06e0: 65 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 69 74  e called to init
06f0: 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
0700: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 0a 2a 2a  y allocation,.**
0710: 20 56 46 53 2c 20 61 6e 64 20 6d 75 74 65 78 20   VFS, and mutex 
0720: 73 75 62 73 79 73 74 65 73 6d 73 20 70 72 69 6f  subsystesms prio
0730: 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 73  r to doing any s
0740: 65 72 69 6f 75 73 20 77 6f 72 6b 20 77 69 74 68  erious work with
0750: 0a 2a 2a 20 53 51 4c 69 74 65 2e 20 20 42 75 74  .** SQLite.  But
0760: 20 61 73 20 6c 6f 6e 67 20 61 73 20 79 6f 75 20   as long as you 
0770: 64 6f 20 6e 6f 74 20 63 6f 6d 70 69 6c 65 20 77  do not compile w
0780: 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ith SQLITE_OMIT_
0790: 41 55 54 4f 49 4e 49 54 0a 2a 2a 20 74 68 69 73  AUTOINIT.** this
07a0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
07b0: 20 63 61 6c 6c 65 64 20 61 75 74 6f 6d 61 74 69   called automati
07c0: 63 61 6c 6c 79 20 62 79 20 6b 65 79 20 72 6f 75  cally by key rou
07d0: 74 69 6e 65 73 20 73 75 63 68 20 61 73 0a 2a 2a  tines such as.**
07e0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e   sqlite3_open().
07f0: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f    .**.** This ro
0800: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
0810: 20 65 78 63 65 70 74 20 6f 6e 20 69 74 73 20 76   except on its v
0820: 65 72 79 20 66 69 72 73 74 20 63 61 6c 6c 20 66  ery first call f
0830: 6f 72 20 74 68 65 20 70 72 6f 63 65 73 73 2c 0a  or the process,.
0840: 2a 2a 20 6f 72 20 66 6f 72 20 74 68 65 20 66 69  ** or for the fi
0850: 72 73 74 20 63 61 6c 6c 20 61 66 74 65 72 20 61  rst call after a
0860: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
0870: 5f 73 68 75 74 64 6f 77 6e 2e 0a 2a 2f 0a 69 6e  _shutdown..*/.in
0880: 74 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  t sqlite3_initia
0890: 6c 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 73 74  lize(void){.  st
08a0: 61 74 69 63 20 69 6e 74 20 69 6e 50 72 6f 67 72  atic int inProgr
08b0: 65 73 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ess = 0;.  int r
08c0: 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69  c;..  /* If SQLi
08d0: 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  te is already in
08e0: 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 69 73 20  itialized, this 
08f0: 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
0900: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
0910: 33 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  3Config.isInit )
0920: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
0930: 4b 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  K;..  /* Make su
0940: 72 65 20 74 68 65 20 6d 75 74 65 78 20 73 79 73  re the mutex sys
0950: 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  tem is initializ
0960: 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ed. */.  rc = sq
0970: 6c 69 74 65 33 4d 75 74 65 78 49 6e 69 74 28 29  lite3MutexInit()
0980: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
0990: 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 2f  ITE_OK ){..    /
09a0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
09b0: 20 6d 61 6c 6c 6f 63 28 29 20 73 79 73 74 65 6d   malloc() system
09c0: 20 61 6e 64 20 74 68 65 20 72 65 63 75 72 73 69   and the recursi
09d0: 76 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75  ve pInitMutex mu
09e0: 74 65 78 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  tex..    ** This
09f0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 72   operation is pr
0a00: 6f 74 65 63 74 65 64 20 62 79 20 74 68 65 20 53  otected by the S
0a10: 54 41 54 49 43 5f 4d 41 53 54 45 52 20 6d 75 74  TATIC_MASTER mut
0a20: 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ex..    */.    s
0a30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
0a40: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
0a50: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
0a60: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
0a70: 53 54 45 52 29 3b 0a 20 20 20 20 73 71 6c 69 74  STER);.    sqlit
0a80: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
0a90: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28  Master);.    if(
0aa0: 20 21 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e   !sqlite3Config.
0ab0: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a  isMallocInit ){.
0ac0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
0ad0: 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a  e3MallocInit();.
0ae0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
0af0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
0b00: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66       sqlite3Conf
0b10: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
0b20: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
0b30: 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 70 49  sqlite3Config.pI
0b40: 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  nitMutex ){.    
0b50: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69      sqlite3Confi
0b60: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 73  g.pInitMutex = s
0b70: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
0b80: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
0b90: 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20  CURSIVE);.      
0ba0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6e    if( sqlite3Con
0bb0: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 26  fig.bCoreMutex &
0bc0: 26 20 21 73 71 6c 69 74 65 33 43 6f 6e 66 69 67  & !sqlite3Config
0bd0: 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20  .pInitMutex ){. 
0be0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
0bf0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
0c00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
0c10: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
0c20: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
0c30: 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ter);.    if( rc
0c40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
0c50: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
0c60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e      }..    /* En
0c70: 74 65 72 20 74 68 65 20 72 65 63 75 72 73 69 76  ter the recursiv
0c80: 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74  e pInitMutex mut
0c90: 65 78 2e 20 41 66 74 65 72 20 64 6f 69 6e 67 20  ex. After doing 
0ca0: 73 6f 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a  so, if the.    *
0cb0: 2a 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  * sqlite3Config.
0cc0: 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20 74  isInit flag is t
0cd0: 72 75 65 2c 20 74 68 65 6e 20 73 6f 6d 65 20 6f  rue, then some o
0ce0: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 0a  ther thread has.
0cf0: 20 20 20 20 2a 2a 20 66 69 6e 69 73 68 65 64 20      ** finished 
0d00: 64 6f 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  doing the initia
0d10: 6c 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68 65  lization. If the
0d20: 20 69 6e 50 72 6f 67 72 65 73 73 20 66 6c 61 67   inProgress flag
0d30: 20 69 73 0a 20 20 20 20 2a 2a 20 74 72 75 65 2c   is.    ** true,
0d40: 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
0d50: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c  ion is being cal
0d60: 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  led recursively 
0d70: 66 72 6f 6d 20 77 69 74 68 69 6e 0a 20 20 20 20  from within.    
0d80: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f  ** the sqlite3_o
0d90: 73 5f 69 6e 69 74 28 29 20 63 61 6c 6c 20 62 65  s_init() call be
0da0: 6c 6f 77 2e 20 49 6e 20 65 69 74 68 65 72 20 63  low. In either c
0db0: 61 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79 2e  ase, exit early.
0dc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
0dd0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
0de0: 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 70 49  sqlite3Config.pI
0df0: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 69  nitMutex);.    i
0e00: 66 28 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67  f( sqlite3Config
0e10: 2e 69 73 49 6e 69 74 20 7c 7c 20 69 6e 50 72 6f  .isInit || inPro
0e20: 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 73  gress ){.      s
0e30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
0e40: 76 65 28 73 71 6c 69 74 65 33 43 6f 6e 66 69 67  ve(sqlite3Config
0e50: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20  .pInitMutex);.  
0e60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
0e70: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
0e80: 73 71 6c 69 74 65 33 53 74 61 74 75 73 52 65 73  sqlite3StatusRes
0e90: 65 74 28 29 3b 0a 20 20 20 20 69 6e 50 72 6f 67  et();.    inProg
0ea0: 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 72 63  ress = 1;.    rc
0eb0: 20 3d 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e   = sqlite3_os_in
0ec0: 69 74 28 29 3b 0a 20 20 20 20 69 6e 50 72 6f 67  it();.    inProg
0ed0: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 73 71  ress = 0;.    sq
0ee0: 6c 69 74 65 33 43 6f 6e 66 69 67 2e 69 73 49 6e  lite3Config.isIn
0ef0: 69 74 20 3d 20 28 72 63 3d 3d 53 51 4c 49 54 45  it = (rc==SQLITE
0f00: 5f 4f 4b 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  _OK ? 1 : 0);.  
0f10: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
0f20: 6c 65 61 76 65 28 73 71 6c 69 74 65 33 43 6f 6e  leave(sqlite3Con
0f30: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
0f40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
0f50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20  ;.}../*.** Undo 
0f60: 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 73  the effects of s
0f70: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
0f80: 65 28 29 2e 20 20 4d 75 73 74 20 6e 6f 74 20 62  e().  Must not b
0f90: 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 0a 2a  e called while.*
0fa0: 2a 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  * there are outs
0fb0: 74 61 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65  tanding database
0fc0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20   connections or 
0fd0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
0fe0: 6e 73 20 6f 72 0a 2a 2a 20 77 68 69 6c 65 20 61  ns or.** while a
0ff0: 6e 79 20 70 61 72 74 20 6f 66 20 53 51 4c 69 74  ny part of SQLit
1000: 65 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 69  e is otherwise i
1010: 6e 20 75 73 65 20 69 6e 20 61 6e 79 20 74 68 72  n use in any thr
1020: 65 61 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ead.  This.** ro
1030: 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 72  utine is not thr
1040: 65 61 64 73 61 66 65 2e 20 20 4e 6f 74 20 62 79  eadsafe.  Not by
1050: 20 61 20 6c 6f 6e 67 20 73 68 6f 74 2e 0a 2a 2f   a long shot..*/
1060: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 75  .int sqlite3_shu
1070: 74 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 20 20 73  tdown(void){.  s
1080: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
1090: 65 28 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  e(sqlite3Config.
10a0: 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 73  pInitMutex);.  s
10b0: 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 70 49 6e  qlite3Config.pIn
10c0: 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 73  itMutex = 0;.  s
10d0: 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 69 73 4d  qlite3Config.isM
10e0: 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b 0a 20  allocInit = 0;. 
10f0: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28   sqlite3_os_end(
1100: 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  );.  sqlite3Mall
1110: 6f 63 45 6e 64 28 29 3b 0a 20 20 73 71 6c 69 74  ocEnd();.  sqlit
1120: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
1130: 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 69 73  sqlite3Config.is
1140: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  Init = 0;.  retu
1150: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1160: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50 49 20  ./*.** This API 
1170: 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61 74 69  allows applicati
1180: 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ons to modify th
1190: 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75  e global configu
11a0: 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65  ration of.** the
11b0: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
11c0: 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a  at run-time..**.
11d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11e0: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
11f0: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
1200: 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
1210: 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
1220: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d  connections or m
1230: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1240: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
1250: 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61   is not.** threa
1260: 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72 65 20  dsafe.  Failure 
1270: 74 6f 20 68 65 65 64 20 74 68 65 73 65 20 77 61  to heed these wa
1280: 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61 64 20  rnings can lead 
1290: 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62 6c 65  to unpredictable
12a0: 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  .** behavior..*/
12b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e  .int sqlite3_con
12c0: 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  fig(int op, ...)
12d0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
12e0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12f0: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  E_OK;..  /* sqli
1300: 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73 68 61  te3_config() sha
1310: 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ll return SQLITE
1320: 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20 69 73  _MISUSE if it is
1330: 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65 0a 20   invoked while. 
1340: 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c   ** the SQLite l
1350: 69 62 72 61 72 79 20 69 73 20 69 6e 20 75 73 65  ibrary is in use
1360: 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  . */.  if( sqlit
1370: 65 33 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  e3Config.isInit 
1380: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1390: 4d 49 53 55 53 45 3b 0a 0a 20 20 76 61 5f 73 74  MISUSE;..  va_st
13a0: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
13b0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
13c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
13d0: 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44  FIG_SINGLETHREAD
13e0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73  : {.      /* Dis
13f0: 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e  able all mutexin
1400: 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  g */.      sqlit
1410: 65 33 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  e3Config.bCoreMu
1420: 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  tex = 0;.      s
1430: 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 62 46 75  qlite3Config.bFu
1440: 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20  llMutex = 0;.   
1450: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1460: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1470: 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45  CONFIG_MULTITHRE
1480: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  AD: {.      /* D
1490: 69 73 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20  isable mutexing 
14a0: 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  of database conn
14b0: 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20  ections */.     
14c0: 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78   /* Enable mutex
14d0: 69 6e 67 20 6f 66 20 63 6f 72 65 20 64 61 74 61  ing of core data
14e0: 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
14f0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66       sqlite3Conf
1500: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
1510: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
1520: 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
1530: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  x = 0;.      bre
1540: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1550: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
1560: 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20  _SERIALIZED: {. 
1570: 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61       /* Enable a
1580: 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20  ll mutexing */. 
1590: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66       sqlite3Conf
15a0: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
15b0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
15c0: 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
15d0: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  x = 1;.      bre
15e0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ak;.    }.#ifdef
15f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
1600: 45 4d 53 59 53 33 0a 20 20 20 20 63 61 73 65 20  EMSYS3.    case 
1610: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45  SQLITE_CONFIG_ME
1620: 4d 53 59 53 33 3a 20 7b 0a 20 20 20 20 20 20 75  MSYS3: {.      u
1630: 38 20 2a 70 4d 65 6d 20 3d 20 76 61 5f 61 72 67  8 *pMem = va_arg
1640: 28 61 70 2c 20 75 38 2a 29 3b 0a 20 20 20 20 20  (ap, u8*);.     
1650: 20 69 6e 74 20 6e 4d 65 6d 20 3d 20 76 61 5f 61   int nMem = va_a
1660: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1670: 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74     sqlite3MemSet
1680: 4d 65 6d 73 79 73 33 28 70 4d 65 6d 2c 20 6e 4d  Memsys3(pMem, nM
1690: 65 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  em);.      break
16a0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
16b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
16c0: 42 4c 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20  BLE_MEMSYS5.    
16d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
16e0: 49 47 5f 4d 45 4d 53 59 53 35 3a 20 7b 0a 20 20  IG_MEMSYS5: {.  
16f0: 20 20 20 20 75 38 20 2a 70 4d 65 6d 20 3d 20 76      u8 *pMem = v
1700: 61 5f 61 72 67 28 61 70 2c 20 75 38 2a 29 3b 0a  a_arg(ap, u8*);.
1710: 20 20 20 20 20 20 69 6e 74 20 6e 4d 65 6d 20 3d        int nMem =
1720: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1730: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  ;.      sqlite3M
1740: 65 6d 53 65 74 4d 65 6d 73 79 73 35 28 70 4d 65  emSetMemsys5(pMe
1750: 6d 2c 20 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20  m, nMem);.      
1760: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1770: 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 51 4c  dif.    case SQL
1780: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
1790: 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70  C: {.      /* Sp
17a0: 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61  ecify an alterna
17b0: 74 69 76 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c  tive malloc impl
17c0: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
17d0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69      sqlite3Confi
17e0: 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70  g.m = *va_arg(ap
17f0: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
1800: 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62  thods*);.      b
1810: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1820: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
1830: 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a  IG_GETMALLOC: {.
1840: 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76        /* Retriev
1850: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  e the current ma
1860: 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74  lloc() implement
1870: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
1880: 66 28 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67  f( sqlite3Config
1890: 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20  .m.xMalloc==0 ) 
18a0: 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66  sqlite3MemSetDef
18b0: 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 2a 76  ault();.      *v
18c0: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
18d0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 20  3_mem_methods*) 
18e0: 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  = sqlite3Config.
18f0: 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  m;.      break;.
1900: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1910: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54  QLITE_CONFIG_MUT
1920: 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53  EX: {.      /* S
1930: 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e  pecify an altern
1940: 61 74 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c  ative mutex impl
1950: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
1960: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69      sqlite3Confi
1970: 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72  g.mutex = *va_ar
1980: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75  g(ap, sqlite3_mu
1990: 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20  tex_methods*);. 
19a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19b0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
19c0: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45  E_CONFIG_GETMUTE
19d0: 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65  X: {.      /* Re
19e0: 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65  trieve the curre
19f0: 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  nt mutex impleme
1a00: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
1a10: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
1a20: 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f  ite3_mutex_metho
1a30: 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 43 6f  ds*) = sqlite3Co
1a40: 6e 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20 20  nfig.mutex;.    
1a50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1a60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
1a70: 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a  ONFIG_MEMSTATUS:
1a80: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62   {.      /* Enab
1a90: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
1aa0: 65 20 6d 61 6c 6c 6f 63 20 73 74 61 74 75 73 20  e malloc status 
1ab0: 63 6f 6c 6c 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  collection */.  
1ac0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69      sqlite3Confi
1ad0: 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f  g.bMemstat = va_
1ae0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1af0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b10: 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a  _CONFIG_SCRATCH:
1b20: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69   {.      /* Desi
1b30: 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20 66  gnate a buffer f
1b40: 6f 72 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72  or scratch memor
1b50: 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20  y space */.     
1b60: 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 70   sqlite3Config.p
1b70: 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67  Scratch = va_arg
1b80: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
1b90: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67     sqlite3Config
1ba0: 2e 73 7a 53 63 72 61 74 63 68 20 3d 20 76 61 5f  .szScratch = va_
1bb0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1bc0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69      sqlite3Confi
1bd0: 67 2e 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f  g.nScratch = va_
1be0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1bf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1c10: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
1c20: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65  E: {.      /* De
1c30: 73 69 67 6e 61 74 65 20 61 20 62 75 66 66 65 72  signate a buffer
1c40: 20 66 6f 72 20 73 63 72 61 74 63 68 20 6d 65 6d   for scratch mem
1c50: 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ory space */.   
1c60: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67     sqlite3Config
1c70: 2e 70 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28  .pPage = va_arg(
1c80: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
1c90: 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e    sqlite3Config.
1ca0: 73 7a 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28  szPage = va_arg(
1cb0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1cc0: 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 50  sqlite3Config.nP
1cd0: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
1ce0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
1cf0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1d00: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
1d10: 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f  _HEAP: {.      /
1d20: 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20 62 75  * Designate a bu
1d30: 66 66 65 72 20 66 6f 72 20 73 63 72 61 74 63 68  ffer for scratch
1d40: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f   memory space */
1d50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1d60: 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 76 61 5f  nfig.pHeap = va_
1d70: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
1d80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
1d90: 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61  fig.nHeap = va_a
1da0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1db0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67     sqlite3Config
1dc0: 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28  .mnReq = va_arg(
1dd0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1de0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1df0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1e00: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
1e10: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
1e20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
1e30: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
1e40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e50: 52 6f 75 74 69 6e 65 20 6e 65 65 64 65 64 20 74  Routine needed t
1e60: 6f 20 73 75 70 70 6f 72 74 20 74 68 65 20 74 65  o support the te
1e70: 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 2e 0a  stcase() macro..
1e80: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1e90: 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 0a 76  _COVERAGE_TEST.v
1ea0: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 76 65 72  oid sqlite3Cover
1eb0: 61 67 65 28 69 6e 74 20 78 29 7b 0a 20 20 73 74  age(int x){.  st
1ec0: 61 74 69 63 20 69 6e 74 20 64 75 6d 6d 79 20 3d  atic int dummy =
1ed0: 20 30 3b 0a 20 20 64 75 6d 6d 79 20 2b 3d 20 78   0;.  dummy += x
1ee0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
1ef0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1f00: 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30  f the buffer z[0
1f10: 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20  ..n-1] contains 
1f20: 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73  all spaces..*/.s
1f30: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61  tatic int allSpa
1f40: 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ces(const char *
1f50: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69  z, int n){.  whi
1f60: 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31  le( n>0 && z[n-1
1f70: 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d  ]==' ' ){ n--; }
1f80: 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a  .  return n==0;.
1f90: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
1fa0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
1fb0: 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
1fc0: 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77  named "BINARY" w
1fd0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a  hich is always.*
1fe0: 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  * available..**.
1ff0: 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c 61  ** If the padFla
2000: 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  g argument is no
2010: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63  t NULL then spac
2020: 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68 65  e padding at the
2030: 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e   end.** of strin
2040: 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20  gs is ignored.  
2050: 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20  This implements 
2060: 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74  the RTRIM collat
2070: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
2080: 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a  nt binCollFunc(.
2090: 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c    void *padFlag,
20a0: 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
20b0: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
20c0: 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f  .  int nKey2, co
20d0: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a  nst void *pKey2.
20e0: 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a  ){.  int rc, n;.
20f0: 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79    n = nKey1<nKey
2100: 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79  2 ? nKey1 : nKey
2110: 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70  2;.  rc = memcmp
2120: 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e  (pKey1, pKey2, n
2130: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
2140: 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c 61  {.    if( padFla
2150: 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61  g.     && allSpa
2160: 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79  ces(((char*)pKey
2170: 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20  1)+n, nKey1-n). 
2180: 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73      && allSpaces
2190: 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29 2b  (((char*)pKey2)+
21a0: 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20  n, nKey2-n).    
21b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61 76  ){.      /* Leav
21c0: 65 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20 61  e rc unchanged a
21d0: 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  t 0 */.    }else
21e0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65  {.      rc = nKe
21f0: 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20  y1 - nKey2;.    
2200: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
2210: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74  c;.}../*.** Anot
2220: 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c  her built-in col
2230: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a  lating sequence:
2240: 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20   NOCASE. .**.** 
2250: 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73  This collating s
2260: 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e  equence is inten
2270: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66  ded to be used f
2280: 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e  or "case indepen
2290: 64 61 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73  dant.** comparis
22a0: 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e  on". SQLite's kn
22b0: 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72  owledge of upper
22c0: 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20   and lower case 
22d0: 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65  equivalents.** e
22e0: 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74  xtends only to t
22f0: 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73  he 26 characters
2300: 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67   used in the Eng
2310: 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a  lish language..*
2320: 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65  *.** At the mome
2330: 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  nt there is only
2340: 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65   a UTF-8 impleme
2350: 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ntation..*/.stat
2360: 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c  ic int nocaseCol
2370: 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f  latingFunc(.  vo
2380: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69  id *NotUsed,.  i
2390: 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
23a0: 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69  void *pKey1,.  i
23b0: 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20  nt nKey2, const 
23c0: 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20  void *pKey2.){. 
23d0: 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33   int r = sqlite3
23e0: 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20  StrNICmp(.      
23f0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b  (const char *)pK
2400: 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ey1, (const char
2410: 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31   *)pKey2, (nKey1
2420: 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b  <nKey2)?nKey1:nK
2430: 65 79 32 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72  ey2);.  if( 0==r
2440: 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79   ){.    r = nKey
2450: 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72  1-nKey2;.  }.  r
2460: 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn r;.}../*.*
2470: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57  * Return the ROW
2480: 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  ID of the most r
2490: 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a  ecent insert.*/.
24a0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c  sqlite_int64 sql
24b0: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
24c0: 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  _rowid(sqlite3 *
24d0: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
24e0: 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a  ->lastRowid;.}..
24f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2500: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
2510: 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72  es in the most r
2520: 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71  ecent call to sq
2530: 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f  lite3_exec()..*/
2540: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61  .int sqlite3_cha
2550: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
2560: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
2570: 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
2580: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
2590: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73  ber of changes s
25a0: 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
25b0: 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65  e handle was ope
25c0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
25d0: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
25e0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
25f0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f    return db->nTo
2600: 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  talChange;.}../*
2610: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69  .** Close an exi
2620: 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74  sting SQLite dat
2630: 61 62 61 73 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c  abase.*/.int sql
2640: 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74  ite3_close(sqlit
2650: 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45  e3 *db){.  HashE
2660: 6c 65 6d 20 2a 69 3b 0a 20 20 69 6e 74 20 6a 3b  lem *i;.  int j;
2670: 0a 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  ..  if( !db ){. 
2680: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2690: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
26a0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
26b0: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
26c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
26d0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
26e0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
26f0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
2700: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
2710: 5f 53 53 45 0a 20 20 7b 0a 20 20 20 20 65 78 74  _SSE.  {.    ext
2720: 65 72 6e 20 76 6f 69 64 20 73 71 6c 69 74 65 33  ern void sqlite3
2730: 53 73 65 43 6c 65 61 6e 75 70 28 73 71 6c 69 74  SseCleanup(sqlit
2740: 65 33 2a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e3*);.    sqlite
2750: 33 53 73 65 43 6c 65 61 6e 75 70 28 64 62 29 3b  3SseCleanup(db);
2760: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20  .  }.#endif ..  
2770: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
2780: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30  rnalSchema(db, 0
2790: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72  );..  /* If a tr
27a0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
27b0: 6e 2c 20 74 68 65 20 52 65 73 65 74 49 6e 74 65  n, the ResetInte
27c0: 72 6e 61 6c 53 63 68 65 6d 61 28 29 20 63 61 6c  rnalSchema() cal
27d0: 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c  l above.  ** wil
27e0: 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65  l not have calle
27f0: 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63  d the xDisconnec
2800: 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e  t() method on an
2810: 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74  y virtual.  ** t
2820: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d  ables in the db-
2830: 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79  >aVTrans[] array
2840: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
2850: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
2860: 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20  ack().  ** call 
2870: 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e  will do so. We n
2880: 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62  eed to do this b
2890: 65 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20  efore the check 
28a0: 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20  for active.  ** 
28b0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62  SQL statements b
28c0: 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74  elow, as the v-t
28d0: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
28e0: 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69  ion may be stori
28f0: 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65  ng.  ** some pre
2900: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
2910: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
2920: 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52  /.  sqlite3VtabR
2930: 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20  ollback(db);..  
2940: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
2950: 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  any outstanding 
2960: 56 4d 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  VMs, return SQLI
2970: 54 45 5f 42 55 53 59 2e 20 2a 2f 0a 20 20 69 66  TE_BUSY. */.  if
2980: 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20  ( db->pVdbe ){. 
2990: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
29a0: 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
29b0: 20 0a 20 20 20 20 20 20 20 20 22 55 6e 61 62 6c   .        "Unabl
29c0: 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74  e to close due t
29d0: 6f 20 75 6e 66 69 6e 61 6c 69 73 65 64 20 73 74  o unfinalised st
29e0: 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20  atements");.    
29f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2a00: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
2a10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a20: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 61 73  E_BUSY;.  }.  as
2a30: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 61 66  sert( sqlite3Saf
2a40: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
2a50: 28 64 62 29 20 29 3b 0a 0a 20 20 66 6f 72 28 6a  (db) );..  for(j
2a60: 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a  =0; j<db->nDb; j
2a70: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
2a80: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
2a90: 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[j];.    if( p
2aa0: 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  Db->pBt ){.     
2ab0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
2ac0: 73 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20  se(pDb->pBt);.  
2ad0: 20 20 20 20 70 44 62 2d 3e 70 42 74 20 3d 20 30      pDb->pBt = 0
2ae0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 31  ;.      if( j!=1
2af0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
2b00: 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20  >pSchema = 0;.  
2b10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2b20: 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e    sqlite3ResetIn
2b30: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c  ternalSchema(db,
2b40: 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64   0);.  assert( d
2b50: 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61  b->nDb<=2 );.  a
2b60: 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d  ssert( db->aDb==
2b70: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b  db->aDbStatic );
2b80: 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
2b90: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 46  ashFirst(&db->aF
2ba0: 75 6e 63 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  unc); i; i=sqlit
2bb0: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
2bc0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e     FuncDef *pFun
2bd0: 63 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 66  c, *pNext;.    f
2be0: 6f 72 28 70 46 75 6e 63 20 3d 20 28 46 75 6e 63  or(pFunc = (Func
2bf0: 44 65 66 2a 29 73 71 6c 69 74 65 48 61 73 68 44  Def*)sqliteHashD
2c00: 61 74 61 28 69 29 3b 20 70 46 75 6e 63 3b 20 70  ata(i); pFunc; p
2c10: 46 75 6e 63 3d 70 4e 65 78 74 29 7b 0a 20 20 20  Func=pNext){.   
2c20: 20 20 20 70 4e 65 78 74 20 3d 20 70 46 75 6e 63     pNext = pFunc
2c30: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
2c40: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 75 6e  qlite3_free(pFun
2c50: 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
2c60: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
2c70: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c  hFirst(&db->aCol
2c80: 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69  lSeq); i; i=sqli
2c90: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
2ca0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
2cb0: 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29  ll = (CollSeq *)
2cc0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
2cd0: 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65  );.    /* Invoke
2ce0: 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72 73   any destructors
2cf0: 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20   registered for 
2d00: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
2d10: 63 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a 2f  ce user data. */
2d20: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
2d30: 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  3; j++){.      i
2d40: 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c  f( pColl[j].xDel
2d50: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
2d60: 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b  l[j].xDel(pColl[
2d70: 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  j].pUser);.     
2d80: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
2d90: 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6c 6c 29  ite3_free(pColl)
2da0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
2db0: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43  ashClear(&db->aC
2dc0: 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66  ollSeq);.#ifndef
2dd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2de0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28  TUALTABLE.  for(
2df0: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
2e00: 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
2e10: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
2e20: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f  Next(i)){.    Mo
2e30: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
2e40: 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  dule *)sqliteHas
2e50: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
2e60: 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79  ( pMod->xDestroy
2e70: 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e   ){.      pMod->
2e80: 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70  xDestroy(pMod->p
2e90: 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Aux);.    }.    
2ea0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 6f  sqlite3_free(pMo
2eb0: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
2ec0: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
2ed0: 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
2ee0: 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  ..  sqlite3HashC
2ef0: 6c 65 61 72 28 26 64 62 2d 3e 61 46 75 6e 63 29  lear(&db->aFunc)
2f00: 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
2f10: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
2f20: 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  0); /* Deallocat
2f30: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
2f40: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
2f50: 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29    if( db->pErr )
2f60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  {.    sqlite3Val
2f70: 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29  ueFree(db->pErr)
2f80: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43  ;.  }.  sqlite3C
2f90: 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64  loseExtensions(d
2fa0: 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63  b);..  db->magic
2fb0: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
2fc0: 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65  ERROR;..  /* The
2fd0: 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73   temp-database s
2fe0: 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74  chema is allocat
2ff0: 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66  ed differently f
3000: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63  rom the other sc
3010: 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  hema.  ** object
3020: 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d  s (using sqliteM
3030: 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79  alloc() directly
3040: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c  , instead of sql
3050: 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
3060: 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e  ))..  ** So it n
3070: 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
3080: 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79   here. Todo: Why
3090: 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65   not roll the te
30a0: 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20  mp schema into. 
30b0: 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c   ** the same sql
30c0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74  iteMalloc() as t
30d0: 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f  he one that allo
30e0: 63 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61  cates the databa
30f0: 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  se .  ** structu
3100: 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  re?.  */.  sqlit
3110: 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 44 62 5b  e3_free(db->aDb[
3120: 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73  1].pSchema);.  s
3130: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
3140: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
3150: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
3160: 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44  ITE_MAGIC_CLOSED
3170: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
3180: 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78  x_free(db->mutex
3190: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
31a0: 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(db);.  return 
31b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
31c0: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
31d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
31e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
31f0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69  RollbackAll(sqli
3200: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
3210: 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73  i;.  int inTrans
3220: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
3230: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
3240: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
3250: 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
3260: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
3270: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
3280: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
3290: 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  f( db->aDb[i].pB
32a0: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  t ){.      if( s
32b0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
32c0: 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  rans(db->aDb[i].
32d0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
32e0: 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20  inTrans = 1;.   
32f0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
3300: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
3310: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b  db->aDb[i].pBt);
3320: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
3330: 5d 2e 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20  ].inTrans = 0;. 
3340: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
3350: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64  e3VtabRollback(d
3360: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64  b);.  sqlite3End
3370: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
3380: 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
3390: 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
33a0: 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c  anges ){.    sql
33b0: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
33c0: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
33d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  ;.    sqlite3Res
33e0: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
33f0: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  (db, 0);.  }..  
3400: 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65  /* If one has be
3410: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69  en configured, i
3420: 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61  nvoke the rollba
3430: 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b  ck-hook callback
3440: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52   */.  if( db->xR
3450: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
3460: 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21  && (inTrans || !
3470: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20  db->autoCommit) 
3480: 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c  ){.    db->xRoll
3490: 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d  backCallback(db-
34a0: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a  >pRollbackArg);.
34b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
34c0: 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72  urn a static str
34d0: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
34e0: 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65  es the kind of e
34f0: 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  rror specified i
3500: 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  n the.** argumen
3510: 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  t..*/.const char
3520: 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72 28   *sqlite3ErrStr(
3530: 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74  int rc){.  const
3540: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
3550: 63 68 28 20 72 63 20 26 20 30 78 66 66 20 29 7b  ch( rc & 0xff ){
3560: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3570: 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20 53  _ROW:.    case S
3580: 51 4c 49 54 45 5f 44 4f 4e 45 3a 0a 20 20 20 20  QLITE_DONE:.    
3590: 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20  case SQLITE_OK: 
35a0: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 6e 6f 74          z = "not
35b0: 20 61 6e 20 65 72 72 6f 72 22 3b 20 20 20 20 20   an error";     
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
35e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f  case SQLITE_ERRO
35f0: 52 3a 20 20 20 20 20 20 7a 20 3d 20 22 53 51 4c  R:      z = "SQL
3600: 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20   logic error or 
3610: 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61 73 65  missing database
3620: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
3630: 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d  case SQLITE_PERM
3640: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 61 63 63  :       z = "acc
3650: 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64  ess permission d
3660: 65 6e 69 65 64 22 3b 20 20 20 20 20 20 20 20 20  enied";         
3670: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3680: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
3690: 54 3a 20 20 20 20 20 20 7a 20 3d 20 22 63 61 6c  T:      z = "cal
36a0: 6c 62 61 63 6b 20 72 65 71 75 65 73 74 65 64 20  lback requested 
36b0: 71 75 65 72 79 20 61 62 6f 72 74 22 3b 20 20 20  query abort";   
36c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
36d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
36e0: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 64 61 74  :       z = "dat
36f0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22  abase is locked"
3700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3710: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3720: 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  case SQLITE_LOCK
3730: 45 44 3a 20 20 20 20 20 7a 20 3d 20 22 64 61 74  ED:     z = "dat
3740: 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c  abase table is l
3750: 6f 63 6b 65 64 22 3b 20 20 20 20 20 20 20 20 20  ocked";         
3760: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3770: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  case SQLITE_NOME
3780: 4d 3a 20 20 20 20 20 20 7a 20 3d 20 22 6f 75 74  M:      z = "out
3790: 20 6f 66 20 6d 65 6d 6f 72 79 22 3b 20 20 20 20   of memory";    
37a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
37c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
37d0: 4f 4e 4c 59 3a 20 20 20 7a 20 3d 20 22 61 74 74  ONLY:   z = "att
37e0: 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20  empt to write a 
37f0: 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73  readonly databas
3800: 65 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  e";  break;.    
3810: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
3820: 52 52 55 50 54 3a 20 20 7a 20 3d 20 22 69 6e 74  RRUPT:  z = "int
3830: 65 72 72 75 70 74 65 64 22 3b 20 20 20 20 20 20  errupted";      
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3850: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3860: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
3870: 52 3a 20 20 20 20 20 20 7a 20 3d 20 22 64 69 73  R:      z = "dis
3880: 6b 20 49 2f 4f 20 65 72 72 6f 72 22 3b 20 20 20  k I/O error";   
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
38b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52  case SQLITE_CORR
38c0: 55 50 54 3a 20 20 20 20 7a 20 3d 20 22 64 61 74  UPT:    z = "dat
38d0: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
38e0: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 3b 20   is malformed"; 
38f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3900: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c  case SQLITE_FULL
3910: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 64 61 74  :       z = "dat
3920: 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73  abase or disk is
3930: 20 66 75 6c 6c 22 3b 20 20 20 20 20 20 20 20 20   full";         
3940: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3950: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
3960: 4f 50 45 4e 3a 20 20 20 7a 20 3d 20 22 75 6e 61  OPEN:   z = "una
3970: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
3980: 62 61 73 65 20 66 69 6c 65 22 3b 20 20 20 20 20  base file";     
3990: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
39a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54  case SQLITE_EMPT
39b0: 59 3a 20 20 20 20 20 20 7a 20 3d 20 22 74 61 62  Y:      z = "tab
39c0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  le contains no d
39d0: 61 74 61 22 3b 20 20 20 20 20 20 20 20 20 20 20  ata";           
39e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
39f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45  case SQLITE_SCHE
3a00: 4d 41 3a 20 20 20 20 20 7a 20 3d 20 22 64 61 74  MA:     z = "dat
3a10: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
3a20: 20 63 68 61 6e 67 65 64 22 3b 20 20 20 20 20 20   changed";      
3a30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3a40: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42  case SQLITE_TOOB
3a50: 49 47 3a 20 20 20 20 20 7a 20 3d 20 22 53 74 72  IG:     z = "Str
3a60: 69 6e 67 20 6f 72 20 42 4c 4f 42 20 65 78 63 65  ing or BLOB exce
3a70: 65 64 65 64 20 73 69 7a 65 20 6c 69 6d 69 74 22  eded size limit"
3a80: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
3a90: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
3aa0: 54 52 41 49 4e 54 3a 20 7a 20 3d 20 22 63 6f 6e  TRAINT: z = "con
3ab0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 3b  straint failed";
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ad0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3ae0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d  case SQLITE_MISM
3af0: 41 54 43 48 3a 20 20 20 7a 20 3d 20 22 64 61 74  ATCH:   z = "dat
3b00: 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22 3b  atype mismatch";
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3b30: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55  case SQLITE_MISU
3b40: 53 45 3a 20 20 20 20 20 7a 20 3d 20 22 6c 69 62  SE:     z = "lib
3b50: 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c  rary routine cal
3b60: 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65  led out of seque
3b70: 6e 63 65 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  nce";break;.    
3b80: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  case SQLITE_NOLF
3b90: 53 3a 20 20 20 20 20 20 7a 20 3d 20 22 6c 61 72  S:      z = "lar
3ba0: 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20  ge file support 
3bb0: 69 73 20 64 69 73 61 62 6c 65 64 22 3b 20 20 20  is disabled";   
3bc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3bd0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48  case SQLITE_AUTH
3be0: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 61 75 74  :       z = "aut
3bf0: 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65  horization denie
3c00: 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d";             
3c10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3c20: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d  case SQLITE_FORM
3c30: 41 54 3a 20 20 20 20 20 7a 20 3d 20 22 61 75 78  AT:     z = "aux
3c40: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
3c50: 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 3b 20 20  format error";  
3c60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3c70: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47  case SQLITE_RANG
3c80: 45 3a 20 20 20 20 20 20 7a 20 3d 20 22 62 69 6e  E:      z = "bin
3c90: 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65  d or column inde
3ca0: 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 3b  x out of range";
3cb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3cc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41  case SQLITE_NOTA
3cd0: 44 42 3a 20 20 20 20 20 7a 20 3d 20 22 66 69 6c  DB:     z = "fil
3ce0: 65 20 69 73 20 65 6e 63 72 79 70 74 65 64 20 6f  e is encrypted o
3cf0: 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62  r is not a datab
3d00: 61 73 65 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  ase";break;.    
3d10: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
3d20: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 75 6e 6b          z = "unk
3d30: 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 20 20 20 20  nown error";    
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
3d60: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f    return z;.}../
3d70: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3d80: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62  e implements a b
3d90: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61  usy callback tha
3da0: 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69  t sleeps and tri
3db0: 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69  es.** again unti
3dc0: 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75  l a timeout valu
3dd0: 65 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 54  e is reached.  T
3de0: 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65  he timeout value
3df0: 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65   is.** an intege
3e00: 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  r number of mill
3e10: 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20  iseconds passed 
3e20: 69 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 0a  in as the first.
3e30: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
3e40: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
3e50: 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c  eDefaultBusyCall
3e60: 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72  back(. void *ptr
3e70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3e80: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
3e90: 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63  ection */. int c
3ea0: 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  ount            
3eb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3ec0: 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73   times table has
3ed0: 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b   been busy */.){
3ee0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
3ef0: 49 4e 20 7c 7c 20 28 64 65 66 69 6e 65 64 28 48  IN || (defined(H
3f00: 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
3f10: 41 56 45 5f 55 53 4c 45 45 50 29 0a 20 20 73 74  AVE_USLEEP).  st
3f20: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 64 65  atic const u8 de
3f30: 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20  lays[] =.     { 
3f40: 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c  1, 2, 5, 10, 15,
3f50: 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35   20, 25, 25,  25
3f60: 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30 30 20  ,  50,  50, 100 
3f70: 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
3f80: 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a  t u8 totals[] =.
3f90: 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20       { 0, 1, 3, 
3fa0: 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c 20   8, 18, 33, 53, 
3fb0: 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20 31 37  78, 103, 128, 17
3fc0: 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65 66 69  8, 228 };.# defi
3fd0: 6e 65 20 4e 44 45 4c 41 59 20 28 73 69 7a 65 6f  ne NDELAY (sizeo
3fe0: 66 28 64 65 6c 61 79 73 29 2f 73 69 7a 65 6f 66  f(delays)/sizeof
3ff0: 28 64 65 6c 61 79 73 5b 30 5d 29 29 0a 20 20 73  (delays[0])).  s
4000: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
4010: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
4020: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d  nt timeout = db-
4030: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
4040: 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72  int delay, prior
4050: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  ;..  assert( cou
4060: 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63  nt>=0 );.  if( c
4070: 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b  ount < NDELAY ){
4080: 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c  .    delay = del
4090: 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20  ays[count];.    
40a0: 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63  prior = totals[c
40b0: 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ount];.  }else{.
40c0: 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61      delay = dela
40d0: 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20  ys[NDELAY-1];.  
40e0: 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73    prior = totals
40f0: 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c  [NDELAY-1] + del
4100: 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41  ay*(count-(NDELA
4110: 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Y-1));.  }.  if(
4120: 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e   prior + delay >
4130: 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20   timeout ){.    
4140: 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74 20  delay = timeout 
4150: 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28  - prior;.    if(
4160: 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75   delay<=0 ) retu
4170: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
4180: 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70  te3OsSleep(db->p
4190: 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29  Vfs, delay*1000)
41a0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
41b0: 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  lse.  sqlite3 *d
41c0: 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70  b = (sqlite3 *)p
41d0: 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75  tr;.  int timeou
41e0: 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29  t = ((sqlite3 *)
41f0: 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75  ptr)->busyTimeou
4200: 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b  t;.  if( (count+
4210: 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f 75  1)*1000 > timeou
4220: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
4230: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
4240: 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73  OsSleep(db->pVfs
4250: 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72 65  , 1000000);.  re
4260: 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
4270: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
4280: 68 65 20 67 69 76 65 6e 20 62 75 73 79 20 68 61  he given busy ha
4290: 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ndler..**.** Thi
42a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
42b0: 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65 72  led when an oper
42c0: 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77 69 74  ation failed wit
42d0: 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20  h a lock..** If 
42e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
42f0: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
4300: 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69  he lock is retri
4310: 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65  ed.  If it.** re
4320: 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65  turns 0, the ope
4330: 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69  ration aborts wi
4340: 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53  th an SQLITE_BUS
4350: 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  Y error..*/.int 
4360: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
4370: 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e  yHandler(BusyHan
4380: 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  dler *p){.  int 
4390: 72 63 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  rc;.  if( p==0 |
43a0: 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c  | p->xFunc==0 ||
43b0: 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65   p->nBusy<0 ) re
43c0: 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70  turn 0;.  rc = p
43d0: 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c  ->xFunc(p->pArg,
43e0: 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66   p->nBusy);.  if
43f0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc==0 ){.    p
4400: 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20  ->nBusy = -1;.  
4410: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42  }else{.    p->nB
4420: 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  usy++;.  }.  ret
4430: 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  urn rc; .}../*.*
4440: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
4450: 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c  ets the busy cal
4460: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
4470: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
4480: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
4490: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
44a0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
44b0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
44c0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
44d0: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
44e0: 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  db,.  int (*xBus
44f0: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20  y)(void*,int),. 
4500: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
4510: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
4520: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
4530: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
4540: 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79  er.xFunc = xBusy
4550: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
4560: 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b  ler.pArg = pArg;
4570: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
4580: 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
4590: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
45a0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
45b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
45c0: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
45d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
45e0: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
45f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4600: 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73  sets the progres
4610: 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  s callback for a
4620: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
4630: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
4640: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
4650: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
4660: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  en argument. The
4670: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
4680: 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e  ck will.** be in
4690: 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73  voked every nOps
46a0: 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69   opcodes..*/.voi
46b0: 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65  d sqlite3_progre
46c0: 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  ss_handler(.  sq
46d0: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
46e0: 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a  t nOps,.  int (*
46f0: 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a  xProgress)(void*
4700: 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ), .  void *pArg
4710: 0a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  .){.  if( sqlite
4720: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
4730: 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
4740: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
4750: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 69 66  ->mutex);.    if
4760: 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20  ( nOps>0 ){.    
4770: 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20    db->xProgress 
4780: 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20  = xProgress;.   
4790: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
47a0: 4f 70 73 20 3d 20 6e 4f 70 73 3b 0a 20 20 20 20  Ops = nOps;.    
47b0: 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41    db->pProgressA
47c0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 20 20 7d  rg = pArg;.    }
47d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e  else{.      db->
47e0: 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  xProgress = 0;. 
47f0: 20 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65       db->nProgre
4800: 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 20  ssOps = 0;.     
4810: 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72   db->pProgressAr
4820: 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
4830: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
4840: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
4850: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
4860: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4870: 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65  ne installs a de
4880: 66 61 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c  fault busy handl
4890: 65 72 20 74 68 61 74 20 77 61 69 74 73 20 66 6f  er that waits fo
48a0: 72 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  r the.** specifi
48b0: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  ed number of mil
48c0: 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65  liseconds before
48d0: 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f   returning 0..*/
48e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73  .int sqlite3_bus
48f0: 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65  y_timeout(sqlite
4900: 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a  3 *db, int ms){.
4910: 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20    if( ms>0 ){.  
4920: 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75    db->busyTimeou
4930: 74 20 3d 20 6d 73 3b 0a 20 20 20 20 73 71 6c 69  t = ms;.    sqli
4940: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
4950: 28 64 62 2c 20 73 71 6c 69 74 65 44 65 66 61 75  (db, sqliteDefau
4960: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20  ltBusyCallback, 
4970: 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 7d 65  (void*)db);.  }e
4980: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
4990: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
49a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
49b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
49c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20  .}../*.** Cause 
49d0: 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72  any pending oper
49e0: 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74  ation to stop at
49f0: 20 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70   its earliest op
4a00: 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f  portunity..*/.vo
4a10: 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  id sqlite3_inter
4a20: 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62  rupt(sqlite3 *db
4a30: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
4a40: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
4a50: 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 75 31 2e  ) ){.    db->u1.
4a60: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20  isInterrupted = 
4a70: 31 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  1;.  }.}.../*.**
4a80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4a90: 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61  s exactly the sa
4aa0: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72  me as sqlite3_cr
4ab0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c  eate_function(),
4ac0: 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20   except.** that 
4ad0: 69 74 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  it is designed t
4ae0: 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69  o be called by i
4af0: 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68  nternal code. Th
4b00: 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a  e difference is.
4b10: 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c  ** that if a mal
4b20: 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73  loc() fails in s
4b30: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
4b40: 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72  nction(), an err
4b50: 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65  or code.** is re
4b60: 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d  turned and the m
4b70: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
4b80: 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e   cleared. .*/.in
4b90: 74 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  t sqlite3CreateF
4ba0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  unc(.  sqlite3 *
4bb0: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
4bc0: 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c   *zFunctionName,
4bd0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
4be0: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
4bf0: 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69  pUserData,.  voi
4c00: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
4c10: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
4c20: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
4c30: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
4c40: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
4c50: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
4c60: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
4c70: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
4c80: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
4c90: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20  .  FuncDef *p;. 
4ca0: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61   int nName;..  a
4cb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
4cc0: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
4cd0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46  tex) );.  if( zF
4ce0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c  unctionName==0 |
4cf0: 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63 20 26  |.      (xFunc &
4d00: 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74  & (xFinal || xSt
4d10: 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28  ep)) || .      (
4d20: 21 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61  !xFunc && (xFina
4d30: 6c 20 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c  l && !xStep)) ||
4d40: 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26  .      (!xFunc &
4d50: 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53  & (!xFinal && xS
4d60: 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28  tep)) ||.      (
4d70: 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e  nArg<-1 || nArg>
4d80: 31 32 37 29 20 7c 7c 0a 20 20 20 20 20 20 28 32  127) ||.      (2
4d90: 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 74 72 6c  55<(nName = strl
4da0: 65 6e 28 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  en(zFunctionName
4db0: 29 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ))) ){.    sqlit
4dc0: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
4dd0: 54 45 5f 45 52 52 4f 52 2c 20 22 62 61 64 20 70  TE_ERROR, "bad p
4de0: 61 72 61 6d 65 74 65 72 73 22 29 3b 0a 20 20 20  arameters");.   
4df0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
4e00: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 23 69 66  RROR;.  }.  .#if
4e10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4e20: 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53  _UTF16.  /* If S
4e30: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73  QLITE_UTF16 is s
4e40: 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20  pecified as the 
4e50: 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74  encoding type, t
4e60: 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20  ransform this.  
4e70: 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c  ** to one of SQL
4e80: 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
4e90: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73  QLITE_UTF16BE us
4ea0: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  ing the.  ** SQL
4eb0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
4ec0: 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54  macro. SQLITE_UT
4ed0: 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20  F16 is not used 
4ee0: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a  internally..  **
4ef0: 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  ** If SQLITE_
4f00: 41 4e 59 20 69 73 20 73 70 65 63 69 66 69 65 64  ANY is specified
4f10: 2c 20 61 64 64 20 74 68 72 65 65 20 76 65 72 73  , add three vers
4f20: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63  ions of the func
4f30: 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tion.  ** to the
4f40: 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a   hash table..  *
4f50: 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c  /.  if( enc==SQL
4f60: 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20  ITE_UTF16 ){.   
4f70: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
4f80: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c  F16NATIVE;.  }el
4f90: 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49  se if( enc==SQLI
4fa0: 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e  TE_ANY ){.    in
4fb0: 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  t rc;.    rc = s
4fc0: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
4fd0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
4fe0: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
4ff0: 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20  _UTF8,.         
5000: 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63  pUserData, xFunc
5010: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 29  , xStep, xFinal)
5020: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
5030: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
5040: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
5050: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
5060: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
5070: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
5080: 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72  .          pUser
5090: 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74  Data, xFunc, xSt
50a0: 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 20  ep, xFinal);.   
50b0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
50c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
50d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
50e0: 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c   }.    enc = SQL
50f0: 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d  ITE_UTF16BE;.  }
5100: 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53  .#else.  enc = S
5110: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64  QLITE_UTF8;.#end
5120: 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  if.  .  /* Check
5130: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
5140: 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
5150: 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20  g overridden or 
5160: 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a  deleted. If so,.
5170: 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61    ** and there a
5180: 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74  re active VMs, t
5190: 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
51a0: 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e  E_BUSY. If a fun
51b0: 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65  ction.  ** is be
51c0: 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64  ing overridden/d
51d0: 65 6c 65 74 65 64 20 62 75 74 20 74 68 65 72 65  eleted but there
51e0: 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
51f0: 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20  Ms, allow the.  
5200: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
5210: 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76  continue but inv
5220: 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63  alidate all prec
5230: 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
5240: 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73  ts..  */.  p = s
5250: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
5260: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
5270: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
5280: 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66  g, enc, 0);.  if
5290: 28 20 70 20 26 26 20 70 2d 3e 69 50 72 65 66 45  ( p && p->iPrefE
52a0: 6e 63 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41  nc==enc && p->nA
52b0: 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20  rg==nArg ){.    
52c0: 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  if( db->activeVd
52d0: 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  beCnt ){.      s
52e0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
52f0: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
5300: 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f        "Unable to
5310: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75   delete/modify u
5320: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65  ser-function due
5330: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
5340: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61  ments");.      a
5350: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
5360: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
5370: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5380: 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
5390: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
53a0: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
53b0: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
53c0: 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  }.  }..  p = sql
53d0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
53e0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
53f0: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
5400: 20 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65   enc, 1);.  asse
5410: 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  rt(p || db->mall
5420: 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28  ocFailed);.  if(
5430: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
5440: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
5450: 20 20 7d 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d    }.  p->flags =
5460: 20 30 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d   0;.  p->xFunc =
5470: 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74   xFunc;.  p->xSt
5480: 65 70 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d  ep = xStep;.  p-
5490: 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69  >xFinalize = xFi
54a0: 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44  nal;.  p->pUserD
54b0: 61 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b  ata = pUserData;
54c0: 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 6e 41 72  .  p->nArg = nAr
54d0: 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
54e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
54f0: 43 72 65 61 74 65 20 6e 65 77 20 75 73 65 72 20  Create new user 
5500: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  functions..*/.in
5510: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
5520: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  _function(.  sql
5530: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
5540: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f  t char *zFunctio
5550: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
5560: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
5570: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
5580: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
5590: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
55a0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
55b0: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
55c0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
55d0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
55e0: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
55f0: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
5600: 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20  3_context*).){. 
5610: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
5620: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
5630: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 63 20  b->mutex);.  rc 
5640: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
5650: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  unc(db, zFunctio
5660: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 65 6e 63  nName, nArg, enc
5670: 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  , p, xFunc, xSte
5680: 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 72 63  p, xFinal);.  rc
5690: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
56a0: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
56b0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
56c0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
56d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
56e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
56f0: 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74  _UTF16.int sqlit
5700: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
5710: 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20  on16(.  sqlite3 
5720: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  *db,.  const voi
5730: 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  d *zFunctionName
5740: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
5750: 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20  int eTextRep,.  
5760: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
5770: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
5780: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
5790: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a  lite3_value**),.
57a0: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
57b0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
57c0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
57d0: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ue**),.  void (*
57e0: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
57f0: 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69  context*).){.  i
5800: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
5810: 46 75 6e 63 38 3b 0a 20 20 73 71 6c 69 74 65 33  Func8;.  sqlite3
5820: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
5830: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
5840: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
5850: 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38  iled );.  zFunc8
5860: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74   = sqlite3Utf16t
5870: 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  o8(db, zFunction
5880: 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 72 63 20  Name, -1);.  rc 
5890: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
58a0: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20  unc(db, zFunc8, 
58b0: 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20  nArg, eTextRep, 
58c0: 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  p, xFunc, xStep,
58d0: 20 78 46 69 6e 61 6c 29 3b 0a 20 20 73 71 6c 69   xFinal);.  sqli
58e0: 74 65 33 5f 66 72 65 65 28 7a 46 75 6e 63 38 29  te3_free(zFunc8)
58f0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
5900: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
5910: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
5920: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
5930: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5940: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
5950: 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
5960: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
5970: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
5980: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
5990: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
59a0: 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
59b0: 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
59c0: 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
59d0: 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
59e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
59f0: 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
5a00: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
5a10: 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
5a20: 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
5a30: 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
5a40: 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
5a50: 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
5a60: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
5a70: 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
5a80: 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
5a90: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
5aa0: 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
5ab0: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
5ac0: 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
5ad0: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
5ae0: 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
5af0: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
5b00: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
5b10: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
5b20: 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
5b30: 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
5b40: 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
5b50: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
5b60: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
5b70: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
5b80: 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
5b90: 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nName = strlen(z
5ba0: 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 3b  Name);.  int rc;
5bb0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
5bc0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
5bd0: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
5be0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
5bf0: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e   zName, nName, n
5c00: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
5c10: 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  , 0)==0 ){.    s
5c20: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
5c30: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67  (db, zName, nArg
5c40: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c60: 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49       0, sqlite3I
5c70: 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20  nvalidFunction, 
5c80: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20  0, 0);.  }.  rc 
5c90: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
5ca0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
5cb0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
5cc0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
5cd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5ce0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
5cf0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a  E_OMIT_TRACE./*.
5d00: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72  ** Register a tr
5d10: 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ace function.  T
5d20: 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65  he pArg from the
5d30: 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69   previously regi
5d40: 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20  stered trace.** 
5d50: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a  is returned.  .*
5d60: 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63  *.** A NULL trac
5d70: 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73  e function means
5d80: 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67   that no tracing
5d90: 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41   is executes.  A
5da0: 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61   non-NULL.** tra
5db0: 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ce is a pointer 
5dc0: 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68  to a function th
5dd0: 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74  at is invoked at
5de0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
5df0: 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  ch.** SQL statem
5e00: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ent..*/.void *sq
5e10: 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69  lite3_trace(sqli
5e20: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a  te3 *db, void (*
5e30: 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f  xTrace)(void*,co
5e40: 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64  nst char*), void
5e50: 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20   *pArg){.  void 
5e60: 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  *pOld;.  sqlite3
5e70: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
5e80: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
5e90: 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 3b  = db->pTraceArg;
5ea0: 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20  .  db->xTrace = 
5eb0: 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54  xTrace;.  db->pT
5ec0: 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  raceArg = pArg;.
5ed0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5ee0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
5ef0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
5f00: 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  .}./*.** Registe
5f10: 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  r a profile func
5f20: 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20  tion.  The pArg 
5f30: 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
5f40: 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 0a  sly registered .
5f50: 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74  ** profile funct
5f60: 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ion is returned.
5f70: 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20    .**.** A NULL 
5f80: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
5f90: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 70   means that no p
5fa0: 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65 63  rofiling is exec
5fb0: 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c  utes.  A non-NUL
5fc0: 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73 20  L.** profile is 
5fd0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
5fe0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
5ff0: 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63  invoked at the c
6000: 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20  onclusion of.** 
6010: 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
6020: 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e 0a  nt that is run..
6030: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
6040: 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69  _profile(.  sqli
6050: 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20  te3 *db,.  void 
6060: 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 64  (*xProfile)(void
6070: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71  *,const char*,sq
6080: 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20  lite_uint64),.  
6090: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20  void *pArg.){.  
60a0: 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71  void *pOld;.  sq
60b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
60c0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
60d0: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66  pOld = db->pProf
60e0: 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50  ileArg;.  db->xP
60f0: 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c  rofile = xProfil
6100: 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c  e;.  db->pProfil
6110: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
6120: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
6130: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
6140: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
6150: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
6160: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a  _OMIT_TRACE */..
6170: 2f 2a 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54 41  /*** EXPERIMENTA
6180: 4c 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 67 69  L ***.**.** Regi
6190: 73 74 65 72 20 61 20 66 75 6e 63 74 69 6f 6e 20  ster a function 
61a0: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68  to be invoked wh
61b0: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
61c0: 20 63 6f 6d 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66   comments..** If
61d0: 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e   the invoked fun
61e0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f  ction returns no
61f0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
6200: 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20   commit becomes 
6210: 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  a.** rollback..*
6220: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
6230: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73  commit_hook(.  s
6240: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
6250: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
6260: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
6270: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
6280: 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63    int (*xCallbac
6290: 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46  k)(void*),  /* F
62a0: 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b  unction to invok
62b0: 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74  e on each commit
62c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62e0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
62f0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
6300: 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
6310: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6320: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
6330: 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
6340: 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d  CommitArg;.  db-
6350: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
6360: 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
6370: 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d  db->pCommitArg =
6380: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
6390: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
63a0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
63b0: 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pOld;.}../*.**
63c0: 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
63d0: 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
63e0: 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 72  ed each time a r
63f0: 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a  ow is updated,.*
6400: 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65  * inserted or de
6410: 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 69 73  leted using this
6420: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
6430: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
6440: 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f  qlite3_update_ho
6450: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
6460: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
6470: 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
6480: 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ok to this datab
6490: 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ase */.  void (*
64a0: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
64b0: 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20  ,int,char const 
64c0: 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73  *,char const *,s
64d0: 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20  qlite_int64),.  
64e0: 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
64f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
6500: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
6510: 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
6520: 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69  id *pRet;.  sqli
6530: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
6540: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
6550: 65 74 20 3d 20 64 62 2d 3e 70 55 70 64 61 74 65  et = db->pUpdate
6560: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61  Arg;.  db->xUpda
6570: 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  teCallback = xCa
6580: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55  llback;.  db->pU
6590: 70 64 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b  pdateArg = pArg;
65a0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
65b0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
65c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
65d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
65e0: 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
65f0: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
6600: 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63  h time a transac
6610: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a  tion is rolled.*
6620: 2a 20 62 61 63 6b 20 62 79 20 74 68 69 73 20 64  * back by this d
6630: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6640: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
6650: 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f  ite3_rollback_ho
6660: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
6670: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
6680: 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
6690: 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ok to this datab
66a0: 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ase */.  void (*
66b0: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
66c0: 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66  ), /* Callback f
66d0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
66e0: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
66f0: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
6700: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
6710: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
6720: 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  *pRet;.  sqlite3
6730: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
6740: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
6750: 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41  = db->pRollbackA
6760: 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62  rg;.  db->xRollb
6770: 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  ackCallback = xC
6780: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
6790: 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70 41  RollbackArg = pA
67a0: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
67b0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
67c0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
67d0: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Ret;.}../*.** Th
67e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
67f0: 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
6800: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61   connection to a
6810: 20 64 61 74 61 62 61 73 65 20 42 54 72 65 65 0a   database BTree.
6820: 2a 2a 20 64 72 69 76 65 72 2e 20 20 49 66 20 7a  ** driver.  If z
6830: 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
6840: 6e 61 6d 65 20 6f 66 20 61 20 66 69 6c 65 2c 20  name of a file, 
6850: 74 68 65 6e 20 74 68 61 74 20 66 69 6c 65 20 69  then that file i
6860: 73 0a 2a 2a 20 6f 70 65 6e 65 64 20 61 6e 64 20  s.** opened and 
6870: 75 73 65 64 2e 20 20 49 66 20 7a 46 69 6c 65 6e  used.  If zFilen
6880: 61 6d 65 20 69 73 20 74 68 65 20 6d 61 67 69 63  ame is the magic
6890: 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
68a0: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61 74   then.** the dat
68b0: 61 62 61 73 65 20 69 73 20 73 74 6f 72 65 64 20  abase is stored 
68c0: 69 6e 20 6d 65 6d 6f 72 79 20 28 61 6e 64 20 69  in memory (and i
68d0: 73 20 74 68 75 73 20 66 6f 72 67 6f 74 74 65 6e  s thus forgotten
68e0: 20 61 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20 74   as soon as.** t
68f0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
6900: 20 63 6c 6f 73 65 64 2e 29 20 20 49 66 20 7a 46   closed.)  If zF
6910: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
6920: 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
6930: 65 0a 2a 2a 20 69 73 20 61 20 22 76 69 72 74 75  e.** is a "virtu
6940: 61 6c 22 20 64 61 74 61 62 61 73 65 20 66 6f 72  al" database for
6950: 20 74 72 61 6e 73 69 65 6e 74 20 75 73 65 20 6f   transient use o
6960: 6e 6c 79 20 61 6e 64 20 69 73 20 64 65 6c 65 74  nly and is delet
6970: 65 64 20 61 73 0a 2a 2a 20 73 6f 6f 6e 20 61 73  ed as.** soon as
6980: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
6990: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
69a0: 20 41 20 76 69 72 74 75 61 6c 20 64 61 74 61 62   A virtual datab
69b0: 61 73 65 20 63 61 6e 20 62 65 20 65 69 74 68 65  ase can be eithe
69c0: 72 20 61 20 64 69 73 6b 20 66 69 6c 65 20 28 74  r a disk file (t
69d0: 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  hat is automatic
69e0: 61 6c 6c 79 0a 2a 2a 20 64 65 6c 65 74 65 64 20  ally.** deleted 
69f0: 77 68 65 6e 20 74 68 65 20 66 69 6c 65 20 69 73  when the file is
6a00: 20 63 6c 6f 73 65 64 29 20 6f 72 20 69 74 20 61   closed) or it a
6a10: 6e 20 62 65 20 68 65 6c 64 20 65 6e 74 69 72 65  n be held entire
6a20: 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 0a 2a 2a  ly in memory,.**
6a30: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
6a40: 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  e values of the 
6a50: 54 45 4d 50 5f 53 54 4f 52 45 20 63 6f 6d 70 69  TEMP_STORE compi
6a60: 6c 65 2d 74 69 6d 65 20 6d 61 63 72 6f 20 61 6e  le-time macro an
6a70: 64 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 74 65 6d  d the.** db->tem
6a80: 70 5f 73 74 6f 72 65 20 76 61 72 69 61 62 6c 65  p_store variable
6a90: 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
6aa0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
6ab0: 72 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  rt:.**.**       
6ac0: 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20 64  TEMP_STORE     d
6ad0: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20 20  b->temp_store   
6ae0: 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65    Location of te
6af0: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
6b00: 0a 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d  .**       ------
6b10: 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
6b20: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
6b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
6b50: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
6b60: 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20          any     
6b70: 20 20 20 20 20 20 20 20 66 69 6c 65 0a 2a 2a 20          file.** 
6b80: 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
6b90: 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
6ba0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 0a 2a            file.*
6bb0: 2a 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20  *           1   
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
6be0: 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ry.**           
6bf0: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
6c00: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
6c10: 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  file.**         
6c20: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
6c30: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
6c40: 20 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20    file.**       
6c50: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
6c60: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
6c70: 20 20 20 20 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20      memory.**   
6c80: 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
6c90: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
6ca0: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 0a 2a          memory.*
6cb0: 2a 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20  *           3   
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20              any 
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
6ce0: 72 79 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ry.*/.int sqlite
6cf0: 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 0a 20  3BtreeFactory(. 
6d00: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20 2a   const sqlite3 *
6d10: 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  db,        /* Ma
6d20: 69 6e 20 64 61 74 61 62 61 73 65 20 77 68 65 6e  in database when
6d30: 20 6f 70 65 6e 69 6e 67 20 61 75 78 20 6f 74 68   opening aux oth
6d40: 65 72 77 69 73 65 20 30 20 2a 2f 0a 20 20 63 6f  erwise 0 */.  co
6d50: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
6d60: 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ame,    /* Name 
6d70: 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
6d80: 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65  aining the BTree
6d90: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
6da0: 6e 74 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c 2c 20  nt omitJournal, 
6db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 54           /* if T
6dc0: 52 55 45 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  RUE then do not 
6dd0: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 66 69 6c  journal this fil
6de0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 61 63 68  e */.  int nCach
6df0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
6e00: 20 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 70 61 67   /* How many pag
6e10: 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
6e20: 61 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ache */.  int vf
6e30: 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
6e40: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
6e50: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 76  sed through to v
6e60: 66 73 4f 70 65 6e 20 2a 2f 0a 20 20 42 74 72 65  fsOpen */.  Btre
6e70: 65 20 2a 2a 70 70 42 74 72 65 65 20 20 20 20 20  e **ppBtree     
6e80: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
6e90: 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
6ea0: 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
6eb0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 74  e */.){.  int bt
6ec0: 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74  Flags = 0;.  int
6ed0: 20 72 63 3b 0a 20 20 0a 20 20 61 73 73 65 72 74   rc;.  .  assert
6ee0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6ef0: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
6f00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70 42  );.  assert( ppB
6f10: 74 72 65 65 20 21 3d 20 30 29 3b 0a 20 20 69 66  tree != 0);.  if
6f20: 28 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c 20 29 7b  ( omitJournal ){
6f30: 0a 20 20 20 20 62 74 46 6c 61 67 73 20 7c 3d 20  .    btFlags |= 
6f40: 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  BTREE_OMIT_JOURN
6f50: 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  AL;.  }.  if( db
6f60: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
6f70: 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20  _NoReadlock ){. 
6f80: 20 20 20 62 74 46 6c 61 67 73 20 7c 3d 20 42 54     btFlags |= BT
6f90: 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 3b  REE_NO_READLOCK;
6fa0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65  .  }.  if( zFile
6fb0: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 20 54  name==0 ){.#if T
6fc0: 45 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20 20  EMP_STORE==0.   
6fd0: 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
6fe0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  /.#endif.#ifndef
6ff0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
7000: 4f 52 59 44 42 0a 23 69 66 20 54 45 4d 50 5f 53  ORYDB.#if TEMP_S
7010: 54 4f 52 45 3d 3d 31 0a 20 20 20 20 69 66 28 20  TORE==1.    if( 
7020: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d  db->temp_store==
7030: 32 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  2 ) zFilename = 
7040: 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65 6e 64  ":memory:";.#end
7050: 69 66 0a 23 69 66 20 54 45 4d 50 5f 53 54 4f 52  if.#if TEMP_STOR
7060: 45 3d 3d 32 0a 20 20 20 20 69 66 28 20 64 62 2d  E==2.    if( db-
7070: 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29  >temp_store!=1 )
7080: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 3a 6d   zFilename = ":m
7090: 65 6d 6f 72 79 3a 22 3b 0a 23 65 6e 64 69 66 0a  emory:";.#endif.
70a0: 23 69 66 20 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  #if TEMP_STORE==
70b0: 33 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  3.    zFilename 
70c0: 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65  = ":memory:";.#e
70d0: 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ndif.#endif /* S
70e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
70f0: 59 44 42 20 2a 2f 0a 20 20 7d 0a 0a 20 20 69 66  YDB */.  }..  if
7100: 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  ( (vfsFlags & SQ
7110: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
7120: 42 29 21 3d 30 20 26 26 20 28 7a 46 69 6c 65 6e  B)!=0 && (zFilen
7130: 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 6c 65  ame==0 || *zFile
7140: 6e 61 6d 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  name==0) ){.    
7150: 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46  vfsFlags = (vfsF
7160: 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f  lags & ~SQLITE_O
7170: 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53  PEN_MAIN_DB) | S
7180: 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
7190: 44 42 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  DB;.  }.  rc = s
71a0: 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
71b0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 73 71 6c 69  zFilename, (sqli
71c0: 74 65 33 20 2a 29 64 62 2c 20 70 70 42 74 72 65  te3 *)db, ppBtre
71d0: 65 2c 20 62 74 46 6c 61 67 73 2c 20 76 66 73 46  e, btFlags, vfsF
71e0: 6c 61 67 73 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  lags);..  /* If 
71f0: 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73  the B-Tree was s
7200: 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
7210: 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65  ed, set the page
7220: 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20  r-cache size to 
7230: 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74  the.  ** default
7240: 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20   value. Except, 
7250: 69 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 42  if the call to B
7260: 74 72 65 65 4f 70 65 6e 28 29 20 72 65 74 75 72  treeOpen() retur
7270: 6e 65 64 20 61 20 68 61 6e 64 6c 65 0a 20 20 2a  ned a handle.  *
7280: 2a 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 65 78 69  * open on an exi
7290: 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
72a0: 65 72 2d 63 61 63 68 65 2c 20 64 6f 20 6e 6f 74  er-cache, do not
72b0: 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   change the page
72c0: 72 2d 63 61 63 68 65 20 0a 20 20 2a 2a 20 73 69  r-cache .  ** si
72d0: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ze..  */.  if( r
72e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
72f0: 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  0==sqlite3BtreeS
7300: 63 68 65 6d 61 28 2a 70 70 42 74 72 65 65 2c 20  chema(*ppBtree, 
7310: 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 73 71 6c  0, 0) ){.    sql
7320: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
7330: 65 53 69 7a 65 28 2a 70 70 42 74 72 65 65 2c 20  eSize(*ppBtree, 
7340: 6e 43 61 63 68 65 29 3b 0a 20 20 7d 0a 20 20 72  nCache);.  }.  r
7350: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7360: 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20  ** Return UTF-8 
7370: 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20  encoded English 
7380: 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61  language explana
7390: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
73a0: 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72   recent.** error
73b0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
73c0: 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  *sqlite3_errmsg(
73d0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
73e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
73f0: 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
7400: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
7410: 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  rStr(SQLITE_NOME
7420: 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  M);.  }.  if( !s
7430: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
7440: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 7c 7c  kSickOrOk(db) ||
7450: 20 64 62 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51   db->errCode==SQ
7460: 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20  LITE_MISUSE ){. 
7470: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
7480: 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d  3ErrStr(SQLITE_M
7490: 49 53 55 53 45 29 3b 0a 20 20 7d 0a 20 20 73 71  ISUSE);.  }.  sq
74a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
74b0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
74c0: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
74d0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
74e0: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
74f0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d  3_value_text(db-
7500: 3e 70 45 72 72 29 3b 0a 20 20 61 73 73 65 72 74  >pErr);.  assert
7510: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
7520: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  led );.  if( z==
7530: 30 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  0 ){.    z = sql
7540: 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
7550: 72 72 43 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 73  rrCode);.  }.  s
7560: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
7570: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
7580: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69   return z;.}..#i
7590: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
75a0: 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
75b0: 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f  turn UTF-16 enco
75c0: 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67  ded English lang
75d0: 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  uage explanation
75e0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
75f0: 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f  ent.** error..*/
7600: 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
7610: 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71  ite3_errmsg16(sq
7620: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 2f 2a  lite3 *db){.  /*
7630: 20 42 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65   Because all the
7640: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
7650: 68 65 20 73 74 72 69 6e 67 20 61 72 65 20 69 6e  he string are in
7660: 20 74 68 65 20 75 6e 69 63 6f 64 65 0a 20 20 2a   the unicode.  *
7670: 2a 20 72 61 6e 67 65 20 30 78 30 30 2d 30 78 46  * range 0x00-0xF
7680: 46 2c 20 69 66 20 77 65 20 70 61 64 20 74 68 65  F, if we pad the
7690: 20 62 69 67 2d 65 6e 64 69 61 6e 20 73 74 72 69   big-endian stri
76a0: 6e 67 20 77 69 74 68 20 61 20 0a 20 20 2a 2a 20  ng with a .  ** 
76b0: 7a 65 72 6f 20 62 79 74 65 2c 20 77 65 20 63 61  zero byte, we ca
76c0: 6e 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 69 74  n obtain the lit
76d0: 74 6c 65 2d 65 6e 64 69 61 6e 20 73 74 72 69 6e  tle-endian strin
76e0: 67 20 77 69 74 68 0a 20 20 2a 2a 20 26 62 69 67  g with.  ** &big
76f0: 5f 65 6e 64 69 61 6e 5b 31 5d 2e 0a 20 20 2a 2f  _endian[1]..  */
7700: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
7710: 63 68 61 72 20 6f 75 74 4f 66 4d 65 6d 42 65 5b  char outOfMemBe[
7720: 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20 27 6f 27  ] = {.    0, 'o'
7730: 2c 20 30 2c 20 27 75 27 2c 20 30 2c 20 27 74 27  , 0, 'u', 0, 't'
7740: 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20 20 20 30  , 0, ' ', .    0
7750: 2c 20 27 6f 27 2c 20 30 2c 20 27 66 27 2c 20 30  , 'o', 0, 'f', 0
7760: 2c 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20 27  , ' ', .    0, '
7770: 6d 27 2c 20 30 2c 20 27 65 27 2c 20 30 2c 20 27  m', 0, 'e', 0, '
7780: 6d 27 2c 20 30 2c 20 27 6f 27 2c 20 30 2c 20 27  m', 0, 'o', 0, '
7790: 72 27 2c 20 30 2c 20 27 79 27 2c 20 30 2c 20 30  r', 0, 'y', 0, 0
77a0: 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69  , 0.  };.  stati
77b0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6d 69 73  c const char mis
77c0: 75 73 65 42 65 20 5b 5d 20 3d 20 7b 0a 20 20 20  useBe [] = {.   
77d0: 20 30 2c 20 27 6c 27 2c 20 30 2c 20 27 69 27 2c   0, 'l', 0, 'i',
77e0: 20 30 2c 20 27 62 27 2c 20 30 2c 20 27 72 27 2c   0, 'b', 0, 'r',
77f0: 20 30 2c 20 27 61 27 2c 20 30 2c 20 27 72 27 2c   0, 'a', 0, 'r',
7800: 20 30 2c 20 27 79 27 2c 20 30 2c 20 27 20 27 2c   0, 'y', 0, ' ',
7810: 20 0a 20 20 20 20 30 2c 20 27 72 27 2c 20 30 2c   .    0, 'r', 0,
7820: 20 27 6f 27 2c 20 30 2c 20 27 75 27 2c 20 30 2c   'o', 0, 'u', 0,
7830: 20 27 74 27 2c 20 30 2c 20 27 69 27 2c 20 30 2c   't', 0, 'i', 0,
7840: 20 27 6e 27 2c 20 30 2c 20 27 65 27 2c 20 30 2c   'n', 0, 'e', 0,
7850: 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 63   ' ', .    0, 'c
7860: 27 2c 20 30 2c 20 27 61 27 2c 20 30 2c 20 27 6c  ', 0, 'a', 0, 'l
7870: 27 2c 20 30 2c 20 27 6c 27 2c 20 30 2c 20 27 65  ', 0, 'l', 0, 'e
7880: 27 2c 20 30 2c 20 27 64 27 2c 20 30 2c 20 27 20  ', 0, 'd', 0, ' 
7890: 27 2c 20 0a 20 20 20 20 30 2c 20 27 6f 27 2c 20  ', .    0, 'o', 
78a0: 30 2c 20 27 75 27 2c 20 30 2c 20 27 74 27 2c 20  0, 'u', 0, 't', 
78b0: 30 2c 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20  0, ' ', .    0, 
78c0: 27 6f 27 2c 20 30 2c 20 27 66 27 2c 20 30 2c 20  'o', 0, 'f', 0, 
78d0: 27 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 73 27  ' ', .    0, 's'
78e0: 2c 20 30 2c 20 27 65 27 2c 20 30 2c 20 27 71 27  , 0, 'e', 0, 'q'
78f0: 2c 20 30 2c 20 27 75 27 2c 20 30 2c 20 27 65 27  , 0, 'u', 0, 'e'
7900: 2c 20 30 2c 20 27 6e 27 2c 20 30 2c 20 27 63 27  , 0, 'n', 0, 'c'
7910: 2c 20 30 2c 20 27 65 27 2c 20 30 2c 20 30 2c 20  , 0, 'e', 0, 0, 
7920: 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20  0.  };..  const 
7930: 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21  void *z;.  if( !
7940: 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
7950: 20 28 76 6f 69 64 20 2a 29 28 26 6f 75 74 4f 66   (void *)(&outOf
7960: 4d 65 6d 42 65 5b 53 51 4c 49 54 45 5f 55 54 46  MemBe[SQLITE_UTF
7970: 31 36 4e 41 54 49 56 45 3d 3d 53 51 4c 49 54 45  16NATIVE==SQLITE
7980: 5f 55 54 46 31 36 4c 45 3f 31 3a 30 5d 29 3b 0a  _UTF16LE?1:0]);.
7990: 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
79a0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
79b0: 6b 4f 72 4f 6b 28 64 62 29 20 7c 7c 20 64 62 2d  kOrOk(db) || db-
79c0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
79d0: 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20 20 20 72  _MISUSE ){.    r
79e0: 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 28 26  eturn (void *)(&
79f0: 6d 69 73 75 73 65 42 65 5b 53 51 4c 49 54 45 5f  misuseBe[SQLITE_
7a00: 55 54 46 31 36 4e 41 54 49 56 45 3d 3d 53 51 4c  UTF16NATIVE==SQL
7a10: 49 54 45 5f 55 54 46 31 36 4c 45 3f 31 3a 30 5d  ITE_UTF16LE?1:0]
7a20: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
7a30: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
7a40: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
7a50: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
7a60: 69 6c 65 64 20 29 3b 0a 20 20 7a 20 3d 20 73 71  iled );.  z = sq
7a70: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
7a80: 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  16(db->pErr);.  
7a90: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
7aa0: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
7ab0: 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c  tr(db->pErr, -1,
7ac0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
7ad0: 62 2d 3e 65 72 72 43 6f 64 65 29 2c 0a 20 20 20  b->errCode),.   
7ae0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
7af0: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
7b00: 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  );.    z = sqlit
7b10: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
7b20: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20  db->pErr);.  }. 
7b30: 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d   /* A malloc() m
7b40: 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  ay have failed w
7b50: 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74  ithin the call t
7b60: 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  o sqlite3_value_
7b70: 74 65 78 74 31 36 28 29 0a 20 20 2a 2a 20 61 62  text16().  ** ab
7b80: 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ove. If this is 
7b90: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
7ba0: 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
7bb0: 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74  led flag needs t
7bc0: 6f 0a 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65  o.  ** be cleare
7bd0: 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
7be0: 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65  ng. Do this dire
7bf0: 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
7c00: 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
7c10: 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20 61  3ApiExit(), to a
7c20: 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68 65  void setting the
7c30: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
7c40: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
7c50: 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 6c 6c 6f    */.  db->mallo
7c60: 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 73  cFailed = 0;.  s
7c70: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
7c80: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
7c90: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e   return z;.}.#en
7ca0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
7cb0: 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
7cc0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** Return the mo
7cd0: 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20  st recent error 
7ce0: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
7cf0: 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74  y an SQLite rout
7d00: 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a  ine. If NULL is.
7d10: 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ** passed to thi
7d20: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61  s function, we a
7d30: 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29  ssume a malloc()
7d40: 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73   failed during s
7d50: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a  qlite3_open()..*
7d60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72  /.int sqlite3_er
7d70: 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
7d80: 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
7d90: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
7da0: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
7db0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7dc0: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
7dd0: 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
7de0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7df0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
7e00: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
7e10: 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
7e20: 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  ode & db->errMas
7e30: 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  k;.}../*.** Crea
7e40: 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  te a new collati
7e50: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ng function for 
7e60: 64 61 74 61 62 61 73 65 20 22 64 62 22 2e 20 20  database "db".  
7e70: 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d  The name is zNam
7e80: 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63  e.** and the enc
7e90: 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f  oding is enc..*/
7ea0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61  .static int crea
7eb0: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73  teCollation(.  s
7ec0: 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
7ed0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
7ee0: 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
7ef0: 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
7f00: 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
7f10: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
7f20: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
7f30: 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  id*),.  void(*xD
7f40: 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
7f50: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
7f60: 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 0a 20    int enc2;.  . 
7f70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7f80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
7f90: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
7fa0: 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  If SQLITE_UTF16 
7fb0: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
7fc0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  the encoding typ
7fd0: 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69  e, transform thi
7fe0: 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66  s.  ** to one of
7ff0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
8000: 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  or SQLITE_UTF16B
8010: 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  E using the.  **
8020: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
8030: 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54  IVE macro. SQLIT
8040: 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75  E_UTF16 is not u
8050: 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  sed internally..
8060: 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e    */.  enc2 = en
8070: 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31  c & ~SQLITE_UTF1
8080: 36 5f 41 4c 49 47 4e 45 44 3b 0a 20 20 69 66 28  6_ALIGNED;.  if(
8090: 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
80a0: 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 32 20  F16 ){.    enc2 
80b0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
80c0: 54 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  TIVE;.  }..  if(
80d0: 20 28 65 6e 63 32 26 7e 33 29 21 3d 30 20 29 7b   (enc2&~3)!=0 ){
80e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
80f0: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52  r(db, SQLITE_ERR
8100: 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 65 6e 63  OR, "unknown enc
8110: 6f 64 69 6e 67 22 29 3b 0a 20 20 20 20 72 65 74  oding");.    ret
8120: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
8130: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
8140: 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69  k if this call i
8150: 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65  s removing or re
8160: 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74  placing an exist
8170: 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20  ing collation . 
8180: 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66   ** sequence. If
8190: 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61   so, and there a
81a0: 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72  re active VMs, r
81b0: 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74  eturn busy. If t
81c0: 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  here.  ** are no
81d0: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76   active VMs, inv
81e0: 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d  alidate any pre-
81f0: 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
8200: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  nts..  */.  pCol
8210: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
8220: 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65  ollSeq(db, (u8)e
8230: 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  nc2, zName, strl
8240: 65 6e 28 7a 4e 61 6d 65 29 2c 20 30 29 3b 0a 20  en(zName), 0);. 
8250: 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43   if( pColl && pC
8260: 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20  oll->xCmp ){.   
8270: 20 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56   if( db->activeV
8280: 64 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20  dbeCnt ){.      
8290: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
82a0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
82b0: 20 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74         "Unable t
82c0: 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20  o delete/modify 
82d0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
82e0: 63 65 20 64 75 65 20 74 6f 20 61 63 74 69 76 65  ce due to active
82f0: 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20   statements");. 
8300: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8310: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
8320: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
8330: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
8340: 74 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20  ts(db);..    /* 
8350: 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  If collation seq
8360: 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20  uence pColl was 
8370: 63 72 65 61 74 65 64 20 64 69 72 65 63 74 6c 79  created directly
8380: 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20   by a call to.  
8390: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65    ** sqlite3_cre
83a0: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61  ate_collation, a
83b0: 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64  nd not generated
83c0: 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71   by synthCollSeq
83d0: 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  (),.    ** then 
83e0: 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20  any copies made 
83f0: 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  by synthCollSeq(
8400: 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76  ) need to be inv
8410: 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a  alidated..    **
8420: 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e   Also, collation
8430: 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f   destructor - Co
8440: 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66  llSeq.xDel() - f
8450: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64  unction may need
8460: 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61  .    ** to be ca
8470: 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  lled..    */ .  
8480: 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e    if( (pColl->en
8490: 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31  c & ~SQLITE_UTF1
84a0: 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32  6_ALIGNED)==enc2
84b0: 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
84c0: 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *aColl = sqlit
84d0: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
84e0: 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c  aCollSeq, zName,
84f0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b   strlen(zName));
8500: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
8510: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33      for(j=0; j<3
8520: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
8530: 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43  CollSeq *p = &aC
8540: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
8550: 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c  if( p->enc==pCol
8560: 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20  l->enc ){.      
8570: 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20      if( p->xDel 
8580: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
8590: 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29  ->xDel(p->pUser)
85a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
85b0: 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20          p->xCmp 
85c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
85d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
85e0: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
85f0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
8600: 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61  b, (u8)enc2, zNa
8610: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  me, strlen(zName
8620: 29 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f  ), 1);.  if( pCo
8630: 6c 6c 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 2d  ll ){.    pColl-
8640: 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65  >xCmp = xCompare
8650: 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 70 55 73  ;.    pColl->pUs
8660: 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 20 20 70  er = pCtx;.    p
8670: 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65  Coll->xDel = xDe
8680: 6c 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 65 6e  l;.    pColl->en
8690: 63 20 3d 20 65 6e 63 32 20 7c 20 28 65 6e 63 20  c = enc2 | (enc 
86a0: 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  & SQLITE_UTF16_A
86b0: 4c 49 47 4e 45 44 29 3b 0a 20 20 7d 0a 20 20 73  LIGNED);.  }.  s
86c0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
86d0: 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
86e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
86f0: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  K;.}.../*.** Thi
8700: 73 20 61 72 72 61 79 20 64 65 66 69 6e 65 73 20  s array defines 
8710: 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64  hard upper bound
8720: 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65  s on limit value
8730: 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69  s.  The.** initi
8740: 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20 6b  alizer must be k
8750: 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74 68  ept in sync with
8760: 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49   the SQLITE_LIMI
8770: 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20  T_*.** #defines 
8780: 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f  in sqlite3.h..*/
8790: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e  .static const in
87a0: 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d  t aHardLimit[] =
87b0: 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f   {.  SQLITE_MAX_
87c0: 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
87d0: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c  _MAX_SQL_LENGTH,
87e0: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
87f0: 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LUMN,.  SQLITE_M
8800: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a 20  AX_EXPR_DEPTH,. 
8810: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
8820: 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53  OUND_SELECT,.  S
8830: 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
8840: 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  P,.  SQLITE_MAX_
8850: 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20  FUNCTION_ARG,.  
8860: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
8870: 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  HED,.  SQLITE_MA
8880: 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
8890: 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
88a0: 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
88b0: 42 45 52 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d  BER,.};../*.** M
88c0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 68 61 72  ake sure the har
88d0: 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74  d limits are set
88e0: 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76   to reasonable v
88f0: 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c  alues.*/.#if SQL
8900: 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31  ITE_MAX_LENGTH<1
8910: 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
8920: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73  E_MAX_LENGTH mus
8930: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
8940: 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
8950: 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
8960: 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53  TH<100.# error S
8970: 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
8980: 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
8990: 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
89a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
89b0: 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54  SQL_LENGTH>SQLIT
89c0: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65  E_MAX_LENGTH.# e
89d0: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
89e0: 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  SQL_LENGTH must 
89f0: 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72 20 74  not be greater t
8a00: 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  han SQLITE_MAX_L
8a10: 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66  ENGTH.#endif.#if
8a20: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
8a30: 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20  OUND_SELECT<2.# 
8a40: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
8a50: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
8a60: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
8a70: 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 2.#endif.#if S
8a80: 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
8a90: 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  P<40.# error SQL
8aa0: 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20  ITE_MAX_VDBE_OP 
8ab0: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
8ac0: 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   40.#endif.#if S
8ad0: 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
8ae0: 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49  ON_ARG<0 || SQLI
8af0: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
8b00: 41 52 47 3e 32 35 35 0a 23 20 65 72 72 6f 72 20  ARG>255.# error 
8b10: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
8b20: 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20  ION_ARG must be 
8b30: 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 32 35  between 0 and 25
8b40: 35 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  5.#endif.#if SQL
8b50: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 3c 30  ITE_MAX_ATTACH<0
8b60: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41   || SQLITE_MAX_A
8b70: 54 54 41 43 48 3e 33 30 0a 23 20 65 72 72 6f 72  TTACH>30.# error
8b80: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
8b90: 43 48 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  CH must be betwe
8ba0: 65 6e 20 30 20 61 6e 64 20 33 30 0a 23 65 6e 64  en 0 and 30.#end
8bb0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
8bc0: 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
8bd0: 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20  ENGTH<1.# error 
8be0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
8bf0: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d  PATTERN_LENGTH m
8c00: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
8c10: 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  1.#endif.#if SQL
8c20: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
8c30: 5f 4e 55 4d 42 45 52 3c 31 0a 23 20 65 72 72 6f  _NUMBER<1.# erro
8c40: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52  r SQLITE_MAX_VAR
8c50: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 6d 75 73  IABLE_NUMBER mus
8c60: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a  t be at least 1.
8c70: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
8c80: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
8c90: 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70  of a limit.  Rep
8ca0: 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75  ort the old valu
8cb0: 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61  e..** If an inva
8cc0: 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20  lid limit index 
8cd0: 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70  is supplied, rep
8ce0: 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20  ort -1..** Make 
8cf0: 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74 20 73  no changes but s
8d00: 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20  till report the 
8d10: 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74 68 65  old value if the
8d20: 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73  .** new limit is
8d30: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
8d40: 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d   A new lower lim
8d50: 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69  it does not shri
8d60: 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73  nk existing cons
8d70: 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65  tructs..** It me
8d80: 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65  rely prevents ne
8d90: 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61  w constructs tha
8da0: 74 20 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d  t exceed the lim
8db0: 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69  it.** from formi
8dc0: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
8dd0: 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33  e3_limit(sqlite3
8de0: 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49   *db, int limitI
8df0: 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29  d, int newLimit)
8e00: 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74  {.  int oldLimit
8e10: 3b 0a 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c  ;.  if( limitId<
8e20: 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51  0 || limitId>=SQ
8e30: 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a  LITE_N_LIMIT ){.
8e40: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
8e50: 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20   }.  oldLimit = 
8e60: 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74  db->aLimit[limit
8e70: 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69  Id];.  if( newLi
8e80: 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  mit>=0 ){.    if
8e90: 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72 64  ( newLimit>aHard
8ea0: 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29  Limit[limitId] )
8eb0: 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74  {.      newLimit
8ec0: 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69   = aHardLimit[li
8ed0: 6d 69 74 49 64 5d 3b 0a 20 20 20 20 7d 0a 20 20  mitId];.    }.  
8ee0: 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d    db->aLimit[lim
8ef0: 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74  itId] = newLimit
8f00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ;.  }.  return o
8f10: 6c 64 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  ldLimit;.}../*.*
8f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
8f30: 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  oes the work of 
8f40: 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61  opening a databa
8f50: 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a  se on behalf of.
8f60: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
8f70: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70  ) and sqlite3_op
8f80: 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74 61  en16(). The data
8f90: 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a  base filename "z
8fa0: 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69  Filename"  .** i
8fb0: 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e  s UTF-8 encoded.
8fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
8fd0: 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63  penDatabase(.  c
8fe0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
8ff0: 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73  name, /* Databas
9000: 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38  e filename UTF-8
9010: 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71   encoded */.  sq
9020: 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20  lite3 **ppDb,   
9030: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
9040: 75 72 6e 65 64 20 64 61 74 61 62 61 73 65 20 68  urned database h
9050: 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67  andle */.  unsig
9060: 6e 65 64 20 66 6c 61 67 73 2c 20 20 20 20 20 20  ned flags,      
9070: 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c    /* Operational
9080: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   flags */.  cons
9090: 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20  t char *zVfs    
90a0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
90b0: 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a  e VFS to use */.
90c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
90d0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 43 6f  ;.  int rc;.  Co
90e0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 23  llSeq *pColl;..#
90f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9100: 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63  IT_AUTOINIT.  rc
9110: 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69   = sqlite3_initi
9120: 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72  alize();.  if( r
9130: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  c ) return rc;.#
9140: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6d 6f  endif..  /* Remo
9150: 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20  ve harmful bits 
9160: 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70  from the flags p
9170: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 66 6c  arameter */.  fl
9180: 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54  ags &=  ~( SQLIT
9190: 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
91a0: 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
91b0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
91c0: 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20  N_MAIN_DB |.    
91d0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
91e0: 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c  E_OPEN_TEMP_DB |
91f0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
9200: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41   SQLITE_OPEN_TRA
9210: 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20  NSIENT_DB | .   
9220: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
9230: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
9240: 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
9250: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
9260: 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
9270: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
9280: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55    SQLITE_OPEN_SU
9290: 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  BJOURNAL | .    
92a0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
92b0: 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
92c0: 55 52 4e 41 4c 0a 20 20 20 20 20 20 20 20 20 20  URNAL.          
92d0: 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f     );..  /* Allo
92e0: 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 20  cate the sqlite 
92f0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a  data structure *
9300: 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33  /.  db = sqlite3
9310: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
9320: 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a 20  of(sqlite3) );. 
9330: 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74   if( db==0 ) got
9340: 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
9350: 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6e 66 69  if( sqlite3Confi
9360: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 29 7b 0a  g.bFullMutex ){.
9370: 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20      db->mutex = 
9380: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
9390: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52  c(SQLITE_MUTEX_R
93a0: 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69  ECURSIVE);.    i
93b0: 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20  f( db->mutex==0 
93c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
93d0: 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20  _free(db);.     
93e0: 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67   db = 0;.      g
93f0: 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
9400: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
9410: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
9420: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
9430: 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66  ->errMask = 0xff
9440: 3b 0a 20 20 64 62 2d 3e 70 72 69 6f 72 4e 65 77  ;.  db->priorNew
9450: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 64 62 2d  Rowid = 0;.  db-
9460: 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e  >nDb = 2;.  db->
9470: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
9480: 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d  AGIC_BUSY;.  db-
9490: 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
94a0: 61 74 69 63 3b 0a 20 20 61 73 73 65 72 74 28 20  atic;.  assert( 
94b0: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
94c0: 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64  t)==sizeof(aHard
94d0: 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63  Limit) );.  memc
94e0: 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61  py(db->aLimit, a
94f0: 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f  HardLimit, sizeo
9500: 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a  f(db->aLimit));.
9510: 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
9520: 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74   = 1;.  db->next
9530: 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20  Autovac = -1;.  
9540: 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
9550: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67   = 0;.  db->flag
9560: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72  s |= SQLITE_Shor
9570: 74 43 6f 6c 4e 61 6d 65 73 0a 23 69 66 20 53 51  tColNames.#if SQ
9580: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
9590: 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20  E_FORMAT<4.     
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
95b0: 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
95c0: 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  mt.#endif.#ifdef
95d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
95e0: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
9600: 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65   SQLITE_LoadExte
9610: 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 20 20 20  nsion.#endif.   
9620: 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48 61     ;.  sqlite3Ha
9630: 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 46 75 6e  shInit(&db->aFun
9640: 63 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  c, SQLITE_HASH_S
9650: 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 73 71 6c  TRING, 0);.  sql
9660: 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62  ite3HashInit(&db
9670: 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 53 51 4c 49  ->aCollSeq, SQLI
9680: 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20  TE_HASH_STRING, 
9690: 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
96a0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
96b0: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61  ABLE.  sqlite3Ha
96c0: 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64  shInit(&db->aMod
96d0: 75 6c 65 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ule, SQLITE_HASH
96e0: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 23 65 6e  _STRING, 0);.#en
96f0: 64 69 66 0a 0a 20 20 64 62 2d 3e 70 56 66 73 20  dif..  db->pVfs 
9700: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
9710: 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20  nd(zVfs);.  if( 
9720: 21 64 62 2d 3e 70 56 66 73 20 29 7b 0a 20 20 20  !db->pVfs ){.   
9730: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
9740: 4f 52 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69  OR;.    db->magi
9750: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
9760: 5f 53 49 43 4b 3b 0a 20 20 20 20 73 71 6c 69 74  _SICK;.    sqlit
9770: 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
9780: 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73  "no such vfs: %s
9790: 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 67 6f  ", zVfs);.    go
97a0: 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
97b0: 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
97c0: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
97d0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41  on sequence BINA
97e0: 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73  RY. BINARY works
97f0: 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a   for both UTF-8.
9800: 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c    ** and UTF-16,
9810: 20 73 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f   so add a versio
9820: 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76  n for each to av
9830: 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73  oid any unnecess
9840: 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73  ary.  ** convers
9850: 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65  ions. The only e
9860: 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63  rror that can oc
9870: 63 75 72 20 68 65 72 65 20 69 73 20 61 20 6d 61  cur here is a ma
9880: 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a  lloc() failure..
9890: 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c    */.  createCol
98a0: 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41  lation(db, "BINA
98b0: 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  RY", SQLITE_UTF8
98c0: 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
98d0: 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
98e0: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e  llation(db, "BIN
98f0: 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ARY", SQLITE_UTF
9900: 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  16BE, 0, binColl
9910: 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
9920: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
9930: 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
9940: 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e  _UTF16LE, 0, bin
9950: 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
9960: 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
9970: 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c  db, "RTRIM", SQL
9980: 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a  ITE_UTF8, (void*
9990: 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c  )1, binCollFunc,
99a0: 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
99b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
99c0: 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
99d0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b  QLITE_MAGIC_SICK
99e0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  ;.    goto opend
99f0: 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d  b_out;.  }.  db-
9a00: 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c  >pDfltColl = sql
9a10: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
9a20: 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  db, SQLITE_UTF8,
9a30: 20 22 42 49 4e 41 52 59 22 2c 20 36 2c 20 30 29   "BINARY", 6, 0)
9a40: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
9a50: 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a  pDfltColl!=0 );.
9a60: 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61  .  /* Also add a
9a70: 20 55 54 46 2d 38 20 63 61 73 65 2d 69 6e 73 65   UTF-8 case-inse
9a80: 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f  nsitive collatio
9a90: 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20  n sequence. */. 
9aa0: 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
9ab0: 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53  (db, "NOCASE", S
9ac0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e  QLITE_UTF8, 0, n
9ad0: 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75  ocaseCollatingFu
9ae0: 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 53 65  nc, 0);..  /* Se
9af0: 74 20 66 6c 61 67 73 20 6f 6e 20 74 68 65 20 62  t flags on the b
9b00: 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e  uilt-in collatin
9b10: 67 20 73 65 71 75 65 6e 63 65 73 20 2a 2f 0a 20  g sequences */. 
9b20: 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e   db->pDfltColl->
9b30: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 43 4f  type = SQLITE_CO
9b40: 4c 4c 5f 42 49 4e 41 52 59 3b 0a 20 20 70 43 6f  LL_BINARY;.  pCo
9b50: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
9b60: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49  CollSeq(db, SQLI
9b70: 54 45 5f 55 54 46 38 2c 20 22 4e 4f 43 41 53 45  TE_UTF8, "NOCASE
9b80: 22 2c 20 36 2c 20 30 29 3b 0a 20 20 69 66 28 20  ", 6, 0);.  if( 
9b90: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43 6f  pColl ){.    pCo
9ba0: 6c 6c 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  ll->type = SQLIT
9bb0: 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 3b 0a 20  E_COLL_NOCASE;. 
9bc0: 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
9bd0: 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61  e backend databa
9be0: 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 64  se driver */.  d
9bf0: 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66  b->openFlags = f
9c00: 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c  lags;.  rc = sql
9c10: 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79  ite3BtreeFactory
9c20: 28 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  (db, zFilename, 
9c30: 30 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  0, SQLITE_DEFAUL
9c40: 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20 0a 20  T_CACHE_SIZE, . 
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c60: 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
9c70: 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  | SQLITE_OPEN_MA
9c80: 49 4e 5f 44 42 2c 0a 20 20 20 20 20 20 20 20 20  IN_DB,.         
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ca0: 20 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42    &db->aDb[0].pB
9cb0: 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
9cc0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
9cd0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
9ce0: 72 63 2c 20 30 29 3b 0a 20 20 20 20 64 62 2d 3e  rc, 0);.    db->
9cf0: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
9d00: 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 20 20 67  AGIC_SICK;.    g
9d10: 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
9d20: 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d    }.  db->aDb[0]
9d30: 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  .pSchema = sqlit
9d40: 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
9d50: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
9d60: 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  .  db->aDb[1].pS
9d70: 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53  chema = sqlite3S
9d80: 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b  chemaGet(db, 0);
9d90: 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61  ...  /* The defa
9da0: 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c  ult safety_level
9db0: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
9dc0: 74 61 62 61 73 65 20 69 73 20 27 66 75 6c 6c 27  tabase is 'full'
9dd0: 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20  ; for the temp. 
9de0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74 20   ** database it 
9df0: 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20  is 'NONE'. This 
9e00: 6d 61 74 63 68 65 73 20 74 68 65 20 70 61 67 65  matches the page
9e10: 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73  r layer defaults
9e20: 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61  .  .  */.  db->a
9e30: 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d  Db[0].zName = "m
9e40: 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  ain";.  db->aDb[
9e50: 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  0].safety_level 
9e60: 3d 20 33 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 3;.#ifndef SQL
9e70: 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a  ITE_OMIT_TEMPDB.
9e80: 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61    db->aDb[1].zNa
9e90: 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64  me = "temp";.  d
9ea0: 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79  b->aDb[1].safety
9eb0: 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 23 65 6e 64  _level = 1;.#end
9ec0: 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  if..  db->magic 
9ed0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f  = SQLITE_MAGIC_O
9ee0: 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  PEN;.  if( db->m
9ef0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
9f00: 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
9f10: 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ut;.  }..  /* Re
9f20: 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74  gister all built
9f30: 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62  -in functions, b
9f40: 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ut do not attemp
9f50: 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20  t to read the.  
9f60: 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65  ** database sche
9f70: 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20  ma yet. This is 
9f80: 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68  delayed until th
9f90: 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
9fa0: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69   database.  ** i
9fb0: 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f  s accessed..  */
9fc0: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
9fd0: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
9fe0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69  );.  sqlite3Regi
9ff0: 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74  sterBuiltinFunct
a000: 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  ions(db);..  /* 
a010: 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65  Load automatic e
a020: 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65  xtensions - exte
a030: 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  nsions that have
a040: 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64   been registered
a050: 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
a060: 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69  sqlite3_automati
a070: 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50  c_extension() AP
a080: 49 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29  I..  */.  (void)
a090: 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45  sqlite3AutoLoadE
a0a0: 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20  xtensions(db);. 
a0b0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 65 72 72   if( sqlite3_err
a0c0: 63 6f 64 65 28 64 62 29 21 3d 53 51 4c 49 54 45  code(db)!=SQLITE
a0d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
a0e0: 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
a0f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a100: 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28  NABLE_FTS1.  if(
a110: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
a120: 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  ed ){.    extern
a130: 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31   int sqlite3Fts1
a140: 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a  Init(sqlite3*);.
a150: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a160: 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts1Init(db);.  
a170: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
a180: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
a190: 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS2.  if( !db->m
a1a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
a1b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
a1c0: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
a1d0: 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 73  qlite3Fts2Init(s
a1e0: 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63  qlite3*);.    rc
a1f0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e   = sqlite3Fts2In
a200: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
a210: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
a220: 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20  E_ENABLE_FTS3.  
a230: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
a240: 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
a250: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
a260: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e   = sqlite3Fts3In
a270: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
a280: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
a290: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69  E_ENABLE_ICU.  i
a2a0: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
a2b0: 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
a2c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74  TE_OK ){.    ext
a2d0: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 49  ern int sqlite3I
a2e0: 63 75 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29  cuInit(sqlite3*)
a2f0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
a300: 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20  e3IcuInit(db);. 
a310: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
a320: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
a330: 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d  RTREE.  if( !db-
a340: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
a350: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b   rc==SQLITE_OK){
a360: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a370: 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a  3RtreeInit(db);.
a380: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
a390: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
a3a0: 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 2d 44 53  c, 0);..  /* -DS
a3b0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
a3c0: 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b  CKING_MODE=1 mak
a3d0: 65 73 20 45 58 43 4c 55 53 49 56 45 20 74 68 65  es EXCLUSIVE the
a3e0: 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
a3f0: 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53  .  ** mode.  -DS
a400: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
a410: 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b  CKING_MODE=0 mak
a420: 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  e NORMAL the def
a430: 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
a440: 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e  * mode.  Doing n
a450: 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c  othing at all al
a460: 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20  so makes NORMAL 
a470: 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a  the default..  *
a480: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
a490: 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
a4a0: 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c  MODE.  db->dfltL
a4b0: 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45  ockMode = SQLITE
a4c0: 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
a4d0: 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33  _MODE;.  sqlite3
a4e0: 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
a4f0: 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
a500: 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  er(db->aDb[0].pB
a510: 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
a520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
a530: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
a540: 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64  KING_MODE);.#end
a550: 69 66 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a  if..opendb_out:.
a560: 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20    if( db ){.    
a570: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65  assert( db->mute
a580: 78 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 43  x!=0 || sqlite3C
a590: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
a5a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
a5b0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
a5c0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20  b->mutex);.  }. 
a5d0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   if( SQLITE_NOME
a5e0: 4d 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  M==(rc = sqlite3
a5f0: 5f 65 72 72 63 6f 64 65 28 64 62 29 29 20 29 7b  _errcode(db)) ){
a600: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
a610: 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d  se(db);.    db =
a620: 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20   0;.  }.  *ppDb 
a630: 3d 20 64 62 3b 0a 20 20 72 65 74 75 72 6e 20 73  = db;.  return s
a640: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c  qlite3ApiExit(0,
a650: 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f   rc);.}../*.** O
a660: 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61  pen a new databa
a670: 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
a680: 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a  t sqlite3_open(.
a690: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
a6a0: 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
a6b0: 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20  te3 **ppDb .){. 
a6c0: 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61   return openData
a6d0: 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  base(zFilename, 
a6e0: 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ppDb,.          
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
a700: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
a710: 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
a720: 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e  CREATE, 0);.}.in
a730: 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  t sqlite3_open_v
a740: 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2(.  const char 
a750: 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  *filename,   /* 
a760: 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
a770: 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73  e (UTF-8) */.  s
a780: 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20  qlite3 **ppDb,  
a790: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
a7a0: 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20  QLite db handle 
a7b0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a7d0: 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  Flags */.  const
a7e0: 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20   char *zVfs     
a7f0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46     /* Name of VF
a800: 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20  S module to use 
a810: 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  */.){.  return o
a820: 70 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65  penDatabase(file
a830: 6e 61 6d 65 2c 20 70 70 44 62 2c 20 66 6c 61 67  name, ppDb, flag
a840: 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66  s, zVfs);.}..#if
a850: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a860: 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65  _UTF16./*.** Ope
a870: 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
a880: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
a890: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a  sqlite3_open16(.
a8a0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
a8b0: 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
a8c0: 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20  te3 **ppDb.){.  
a8d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
a8e0: 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69  ename8;   /* zFi
a8f0: 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69  lename encoded i
a900: 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20  n UTF-8 instead 
a910: 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73  of UTF-16 */.  s
a920: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
a930: 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  al;.  int rc;.. 
a940: 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
a950: 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  me );.  assert( 
a960: 70 70 44 62 20 29 3b 0a 20 20 2a 70 70 44 62 20  ppDb );.  *ppDb 
a970: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
a980: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
a990: 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  T.  rc = sqlite3
a9a0: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
a9b0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
a9c0: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56   rc;.#endif.  pV
a9d0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
a9e0: 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74  eNew(0);.  sqlit
a9f0: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
aa00: 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  al, -1, zFilenam
aa10: 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  e, SQLITE_UTF16N
aa20: 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54  ATIVE, SQLITE_ST
aa30: 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61  ATIC);.  zFilena
aa40: 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  me8 = sqlite3Val
aa50: 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c  ueText(pVal, SQL
aa60: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28  ITE_UTF8);.  if(
aa70: 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20   zFilename8 ){. 
aa80: 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61     rc = openData
aa90: 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c  base(zFilename8,
aaa0: 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
aac0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
aad0: 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
aae0: 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20  _CREATE, 0);.   
aaf0: 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c   assert( *ppDb |
ab00: 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
ab10: 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  EM );.    if( rc
ab20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
ab30: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70  DbHasProperty(*p
ab40: 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d  pDb, 0, DB_Schem
ab50: 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20  aLoaded) ){.    
ab60: 20 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53    ENC(*ppDb) = S
ab70: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
ab80: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  E;.    }.  }else
ab90: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
aba0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73  E_NOMEM;.  }.  s
abb0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
abc0: 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pVal);..  return
abd0: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
abe0: 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66  0, rc);.}.#endif
abf0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
ac00: 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
ac10: 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
ac20: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
ac30: 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
ac40: 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
ac50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
ac60: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  eate_collation(.
ac70: 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
ac80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
ac90: 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
aca0: 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
acb0: 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
acc0: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
acd0: 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
ace0: 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74   void*).){.  int
acf0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d   rc;.  sqlite3_m
ad00: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
ad10: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
ad20: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
ad30: 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65  ed );.  rc = cre
ad40: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
ad50: 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43 74   zName, enc, pCt
ad60: 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b  x, xCompare, 0);
ad70: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
ad80: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
ad90: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ada0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
adb0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
adc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
add0: 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
ade0: 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
adf0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
ae00: 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
ae10: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
ae20: 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c  lation_v2(.  sql
ae30: 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e  ite3* db, .  con
ae40: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
ae50: 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76  .  int enc, .  v
ae60: 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
ae70: 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
ae80: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
ae90: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
aea0: 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c  *),.  void(*xDel
aeb0: 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  )(void*).){.  in
aec0: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
aed0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
aee0: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
aef0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
af00: 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72  led );.  rc = cr
af10: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
af20: 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43  , zName, enc, pC
af30: 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44  tx, xCompare, xD
af40: 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  el);.  rc = sqli
af50: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
af60: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
af70: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
af80: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
af90: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
afa0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
afb0: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
afc0: 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
afd0: 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
afe0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
aff0: 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
b000: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
b010: 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65  tion16(.  sqlite
b020: 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
b030: 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  void *zName,.  i
b040: 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
b050: 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
b060: 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
b070: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
b080: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
b090: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b0a0: 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
b0b0: 7a 4e 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65  zName8;.  sqlite
b0c0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
b0d0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
b0e0: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
b0f0: 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65  ailed );.  zName
b100: 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36  8 = sqlite3Utf16
b110: 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d  to8(db, zName, -
b120: 31 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38  1);.  if( zName8
b130: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65   ){.    rc = cre
b140: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
b150: 20 7a 4e 61 6d 65 38 2c 20 65 6e 63 2c 20 70 43   zName8, enc, pC
b160: 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
b170: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
b180: 65 65 28 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a  ee(zName8);.  }.
b190: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
b1a0: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
b1b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
b1c0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
b1d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b1e0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b1f0: 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
b200: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
b210: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
b220: 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c  nce factory call
b230: 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61  back with the da
b240: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
b250: 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79   db. Replace any
b260: 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74   previously inst
b270: 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  alled collation 
b280: 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
b290: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b2a0: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
b2b0: 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  d(.  sqlite3 *db
b2c0: 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
b2d0: 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
b2e0: 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29  id(*xCollNeeded)
b2f0: 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c  (void*,sqlite3*,
b300: 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e  int eTextRep,con
b310: 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73  st char*).){.  s
b320: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
b330: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
b340: 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
b350: 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a   = xCollNeeded;.
b360: 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
b370: 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70  d16 = 0;.  db->p
b380: 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20  CollNeededArg = 
b390: 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a  pCollNeededArg;.
b3a0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
b3b0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
b3c0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
b3d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
b3e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
b3f0: 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  16./*.** Registe
b400: 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  r a collation se
b410: 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63  quence factory c
b420: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
b430: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
b440: 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20  .** db. Replace 
b450: 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69  any previously i
b460: 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69  nstalled collati
b470: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
b480: 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ory..*/.int sqli
b490: 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
b4a0: 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65  eded16(.  sqlite
b4b0: 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a  3 *db, .  void *
b4c0: 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
b4d0: 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65  .  void(*xCollNe
b4e0: 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71  eded16)(void*,sq
b4f0: 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
b500: 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  Rep,const void*)
b510: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
b520: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
b530: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  tex);.  db->xCol
b540: 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64  lNeeded = 0;.  d
b550: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
b560: 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36   = xCollNeeded16
b570: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65  ;.  db->pCollNee
b580: 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65  dedArg = pCollNe
b590: 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74  ededArg;.  sqlit
b5a0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
b5b0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
b5c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b5d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b5e0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
b5f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b600: 4f 4d 49 54 5f 47 4c 4f 42 41 4c 52 45 43 4f 56  OMIT_GLOBALRECOV
b610: 45 52 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ER./*.** This fu
b620: 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e  nction is now an
b630: 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74   anachronism. It
b640: 20 75 73 65 64 20 74 6f 20 62 65 20 75 73 65 64   used to be used
b650: 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d   to recover from
b660: 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66   a.** malloc() f
b670: 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69  ailure, but SQLi
b680: 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73  te now does this
b690: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a   automatically..
b6a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67  */.int sqlite3_g
b6b0: 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f  lobal_recover(vo
b6c0: 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  id){.  return SQ
b6d0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
b6e0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f  f../*.** Test to
b6f0: 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20   see whether or 
b700: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
b710: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69   connection is i
b720: 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20  n autocommit.** 
b730: 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52  mode.  Return TR
b740: 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20  UE if it is and 
b750: 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41  FALSE if not.  A
b760: 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69  utocommit mode i
b770: 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75  s on.** by defau
b780: 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20  lt.  Autocommit 
b790: 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61  is disabled by a
b7a0: 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74   BEGIN statement
b7b0: 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a   and reenabled.*
b7c0: 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f  * by the next CO
b7d0: 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  MMIT or ROLLBACK
b7e0: 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48 49  ..**.******* THI
b7f0: 53 20 49 53 20 41 4e 20 45 58 50 45 52 49 4d 45  S IS AN EXPERIME
b800: 4e 54 41 4c 20 41 50 49 20 41 4e 44 20 49 53 20  NTAL API AND IS 
b810: 53 55 42 4a 45 43 54 20 54 4f 20 43 48 41 4e 47  SUBJECT TO CHANG
b820: 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20  E ******.*/.int 
b830: 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
b840: 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  commit(sqlite3 *
b850: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
b860: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a  ->autoCommit;.}.
b870: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
b880: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  EBUG./*.** The f
b890: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
b8a0: 20 69 73 20 73 75 62 74 69 74 75 74 65 64 20 66   is subtituted f
b8b0: 6f 72 20 63 6f 6e 73 74 61 6e 74 20 53 51 4c 49  or constant SQLI
b8c0: 54 45 5f 43 4f 52 52 55 50 54 20 69 6e 0a 2a 2a  TE_CORRUPT in.**
b8d0: 20 64 65 62 75 67 67 69 6e 67 20 62 75 69 6c 64   debugging build
b8e0: 73 2e 20 20 54 68 69 73 20 70 72 6f 76 69 64 65  s.  This provide
b8f0: 73 20 61 20 77 61 79 20 74 6f 20 73 65 74 20 61  s a way to set a
b900: 20 62 72 65 61 6b 70 6f 69 6e 74 20 66 6f 72 20   breakpoint for 
b910: 77 68 65 6e 0a 2a 2a 20 63 6f 72 72 75 70 74 69  when.** corrupti
b920: 6f 6e 20 69 73 20 66 69 72 73 74 20 64 65 74 65  on is first dete
b930: 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  cted..*/.int sql
b940: 69 74 65 33 43 6f 72 72 75 70 74 28 76 6f 69 64  ite3Corrupt(void
b950: 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ){.  return SQLI
b960: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 23 65  TE_CORRUPT;.}.#e
b970: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
b980: 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63   is a convenienc
b990: 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d  e routine that m
b9a0: 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61  akes sure that a
b9b0: 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  ll thread-specif
b9c0: 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74  ic.** data for t
b9d0: 68 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62  his thread has b
b9e0: 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e  een deallocated.
b9f0: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f  .**.** SQLite no
ba00: 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72   longer uses thr
ba10: 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74  ead-specific dat
ba20: 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  a so this routin
ba30: 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f  e is now a.** no
ba40: 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61  -op.  It is reta
ba50: 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69  ined for histori
ba60: 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  cal compatibilit
ba70: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
ba80: 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
ba90: 70 28 76 6f 69 64 29 7b 0a 7d 0a 0a 2f 2a 0a 2a  p(void){.}../*.*
baa0: 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e  * Return meta in
bab0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
bac0: 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d  a specific colum
bad0: 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  n of a database 
bae0: 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  table..** See co
baf0: 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33  mment in sqlite3
bb00: 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29  .h (sqlite.h.in)
bb10: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
bb20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
bb30: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
bb40: 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65  ADATA.int sqlite
bb50: 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
bb60: 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74  etadata(.  sqlit
bb70: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
bb80: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
bb90: 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  tion handle */. 
bba0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
bbb0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
bbc0: 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72  Database name or
bbd0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
bbe0: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d   char *zTableNam
bbf0: 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  e,     /* Table 
bc00: 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  name */.  const 
bc10: 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d  char *zColumnNam
bc20: 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  e,    /* Column 
bc30: 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  name */.  char c
bc40: 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70  onst **pzDataTyp
bc50: 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  e,    /* OUTPUT:
bc60: 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20 74   Declared data t
bc70: 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ype */.  char co
bc80: 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c  nst **pzCollSeq,
bc90: 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
bca0: 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
bcb0: 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  ce name */.  int
bcc0: 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20   *pNotNull,     
bcd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
bce0: 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20  UT: True if NOT 
bcf0: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20  NULL constraint 
bd00: 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20  exists */.  int 
bd10: 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20  *pPrimaryKey,   
bd20: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
bd30: 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
bd40: 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a  n part of PK */.
bd50: 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20    int *pAutoinc 
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd70: 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
bd80: 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d   column is auto-
bd90: 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  increment */.){.
bda0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
bdb0: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
bdc0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
bdd0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
bde0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
bdf0: 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ;..  char const 
be00: 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a  *zDataType = 0;.
be10: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43    char const *zC
be20: 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e  ollSeq = 0;.  in
be30: 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20  t notnull = 0;. 
be40: 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20   int primarykey 
be50: 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69  = 0;.  int autoi
be60: 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e  nc = 0;..  /* En
be70: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
be80: 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65 65  e schema has bee
be90: 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71  n loaded */.  sq
bea0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
beb0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
bec0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
bed0: 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c  etyOn(db);.  sql
bee0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
bef0: 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71  l(db);.  rc = sq
bf00: 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a  lite3Init(db, &z
bf10: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
bf20: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
bf30: 64 62 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  db);.  if( SQLIT
bf40: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
bf50: 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
bf60: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
bf70: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75   the table in qu
bf80: 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62  estion */.  pTab
bf90: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
bfa0: 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61  ble(db, zTableNa
bfb0: 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  me, zDbName);.  
bfc0: 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61  if( !pTab || pTa
bfd0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
bfe0: 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
bff0: 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
c000: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74    }..  /* Find t
c010: 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68  he column for wh
c020: 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75  ich info is requ
c030: 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 73  ested */.  if( s
c040: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43  qlite3IsRowid(zC
c050: 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20  olumnName) ){.  
c060: 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69    iCol = pTab->i
c070: 50 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 69 43  PKey;.    if( iC
c080: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ol>=0 ){.      p
c090: 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
c0a0: 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20  l[iCol];.    }. 
c0b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
c0c0: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
c0d0: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
c0e0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26  {.      pCol = &
c0f0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
c100: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
c110: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
c120: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75  ol->zName, zColu
c130: 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  mnName) ){.     
c140: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c150: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
c160: 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  iCol==pTab->nCol
c170: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
c180: 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   0;.      goto e
c190: 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  rror_out;.    }.
c1a0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
c1b0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74  llowing block st
c1c0: 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e  ores the meta in
c1d0: 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77  formation that w
c1e0: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a  ill be returned.
c1f0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c    ** to the call
c200: 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  er in local vari
c210: 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c  ables zDataType,
c220: 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75   zCollSeq, notnu
c230: 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20  ll, primarykey. 
c240: 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e   ** and autoinc.
c250: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
c260: 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73  here are two pos
c270: 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a  sibilities:.  **
c280: 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68   .  **     1. Th
c290: 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75  e specified colu
c2a0: 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69  mn name was rowi
c2b0: 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72  d", "oid" or "_r
c2c0: 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20  owid_" .  **    
c2d0: 20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69 73      and there is
c2e0: 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64   no explicitly d
c2f0: 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75  eclared IPK colu
c300: 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  mn. .  **.  **  
c310: 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20     2. The table 
c320: 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e  is not a view an
c330: 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  d the column nam
c340: 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20  e identified an 
c350: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70  .  **        exp
c360: 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64  licitly declared
c370: 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65   column. Copy me
c380: 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ta information f
c390: 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20  rom *pCol..  */ 
c3a0: 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
c3b0: 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70     zDataType = p
c3c0: 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20  Col->zType;.    
c3d0: 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d  zCollSeq = pCol-
c3e0: 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e  >zColl;.    notn
c3f0: 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e  ull = pCol->notN
c400: 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d  ull!=0;.    prim
c410: 61 72 79 6b 65 79 20 20 3d 20 70 43 6f 6c 2d 3e  arykey  = pCol->
c420: 69 73 50 72 69 6d 4b 65 79 21 3d 30 3b 0a 20 20  isPrimKey!=0;.  
c430: 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62    autoinc = pTab
c440: 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26  ->iPKey==iCol &&
c450: 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 3b 0a   pTab->autoInc;.
c460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61    }else{.    zDa
c470: 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45  taType = "INTEGE
c480: 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b  R";.    primaryk
c490: 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  ey = 1;.  }.  if
c4a0: 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20  ( !zCollSeq ){. 
c4b0: 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22 42     zCollSeq = "B
c4c0: 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72 72  INARY";.  }..err
c4d0: 6f 72 5f 6f 75 74 3a 0a 20 20 28 76 6f 69 64 29  or_out:.  (void)
c4e0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66  sqlite3SafetyOff
c4f0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74  (db);..  /* Whet
c500: 68 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  her the function
c510: 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20   call succeeded 
c520: 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74  or failed, set t
c530: 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  he output parame
c540: 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61  ters.  ** to wha
c550: 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61  tever their loca
c560: 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63  l counterparts c
c570: 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72  ontain. If an er
c580: 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20  ror did occur,. 
c590: 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68 65   ** this has the
c5a0: 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69   effect of zeroi
c5b0: 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61  ng all output pa
c5c0: 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20  rameters..  */. 
c5d0: 20 69 66 28 20 70 7a 44 61 74 61 54 79 70 65 20   if( pzDataType 
c5e0: 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20  ) *pzDataType = 
c5f0: 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28  zDataType;.  if(
c600: 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a   pzCollSeq ) *pz
c610: 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53  CollSeq = zCollS
c620: 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75  eq;.  if( pNotNu
c630: 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d  ll ) *pNotNull =
c640: 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20   notnull;.  if( 
c650: 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70  pPrimaryKey ) *p
c660: 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69  PrimaryKey = pri
c670: 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70  marykey;.  if( p
c680: 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f  Autoinc ) *pAuto
c690: 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a  inc = autoinc;..
c6a0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
c6b0: 3d 72 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a  =rc && !pTab ){.
c6c0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
c6d0: 72 69 6e 67 28 26 7a 45 72 72 4d 73 67 2c 20 22  ring(&zErrMsg, "
c6e0: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f  no such table co
c6f0: 6c 75 6d 6e 3a 20 22 2c 20 7a 54 61 62 6c 65 4e  lumn: ", zTableN
c700: 61 6d 65 2c 20 22 2e 22 2c 20 0a 20 20 20 20 20  ame, ".", .     
c710: 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20     zColumnName, 
c720: 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  0);.    rc = SQL
c730: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
c740: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
c750: 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22  , rc, (zErrMsg?"
c760: 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29  %s":0), zErrMsg)
c770: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
c780: 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63 20  (zErrMsg);.  rc 
c790: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
c7a0: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
c7b0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
c7c0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
c7d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
c7e0: 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  f../*.** Sleep f
c7f0: 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
c800: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
c810: 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
c820: 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ept..*/.int sqli
c830: 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73  te3_sleep(int ms
c840: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
c850: 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63   *pVfs;.  int rc
c860: 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74  ;.  pVfs = sqlit
c870: 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
c880: 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20    if( pVfs==0 ) 
c890: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
c8a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f  This function wo
c8b0: 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f  rks in milliseco
c8c0: 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64  nds, but the und
c8d0: 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28  erlying OsSleep(
c8e0: 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73  ) .  ** API uses
c8f0: 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48   microseconds. H
c900: 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73 2e  ence the 1000's.
c910: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71  .  */.  rc = (sq
c920: 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66  lite3OsSleep(pVf
c930: 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30  s, 1000*ms)/1000
c940: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
c950: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  }../*.** Enable 
c960: 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 65  or disable the e
c970: 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63  xtended result c
c980: 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  odes..*/.int sql
c990: 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65  ite3_extended_re
c9a0: 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74  sult_codes(sqlit
c9b0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66  e3 *db, int onof
c9c0: 66 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  f){.  sqlite3_mu
c9d0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
c9e0: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d  tex);.  db->errM
c9f0: 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78  ask = onoff ? 0x
ca00: 66 66 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b  ffffffff : 0xff;
ca10: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ca20: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
ca30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
ca40: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
ca50: 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65  Invoke the xFile
ca60: 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f  Control method o
ca70: 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  n a particular d
ca80: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
ca90: 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
caa0: 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  trol(sqlite3 *db
cab0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
cac0: 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76  bName, int op, v
cad0: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e  oid *pArg){.  in
cae0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  t rc = SQLITE_ER
caf0: 52 4f 52 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  ROR;.  int iDb;.
cb00: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
cb10: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
cb20: 3b 0a 20 20 69 66 28 20 7a 44 62 4e 61 6d 65 3d  ;.  if( zDbName=
cb30: 3d 30 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20  =0 ){.    iDb = 
cb40: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
cb50: 66 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64  for(iDb=0; iDb<d
cb60: 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a  b->nDb; iDb++){.
cb70: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
cb80: 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  (db->aDb[iDb].zN
cb90: 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3d 3d 30  ame, zDbName)==0
cba0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
cbb0: 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 64 62    }.  if( iDb<db
cbc0: 2d 3e 6e 44 62 20 29 7b 0a 20 20 20 20 42 74 72  ->nDb ){.    Btr
cbd0: 65 65 20 2a 70 42 74 72 65 65 20 3d 20 64 62 2d  ee *pBtree = db-
cbe0: 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
cbf0: 20 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b     if( pBtree ){
cc00: 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50  .      Pager *pP
cc10: 61 67 65 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  ager;.      sqli
cc20: 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20  te3_file *fd;.  
cc30: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
cc40: 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
cc50: 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71       pPager = sq
cc60: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
cc70: 70 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20 61  pBtree);.      a
cc80: 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
cc90: 20 29 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 73   );.      fd = s
cca0: 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
ccb0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
ccc0: 73 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a  ssert( fd!=0 );.
ccd0: 20 20 20 20 20 20 69 66 28 20 66 64 2d 3e 70 4d        if( fd->pM
cce0: 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
ccf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
cd00: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20  FileControl(fd, 
cd10: 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20  op, pArg);.     
cd20: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
cd30: 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
cd40: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
cd50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
cd60: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
cd70: 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 0a    return rc;   .
cd80: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  }../*.** Interfa
cd90: 63 65 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e  ce to the testin
cda0: 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20  g logic..*/.int 
cdb0: 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
cdc0: 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e  trol(int op, ...
cdd0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
cde0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cdf0: 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53  OMIT_BUILTIN_TES
ce00: 54 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  T.  va_list ap;.
ce10: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f    va_start(ap, o
ce20: 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p);.  switch( op
ce30: 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   ){..    /*.    
ce40: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
ce50: 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
ce60: 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20   PRNG..    */.  
ce70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
ce80: 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45  STCTRL_PRNG_SAVE
ce90: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
cea0: 33 50 72 6e 67 53 61 76 65 53 74 61 74 65 28 29  3PrngSaveState()
ceb0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
cec0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
ced0: 20 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20   ** Restore the 
cee0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
cef0: 47 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74  G to the last st
cf00: 61 74 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a  ate saved using.
cf10: 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45      ** PRNG_SAVE
cf20: 2e 20 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20  .  If PRNG_SAVE 
cf30: 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65  has never before
cf40: 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68   been called, th
cf50: 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76  en.    ** this v
cf60: 65 72 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52  erb acts like PR
cf70: 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f  NG_RESET..    */
cf80: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
cf90: 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
cfa0: 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20  ESTORE: {.      
cfb0: 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f  sqlite3PrngResto
cfc0: 72 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  reState();.     
cfd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
cfe0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73     /*.    ** Res
cff0: 65 74 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b  et the PRNG back
d000: 20 74 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61   to its uninitia
d010: 6c 69 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68  lized state.  Th
d020: 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20  e next call.    
d030: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61  ** to sqlite3_ra
d040: 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20  ndomness() will 
d050: 72 65 73 65 65 64 20 74 68 65 20 50 52 4e 47 20  reseed the PRNG 
d060: 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63  using a single c
d070: 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  all.    ** to th
d080: 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65  e xRandomness me
d090: 74 68 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61  thod of the defa
d0a0: 75 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a  ult VFS..    */.
d0b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
d0c0: 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
d0d0: 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  SET: {.      sql
d0e0: 69 74 65 33 50 72 6e 67 52 65 73 65 74 53 74 61  ite3PrngResetSta
d0f0: 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
d100: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
d110: 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
d120: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49  _test_control(BI
d130: 54 56 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c  TVEC_TEST, size,
d140: 20 70 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a   program).    **
d150: 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65  .    ** Run a te
d160: 73 74 20 61 67 61 69 6e 73 74 20 61 20 42 69 74  st against a Bit
d170: 76 65 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69  vec object of si
d180: 7a 65 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d  ze.  The program
d190: 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a   argument.    **
d1a0: 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
d1b0: 69 6e 74 65 67 65 72 73 20 74 68 61 74 20 64 65  integers that de
d1c0: 66 69 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20  fines the test. 
d1d0: 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a   Return -1 on a.
d1e0: 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c      ** memory al
d1f0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20  location error, 
d200: 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72  0 on success, or
d210: 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e   non-zero for an
d220: 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53   error..    ** S
d230: 65 65 20 74 68 65 20 73 71 6c 69 74 65 33 42 69  ee the sqlite3Bi
d240: 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28  tvecBuiltinTest(
d250: 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
d260: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
d270: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
d280: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49  LITE_TESTCTRL_BI
d290: 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20  TVEC_TEST: {.   
d2a0: 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61     int sz = va_a
d2b0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
d2c0: 20 20 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20     int *aProg = 
d2d0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29  va_arg(ap, int*)
d2e0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d2f0: 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69  ite3BitvecBuilti
d300: 6e 54 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29  nTest(sz, aProg)
d310: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d320: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
d330: 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
d340: 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e  t_control(BENIGN
d350: 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78  _MALLOC_HOOKS, x
d360: 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20  Begin, xEnd).   
d370: 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73   **.    ** Regis
d380: 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c  ter hooks to cal
d390: 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  l to indicate wh
d3a0: 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ich malloc() fai
d3b0: 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72  lures .    ** ar
d3c0: 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f  e benign..    */
d3d0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
d3e0: 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e  _TESTCTRL_BENIGN
d3f0: 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b  _MALLOC_HOOKS: {
d400: 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76  .      typedef v
d410: 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74  oid (*void_funct
d420: 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20  ion)(void);.    
d430: 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
d440: 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20  xBenignBegin;.  
d450: 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f      void_functio
d460: 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20  n xBenignEnd;.  
d470: 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e      xBenignBegin
d480: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
d490: 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20  id_function);.  
d4a0: 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d      xBenignEnd =
d4b0: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
d4c0: 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
d4d0: 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d    sqlite3BenignM
d4e0: 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69  allocHooks(xBeni
d4f0: 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e  gnBegin, xBenign
d500: 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61  End);.      brea
d510: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
d520: 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69  a_end(ap);.#endi
d530: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d540: 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f  _BUILTIN_TEST */
d550: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.