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

Artifact de0a4555caa68268c9c804283e9476a4e9aa0c62:


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 31 32 20 32 30 30 38 2f 30 31  ,v 1.412 2008/01
0280: 2f 32 32 20 32 31 3a 33 30 3a 35 33 20 64 72 68  /22 21:30:53 drh
0290: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
02a0: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
02b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65  .#include <ctype
02c0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 76  .h>../*.** The v
02d0: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69  ersion of the li
02e0: 62 72 61 72 79 0a 2a 2f 0a 63 6f 6e 73 74 20 63  brary.*/.const c
02f0: 68 61 72 20 73 71 6c 69 74 65 33 5f 76 65 72 73  har sqlite3_vers
0300: 69 6f 6e 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56  ion[] = SQLITE_V
0310: 45 52 53 49 4f 4e 3b 0a 63 6f 6e 73 74 20 63 68  ERSION;.const ch
0320: 61 72 20 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76  ar *sqlite3_libv
0330: 65 72 73 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65  ersion(void){ re
0340: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 76 65 72  turn sqlite3_ver
0350: 73 69 6f 6e 3b 20 7d 0a 69 6e 74 20 73 71 6c 69  sion; }.int sqli
0360: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  te3_libversion_n
0370: 75 6d 62 65 72 28 76 6f 69 64 29 7b 20 72 65 74  umber(void){ ret
0380: 75 72 6e 20 53 51 4c 49 54 45 5f 56 45 52 53 49  urn SQLITE_VERSI
0390: 4f 4e 5f 4e 55 4d 42 45 52 3b 20 7d 0a 69 6e 74  ON_NUMBER; }.int
03a0: 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 73   sqlite3_threads
03b0: 61 66 65 28 76 6f 69 64 29 7b 20 72 65 74 75 72  afe(void){ retur
03c0: 6e 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  n SQLITE_THREADS
03d0: 41 46 45 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  AFE; }../*.** If
03e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
03f0: 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
0400: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20  is not NULL and 
0410: 69 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if.** SQLITE_ENA
0420: 42 4c 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65  BLE_IOTRACE is e
0430: 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73  nabled, then mes
0440: 73 61 67 65 73 20 64 65 73 63 72 69 62 69 6e 67  sages describing
0450: 0a 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61  .** I/O active a
0460: 72 65 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67  re written using
0470: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
0480: 20 54 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a   These messages.
0490: 2a 2a 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20  ** are intended 
04a0: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 63  for debugging ac
04b0: 74 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a  tivity only..*/.
04c0: 76 6f 69 64 20 28 2a 73 71 6c 69 74 65 33 5f 69  void (*sqlite3_i
04d0: 6f 5f 74 72 61 63 65 29 28 63 6f 6e 73 74 20 63  o_trace)(const c
04e0: 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b 0a  har*, ...) = 0;.
04f0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f  ./*.** If the fo
0500: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
0510: 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74  ariable points t
0520: 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 68  o a string which
0530: 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20   is the.** name 
0540: 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  of a directory, 
0550: 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63 74  then that direct
0560: 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ory will be used
0570: 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d   to store.** tem
0580: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a  porary files..**
0590: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
05a0: 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74   "PRAGMA temp_st
05b0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53  ore_directory" S
05c0: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63  QL command..*/.c
05d0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 74 65 6d  har *sqlite3_tem
05e0: 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  p_directory = 0;
05f0: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
0600: 74 72 75 65 20 69 66 20 74 68 65 20 62 75 66 66  true if the buff
0610: 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e  er z[0..n-1] con
0620: 74 61 69 6e 73 20 61 6c 6c 20 73 70 61 63 65 73  tains all spaces
0630: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0640: 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73 74 20  allSpaces(const 
0650: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
0660: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
0670: 20 7a 5b 2d 2d 6e 5d 3d 3d 27 20 27 20 29 7b 7d   z[--n]==' ' ){}
0680: 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a  .  return n==0;.
0690: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
06a0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
06b0: 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
06c0: 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77  named "BINARY" w
06d0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a  hich is always.*
06e0: 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  * available..**.
06f0: 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c 61  ** If the padFla
0700: 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  g argument is no
0710: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63  t NULL then spac
0720: 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68 65  e padding at the
0730: 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e   end.** of strin
0740: 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20  gs is ignored.  
0750: 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20  This implements 
0760: 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74  the RTRIM collat
0770: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
0780: 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a  nt binCollFunc(.
0790: 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c    void *padFlag,
07a0: 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
07b0: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
07c0: 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f  .  int nKey2, co
07d0: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a  nst void *pKey2.
07e0: 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a  ){.  int rc, n;.
07f0: 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79    n = nKey1<nKey
0800: 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79  2 ? nKey1 : nKey
0810: 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70  2;.  rc = memcmp
0820: 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e  (pKey1, pKey2, n
0830: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
0840: 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c 61  {.    if( padFla
0850: 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61  g.     && allSpa
0860: 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79  ces(((char*)pKey
0870: 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20  1)+n, nKey1-n). 
0880: 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73      && allSpaces
0890: 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29 2b  (((char*)pKey2)+
08a0: 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20  n, nKey2-n).    
08b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61 76  ){.      /* Leav
08c0: 65 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20 61  e rc unchanged a
08d0: 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  t 0 */.    }else
08e0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65  {.      rc = nKe
08f0: 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20  y1 - nKey2;.    
0900: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
0910: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74  c;.}../*.** Anot
0920: 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c  her built-in col
0930: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a  lating sequence:
0940: 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20   NOCASE. .**.** 
0950: 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73  This collating s
0960: 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e  equence is inten
0970: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66  ded to be used f
0980: 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e  or "case indepen
0990: 64 61 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73  dant.** comparis
09a0: 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e  on". SQLite's kn
09b0: 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72  owledge of upper
09c0: 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20   and lower case 
09d0: 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65  equivalents.** e
09e0: 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74  xtends only to t
09f0: 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73  he 26 characters
0a00: 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67   used in the Eng
0a10: 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a  lish language..*
0a20: 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65  *.** At the mome
0a30: 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  nt there is only
0a40: 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65   a UTF-8 impleme
0a50: 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ntation..*/.stat
0a60: 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c  ic int nocaseCol
0a70: 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f  latingFunc(.  vo
0a80: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69  id *NotUsed,.  i
0a90: 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
0aa0: 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69  void *pKey1,.  i
0ab0: 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20  nt nKey2, const 
0ac0: 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20  void *pKey2.){. 
0ad0: 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33   int r = sqlite3
0ae0: 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20  StrNICmp(.      
0af0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b  (const char *)pK
0b00: 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ey1, (const char
0b10: 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31   *)pKey2, (nKey1
0b20: 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b  <nKey2)?nKey1:nK
0b30: 65 79 32 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72  ey2);.  if( 0==r
0b40: 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79   ){.    r = nKey
0b50: 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72  1-nKey2;.  }.  r
0b60: 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn r;.}../*.*
0b70: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57  * Return the ROW
0b80: 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  ID of the most r
0b90: 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a  ecent insert.*/.
0ba0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c  sqlite_int64 sql
0bb0: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
0bc0: 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  _rowid(sqlite3 *
0bd0: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
0be0: 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a  ->lastRowid;.}..
0bf0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0c00: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
0c10: 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72  es in the most r
0c20: 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71  ecent call to sq
0c30: 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f  lite3_exec()..*/
0c40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61  .int sqlite3_cha
0c50: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
0c60: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
0c70: 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
0c80: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
0c90: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73  ber of changes s
0ca0: 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
0cb0: 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65  e handle was ope
0cc0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
0cd0: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
0ce0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
0cf0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f    return db->nTo
0d00: 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  talChange;.}../*
0d10: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69  .** Close an exi
0d20: 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74  sting SQLite dat
0d30: 61 62 61 73 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c  abase.*/.int sql
0d40: 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74  ite3_close(sqlit
0d50: 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45  e3 *db){.  HashE
0d60: 6c 65 6d 20 2a 69 3b 0a 20 20 69 6e 74 20 6a 3b  lem *i;.  int j;
0d70: 0a 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  ..  if( !db ){. 
0d80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
0d90: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  _OK;.  }.  if( s
0da0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
0db0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
0dc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
0dd0: 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  E;.  }.  sqlite3
0de0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
0df0: 3e 6d 75 74 65 78 29 3b 0a 0a 23 69 66 64 65 66  >mutex);..#ifdef
0e00: 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 7b 0a   SQLITE_SSE.  {.
0e10: 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20      extern void 
0e20: 73 71 6c 69 74 65 33 53 73 65 43 6c 65 61 6e 75  sqlite3SseCleanu
0e30: 70 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  p(sqlite3*);.   
0e40: 20 73 71 6c 69 74 65 33 53 73 65 43 6c 65 61 6e   sqlite3SseClean
0e50: 75 70 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  up(db);.  }.#end
0e60: 69 66 20 0a 0a 20 20 73 71 6c 69 74 65 33 52 65  if ..  sqlite3Re
0e70: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
0e80: 61 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  a(db, 0);..  /* 
0e90: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
0ea0: 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 20 52 65   is open, the Re
0eb0: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
0ec0: 61 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a 20  a() call above. 
0ed0: 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61 76   ** will not hav
0ee0: 65 20 63 61 6c 6c 65 64 20 74 68 65 20 78 44 69  e called the xDi
0ef0: 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f  sconnect() metho
0f00: 64 20 6f 6e 20 61 6e 79 20 76 69 72 74 75 61 6c  d on any virtual
0f10: 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20  .  ** tables in 
0f20: 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b  the db->aVTrans[
0f30: 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66 6f 6c  ] array. The fol
0f40: 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 56 74  lowing sqlite3Vt
0f50: 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20 2a  abRollback().  *
0f60: 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20 73  * call will do s
0f70: 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f 20 64 6f  o. We need to do
0f80: 20 74 68 69 73 20 62 65 66 6f 72 65 20 74 68 65   this before the
0f90: 20 63 68 65 63 6b 20 66 6f 72 20 61 63 74 69 76   check for activ
0fa0: 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  e.  ** SQL state
0fb0: 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73 20  ments below, as 
0fc0: 74 68 65 20 76 2d 74 61 62 6c 65 20 69 6d 70 6c  the v-table impl
0fd0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 62  ementation may b
0fe0: 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20 73  e storing.  ** s
0ff0: 6f 6d 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ome prepared sta
1000: 74 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61 6c  tements internal
1010: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ly..  */.  sqlit
1020: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64  e3VtabRollback(d
1030: 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  b);..  /* If the
1040: 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74  re are any outst
1050: 61 6e 64 69 6e 67 20 56 4d 73 2c 20 72 65 74 75  anding VMs, retu
1060: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
1070: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64  */.  if( db->pVd
1080: 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  be ){.    sqlite
1090: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
10a0: 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20  E_BUSY, .       
10b0: 20 22 55 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73   "Unable to clos
10c0: 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61 6c  e due to unfinal
10d0: 69 73 65 64 20 73 74 61 74 65 6d 65 6e 74 73 22  ised statements"
10e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
10f0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1100: 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72  utex);.    retur
1110: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
1120: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 73 71   }.  assert( !sq
1130: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1140: 28 64 62 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 49  (db) );..  /* FI
1150: 58 20 4d 45 3a 20 64 62 2d 3e 6d 61 67 69 63 20  X ME: db->magic 
1160: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 53 51  may be set to SQ
1170: 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45  LITE_MAGIC_CLOSE
1180: 44 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  D if the databas
1190: 65 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  e.  ** cannot be
11a0: 20 6f 70 65 6e 65 64 20 66 6f 72 20 73 6f 6d 65   opened for some
11b0: 20 72 65 61 73 6f 6e 2e 20 53 6f 20 74 68 69 73   reason. So this
11c0: 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74   routine needs t
11d0: 6f 20 72 75 6e 20 69 6e 0a 20 20 2a 2a 20 74 68  o run in.  ** th
11e0: 61 74 20 63 61 73 65 2e 20 42 75 74 20 6d 61 79  at case. But may
11f0: 62 65 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  be there should 
1200: 62 65 20 61 6e 20 65 78 74 72 61 20 6d 61 67 69  be an extra magi
1210: 63 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 0a  c value for the.
1220: 20 20 2a 2a 20 22 66 61 69 6c 65 64 20 74 6f 20    ** "failed to 
1230: 6f 70 65 6e 22 20 73 74 61 74 65 2e 0a 20 20 2a  open" state..  *
1240: 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 6f 76  *.  ** TODO: Cov
1250: 65 72 61 67 65 20 74 65 73 74 73 20 64 6f 20 6e  erage tests do n
1260: 6f 74 20 74 65 73 74 20 74 68 65 20 63 61 73 65  ot test the case
1270: 20 77 68 65 72 65 20 74 68 69 73 20 63 6f 6e 64   where this cond
1280: 69 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 74 72  ition is.  ** tr
1290: 75 65 2e 20 49 74 27 73 20 68 61 72 64 20 74 6f  ue. It's hard to
12a0: 20 73 65 65 20 68 6f 77 20 74 6f 20 63 61 75 73   see how to caus
12b0: 65 20 69 74 20 77 69 74 68 6f 75 74 20 6d 65 73  e it without mes
12c0: 73 69 6e 67 20 77 69 74 68 20 74 68 72 65 61 64  sing with thread
12d0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
12e0: 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f  ->magic!=SQLITE_
12f0: 4d 41 47 49 43 5f 43 4c 4f 53 45 44 20 26 26 20  MAGIC_CLOSED && 
1300: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
1310: 64 62 29 20 29 7b 0a 20 20 20 20 2f 2a 20 70 72  db) ){.    /* pr
1320: 69 6e 74 66 28 22 44 49 44 20 4e 4f 54 20 43 4c  intf("DID NOT CL
1330: 4f 53 45 5c 6e 22 29 3b 20 66 66 6c 75 73 68 28  OSE\n"); fflush(
1340: 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 20 20  stdout); */.    
1350: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1360: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1370: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1380: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
1390: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
13a0: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; j++){.    st
13b0: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
13c0: 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20  db->aDb[j];.    
13d0: 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a  if( pDb->pBt ){.
13e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
13f0: 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74  eeClose(pDb->pBt
1400: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42  );.      pDb->pB
1410: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
1420: 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   j!=1 ){.       
1430: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20   pDb->pSchema = 
1440: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1450: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
1460: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
1470: 61 28 64 62 2c 20 30 29 3b 0a 20 20 61 73 73 65  a(db, 0);.  asse
1480: 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29  rt( db->nDb<=2 )
1490: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
14a0: 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74  aDb==db->aDbStat
14b0: 69 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71  ic );.  for(i=sq
14c0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
14d0: 62 2d 3e 61 46 75 6e 63 29 3b 20 69 3b 20 69 3d  b->aFunc); i; i=
14e0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
14f0: 29 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20  )){.    FuncDef 
1500: 2a 70 46 75 6e 63 2c 20 2a 70 4e 65 78 74 3b 0a  *pFunc, *pNext;.
1510: 20 20 20 20 66 6f 72 28 70 46 75 6e 63 20 3d 20      for(pFunc = 
1520: 28 46 75 6e 63 44 65 66 2a 29 73 71 6c 69 74 65  (FuncDef*)sqlite
1530: 48 61 73 68 44 61 74 61 28 69 29 3b 20 70 46 75  HashData(i); pFu
1540: 6e 63 3b 20 70 46 75 6e 63 3d 70 4e 65 78 74 29  nc; pFunc=pNext)
1550: 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  {.      pNext = 
1560: 70 46 75 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20 20  pFunc->pNext;.  
1570: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1580: 28 70 46 75 6e 63 29 3b 0a 20 20 20 20 7d 0a 20  (pFunc);.    }. 
1590: 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69   }..  for(i=sqli
15a0: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
15b0: 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69  >aCollSeq); i; i
15c0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
15d0: 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  i)){.    CollSeq
15e0: 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53   *pColl = (CollS
15f0: 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  eq *)sqliteHashD
1600: 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49  ata(i);.    /* I
1610: 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75  nvoke any destru
1620: 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64  ctors registered
1630: 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   for collation s
1640: 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74  equence user dat
1650: 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d  a. */.    for(j=
1660: 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<3; j++){.  
1670: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d      if( pColl[j]
1680: 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  .xDel ){.       
1690: 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70   pColl[j].xDel(p
16a0: 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a  Coll[j].pUser);.
16b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
16d0: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Coll);.  }.  sql
16e0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
16f0: 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
1700: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1710: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1720: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
1730: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64  hFirst(&db->aMod
1740: 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ule); i; i=sqlit
1750: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
1760: 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20     Module *pMod 
1770: 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69  = (Module *)sqli
1780: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
1790: 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65     if( pMod->xDe
17a0: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 70  stroy ){.      p
17b0: 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d  Mod->xDestroy(pM
17c0: 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d  od->pAux);.    }
17d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
17e0: 65 28 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73  e(pMod);.  }.  s
17f0: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
1800: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23  &db->aModule);.#
1810: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
1820: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61  HashClear(&db->a
1830: 46 75 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  Func);.  sqlite3
1840: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
1850: 5f 4f 4b 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c  _OK, 0); /* Deal
1860: 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63 68  locates any cach
1870: 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73  ed error strings
1880: 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70  . */.  if( db->p
1890: 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
18a0: 65 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e  e3ValueFree(db->
18b0: 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pErr);.  }.  sql
18c0: 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69  ite3CloseExtensi
18d0: 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e  ons(db);..  db->
18e0: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
18f0: 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f  AGIC_ERROR;..  /
1900: 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62  * The temp-datab
1910: 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c  ase schema is al
1920: 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e  located differen
1930: 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  tly from the oth
1940: 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f  er schema.  ** o
1950: 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71  bjects (using sq
1960: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72  liteMalloc() dir
1970: 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f  ectly, instead o
1980: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  f sqlite3BtreeSc
1990: 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f  hema())..  ** So
19a0: 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
19b0: 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f  freed here. Todo
19c0: 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74  : Why not roll t
19d0: 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69  he temp schema i
19e0: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d  nto.  ** the sam
19f0: 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  e sqliteMalloc()
1a00: 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74   as the one that
1a10: 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64   allocates the d
1a20: 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74  atabase .  ** st
1a30: 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20  ructure?.  */.  
1a40: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
1a50: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
1a60: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1a70: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1a80: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  x);.  sqlite3_mu
1a90: 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74  tex_free(db->mut
1aa0: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ex);.  sqlite3_f
1ab0: 72 65 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72  ree(db);.  retur
1ac0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ad0: 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
1ae0: 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ll database file
1af0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1b00: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71  e3RollbackAll(sq
1b10: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
1b20: 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61  t i;.  int inTra
1b30: 6e 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ns = 0;.  assert
1b40: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1b50: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
1b60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 61 75 6c  );.  sqlite3Faul
1b70: 74 42 65 6e 69 67 6e 28 53 51 4c 49 54 45 5f 46  tBenign(SQLITE_F
1b80: 41 55 4c 54 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c  AULTINJECTOR_MAL
1b90: 4c 4f 43 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69  LOC, 1);.  for(i
1ba0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
1bb0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  ++){.    if( db-
1bc0: 3e 61 44 62 5b 69 5d 2e 70 42 74 20 29 7b 0a 20  >aDb[i].pBt ){. 
1bd0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1be0: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 64  BtreeIsInTrans(d
1bf0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29  b->aDb[i].pBt) )
1c00: 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e  {.        inTran
1c10: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 1;.      }. 
1c20: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1c30: 65 52 6f 6c 6c 62 61 63 6b 28 64 62 2d 3e 61 44  eRollback(db->aD
1c40: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20  b[i].pBt);.     
1c50: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72   db->aDb[i].inTr
1c60: 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ans = 0;.    }. 
1c70: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
1c80: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20  Rollback(db);.  
1c90: 73 71 6c 69 74 65 33 46 61 75 6c 74 42 65 6e 69  sqlite3FaultBeni
1ca0: 67 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54 49  gn(SQLITE_FAULTI
1cb0: 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 2c 20  NJECTOR_MALLOC, 
1cc0: 30 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 66  0);..  if( db->f
1cd0: 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
1ce0: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
1cf0: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
1d00: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
1d10: 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (db);.    sqlite
1d20: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
1d30: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d  hema(db, 0);.  }
1d40: 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61  ..  /* If one ha
1d50: 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65  s been configure
1d60: 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f  d, invoke the ro
1d70: 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c  llback-hook call
1d80: 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62  back */.  if( db
1d90: 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
1da0: 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20  ack && (inTrans 
1db0: 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  || !db->autoComm
1dc0: 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78  it) ){.    db->x
1dd0: 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
1de0: 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72  (db->pRollbackAr
1df0: 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  g);.  }.}../*.**
1e00: 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63   Return a static
1e10: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
1e20: 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20  cribes the kind 
1e30: 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69  of error specifi
1e40: 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67  ed in the.** arg
1e50: 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ument..*/.const 
1e60: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72  char *sqlite3Err
1e70: 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 63  Str(int rc){.  c
1e80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
1e90: 73 77 69 74 63 68 28 20 72 63 20 26 20 30 78 66  switch( rc & 0xf
1ea0: 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  f ){.    case SQ
1eb0: 4c 49 54 45 5f 52 4f 57 3a 0a 20 20 20 20 63 61  LITE_ROW:.    ca
1ec0: 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 0a  se SQLITE_DONE:.
1ed0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ee0: 4f 4b 3a 20 20 20 20 20 20 20 20 20 7a 20 3d 20  OK:         z = 
1ef0: 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 3b 20  "not an error"; 
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f10: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1f20: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1f30: 45 52 52 4f 52 3a 20 20 20 20 20 20 7a 20 3d 20  ERROR:      z = 
1f40: 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72  "SQL logic error
1f50: 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61   or missing data
1f60: 62 61 73 65 22 3b 20 20 20 62 72 65 61 6b 3b 0a  base";   break;.
1f70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1f80: 50 45 52 4d 3a 20 20 20 20 20 20 20 7a 20 3d 20  PERM:       z = 
1f90: 22 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69  "access permissi
1fa0: 6f 6e 20 64 65 6e 69 65 64 22 3b 20 20 20 20 20  on denied";     
1fb0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1fc0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1fd0: 41 42 4f 52 54 3a 20 20 20 20 20 20 7a 20 3d 20  ABORT:      z = 
1fe0: 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73  "callback reques
1ff0: 74 65 64 20 71 75 65 72 79 20 61 62 6f 72 74 22  ted query abort"
2000: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
2010: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2020: 42 55 53 59 3a 20 20 20 20 20 20 20 7a 20 3d 20  BUSY:       z = 
2030: 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  "database is loc
2040: 6b 65 64 22 3b 20 20 20 20 20 20 20 20 20 20 20  ked";           
2050: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2060: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2070: 4c 4f 43 4b 45 44 3a 20 20 20 20 20 7a 20 3d 20  LOCKED:     z = 
2080: 22 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20  "database table 
2090: 69 73 20 6c 6f 63 6b 65 64 22 3b 20 20 20 20 20  is locked";     
20a0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
20b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
20c0: 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 7a 20 3d 20  NOMEM:      z = 
20d0: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 3b  "out of memory";
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2100: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2110: 52 45 41 44 4f 4e 4c 59 3a 20 20 20 7a 20 3d 20  READONLY:   z = 
2120: 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74  "attempt to writ
2130: 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74  e a readonly dat
2140: 61 62 61 73 65 22 3b 20 20 62 72 65 61 6b 3b 0a  abase";  break;.
2150: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2160: 49 4e 54 45 52 52 55 50 54 3a 20 20 7a 20 3d 20  INTERRUPT:  z = 
2170: 22 69 6e 74 65 72 72 75 70 74 65 64 22 3b 20 20  "interrupted";  
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
21a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
21b0: 49 4f 45 52 52 3a 20 20 20 20 20 20 7a 20 3d 20  IOERR:      z = 
21c0: 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22  "disk I/O error"
21d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
21f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2200: 43 4f 52 52 55 50 54 3a 20 20 20 20 7a 20 3d 20  CORRUPT:    z = 
2210: 22 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  "database disk i
2220: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
2230: 64 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  d";      break;.
2240: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2250: 46 55 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20  FULL:       z = 
2260: 22 64 61 74 61 62 61 73 65 20 6f 72 20 64 69 73  "database or dis
2270: 6b 20 69 73 20 66 75 6c 6c 22 3b 20 20 20 20 20  k is full";     
2280: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2290: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22a0: 43 41 4e 54 4f 50 45 4e 3a 20 20 20 7a 20 3d 20  CANTOPEN:   z = 
22b0: 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
22c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 3b 20  database file"; 
22d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
22e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22f0: 45 4d 50 54 59 3a 20 20 20 20 20 20 7a 20 3d 20  EMPTY:      z = 
2300: 22 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20  "table contains 
2310: 6e 6f 20 64 61 74 61 22 3b 20 20 20 20 20 20 20  no data";       
2320: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2330: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2340: 53 43 48 45 4d 41 3a 20 20 20 20 20 7a 20 3d 20  SCHEMA:     z = 
2350: 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61  "database schema
2360: 20 68 61 73 20 63 68 61 6e 67 65 64 22 3b 20 20   has changed";  
2370: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2380: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2390: 54 4f 4f 42 49 47 3a 20 20 20 20 20 7a 20 3d 20  TOOBIG:     z = 
23a0: 22 53 74 72 69 6e 67 20 6f 72 20 42 4c 4f 42 20  "String or BLOB 
23b0: 65 78 63 65 65 64 65 64 20 73 69 7a 65 20 6c 69  exceeded size li
23c0: 6d 69 74 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  mit";    break;.
23d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
23e0: 43 4f 4e 53 54 52 41 49 4e 54 3a 20 7a 20 3d 20  CONSTRAINT: z = 
23f0: 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c  "constraint fail
2400: 65 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ed";            
2410: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2420: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2430: 4d 49 53 4d 41 54 43 48 3a 20 20 20 7a 20 3d 20  MISMATCH:   z = 
2440: 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74  "datatype mismat
2450: 63 68 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ch";            
2460: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2470: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2480: 4d 49 53 55 53 45 3a 20 20 20 20 20 7a 20 3d 20  MISUSE:     z = 
2490: 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e 65  "library routine
24a0: 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73   called out of s
24b0: 65 71 75 65 6e 63 65 22 3b 62 72 65 61 6b 3b 0a  equence";break;.
24c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
24d0: 4e 4f 4c 46 53 3a 20 20 20 20 20 20 7a 20 3d 20  NOLFS:      z = 
24e0: 22 6b 65 72 6e 65 6c 20 6c 61 63 6b 73 20 6c 61  "kernel lacks la
24f0: 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74  rge file support
2500: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
2510: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2520: 41 55 54 48 3a 20 20 20 20 20 20 20 7a 20 3d 20  AUTH:       z = 
2530: 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64  "authorization d
2540: 65 6e 69 65 64 22 3b 20 20 20 20 20 20 20 20 20  enied";         
2550: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2560: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2570: 46 4f 52 4d 41 54 3a 20 20 20 20 20 7a 20 3d 20  FORMAT:     z = 
2580: 22 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62  "auxiliary datab
2590: 61 73 65 20 66 6f 72 6d 61 74 20 65 72 72 6f 72  ase format error
25a0: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
25b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
25c0: 52 41 4e 47 45 3a 20 20 20 20 20 20 7a 20 3d 20  RANGE:      z = 
25d0: 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20  "bind or column 
25e0: 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e  index out of ran
25f0: 67 65 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ge";     break;.
2600: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2610: 4e 4f 54 41 44 42 3a 20 20 20 20 20 7a 20 3d 20  NOTADB:     z = 
2620: 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74  "file is encrypt
2630: 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64  ed or is not a d
2640: 61 74 61 62 61 73 65 22 3b 62 72 65 61 6b 3b 0a  atabase";break;.
2650: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
2660: 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20              z = 
2670: 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b  "unknown error";
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
26a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
26b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
26c0: 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
26d0: 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b   a busy callback
26e0: 20 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64   that sleeps and
26f0: 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20   tries.** again 
2700: 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20  until a timeout 
2710: 76 61 6c 75 65 20 69 73 20 72 65 61 63 68 65 64  value is reached
2720: 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76  .  The timeout v
2730: 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e  alue is.** an in
2740: 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
2750: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73  milliseconds pas
2760: 73 65 64 20 69 6e 20 61 73 20 74 68 65 20 66 69  sed in as the fi
2770: 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  rst.** argument.
2780: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2790: 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79  qliteDefaultBusy
27a0: 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20  Callback(. void 
27b0: 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  *ptr,           
27c0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
27d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69  connection */. i
27e0: 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20  nt count        
27f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2800: 72 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65  r of times table
2810: 20 68 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a   has been busy *
2820: 2f 0a 29 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 20  /.){.#if OS_WIN 
2830: 7c 7c 20 28 64 65 66 69 6e 65 64 28 48 41 56 45  || (defined(HAVE
2840: 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45  _USLEEP) && HAVE
2850: 5f 55 53 4c 45 45 50 29 0a 20 20 73 74 61 74 69  _USLEEP).  stati
2860: 63 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79  c const u8 delay
2870: 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20  s[] =.     { 1, 
2880: 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30  2, 5, 10, 15, 20
2890: 2c 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20  , 25, 25,  25,  
28a0: 35 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a  50,  50, 100 };.
28b0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
28c0: 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20  8 totals[] =.   
28d0: 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c    { 0, 1, 3,  8,
28e0: 20 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c   18, 33, 53, 78,
28f0: 20 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20   103, 128, 178, 
2900: 32 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20  228 };.# define 
2910: 4e 44 45 4c 41 59 20 28 73 69 7a 65 6f 66 28 64  NDELAY (sizeof(d
2920: 65 6c 61 79 73 29 2f 73 69 7a 65 6f 66 28 64 65  elays)/sizeof(de
2930: 6c 61 79 73 5b 30 5d 29 29 0a 20 20 73 71 6c 69  lays[0])).  sqli
2940: 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74  te3 *db = (sqlit
2950: 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20  e3 *)ptr;.  int 
2960: 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75  timeout = db->bu
2970: 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74  syTimeout;.  int
2980: 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a   delay, prior;..
2990: 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e    assert( count>
29a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e  =0 );.  if( coun
29b0: 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20  t < NDELAY ){.  
29c0: 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73    delay = delays
29d0: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69  [count];.    pri
29e0: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e  or = totals[coun
29f0: 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
2a00: 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b   delay = delays[
2a10: 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70  NDELAY-1];.    p
2a20: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44  rior = totals[ND
2a30: 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a  ELAY-1] + delay*
2a40: 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31  (count-(NDELAY-1
2a50: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72  ));.  }.  if( pr
2a60: 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69  ior + delay > ti
2a70: 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c  meout ){.    del
2a80: 61 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70  ay = timeout - p
2a90: 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65  rior;.    if( de
2aa0: 6c 61 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20  lay<=0 ) return 
2ab0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
2ac0: 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73  OsSleep(db->pVfs
2ad0: 2c 20 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20  , delay*1000);. 
2ae0: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65   return 1;.#else
2af0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2b00: 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b   (sqlite3 *)ptr;
2b10: 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d  .  int timeout =
2b20: 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72   ((sqlite3 *)ptr
2b30: 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a  )->busyTimeout;.
2b40: 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a    if( (count+1)*
2b50: 31 30 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29  1000 > timeout )
2b60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2b70: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
2b80: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31  leep(db->pVfs, 1
2b90: 30 30 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72  000000);.  retur
2ba0: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
2bb0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
2bc0: 67 69 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c  given busy handl
2bd0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
2be0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2bf0: 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69   when an operati
2c00: 6f 6e 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  on failed with a
2c10: 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69   lock..** If thi
2c20: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2c30: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
2c40: 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e  lock is retried.
2c50: 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72    If it.** retur
2c60: 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74  ns 0, the operat
2c70: 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20  ion aborts with 
2c80: 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65  an SQLITE_BUSY e
2c90: 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rror..*/.int sql
2ca0: 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
2cb0: 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65  ndler(BusyHandle
2cc0: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  r *p){.  int rc;
2cd0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
2ce0: 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d  ->xFunc==0 || p-
2cf0: 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75 72  >nBusy<0 ) retur
2d00: 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78  n 0;.  rc = p->x
2d10: 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d  Func(p->pArg, p-
2d20: 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72  >nBusy);.  if( r
2d30: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  c==0 ){.    p->n
2d40: 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  Busy = -1;.  }el
2d50: 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79  se{.    p->nBusy
2d60: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
2d70: 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   rc; .}../*.** T
2d80: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
2d90: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
2da0: 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65  ck for an Sqlite
2db0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65   database to the
2dc0: 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  .** given callba
2dd0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ck function with
2de0: 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d   the given argum
2df0: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
2e00: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
2e10: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
2e20: 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28  .  int (*xBusy)(
2e30: 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f  void*,int),.  vo
2e40: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 69 66  id *pArg.){.  if
2e50: 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43  ( sqlite3SafetyC
2e60: 68 65 63 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  heck(db) ){.    
2e70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
2e80: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  SUSE;.  }.  sqli
2e90: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
2ea0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
2eb0: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 46  ->busyHandler.xF
2ec0: 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a 20 20 64  unc = xBusy;.  d
2ed0: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70  b->busyHandler.p
2ee0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62  Arg = pArg;.  db
2ef0: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42  ->busyHandler.nB
2f00: 75 73 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  usy = 0;.  sqlit
2f10: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
2f20: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
2f30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2f40: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2f50: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
2f60: 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68  ALLBACK./*.** Th
2f70: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
2f80: 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  the progress cal
2f90: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
2fa0: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
2fb0: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
2fc0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
2fd0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
2fe0: 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67  gument. The prog
2ff0: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69  ress callback wi
3000: 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ll.** be invoked
3010: 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f   every nOps opco
3020: 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  des..*/.void sql
3030: 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
3040: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
3050: 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70   *db, .  int nOp
3060: 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67  s,.  int (*xProg
3070: 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20  ress)(void*), . 
3080: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
3090: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
30a0: 65 74 79 43 68 65 63 6b 28 64 62 29 20 29 7b 0a  etyCheck(db) ){.
30b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
30c0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
30d0: 78 29 3b 0a 20 20 20 20 69 66 28 20 6e 4f 70 73  x);.    if( nOps
30e0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  >0 ){.      db->
30f0: 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f  xProgress = xPro
3100: 67 72 65 73 73 3b 0a 20 20 20 20 20 20 64 62 2d  gress;.      db-
3110: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20  >nProgressOps = 
3120: 6e 4f 70 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e  nOps;.      db->
3130: 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70  pProgressArg = p
3140: 41 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Arg;.    }else{.
3150: 20 20 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72        db->xProgr
3160: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 64  ess = 0;.      d
3170: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
3180: 3d 20 30 3b 0a 20 20 20 20 20 20 64 62 2d 3e 70  = 0;.      db->p
3190: 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 30 3b  ProgressArg = 0;
31a0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
31b0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
31c0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 7d  b->mutex);.  }.}
31d0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
31e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73  This routine ins
31f0: 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20  talls a default 
3200: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61  busy handler tha
3210: 74 20 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a  t waits for the.
3220: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d  ** specified num
3230: 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
3240: 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nds before retur
3250: 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  ning 0..*/.int s
3260: 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
3270: 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  out(sqlite3 *db,
3280: 20 69 6e 74 20 6d 73 29 7b 0a 20 20 69 66 28 20   int ms){.  if( 
3290: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
32a0: 63 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  ck(db) ){.    re
32b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
32c0: 53 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 73  SE;.  }.  if( ms
32d0: 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 75  >0 ){.    db->bu
32e0: 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a  syTimeout = ms;.
32f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
3300: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c  _handler(db, sql
3310: 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61  iteDefaultBusyCa
3320: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64  llback, (void*)d
3330: 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
3340: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
3350: 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b  ndler(db, 0, 0);
3360: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
3370: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
3380: 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64  * Cause any pend
3390: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  ing operation to
33a0: 20 73 74 6f 70 20 61 74 20 69 74 73 20 65 61 72   stop at its ear
33b0: 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74  liest opportunit
33c0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
33d0: 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c  e3_interrupt(sql
33e0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28  ite3 *db){.  if(
33f0: 20 64 62 20 26 26 20 28 64 62 2d 3e 6d 61 67 69   db && (db->magi
3400: 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c==SQLITE_MAGIC_
3410: 4f 50 45 4e 20 7c 7c 20 64 62 2d 3e 6d 61 67 69  OPEN || db->magi
3420: 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c==SQLITE_MAGIC_
3430: 42 55 53 59 29 20 29 7b 0a 20 20 20 20 64 62 2d  BUSY) ){.    db-
3440: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
3450: 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  d = 1;.  }.}.../
3460: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3470: 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74 68  on is exactly th
3480: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
3490: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
34a0: 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74  n(), except.** t
34b0: 68 61 74 20 69 74 20 69 73 20 64 65 73 69 67 6e  hat it is design
34c0: 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
34d0: 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65  by internal code
34e0: 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  . The difference
34f0: 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61   is.** that if a
3500: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20   malloc() fails 
3510: 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  in sqlite3_creat
3520: 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e  e_function(), an
3530: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69   error code.** i
3540: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
3550: 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  he mallocFailed 
3560: 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a  flag cleared. .*
3570: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65  /.int sqlite3Cre
3580: 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ateFunc(.  sqlit
3590: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
35a0: 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  char *zFunctionN
35b0: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  ame,.  int nArg,
35c0: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
35d0: 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20  id *pUserData,. 
35e0: 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73   void (*xFunc)(s
35f0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
3600: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
3610: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
3620: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
3630: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
3640: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
3650: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
3660: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
3670: 29 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  ).){.  FuncDef *
3680: 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  p;.  int nName;.
3690: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
36a0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
36b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
36c0: 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43  ( sqlite3SafetyC
36d0: 68 65 63 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  heck(db) ){.    
36e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
36f0: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  SUSE;.  }.  if( 
3700: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30  zFunctionName==0
3710: 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63   ||.      (xFunc
3720: 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78   && (xFinal || x
3730: 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20  Step)) || .     
3740: 20 28 21 78 46 75 6e 63 20 26 26 20 28 78 46 69   (!xFunc && (xFi
3750: 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29 29 20  nal && !xStep)) 
3760: 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63  ||.      (!xFunc
3770: 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20   && (!xFinal && 
3780: 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20  xStep)) ||.     
3790: 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72   (nArg<-1 || nAr
37a0: 67 3e 31 32 37 29 20 7c 7c 0a 20 20 20 20 20 20  g>127) ||.      
37b0: 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 74  (255<(nName = st
37c0: 72 6c 65 6e 28 7a 46 75 6e 63 74 69 6f 6e 4e 61  rlen(zFunctionNa
37d0: 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  me))) ){.    sql
37e0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
37f0: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 62 61 64  LITE_ERROR, "bad
3800: 20 70 61 72 61 6d 65 74 65 72 73 22 29 3b 0a 20   parameters");. 
3810: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3820: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 23  _ERROR;.  }.  .#
3830: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3840: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66  IT_UTF16.  /* If
3850: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
3860: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
3870: 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
3880: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
3890: 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
38a0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
38b0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
38c0: 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
38d0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
38e0: 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
38f0: 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
3900: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
3910: 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54  **.  ** If SQLIT
3920: 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69  E_ANY is specifi
3930: 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65  ed, add three ve
3940: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75  rsions of the fu
3950: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74  nction.  ** to t
3960: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20  he hash table.. 
3970: 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53   */.  if( enc==S
3980: 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20  QLITE_UTF16 ){. 
3990: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
39a0: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
39b0: 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51  else if( enc==SQ
39c0: 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20  LITE_ANY ){.    
39d0: 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  int rc;.    rc =
39e0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
39f0: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
3a00: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
3a10: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
3a20: 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75    pUserData, xFu
3a30: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
3a40: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  l);.    if( rc==
3a50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3a60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
3a70: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
3a80: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
3a90: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  g, SQLITE_UTF16L
3aa0: 45 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55 73  E,.          pUs
3ab0: 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78  erData, xFunc, x
3ac0: 53 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20  Step, xFinal);. 
3ad0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
3ae0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3af0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
3b00: 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53     }.    enc = S
3b10: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20  QLITE_UTF16BE;. 
3b20: 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d   }.#else.  enc =
3b30: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
3b40: 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65  ndif.  .  /* Che
3b50: 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ck if an existin
3b60: 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  g function is be
3b70: 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f  ing overridden o
3b80: 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f  r deleted. If so
3b90: 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65  ,.  ** and there
3ba0: 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c   are active VMs,
3bb0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c   then return SQL
3bc0: 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66  ITE_BUSY. If a f
3bd0: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
3be0: 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e  being overridden
3bf0: 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68 65  /deleted but the
3c00: 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  re are no active
3c10: 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a   VMs, allow the.
3c20: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74    ** operation t
3c30: 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69  o continue but i
3c40: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
3c50: 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  ecompiled statem
3c60: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  ents..  */.  p =
3c70: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
3c80: 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69  tion(db, zFuncti
3c90: 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e  onName, nName, n
3ca0: 41 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  Arg, enc, 0);.  
3cb0: 69 66 28 20 70 20 26 26 20 70 2d 3e 69 50 72 65  if( p && p->iPre
3cc0: 66 45 6e 63 3d 3d 65 6e 63 20 26 26 20 70 2d 3e  fEnc==enc && p->
3cd0: 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20  nArg==nArg ){.  
3ce0: 20 20 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65    if( db->active
3cf0: 56 64 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20  VdbeCnt ){.     
3d00: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
3d10: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a  , SQLITE_BUSY, .
3d20: 20 20 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20          "Unable 
3d30: 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79  to delete/modify
3d40: 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64   user-function d
3d50: 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61  ue to active sta
3d60: 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20  tements");.     
3d70: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
3d80: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
3d90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3da0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73  E_BUSY;.    }els
3db0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
3dc0: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
3dd0: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
3de0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73    }.  }..  p = s
3df0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
3e00: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
3e10: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
3e20: 67 2c 20 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73  g, enc, 1);.  as
3e30: 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61  sert(p || db->ma
3e40: 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69  llocFailed);.  i
3e50: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
3e60: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
3e70: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 66 6c 61 67 73  ;.  }.  p->flags
3e80: 20 3d 20 30 3b 0a 20 20 70 2d 3e 78 46 75 6e 63   = 0;.  p->xFunc
3e90: 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78   = xFunc;.  p->x
3ea0: 53 74 65 70 20 3d 20 78 53 74 65 70 3b 0a 20 20  Step = xStep;.  
3eb0: 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78  p->xFinalize = x
3ec0: 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65  Final;.  p->pUse
3ed0: 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61 74  rData = pUserDat
3ee0: 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 6e  a;.  p->nArg = n
3ef0: 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Arg;.  return SQ
3f00: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
3f10: 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73 65  * Create new use
3f20: 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  r functions..*/.
3f30: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
3f40: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73  te_function(.  s
3f50: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
3f60: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74  nst char *zFunct
3f70: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
3f80: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
3f90: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
3fa0: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
3fb0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
3fc0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3fd0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
3fe0: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
3ff0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
4000: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
4010: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
4020: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
4030: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
4040: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
4050: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
4060: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
4070: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63  ocFailed );.  rc
4080: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
4090: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69  Func(db, zFuncti
40a0: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 65 6e  onName, nArg, en
40b0: 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74  c, p, xFunc, xSt
40c0: 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 72  ep, xFinal);.  r
40d0: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
40e0: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
40f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
4100: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
4110: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
4120: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4130: 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69  T_UTF16.int sqli
4140: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
4150: 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33  ion16(.  sqlite3
4160: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f   *db,.  const vo
4170: 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  id *zFunctionNam
4180: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  e,.  int nArg,. 
4190: 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20   int eTextRep,. 
41a0: 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64   void *p,.  void
41b0: 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
41c0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
41d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c  qlite3_value**),
41e0: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
41f0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
4200: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
4210: 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  lue**),.  void (
4220: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
4230: 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20  _context*).){.  
4240: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
4250: 7a 46 75 6e 63 38 3b 0a 20 20 73 71 6c 69 74 65  zFunc8;.  sqlite
4260: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
4270: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
4280: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
4290: 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63  ailed );.  zFunc
42a0: 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36  8 = sqlite3Utf16
42b0: 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  to8(db, zFunctio
42c0: 6e 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 72 63  nName, -1);.  rc
42d0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
42e0: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c  Func(db, zFunc8,
42f0: 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c   nArg, eTextRep,
4300: 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70   p, xFunc, xStep
4310: 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 73 71 6c  , xFinal);.  sql
4320: 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6e 63 38  ite3_free(zFunc8
4330: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
4340: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
4350: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
4360: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
4370: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
4380: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
4390: 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61  * Declare that a
43a0: 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65   function has be
43b0: 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79  en overloaded by
43c0: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
43d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
43e0: 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20  unction already 
43f0: 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75  exists as a regu
4400: 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  lar global funct
4410: 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ion, then.** thi
4420: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
4430: 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75  o-op.  If the fu
4440: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
4450: 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61  exist, then crea
4460: 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20  te.** a new one 
4470: 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f  that always thro
4480: 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72  ws a run-time er
4490: 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  ror.  .**.** Whe
44a0: 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  n virtual tables
44b0: 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69   intend to provi
44c0: 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64  de an overloaded
44d0: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a   function, they.
44e0: 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74  ** should call t
44f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d  his routine to m
4500: 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f  ake sure the glo
4510: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69  bal function exi
4520: 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  sts..** A global
4530: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65   function must e
4540: 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f  xist in order fo
4550: 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
4560: 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f  n to work.** pro
4570: 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  perly..*/.int sq
4580: 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
4590: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
45a0: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
45b0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
45c0: 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74  nt nArg.){.  int
45d0: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
45e0: 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63  zName);.  int rc
45f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
4600: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
4610: 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  x);.  if( sqlite
4620: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
4630: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
4640: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
4650: 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  8, 0)==0 ){.    
4660: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
4670: 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  c(db, zName, nAr
4680: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46a0: 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33        0, sqlite3
46b0: 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c  InvalidFunction,
46c0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63   0, 0);.  }.  rc
46d0: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
46e0: 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  t(db, SQLITE_OK)
46f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
4700: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
4710: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
4720: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
4730: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
4740: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74  .** Register a t
4750: 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20  race function.  
4760: 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68  The pArg from th
4770: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
4780: 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a  istered trace.**
4790: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
47a0: 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61  **.** A NULL tra
47b0: 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  ce function mean
47c0: 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e  s that no tracin
47d0: 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20  g is executes.  
47e0: 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72  A non-NULL.** tr
47f0: 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ace is a pointer
4800: 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
4810: 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
4820: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
4830: 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65  ach.** SQL state
4840: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ment..*/.void *s
4850: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c  qlite3_trace(sql
4860: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 28  ite3 *db, void (
4870: 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63  *xTrace)(void*,c
4880: 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69  onst char*), voi
4890: 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64  d *pArg){.  void
48a0: 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65   *pOld;.  sqlite
48b0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
48c0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
48d0: 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67   = db->pTraceArg
48e0: 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d  ;.  db->xTrace =
48f0: 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70   xTrace;.  db->p
4900: 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b  TraceArg = pArg;
4910: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4920: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
4930: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
4940: 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  ;.}./*.** Regist
4950: 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e  er a profile fun
4960: 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67  ction.  The pArg
4970: 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
4980: 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  usly registered 
4990: 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  .** profile func
49a0: 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64  tion is returned
49b0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  .  .**.** A NULL
49c0: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
49d0: 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  n means that no 
49e0: 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65  profiling is exe
49f0: 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55  cutes.  A non-NU
4a00: 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73  LL.** profile is
4a10: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
4a20: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
4a30: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
4a40: 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a  conclusion of.**
4a50: 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
4a60: 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e  ent that is run.
4a70: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
4a80: 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c  3_profile(.  sql
4a90: 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
4aa0: 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69   (*xProfile)(voi
4ab0: 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  d*,const char*,s
4ac0: 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20  qlite_uint64),. 
4ad0: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
4ae0: 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73   void *pOld;.  s
4af0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
4b00: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
4b10: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f   pOld = db->pPro
4b20: 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  fileArg;.  db->x
4b30: 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69  Profile = xProfi
4b40: 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69  le;.  db->pProfi
4b50: 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  leArg = pArg;.  
4b60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
4b70: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
4b80: 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d    return pOld;.}
4b90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
4ba0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a  E_OMIT_TRACE */.
4bb0: 0a 2f 2a 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54  ./*** EXPERIMENT
4bc0: 41 4c 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 67  AL ***.**.** Reg
4bd0: 69 73 74 65 72 20 61 20 66 75 6e 63 74 69 6f 6e  ister a function
4be0: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 77   to be invoked w
4bf0: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
4c00: 6e 20 63 6f 6d 6d 65 6e 74 73 2e 0a 2a 2a 20 49  n comments..** I
4c10: 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66 75  f the invoked fu
4c20: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e  nction returns n
4c30: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
4c40: 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73  e commit becomes
4c50: 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a   a.** rollback..
4c60: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
4c70: 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20  _commit_hook(.  
4c80: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
4c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
4ca0: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
4cb0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
4cc0: 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61  .  int (*xCallba
4cd0: 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20  ck)(void*),  /* 
4ce0: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f  Function to invo
4cf0: 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69  ke on each commi
4d00: 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  t */.  void *pAr
4d10: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
4d20: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
4d30: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
4d40: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
4d50: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4d60: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
4d70: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
4d80: 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62  pCommitArg;.  db
4d90: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
4da0: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
4db0: 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20   db->pCommitArg 
4dc0: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
4dd0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
4de0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
4df0: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pOld;.}../*.*
4e00: 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
4e10: 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
4e20: 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
4e30: 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a  row is updated,.
4e40: 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64  ** inserted or d
4e50: 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 69  eleted using thi
4e60: 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
4e70: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
4e80: 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68  sqlite3_update_h
4e90: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
4ea0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
4eb0: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
4ec0: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
4ed0: 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  base */.  void (
4ee0: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
4ef0: 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74  *,int,char const
4f00: 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c   *,char const *,
4f10: 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20  sqlite_int64),. 
4f20: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
4f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
4f40: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
4f50: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
4f60: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
4f70: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
4f80: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
4f90: 52 65 74 20 3d 20 64 62 2d 3e 70 55 70 64 61 74  Ret = db->pUpdat
4fa0: 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64  eArg;.  db->xUpd
4fb0: 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  ateCallback = xC
4fc0: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
4fd0: 55 70 64 61 74 65 41 72 67 20 3d 20 70 41 72 67  UpdateArg = pArg
4fe0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
4ff0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
5000: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  x);.  return pRe
5010: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  t;.}../*.** Regi
5020: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
5030: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
5040: 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61  ch time a transa
5050: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a  ction is rolled.
5060: 2a 2a 20 62 61 63 6b 20 62 79 20 74 68 69 73 20  ** back by this 
5070: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
5080: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
5090: 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68  lite3_rollback_h
50a0: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
50b0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
50c0: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
50d0: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
50e0: 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  base */.  void (
50f0: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
5100: 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20  *), /* Callback 
5110: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
5120: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
5130: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
5140: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
5150: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
5160: 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65   *pRet;.  sqlite
5170: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
5180: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
5190: 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b   = db->pRollback
51a0: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c  Arg;.  db->xRoll
51b0: 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78  backCallback = x
51c0: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
51d0: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70  pRollbackArg = p
51e0: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
51f0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
5200: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
5210: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pRet;.}../*.** T
5220: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5230: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
5240: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
5250: 61 20 64 61 74 61 62 61 73 65 20 42 54 72 65 65  a database BTree
5260: 0a 2a 2a 20 64 72 69 76 65 72 2e 20 20 49 66 20  .** driver.  If 
5270: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
5280: 20 6e 61 6d 65 20 6f 66 20 61 20 66 69 6c 65 2c   name of a file,
5290: 20 74 68 65 6e 20 74 68 61 74 20 66 69 6c 65 20   then that file 
52a0: 69 73 0a 2a 2a 20 6f 70 65 6e 65 64 20 61 6e 64  is.** opened and
52b0: 20 75 73 65 64 2e 20 20 49 66 20 7a 46 69 6c 65   used.  If zFile
52c0: 6e 61 6d 65 20 69 73 20 74 68 65 20 6d 61 67 69  name is the magi
52d0: 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a  c name ":memory:
52e0: 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61  " then.** the da
52f0: 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65 64  tabase is stored
5300: 20 69 6e 20 6d 65 6d 6f 72 79 20 28 61 6e 64 20   in memory (and 
5310: 69 73 20 74 68 75 73 20 66 6f 72 67 6f 74 74 65  is thus forgotte
5320: 6e 20 61 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20  n as soon as.** 
5330: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
5340: 73 20 63 6c 6f 73 65 64 2e 29 20 20 49 66 20 7a  s closed.)  If z
5350: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
5360: 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
5370: 73 65 0a 2a 2a 20 69 73 20 61 20 22 76 69 72 74  se.** is a "virt
5380: 75 61 6c 22 20 64 61 74 61 62 61 73 65 20 66 6f  ual" database fo
5390: 72 20 74 72 61 6e 73 69 65 6e 74 20 75 73 65 20  r transient use 
53a0: 6f 6e 6c 79 20 61 6e 64 20 69 73 20 64 65 6c 65  only and is dele
53b0: 74 65 64 20 61 73 0a 2a 2a 20 73 6f 6f 6e 20 61  ted as.** soon a
53c0: 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  s the connection
53d0: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
53e0: 2a 20 41 20 76 69 72 74 75 61 6c 20 64 61 74 61  * A virtual data
53f0: 62 61 73 65 20 63 61 6e 20 62 65 20 65 69 74 68  base can be eith
5400: 65 72 20 61 20 64 69 73 6b 20 66 69 6c 65 20 28  er a disk file (
5410: 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69  that is automati
5420: 63 61 6c 6c 79 0a 2a 2a 20 64 65 6c 65 74 65 64  cally.** deleted
5430: 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65 20 69   when the file i
5440: 73 20 63 6c 6f 73 65 64 29 20 6f 72 20 69 74 20  s closed) or it 
5450: 61 6e 20 62 65 20 68 65 6c 64 20 65 6e 74 69 72  an be held entir
5460: 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 0a 2a  ely in memory,.*
5470: 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  * depending on t
5480: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65  he values of the
5490: 20 54 45 4d 50 5f 53 54 4f 52 45 20 63 6f 6d 70   TEMP_STORE comp
54a0: 69 6c 65 2d 74 69 6d 65 20 6d 61 63 72 6f 20 61  ile-time macro a
54b0: 6e 64 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 74 65  nd the.** db->te
54c0: 6d 70 5f 73 74 6f 72 65 20 76 61 72 69 61 62 6c  mp_store variabl
54d0: 65 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  e, according to 
54e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  the following ch
54f0: 61 72 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  art:.**.**      
5500: 20 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20   TEMP_STORE     
5510: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20  db->temp_store  
5520: 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74     Location of t
5530: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
5540: 65 0a 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  e.**       -----
5550: 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
5560: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
5590: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
55a0: 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20           any    
55b0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 0a 2a 2a           file.**
55c0: 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
55e0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 0a             file.
55f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 31 20 20  **           1  
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
5620: 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ory.**          
5630: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
5640: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
5650: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20   file.**        
5660: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
5670: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
5680: 20 20 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20     file.**      
5690: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
56a0: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
56b0: 20 20 20 20 20 6d 65 6d 6f 72 79 0a 2a 2a 20 20       memory.**  
56c0: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
56d0: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
56e0: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 0a           memory.
56f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 33 20 20  **           3  
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79               any
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
5720: 6f 72 79 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ory.*/.int sqlit
5730: 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 0a  e3BtreeFactory(.
5740: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20    const sqlite3 
5750: 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d  *db,        /* M
5760: 61 69 6e 20 64 61 74 61 62 61 73 65 20 77 68 65  ain database whe
5770: 6e 20 6f 70 65 6e 69 6e 67 20 61 75 78 20 6f 74  n opening aux ot
5780: 68 65 72 77 69 73 65 20 30 20 2a 2f 0a 20 20 63  herwise 0 */.  c
5790: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
57a0: 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  name,    /* Name
57b0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
57c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
57d0: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
57e0: 69 6e 74 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c 2c  int omitJournal,
57f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20            /* if 
5800: 54 52 55 45 20 74 68 65 6e 20 64 6f 20 6e 6f 74  TRUE then do not
5810: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 66 69   journal this fi
5820: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 61 63  le */.  int nCac
5830: 68 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  he,             
5840: 20 20 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 70 61    /* How many pa
5850: 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
5860: 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 76  cache */.  int v
5870: 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
5880: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
5890: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
58a0: 76 66 73 4f 70 65 6e 20 2a 2f 0a 20 20 42 74 72  vfsOpen */.  Btr
58b0: 65 65 20 2a 2a 70 70 42 74 72 65 65 20 20 20 20  ee **ppBtree    
58c0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
58d0: 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
58e0: 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
58f0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62  re */.){.  int b
5900: 74 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 69 6e  tFlags = 0;.  in
5910: 74 20 72 63 3b 0a 20 20 0a 20 20 61 73 73 65 72  t rc;.  .  asser
5920: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5930: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
5940: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70   );.  assert( pp
5950: 42 74 72 65 65 20 21 3d 20 30 29 3b 0a 20 20 69  Btree != 0);.  i
5960: 66 28 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c 20 29  f( omitJournal )
5970: 7b 0a 20 20 20 20 62 74 46 6c 61 67 73 20 7c 3d  {.    btFlags |=
5980: 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
5990: 4e 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  NAL;.  }.  if( d
59a0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
59b0: 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  E_NoReadlock ){.
59c0: 20 20 20 20 62 74 46 6c 61 67 73 20 7c 3d 20 42      btFlags |= B
59d0: 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  TREE_NO_READLOCK
59e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c  ;.  }.  if( zFil
59f0: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 20  ename==0 ){.#if 
5a00: 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20  TEMP_STORE==0.  
5a10: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
5a20: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  */.#endif.#ifnde
5a30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
5a40: 4d 4f 52 59 44 42 0a 23 69 66 20 54 45 4d 50 5f  MORYDB.#if TEMP_
5a50: 53 54 4f 52 45 3d 3d 31 0a 20 20 20 20 69 66 28  STORE==1.    if(
5a60: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d   db->temp_store=
5a70: 3d 32 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  =2 ) zFilename =
5a80: 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65 6e   ":memory:";.#en
5a90: 64 69 66 0a 23 69 66 20 54 45 4d 50 5f 53 54 4f  dif.#if TEMP_STO
5aa0: 52 45 3d 3d 32 0a 20 20 20 20 69 66 28 20 64 62  RE==2.    if( db
5ab0: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20  ->temp_store!=1 
5ac0: 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 3a  ) zFilename = ":
5ad0: 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65 6e 64 69 66  memory:";.#endif
5ae0: 0a 23 69 66 20 54 45 4d 50 5f 53 54 4f 52 45 3d  .#if TEMP_STORE=
5af0: 3d 33 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  =3.    zFilename
5b00: 20 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23   = ":memory:";.#
5b10: 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20  endif.#endif /* 
5b20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
5b30: 52 59 44 42 20 2a 2f 0a 20 20 7d 0a 0a 20 20 69  RYDB */.  }..  i
5b40: 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  f( (vfsFlags & S
5b50: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
5b60: 44 42 29 21 3d 30 20 26 26 20 28 7a 46 69 6c 65  DB)!=0 && (zFile
5b70: 6e 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 6c  name==0 || *zFil
5b80: 65 6e 61 6d 65 3d 3d 30 29 20 29 7b 0a 20 20 20  ename==0) ){.   
5b90: 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
5ba0: 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
5bb0: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
5bc0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
5bd0: 5f 44 42 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _DB;.  }.  rc = 
5be0: 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
5bf0: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 73 71 6c  (zFilename, (sql
5c00: 69 74 65 33 20 2a 29 64 62 2c 20 70 70 42 74 72  ite3 *)db, ppBtr
5c10: 65 65 2c 20 62 74 46 6c 61 67 73 2c 20 76 66 73  ee, btFlags, vfs
5c20: 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  Flags);.  if( rc
5c30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5c40: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
5c50: 65 74 43 61 63 68 65 53 69 7a 65 28 2a 70 70 42  etCacheSize(*ppB
5c60: 74 72 65 65 2c 20 6e 43 61 63 68 65 29 3b 0a 20  tree, nCache);. 
5c70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
5c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5c90: 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e  UTF-8 encoded En
5ca0: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
5cb0: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
5cc0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
5cd0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
5ce0: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65   char *sqlite3_e
5cf0: 72 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64  rrmsg(sqlite3 *d
5d00: 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b){.  const char
5d10: 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29   *z;.  if( !db )
5d20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
5d30: 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
5d40: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20  E_NOMEM);.  }.  
5d50: 69 66 28 20 73 71 6c 69 74 65 33 53 61 66 65 74  if( sqlite3Safet
5d60: 79 43 68 65 63 6b 28 64 62 29 20 7c 7c 20 64 62  yCheck(db) || db
5d70: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
5d80: 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20 20 20  E_MISUSE ){.    
5d90: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
5da0: 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55  rStr(SQLITE_MISU
5db0: 53 45 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  SE);.  }.  sqlit
5dc0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
5dd0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
5de0: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
5df0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 20 3d 20  Failed );.  z = 
5e00: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
5e10: 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45  alue_text(db->pE
5e20: 72 72 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  rr);.  if( z==0 
5e30: 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  ){.    z = sqlit
5e40: 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72  e3ErrStr(db->err
5e50: 43 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Code);.  }.  sql
5e60: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
5e70: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
5e80: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e  eturn z;.}..#ifn
5e90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5ea0: 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75  UTF16./*.** Retu
5eb0: 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65  rn UTF-16 encode
5ec0: 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
5ed0: 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ge explanation o
5ee0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
5ef0: 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  t.** error..*/.c
5f00: 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
5f10: 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69  e3_errmsg16(sqli
5f20: 74 65 33 20 2a 64 62 29 7b 0a 20 20 2f 2a 20 42  te3 *db){.  /* B
5f30: 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 63  ecause all the c
5f40: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
5f50: 20 73 74 72 69 6e 67 20 61 72 65 20 69 6e 20 74   string are in t
5f60: 68 65 20 75 6e 69 63 6f 64 65 0a 20 20 2a 2a 20  he unicode.  ** 
5f70: 72 61 6e 67 65 20 30 78 30 30 2d 30 78 46 46 2c  range 0x00-0xFF,
5f80: 20 69 66 20 77 65 20 70 61 64 20 74 68 65 20 62   if we pad the b
5f90: 69 67 2d 65 6e 64 69 61 6e 20 73 74 72 69 6e 67  ig-endian string
5fa0: 20 77 69 74 68 20 61 20 0a 20 20 2a 2a 20 7a 65   with a .  ** ze
5fb0: 72 6f 20 62 79 74 65 2c 20 77 65 20 63 61 6e 20  ro byte, we can 
5fc0: 6f 62 74 61 69 6e 20 74 68 65 20 6c 69 74 74 6c  obtain the littl
5fd0: 65 2d 65 6e 64 69 61 6e 20 73 74 72 69 6e 67 20  e-endian string 
5fe0: 77 69 74 68 0a 20 20 2a 2a 20 26 62 69 67 5f 65  with.  ** &big_e
5ff0: 6e 64 69 61 6e 5b 31 5d 2e 0a 20 20 2a 2f 0a 20  ndian[1]..  */. 
6000: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
6010: 61 72 20 6f 75 74 4f 66 4d 65 6d 42 65 5b 5d 20  ar outOfMemBe[] 
6020: 3d 20 7b 0a 20 20 20 20 30 2c 20 27 6f 27 2c 20  = {.    0, 'o', 
6030: 30 2c 20 27 75 27 2c 20 30 2c 20 27 74 27 2c 20  0, 'u', 0, 't', 
6040: 30 2c 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20  0, ' ', .    0, 
6050: 27 6f 27 2c 20 30 2c 20 27 66 27 2c 20 30 2c 20  'o', 0, 'f', 0, 
6060: 27 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 6d 27  ' ', .    0, 'm'
6070: 2c 20 30 2c 20 27 65 27 2c 20 30 2c 20 27 6d 27  , 0, 'e', 0, 'm'
6080: 2c 20 30 2c 20 27 6f 27 2c 20 30 2c 20 27 72 27  , 0, 'o', 0, 'r'
6090: 2c 20 30 2c 20 27 79 27 2c 20 30 2c 20 30 2c 20  , 0, 'y', 0, 0, 
60a0: 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  0.  };.  static 
60b0: 63 6f 6e 73 74 20 63 68 61 72 20 6d 69 73 75 73  const char misus
60c0: 65 42 65 20 5b 5d 20 3d 20 7b 0a 20 20 20 20 30  eBe [] = {.    0
60d0: 2c 20 27 6c 27 2c 20 30 2c 20 27 69 27 2c 20 30  , 'l', 0, 'i', 0
60e0: 2c 20 27 62 27 2c 20 30 2c 20 27 72 27 2c 20 30  , 'b', 0, 'r', 0
60f0: 2c 20 27 61 27 2c 20 30 2c 20 27 72 27 2c 20 30  , 'a', 0, 'r', 0
6100: 2c 20 27 79 27 2c 20 30 2c 20 27 20 27 2c 20 0a  , 'y', 0, ' ', .
6110: 20 20 20 20 30 2c 20 27 72 27 2c 20 30 2c 20 27      0, 'r', 0, '
6120: 6f 27 2c 20 30 2c 20 27 75 27 2c 20 30 2c 20 27  o', 0, 'u', 0, '
6130: 74 27 2c 20 30 2c 20 27 69 27 2c 20 30 2c 20 27  t', 0, 'i', 0, '
6140: 6e 27 2c 20 30 2c 20 27 65 27 2c 20 30 2c 20 27  n', 0, 'e', 0, '
6150: 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 63 27 2c   ', .    0, 'c',
6160: 20 30 2c 20 27 61 27 2c 20 30 2c 20 27 6c 27 2c   0, 'a', 0, 'l',
6170: 20 30 2c 20 27 6c 27 2c 20 30 2c 20 27 65 27 2c   0, 'l', 0, 'e',
6180: 20 30 2c 20 27 64 27 2c 20 30 2c 20 27 20 27 2c   0, 'd', 0, ' ',
6190: 20 0a 20 20 20 20 30 2c 20 27 6f 27 2c 20 30 2c   .    0, 'o', 0,
61a0: 20 27 75 27 2c 20 30 2c 20 27 74 27 2c 20 30 2c   'u', 0, 't', 0,
61b0: 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 6f   ' ', .    0, 'o
61c0: 27 2c 20 30 2c 20 27 66 27 2c 20 30 2c 20 27 20  ', 0, 'f', 0, ' 
61d0: 27 2c 20 0a 20 20 20 20 30 2c 20 27 73 27 2c 20  ', .    0, 's', 
61e0: 30 2c 20 27 65 27 2c 20 30 2c 20 27 71 27 2c 20  0, 'e', 0, 'q', 
61f0: 30 2c 20 27 75 27 2c 20 30 2c 20 27 65 27 2c 20  0, 'u', 0, 'e', 
6200: 30 2c 20 27 6e 27 2c 20 30 2c 20 27 63 27 2c 20  0, 'n', 0, 'c', 
6210: 30 2c 20 27 65 27 2c 20 30 2c 20 30 2c 20 30 0a  0, 'e', 0, 0, 0.
6220: 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f    };..  const vo
6230: 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62  id *z;.  if( !db
6240: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
6250: 76 6f 69 64 20 2a 29 28 26 6f 75 74 4f 66 4d 65  void *)(&outOfMe
6260: 6d 42 65 5b 53 51 4c 49 54 45 5f 55 54 46 31 36  mBe[SQLITE_UTF16
6270: 4e 41 54 49 56 45 3d 3d 53 51 4c 49 54 45 5f 55  NATIVE==SQLITE_U
6280: 54 46 31 36 4c 45 3f 31 3a 30 5d 29 3b 0a 20 20  TF16LE?1:0]);.  
6290: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  }.  if( sqlite3S
62a0: 61 66 65 74 79 43 68 65 63 6b 28 64 62 29 20 7c  afetyCheck(db) |
62b0: 7c 20 64 62 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  | db->errCode==S
62c0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a  QLITE_MISUSE ){.
62d0: 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64      return (void
62e0: 20 2a 29 28 26 6d 69 73 75 73 65 42 65 5b 53 51   *)(&misuseBe[SQ
62f0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
6300: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
6310: 3f 31 3a 30 5d 29 3b 0a 20 20 7d 0a 20 20 73 71  ?1:0]);.  }.  sq
6320: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6330: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
6340: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
6350: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
6360: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6370: 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72  _text16(db->pErr
6380: 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  );.  if( z==0 ){
6390: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
63a0: 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
63b0: 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 45 72 72  , -1, sqlite3Err
63c0: 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29  Str(db->errCode)
63d0: 2c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  ,.         SQLIT
63e0: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
63f0: 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 20 3d 20  TATIC);.    z = 
6400: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6410: 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a  xt16(db->pErr);.
6420: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 41 70 69    }.  sqlite3Api
6430: 45 78 69 74 28 30 2c 20 30 29 3b 0a 20 20 73 71  Exit(0, 0);.  sq
6440: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
6450: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
6460: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64  return z;.}.#end
6470: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
6480: 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
6490: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * Return the mos
64a0: 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63  t recent error c
64b0: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
64c0: 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69   an SQLite routi
64d0: 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a  ne. If NULL is.*
64e0: 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  * passed to this
64f0: 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73   function, we as
6500: 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20  sume a malloc() 
6510: 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71  failed during sq
6520: 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f  lite3_open()..*/
6530: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72  .int sqlite3_err
6540: 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  code(sqlite3 *db
6550: 29 7b 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20  ){.  if( !db || 
6560: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6570: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
6580: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
6590: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 61  .  if( sqlite3Sa
65a0: 66 65 74 79 43 68 65 63 6b 28 64 62 29 20 29 7b  fetyCheck(db) ){
65b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
65c0: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
65d0: 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
65e0: 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  ode & db->errMas
65f0: 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  k;.}../*.** Crea
6600: 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  te a new collati
6610: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ng function for 
6620: 64 61 74 61 62 61 73 65 20 22 64 62 22 2e 20 20  database "db".  
6630: 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d  The name is zNam
6640: 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63  e.** and the enc
6650: 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f  oding is enc..*/
6660: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61  .static int crea
6670: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73  teCollation(.  s
6680: 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
6690: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
66a0: 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
66b0: 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
66c0: 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
66d0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
66e0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
66f0: 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  id*),.  void(*xD
6700: 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
6710: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
6720: 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 0a 20    int enc2;.  . 
6730: 20 69 66 28 20 73 71 6c 69 74 65 33 53 61 66 65   if( sqlite3Safe
6740: 74 79 43 68 65 63 6b 28 64 62 29 20 29 7b 0a 20  tyCheck(db) ){. 
6750: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6760: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 61  _MISUSE;.  }.  a
6770: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6780: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
6790: 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
67a0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
67b0: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
67c0: 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
67d0: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
67e0: 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
67f0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
6800: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
6810: 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
6820: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
6830: 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
6840: 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
6850: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
6860: 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 20  */.  enc2 = enc 
6870: 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  & ~SQLITE_UTF16_
6880: 41 4c 49 47 4e 45 44 3b 0a 20 20 69 66 28 20 65  ALIGNED;.  if( e
6890: 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
68a0: 36 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20  6 ){.    enc2 = 
68b0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
68c0: 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 28  VE;.  }..  if( (
68d0: 65 6e 63 32 26 7e 33 29 21 3d 30 20 29 7b 0a 20  enc2&~3)!=0 ){. 
68e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
68f0: 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  db, SQLITE_ERROR
6900: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 65 6e 63 6f 64  , "unknown encod
6910: 69 6e 67 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ing");.    retur
6920: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
6930: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
6940: 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  if this call is 
6950: 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c  removing or repl
6960: 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  acing an existin
6970: 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a  g collation .  *
6980: 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73  * sequence. If s
6990: 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  o, and there are
69a0: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74   active VMs, ret
69b0: 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65  urn busy. If the
69c0: 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61  re.  ** are no a
69d0: 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c  ctive VMs, inval
69e0: 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f  idate any pre-co
69f0: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
6a00: 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20  s..  */.  pColl 
6a10: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
6a20: 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
6a30: 32 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  2, zName, strlen
6a40: 28 7a 4e 61 6d 65 29 2c 20 30 29 3b 0a 20 20 69  (zName), 0);.  i
6a50: 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
6a60: 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69  l->xCmp ){.    i
6a70: 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  f( db->activeVdb
6a80: 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  eCnt ){.      sq
6a90: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
6aa0: 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
6ab0: 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20       "Unable to 
6ac0: 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f  delete/modify co
6ad0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
6ae0: 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73   due to active s
6af0: 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
6b00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6b10: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
6b20: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
6b30: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
6b40: 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  (db);..    /* If
6b50: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
6b60: 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72  nce pColl was cr
6b70: 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62  eated directly b
6b80: 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  y a call to.    
6b90: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ** sqlite3_creat
6ba0: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64  e_collation, and
6bb0: 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62   not generated b
6bc0: 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
6bd0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e  ,.    ** then an
6be0: 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79  y copies made by
6bf0: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20   synthCollSeq() 
6c00: 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  need to be inval
6c10: 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41  idated..    ** A
6c20: 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64  lso, collation d
6c30: 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c  estructor - Coll
6c40: 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e  Seq.xDel() - fun
6c50: 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20  ction may need. 
6c60: 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c     ** to be call
6c70: 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  ed..    */ .    
6c80: 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20  if( (pColl->enc 
6c90: 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  & ~SQLITE_UTF16_
6ca0: 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29  ALIGNED)==enc2 )
6cb0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
6cc0: 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *aColl = sqlite3
6cd0: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43  HashFind(&db->aC
6ce0: 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 73  ollSeq, zName, s
6cf0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20  trlen(zName));. 
6d00: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
6d10: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
6d20: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
6d30: 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c  llSeq *p = &aCol
6d40: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
6d50: 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  ( p->enc==pColl-
6d60: 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  >enc ){.        
6d70: 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b    if( p->xDel ){
6d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
6d90: 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a  xDel(p->pUser);.
6da0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6db0: 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20        p->xCmp = 
6dc0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
6dd0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
6de0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
6df0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
6e00: 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
6e10: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2c  , strlen(zName),
6e20: 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   1);.  if( pColl
6e30: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 78   ){.    pColl->x
6e40: 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a  Cmp = xCompare;.
6e50: 20 20 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72      pColl->pUser
6e60: 20 3d 20 70 43 74 78 3b 0a 20 20 20 20 70 43 6f   = pCtx;.    pCo
6e70: 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b  ll->xDel = xDel;
6e80: 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20  .    pColl->enc 
6e90: 3d 20 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20  = enc2 | (enc & 
6ea0: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
6eb0: 47 4e 45 44 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  GNED);.  }.  sql
6ec0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
6ed0: 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72  LITE_OK, 0);.  r
6ee0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6ef0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
6f00: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
6f10: 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67   work of opening
6f20: 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62   a database on b
6f30: 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69  ehalf of.** sqli
6f40: 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73  te3_open() and s
6f50: 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e  qlite3_open16().
6f60: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
6f70: 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d  lename "zFilenam
6f80: 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38  e"  .** is UTF-8
6f90: 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61   encoded..*/.sta
6fa0: 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61  tic int openData
6fb0: 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  base(.  const ch
6fc0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f  ar *zFilename, /
6fd0: 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
6fe0: 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  ame UTF-8 encode
6ff0: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
7000: 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a  *ppDb,        /*
7010: 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64   OUT: Returned d
7020: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
7030: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 6c 61  /.  unsigned fla
7040: 67 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  gs,        /* Op
7050: 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20  erational flags 
7060: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7070: 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e  *zVfs       /* N
7080: 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74  ame of the VFS t
7090: 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71  o use */.){.  sq
70a0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
70b0: 20 72 63 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a   rc;.  CollSeq *
70c0: 70 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  pColl;..  /* All
70d0: 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  ocate the sqlite
70e0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
70f0: 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65  */.  db = sqlite
7100: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
7110: 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a  eof(sqlite3) );.
7120: 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f    if( db==0 ) go
7130: 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
7140: 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c   db->mutex = sql
7150: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
7160: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
7170: 43 55 52 53 49 56 45 29 3b 0a 20 20 69 66 28 20  CURSIVE);.  if( 
7180: 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  db->mutex==0 ){.
7190: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
71a0: 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30  (db);.    db = 0
71b0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  ;.    goto opend
71c0: 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  b_out;.  }.  sql
71d0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
71e0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
71f0: 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66  b->errMask = 0xf
7200: 66 3b 0a 20 20 64 62 2d 3e 70 72 69 6f 72 4e 65  f;.  db->priorNe
7210: 77 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 64 62  wRowid = 0;.  db
7220: 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d  ->nDb = 2;.  db-
7230: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
7240: 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62  MAGIC_BUSY;.  db
7250: 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
7260: 74 61 74 69 63 3b 0a 20 20 64 62 2d 3e 61 75 74  tatic;.  db->aut
7270: 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64  oCommit = 1;.  d
7280: 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d  b->nextAutovac =
7290: 20 2d 31 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73   -1;.  db->flags
72a0: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
72b0: 43 6f 6c 4e 61 6d 65 73 0a 23 69 66 20 53 51 4c  ColNames.#if SQL
72c0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
72d0: 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20  _FORMAT<4.      
72e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
72f0: 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d  ITE_LegacyFileFm
7300: 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  t.#endif.#ifdef 
7310: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
7320: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
7340: 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e  SQLITE_LoadExten
7350: 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 20 20 20 20  sion.#endif.    
7360: 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73    ;.  sqlite3Has
7370: 68 49 6e 69 74 28 26 64 62 2d 3e 61 46 75 6e 63  hInit(&db->aFunc
7380: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
7390: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 73 71 6c 69  RING, 0);.  sqli
73a0: 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
73b0: 3e 61 43 6f 6c 6c 53 65 71 2c 20 53 51 4c 49 54  >aCollSeq, SQLIT
73c0: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
73d0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
73e0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
73f0: 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73  BLE.  sqlite3Has
7400: 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75  hInit(&db->aModu
7410: 6c 65 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f  le, SQLITE_HASH_
7420: 53 54 52 49 4e 47 2c 20 30 29 3b 0a 23 65 6e 64  STRING, 0);.#end
7430: 69 66 0a 0a 20 20 64 62 2d 3e 70 56 66 73 20 3d  if..  db->pVfs =
7440: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
7450: 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 21  d(zVfs);.  if( !
7460: 64 62 2d 3e 70 56 66 73 20 29 7b 0a 20 20 20 20  db->pVfs ){.    
7470: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
7480: 52 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  R;.    db->magic
7490: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
74a0: 43 4c 4f 53 45 44 3b 0a 20 20 20 20 73 71 6c 69  CLOSED;.    sqli
74b0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c  te3Error(db, rc,
74c0: 20 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25   "no such vfs: %
74d0: 73 22 2c 20 28 7a 56 66 73 3f 7a 56 66 73 3a 22  s", (zVfs?zVfs:"
74e0: 28 6e 75 6c 6c 29 22 29 29 3b 0a 20 20 20 20 67  (null)"));.    g
74f0: 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
7500: 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
7510: 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
7520: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e  ion sequence BIN
7530: 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b  ARY. BINARY work
7540: 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38  s for both UTF-8
7550: 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36  .  ** and UTF-16
7560: 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72 73 69  , so add a versi
7570: 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61  on for each to a
7580: 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73  void any unneces
7590: 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72  sary.  ** conver
75a0: 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20  sions. The only 
75b0: 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f  error that can o
75c0: 63 63 75 72 20 68 65 72 65 20 69 73 20 61 20 6d  ccur here is a m
75d0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e  alloc() failure.
75e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 72 65 61  .  */.  if( crea
75f0: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
7600: 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
7610: 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c  _UTF8, 0, binCol
7620: 6c 46 75 6e 63 2c 20 30 29 20 7c 7c 0a 20 20 20  lFunc, 0) ||.   
7630: 20 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69     createCollati
7640: 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c  on(db, "BINARY",
7650: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c   SQLITE_UTF16BE,
7660: 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
7670: 20 30 29 20 7c 7c 0a 20 20 20 20 20 20 63 72 65   0) ||.      cre
7680: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
7690: 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
76a0: 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69  E_UTF16LE, 0, bi
76b0: 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 20 7c 7c  nCollFunc, 0) ||
76c0: 0a 20 20 20 20 20 20 63 72 65 61 74 65 43 6f 6c  .      createCol
76d0: 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49  lation(db, "RTRI
76e0: 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  M", SQLITE_UTF8,
76f0: 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f   (void*)1, binCo
7700: 6c 6c 46 75 6e 63 2c 20 30 29 20 7c 7c 0a 20 20  llFunc, 0) ||.  
7710: 20 20 20 20 28 64 62 2d 3e 70 44 66 6c 74 43 6f      (db->pDfltCo
7720: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
7730: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49  CollSeq(db, SQLI
7740: 54 45 5f 55 54 46 38 2c 20 22 42 49 4e 41 52 59  TE_UTF8, "BINARY
7750: 22 2c 20 36 2c 20 30 29 29 3d 3d 30 20 0a 20 20  ", 6, 0))==0 .  
7760: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
7770: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7780: 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  );.    db->magic
7790: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
77a0: 43 4c 4f 53 45 44 3b 0a 20 20 20 20 67 6f 74 6f  CLOSED;.    goto
77b0: 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
77c0: 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20  ..  /* Also add 
77d0: 61 20 55 54 46 2d 38 20 63 61 73 65 2d 69 6e 73  a UTF-8 case-ins
77e0: 65 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61 74 69  ensitive collati
77f0: 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a  on sequence. */.
7800: 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
7810: 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20  n(db, "NOCASE", 
7820: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
7830: 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46  nocaseCollatingF
7840: 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 53  unc, 0);..  /* S
7850: 65 74 20 66 6c 61 67 73 20 6f 6e 20 74 68 65 20  et flags on the 
7860: 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
7870: 6e 67 20 73 65 71 75 65 6e 63 65 73 20 2a 2f 0a  ng sequences */.
7880: 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d    db->pDfltColl-
7890: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 43  >type = SQLITE_C
78a0: 4f 4c 4c 5f 42 49 4e 41 52 59 3b 0a 20 20 70 43  OLL_BINARY;.  pC
78b0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
78c0: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c  dCollSeq(db, SQL
78d0: 49 54 45 5f 55 54 46 38 2c 20 22 4e 4f 43 41 53  ITE_UTF8, "NOCAS
78e0: 45 22 2c 20 36 2c 20 30 29 3b 0a 20 20 69 66 28  E", 6, 0);.  if(
78f0: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43   pColl ){.    pC
7900: 6f 6c 6c 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  oll->type = SQLI
7910: 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 3b 0a  TE_COLL_NOCASE;.
7920: 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74    }..  /* Open t
7930: 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62  he backend datab
7940: 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20  ase driver */.  
7950: 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  db->openFlags = 
7960: 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71  flags;.  rc = sq
7970: 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72  lite3BtreeFactor
7980: 79 28 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  y(db, zFilename,
7990: 20 30 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55   0, SQLITE_DEFAU
79a0: 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20 0a  LT_CACHE_SIZE, .
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79c0: 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73             flags
79d0: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   | SQLITE_OPEN_M
79e0: 41 49 4e 5f 44 42 2c 0a 20 20 20 20 20 20 20 20  AIN_DB,.        
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70     &db->aDb[0].p
7a10: 42 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  Bt);.  if( rc!=S
7a20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7a30: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
7a40: 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 64 62 2d   rc, 0);.    db-
7a50: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
7a60: 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
7a70: 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
7a80: 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62  t;.  }.  db->aDb
7a90: 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71  [0].pSchema = sq
7aa0: 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
7ab0: 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  b, db->aDb[0].pB
7ac0: 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  t);.  db->aDb[1]
7ad0: 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  .pSchema = sqlit
7ae0: 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
7af0: 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 64  0);...  /* The d
7b00: 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65  efault safety_le
7b10: 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  vel for the main
7b20: 20 64 61 74 61 62 61 73 65 20 69 73 20 27 66 75   database is 'fu
7b30: 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65 6d  ll'; for the tem
7b40: 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  p.  ** database 
7b50: 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68  it is 'NONE'. Th
7b60: 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 70  is matches the p
7b70: 61 67 65 72 20 6c 61 79 65 72 20 64 65 66 61 75  ager layer defau
7b80: 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62  lts.  .  */.  db
7b90: 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d  ->aDb[0].zName =
7ba0: 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61   "main";.  db->a
7bb0: 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[0].safety_lev
7bc0: 65 6c 20 3d 20 33 3b 0a 23 69 66 6e 64 65 66 20  el = 3;.#ifndef 
7bd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
7be0: 44 42 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  DB.  db->aDb[1].
7bf0: 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a  zName = "temp";.
7c00: 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66    db->aDb[1].saf
7c10: 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 23  ety_level = 1;.#
7c20: 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67  endif..  db->mag
7c30: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
7c40: 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64 62  C_OPEN;.  if( db
7c50: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7c60: 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  {.    goto opend
7c70: 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b_out;.  }..  /*
7c80: 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75   Register all bu
7c90: 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73  ilt-in functions
7ca0: 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74 74  , but do not att
7cb0: 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68 65  empt to read the
7cc0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73  .  ** database s
7cd0: 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73 20  chema yet. This 
7ce0: 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c  is delayed until
7cf0: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
7d00: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
7d10: 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a 20  * is accessed.. 
7d20: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72 72   */.  sqlite3Err
7d30: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
7d40: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  , 0);.  sqlite3R
7d50: 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75  egisterBuiltinFu
7d60: 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20  nctions(db);..  
7d70: 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69  /* Load automati
7d80: 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65  c extensions - e
7d90: 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68  xtensions that h
7da0: 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74 65  ave been registe
7db0: 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  red.  ** using t
7dc0: 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d  he sqlite3_autom
7dd0: 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29  atic_extension()
7de0: 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f   API..  */.  (vo
7df0: 69 64 29 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f  id)sqlite3AutoLo
7e00: 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  adExtensions(db)
7e10: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
7e20: 65 72 72 63 6f 64 65 28 64 62 29 21 3d 53 51 4c  errcode(db)!=SQL
7e30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
7e40: 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
7e50: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
7e60: 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20  E_ENABLE_FTS1.  
7e70: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
7e80: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74  ailed ){.    ext
7e90: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46  ern int sqlite3F
7ea0: 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a  ts1Init(sqlite3*
7eb0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
7ec0: 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b  te3Fts1Init(db);
7ed0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
7ee0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
7ef0: 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64 62  E_FTS2.  if( !db
7f00: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
7f10: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
7f20: 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ){.    extern in
7f30: 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69  t sqlite3Fts2Ini
7f40: 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  t(sqlite3*);.   
7f50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
7f60: 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  2Init(db);.  }.#
7f70: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
7f80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
7f90: 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
7fa0: 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
7fb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7fc0: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
7fd0: 74 65 33 46 74 73 33 49 6e 69 74 28 73 71 6c 69  te3Fts3Init(sqli
7fe0: 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  te3*);.    rc = 
7ff0: 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28  sqlite3Fts3Init(
8000: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
8010: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8020: 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20  NABLE_ICU.  if( 
8030: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
8040: 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
8050: 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  OK ){.    extern
8060: 20 69 6e 74 20 73 71 6c 69 74 65 33 49 63 75 49   int sqlite3IcuI
8070: 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  nit(sqlite3*);. 
8080: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49     rc = sqlite3I
8090: 63 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  cuInit(db);.  }.
80a0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
80b0: 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
80c0: 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45  ;..  /* -DSQLITE
80d0: 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
80e0: 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58  _MODE=1 makes EX
80f0: 43 4c 55 53 49 56 45 20 74 68 65 20 64 65 66 61  CLUSIVE the defa
8100: 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a  ult locking.  **
8110: 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45   mode.  -DSQLITE
8120: 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
8130: 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52  _MODE=0 make NOR
8140: 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20  MAL the default 
8150: 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64  locking.  ** mod
8160: 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e  e.  Doing nothin
8170: 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61  g at all also ma
8180: 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64  kes NORMAL the d
8190: 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66  efault..  */.#if
81a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
81b0: 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a  LT_LOCKING_MODE.
81c0: 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f    db->dfltLockMo
81d0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  de = SQLITE_DEFA
81e0: 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
81f0: 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
8200: 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69  LockingMode(sqli
8210: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62  te3BtreePager(db
8220: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20  ->aDb[0].pBt),. 
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8240: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
8250: 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
8260: 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 6f  MODE);.#endif..o
8270: 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66 28  pendb_out:.  if(
8280: 20 64 62 20 26 26 20 64 62 2d 3e 6d 75 74 65 78   db && db->mutex
8290: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
82a0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
82b0: 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 69 66  mutex);.  }.  if
82c0: 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d  ( SQLITE_NOMEM==
82d0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72  (rc = sqlite3_er
82e0: 72 63 6f 64 65 28 64 62 29 29 20 29 7b 0a 20 20  rcode(db)) ){.  
82f0: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
8300: 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b  db);.    db = 0;
8310: 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64  .  }.  *ppDb = d
8320: 62 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  b;.  return sqli
8330: 74 65 33 41 70 69 45 78 69 74 28 30 2c 20 72 63  te3ApiExit(0, rc
8340: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
8350: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
8360: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
8370: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63  qlite3_open(.  c
8380: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
8390: 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33  name, .  sqlite3
83a0: 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72 65   **ppDb .){.  re
83b0: 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73  turn openDatabas
83c0: 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44  e(zFilename, ppD
83d0: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
83e0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
83f0: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
8400: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
8410: 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  ATE, 0);.}.int s
8420: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a  qlite3_open_v2(.
8430: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
8440: 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74  lename,   /* Dat
8450: 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 28  abase filename (
8460: 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69  UTF-8) */.  sqli
8470: 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20  te3 **ppDb,     
8480: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69      /* OUT: SQLi
8490: 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a  te db handle */.
84a0: 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
84b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
84c0: 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  gs */.  const ch
84d0: 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 20  ar *zVfs        
84e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d  /* Name of VFS m
84f0: 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a  odule to use */.
8500: 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e  ){.  return open
8510: 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e 61 6d  Database(filenam
8520: 65 2c 20 70 70 44 62 2c 20 66 6c 61 67 73 2c 20  e, ppDb, flags, 
8530: 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  zVfs);.}..#ifnde
8540: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
8550: 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  F16./*.** Open a
8560: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61   new database ha
8570: 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
8580: 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63  ite3_open16(.  c
8590: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65  onst void *zFile
85a0: 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33  name, .  sqlite3
85b0: 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61   **ppDb.){.  cha
85c0: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61  r const *zFilena
85d0: 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e  me8;   /* zFilen
85e0: 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55  ame encoded in U
85f0: 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20  TF-8 instead of 
8600: 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69  UTF-16 */.  sqli
8610: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
8620: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8630: 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73  TE_NOMEM;..  ass
8640: 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29  ert( zFilename )
8650: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70 44 62  ;.  assert( ppDb
8660: 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b   );.  *ppDb = 0;
8670: 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
8680: 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
8690: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
86a0: 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69  tr(pVal, -1, zFi
86b0: 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55  lename, SQLITE_U
86c0: 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49  TF16NATIVE, SQLI
86d0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46  TE_STATIC);.  zF
86e0: 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74  ilename8 = sqlit
86f0: 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
8700: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
8710: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38    if( zFilename8
8720: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   ){.    rc = ope
8730: 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e  nDatabase(zFilen
8740: 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20  ame8, ppDb,.    
8750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8760: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
8770: 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
8780: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29  _OPEN_CREATE, 0)
8790: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
87a0: 4c 49 54 45 5f 4f 4b 20 26 26 20 2a 70 70 44 62  LITE_OK && *ppDb
87b0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
87c0: 71 6c 69 74 65 33 5f 65 78 65 63 28 2a 70 70 44  qlite3_exec(*ppD
87d0: 62 2c 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64  b, "PRAGMA encod
87e0: 69 6e 67 20 3d 20 27 55 54 46 2d 31 36 27 22 2c  ing = 'UTF-16'",
87f0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
8800: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8810: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
8820: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 2a 70 70 44  lite3_close(*ppD
8830: 62 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 44  b);.        *ppD
8840: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  b = 0;.      }. 
8850: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
8860: 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
8870: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  );..  return sql
8880: 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20 72  ite3ApiExit(0, r
8890: 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  c);.}.#endif /* 
88a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
88b0: 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  6 */../*.** Regi
88c0: 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
88d0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
88e0: 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
88f0: 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
8900: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
8910: 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71  _collation(.  sq
8920: 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
8930: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
8940: 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20   .  int enc, .  
8950: 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
8960: 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
8970: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
8980: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
8990: 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  d*).){.  int rc;
89a0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
89b0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
89c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
89d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
89e0: 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43  ;.  rc = createC
89f0: 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
8a00: 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78  me, enc, pCtx, x
8a10: 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 72  Compare, 0);.  r
8a20: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
8a30: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
8a40: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
8a50: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
8a60: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
8a70: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
8a80: 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
8a90: 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
8aa0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
8ab0: 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
8ac0: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
8ad0: 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
8ae0: 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
8af0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
8b00: 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
8b10: 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
8b20: 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
8b30: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
8b40: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
8b50: 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
8b60: 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
8b70: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
8b80: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
8b90: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
8ba0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8bb0: 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65  );.  rc = create
8bc0: 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
8bd0: 61 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20  ame, enc, pCtx, 
8be0: 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b  xCompare, xDel);
8bf0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
8c00: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
8c10: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
8c20: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
8c30: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
8c40: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8c50: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
8c60: 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
8c70: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
8c80: 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
8c90: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
8ca0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
8cb0: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
8cc0: 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  16(.  sqlite3* d
8cd0: 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
8ce0: 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
8cf0: 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
8d00: 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
8d10: 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
8d20: 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
8d30: 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
8d40: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8d50: 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  _OK;.  char *zNa
8d60: 6d 65 38 3b 20 0a 20 20 73 71 6c 69 74 65 33 5f  me8; .  sqlite3_
8d70: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
8d80: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
8d90: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
8da0: 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20  led );.  zName8 
8db0: 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f  = sqlite3Utf16to
8dc0: 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29  8(db, zName, -1)
8dd0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29  ;.  if( zName8 )
8de0: 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74  {.    rc = creat
8df0: 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
8e00: 4e 61 6d 65 38 2c 20 65 6e 63 2c 20 70 43 74 78  Name8, enc, pCtx
8e10: 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a  , xCompare, 0);.
8e20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8e30: 28 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20  (zName8);.  }.  
8e40: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
8e50: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
8e60: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
8e70: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
8e80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
8e90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8ea0: 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
8eb0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
8ec0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
8ed0: 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
8ee0: 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
8ef0: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
8f00: 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
8f10: 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
8f20: 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
8f30: 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
8f40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
8f50: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28  ollation_needed(
8f60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
8f70: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65  .  void *pCollNe
8f80: 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64  ededArg, .  void
8f90: 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76  (*xCollNeeded)(v
8fa0: 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
8fb0: 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74  t eTextRep,const
8fc0: 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 69 66 28   char*).){.  if(
8fd0: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68   sqlite3SafetyCh
8fe0: 65 63 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  eck(db) ){.    r
8ff0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
9000: 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  USE;.  }.  sqlit
9010: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
9020: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
9030: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78  >xCollNeeded = x
9040: 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62  CollNeeded;.  db
9050: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20  ->xCollNeeded16 
9060: 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c  = 0;.  db->pColl
9070: 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c  NeededArg = pCol
9080: 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71  lNeededArg;.  sq
9090: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
90a0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
90b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
90c0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
90d0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
90e0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
90f0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9100: 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62  ce factory callb
9110: 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74  ack with the dat
9120: 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
9130: 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20  db. Replace any 
9140: 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61  previously insta
9150: 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  lled collation s
9160: 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e  equence factory.
9170: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
9180: 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
9190: 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
91a0: 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c  b, .  void *pCol
91b0: 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76  lNeededArg, .  v
91c0: 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64  oid(*xCollNeeded
91d0: 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65  16)(void*,sqlite
91e0: 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c  3*,int eTextRep,
91f0: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
9200: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 61 66    if( sqlite3Saf
9210: 65 74 79 43 68 65 63 6b 28 64 62 29 20 29 7b 0a  etyCheck(db) ){.
9220: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9230: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
9240: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
9250: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
9260: 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
9270: 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f  d = 0;.  db->xCo
9280: 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f  llNeeded16 = xCo
9290: 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62  llNeeded16;.  db
92a0: 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
92b0: 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72   = pCollNeededAr
92c0: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
92d0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
92e0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
92f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
9300: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
9310: 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64  _UTF16 */..#ifnd
9320: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47  ef SQLITE_OMIT_G
9330: 4c 4f 42 41 4c 52 45 43 4f 56 45 52 0a 2f 2a 0a  LOBALRECOVER./*.
9340: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9350: 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68   is now an anach
9360: 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20  ronism. It used 
9370: 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  to be used to re
9380: 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20  cover from a.** 
9390: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
93a0: 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77  , but SQLite now
93b0: 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d   does this autom
93c0: 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  atically..*/.int
93d0: 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f   sqlite3_global_
93e0: 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20  recover(void){. 
93f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9400: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
9410: 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77  ** Test to see w
9420: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
9430: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
9440: 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f  ction is in auto
9450: 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20  commit.** mode. 
9460: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
9470: 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20  it is and FALSE 
9480: 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d  if not.  Autocom
9490: 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a  mit mode is on.*
94a0: 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41  * by default.  A
94b0: 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73  utocommit is dis
94c0: 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e  abled by a BEGIN
94d0: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
94e0: 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74  eenabled.** by t
94f0: 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f  he next COMMIT o
9500: 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a  r ROLLBACK..**.*
9510: 2a 2a 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20 41  ****** THIS IS A
9520: 4e 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 41  N EXPERIMENTAL A
9530: 50 49 20 41 4e 44 20 49 53 20 53 55 42 4a 45 43  PI AND IS SUBJEC
9540: 54 20 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a 2a  T TO CHANGE ****
9550: 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
9560: 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
9570: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
9580: 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f   return db->auto
9590: 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 23 69 66 64 65  Commit;.}..#ifde
95a0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
95b0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
95c0: 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 73 75  ng routine is su
95d0: 62 74 69 74 75 74 65 64 20 66 6f 72 20 63 6f 6e  btituted for con
95e0: 73 74 61 6e 74 20 53 51 4c 49 54 45 5f 43 4f 52  stant SQLITE_COR
95f0: 52 55 50 54 20 69 6e 0a 2a 2a 20 64 65 62 75 67  RUPT in.** debug
9600: 67 69 6e 67 20 62 75 69 6c 64 73 2e 20 20 54 68  ging builds.  Th
9610: 69 73 20 70 72 6f 76 69 64 65 73 20 61 20 77 61  is provides a wa
9620: 79 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  y to set a break
9630: 70 6f 69 6e 74 20 66 6f 72 20 77 68 65 6e 0a 2a  point for when.*
9640: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  * corruption is 
9650: 66 69 72 73 74 20 64 65 74 65 63 74 65 64 2e 0a  first detected..
9660: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  */.int sqlite3Co
9670: 72 72 75 70 74 28 76 6f 69 64 29 7b 0a 20 20 72  rrupt(void){.  r
9680: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9690: 52 55 50 54 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  RUPT;.}.#endif..
96a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
96b0: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74  convenience rout
96c0: 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73  ine that makes s
96d0: 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72  ure that all thr
96e0: 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  ead-specific.** 
96f0: 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68  data for this th
9700: 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65  read has been de
9710: 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
9720: 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65   SQLite no longe
9730: 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70  r uses thread-sp
9740: 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74  ecific data so t
9750: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
9760: 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20  ow a.** no-op.  
9770: 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66  It is retained f
9780: 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f  or historical co
9790: 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a  mpatibility..*/.
97a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72  void sqlite3_thr
97b0: 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64  ead_cleanup(void
97c0: 29 7b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ){.}../*.** Retu
97d0: 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  rn meta informat
97e0: 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63  ion about a spec
97f0: 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  ific column of a
9800: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
9810: 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20  .** See comment 
9820: 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71  in sqlite3.h (sq
9830: 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64  lite.h.in) for d
9840: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65  etails..*/.#ifde
9850: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
9860: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
9870: 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  int sqlite3_tabl
9880: 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
9890: 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  a(.  sqlite3 *db
98a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
98b0: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
98c0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
98d0: 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20   char *zDbName, 
98e0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
98f0: 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20  se name or NULL 
9900: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
9910: 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20  *zTableName,    
9920: 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a   /* Table name *
9930: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
9940: 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20  zColumnName,    
9950: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
9960: 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
9970: 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20  *pzDataType,    
9980: 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61  /* OUTPUT: Decla
9990: 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f  red data type */
99a0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
99b0: 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f  pzCollSeq,     /
99c0: 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74  * OUTPUT: Collat
99d0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
99e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74  e */.  int *pNot
99f0: 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Null,           
9a00: 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
9a10: 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63  ue if NOT NULL c
9a20: 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73  onstraint exists
9a30: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d   */.  int *pPrim
9a40: 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20  aryKey,         
9a50: 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
9a60: 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74  e if column part
9a70: 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20   of PK */.  int 
9a80: 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20  *pAutoinc       
9a90: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
9aa0: 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
9ab0: 73 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d  s is auto-increm
9ac0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
9ad0: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
9ae0: 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65  Msg = 0;.  Table
9af0: 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f   *pTab = 0;.  Co
9b00: 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a  lumn *pCol = 0;.
9b10: 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63    int iCol;..  c
9b20: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61  har const *zData
9b30: 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72  Type = 0;.  char
9b40: 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71   const *zCollSeq
9b50: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e   = 0;.  int notn
9b60: 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70  ull = 0;.  int p
9b70: 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20  rimarykey = 0;. 
9b80: 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30   int autoinc = 0
9b90: 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74  ;..  /* Ensure t
9ba0: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
9bb0: 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64  ma has been load
9bc0: 65 64 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  ed */.  if( sqli
9bd0: 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 20  te3SafetyOn(db) 
9be0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9bf0: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
9c00: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9c10: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
9c20: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
9c30: 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d  3Init(db, &zErrM
9c40: 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  sg);.  if( SQLIT
9c50: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
9c60: 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
9c70: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
9c80: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75   the table in qu
9c90: 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62  estion */.  pTab
9ca0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
9cb0: 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61  ble(db, zTableNa
9cc0: 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  me, zDbName);.  
9cd0: 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61  if( !pTab || pTa
9ce0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
9cf0: 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
9d00: 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
9d10: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74    }..  /* Find t
9d20: 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68  he column for wh
9d30: 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75  ich info is requ
9d40: 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 73  ested */.  if( s
9d50: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43  qlite3IsRowid(zC
9d60: 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20  olumnName) ){.  
9d70: 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69    iCol = pTab->i
9d80: 50 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 69 43  PKey;.    if( iC
9d90: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ol>=0 ){.      p
9da0: 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
9db0: 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20  l[iCol];.    }. 
9dc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
9dd0: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
9de0: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
9df0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26  {.      pCol = &
9e00: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
9e10: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
9e20: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
9e30: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75  ol->zName, zColu
9e40: 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  mnName) ){.     
9e50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9e60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9e70: 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  iCol==pTab->nCol
9e80: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
9e90: 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   0;.      goto e
9ea0: 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  rror_out;.    }.
9eb0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
9ec0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74  llowing block st
9ed0: 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e  ores the meta in
9ee0: 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77  formation that w
9ef0: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a  ill be returned.
9f00: 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c    ** to the call
9f10: 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  er in local vari
9f20: 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c  ables zDataType,
9f30: 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75   zCollSeq, notnu
9f40: 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20  ll, primarykey. 
9f50: 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e   ** and autoinc.
9f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
9f70: 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73  here are two pos
9f80: 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a  sibilities:.  **
9f90: 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68   .  **     1. Th
9fa0: 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75  e specified colu
9fb0: 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69  mn name was rowi
9fc0: 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72  d", "oid" or "_r
9fd0: 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20  owid_" .  **    
9fe0: 20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69 73      and there is
9ff0: 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64   no explicitly d
a000: 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75  eclared IPK colu
a010: 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  mn. .  **.  **  
a020: 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20     2. The table 
a030: 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e  is not a view an
a040: 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  d the column nam
a050: 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20  e identified an 
a060: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70  .  **        exp
a070: 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64  licitly declared
a080: 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65   column. Copy me
a090: 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ta information f
a0a0: 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20  rom *pCol..  */ 
a0b0: 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
a0c0: 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70     zDataType = p
a0d0: 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20  Col->zType;.    
a0e0: 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d  zCollSeq = pCol-
a0f0: 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e  >zColl;.    notn
a100: 75 6c 6c 20 3d 20 28 70 43 6f 6c 2d 3e 6e 6f 74  ull = (pCol->not
a110: 4e 75 6c 6c 3f 31 3a 30 29 3b 0a 20 20 20 20 70  Null?1:0);.    p
a120: 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 28 70 43  rimarykey  = (pC
a130: 6f 6c 2d 3e 69 73 50 72 69 6d 4b 65 79 3f 31 3a  ol->isPrimKey?1:
a140: 30 29 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20  0);.    autoinc 
a150: 3d 20 28 28 70 54 61 62 2d 3e 69 50 4b 65 79 3d  = ((pTab->iPKey=
a160: 3d 69 43 6f 6c 20 26 26 20 70 54 61 62 2d 3e 61  =iCol && pTab->a
a170: 75 74 6f 49 6e 63 29 3f 31 3a 30 29 3b 0a 20 20  utoInc)?1:0);.  
a180: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61  }else{.    zData
a190: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
a1a0: 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79  ;.    primarykey
a1b0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
a1c0: 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  !zCollSeq ){.   
a1d0: 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e   zCollSeq = "BIN
a1e0: 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72  ARY";.  }..error
a1f0: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 73 71 6c 69  _out:.  if( sqli
a200: 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29  te3SafetyOff(db)
a210: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
a220: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
a230: 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68  .  /* Whether th
a240: 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  e function call 
a250: 73 75 63 63 65 65 64 65 64 20 6f 72 20 66 61 69  succeeded or fai
a260: 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74  led, set the out
a270: 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20  put parameters. 
a280: 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20   ** to whatever 
a290: 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e  their local coun
a2a0: 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e  terparts contain
a2b0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69  . If an error di
a2c0: 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68  d occur,.  ** th
a2d0: 69 73 20 68 61 73 20 74 68 65 20 65 66 66 65 63  is has the effec
a2e0: 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c  t of zeroing all
a2f0: 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
a300: 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rs..  */.  if( p
a310: 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44  zDataType ) *pzD
a320: 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54  ataType = zDataT
a330: 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c  ype;.  if( pzCol
a340: 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65  lSeq ) *pzCollSe
a350: 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20  q = zCollSeq;.  
a360: 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a  if( pNotNull ) *
a370: 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75  pNotNull = notnu
a380: 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61  ll;.  if( pPrima
a390: 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72  ryKey ) *pPrimar
a3a0: 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65  yKey = primaryke
a3b0: 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e  y;.  if( pAutoin
a3c0: 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20  c ) *pAutoinc = 
a3d0: 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20  autoinc;..  if( 
a3e0: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26  SQLITE_OK==rc &&
a3f0: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71   !pTab ){.    sq
a400: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
a410: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
a420: 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20  h table column: 
a430: 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 22  ", zTableName, "
a440: 2e 22 2c 20 0a 20 20 20 20 20 20 20 20 7a 43 6f  .", .        zCo
a450: 6c 75 6d 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  lumnName, 0);.  
a460: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
a470: 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
a480: 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
a490: 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29  (zErrMsg?"%s":0)
a4a0: 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71  , zErrMsg);.  sq
a4b0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
a4c0: 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  sg);.  rc = sqli
a4d0: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
a4e0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
a4f0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
a500: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
a510: 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
a520: 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c  ** Sleep for a l
a530: 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65  ittle while.  Re
a540: 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  turn the amount 
a550: 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a  of time slept..*
a560: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c  /.int sqlite3_sl
a570: 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73  eep(int ms){.  s
a580: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
a590: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 56  ;.  int rc;.  pV
a5a0: 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
a5b0: 5f 66 69 6e 64 28 30 29 3b 0a 0a 20 20 2f 2a 20  _find(0);..  /* 
a5c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f  This function wo
a5d0: 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f  rks in milliseco
a5e0: 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64  nds, but the und
a5f0: 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28  erlying OsSleep(
a600: 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73  ) .  ** API uses
a610: 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48   microseconds. H
a620: 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73 2e  ence the 1000's.
a630: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71  .  */.  rc = (sq
a640: 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66  lite3OsSleep(pVf
a650: 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30  s, 1000*ms)/1000
a660: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
a670: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  }../*.** Enable 
a680: 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 65  or disable the e
a690: 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63  xtended result c
a6a0: 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  odes..*/.int sql
a6b0: 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65  ite3_extended_re
a6c0: 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74  sult_codes(sqlit
a6d0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66  e3 *db, int onof
a6e0: 66 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  f){.  sqlite3_mu
a6f0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
a700: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d  tex);.  db->errM
a710: 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78  ask = onoff ? 0x
a720: 66 66 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b  ffffffff : 0xff;
a730: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a740: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
a750: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
a760: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
a770: 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65  Invoke the xFile
a780: 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f  Control method o
a790: 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  n a particular d
a7a0: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
a7b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
a7c0: 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  trol(sqlite3 *db
a7d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
a7e0: 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76  bName, int op, v
a7f0: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e  oid *pArg){.  in
a800: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  t rc = SQLITE_ER
a810: 52 4f 52 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  ROR;.  int iDb;.
a820: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a830: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
a840: 3b 0a 20 20 69 66 28 20 7a 44 62 4e 61 6d 65 3d  ;.  if( zDbName=
a850: 3d 30 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20  =0 ){.    iDb = 
a860: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
a870: 66 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64  for(iDb=0; iDb<d
a880: 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a  b->nDb; iDb++){.
a890: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
a8a0: 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  (db->aDb[iDb].zN
a8b0: 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3d 3d 30  ame, zDbName)==0
a8c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
a8d0: 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 64 62    }.  if( iDb<db
a8e0: 2d 3e 6e 44 62 20 29 7b 0a 20 20 20 20 42 74 72  ->nDb ){.    Btr
a8f0: 65 65 20 2a 70 42 74 72 65 65 20 3d 20 64 62 2d  ee *pBtree = db-
a900: 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
a910: 20 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b     if( pBtree ){
a920: 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50  .      Pager *pP
a930: 61 67 65 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  ager;.      sqli
a940: 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20  te3_file *fd;.  
a950: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
a960: 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
a970: 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71       pPager = sq
a980: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
a990: 70 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20 61  pBtree);.      a
a9a0: 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
a9b0: 20 29 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 73   );.      fd = s
a9c0: 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
a9d0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
a9e0: 73 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a  ssert( fd!=0 );.
a9f0: 20 20 20 20 20 20 69 66 28 20 66 64 2d 3e 70 4d        if( fd->pM
aa00: 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
aa10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
aa20: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20  FileControl(fd, 
aa30: 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20  op, pArg);.     
aa40: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
aa50: 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
aa60: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
aa70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
aa80: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
aa90: 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 0a    return rc;   .
aaa0: 7d 0a                                            }.