Compare commits
309 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3b9c321ab8 | |||
| 55cb77270b | |||
| e7106be82c | |||
| 08964c4dec | |||
| 02a6eb2ebc | |||
| 01b37173f7 | |||
| f60f004961 | |||
| ff98097280 | |||
| 56d4b9f7eb | |||
| fe6f4be4dd | |||
| fa12e8ffa1 | |||
| 58eb59420b | |||
| 48141a43f8 | |||
| 1f7b590a8f | |||
| 3041053558 | |||
| d82c89d70c | |||
| 17ec759c86 | |||
| 9c69a80d2f | |||
| 6d60b7393e | |||
| 9febfd6cb0 | |||
| 4864f3e0fb | |||
| c5baaab4c6 | |||
| 7922183250 | |||
| af9861af87 | |||
| 2019026983 | |||
| 0ef6378073 | |||
| 08ce79c5af | |||
| 0404fa55d4 | |||
| 9db600f3c7 | |||
| 9519ac75c6 | |||
| 09a729c785 | |||
| d6396e9b16 | |||
| d4d01a689d | |||
| a096fcc73c | |||
| 50179f91f3 | |||
| 39440626e7 | |||
| 53d9fc4fc9 | |||
| c606f289c4 | |||
| d87442b4c0 | |||
| 660e7677ab | |||
| 88d139d590 | |||
| 76ea5d121e | |||
| fe329a7370 | |||
| cc0f95f93a | |||
| bfb2c9aedd | |||
| 99be78d34b | |||
| ae47a1accf | |||
| 64b7a31a0c | |||
| 86aac2020e | |||
| cefca47ab5 | |||
| 191bc61af2 | |||
| 91fba13a2c | |||
| b60ba6bda7 | |||
| 4a570cc680 | |||
| 4a9cb72882 | |||
| 10d5cc5f83 | |||
| 872a0e5658 | |||
| d951e90805 | |||
| cd3aa28dd6 | |||
| 570e9f6bff | |||
| ae0c1cc387 | |||
| 00334f2bbc | |||
| f0dc2aa431 | |||
| fe6f2a3ca4 | |||
| 578a1a40bc | |||
| 0ef5f800b3 | |||
| ed0a24a237 | |||
| 756234695f | |||
| 6db6a466b0 | |||
| 7414036899 | |||
| 755980ace0 | |||
| 320edfac1b | |||
| 25f042bae8 | |||
| 2793c269bb | |||
| e5c66e42db | |||
| cf178fc37e | |||
| 16ad651054 | |||
| 54f681e52f | |||
| 429c123b59 | |||
| 4c12ada23d | |||
| 43bbfc5d82 | |||
| 7e1accd0e7 | |||
| 56e70d0539 | |||
| e00d2c4f3c | |||
| 8eebf02f53 | |||
| 1563c7a4d5 | |||
| 6f7087211c | |||
| 68cd37c10f | |||
| 9e89b957ef | |||
| 114f5744d4 | |||
| ebbee40a8f | |||
| 9d32b7b042 | |||
| 74a7ef79f7 | |||
| 469077596f | |||
| 88b69f3fb5 | |||
| 04600b249f | |||
| adb9636887 | |||
| 9fc3d1cfa7 | |||
| 2b78c0d38b | |||
| cb9e7a56af | |||
| 101f557a23 | |||
| e5a060474a | |||
| a14dfe465c | |||
| ce08336c43 | |||
| 72f0d40ac4 | |||
| 0ecefeb10b | |||
| 2a73755f4e | |||
| 7991137311 | |||
| 3db53ff77b | |||
| 04393bb585 | |||
| 2911e6c570 | |||
| 07a6166f23 | |||
| 93e52b35cc | |||
| 4f25847dbd | |||
| 62c831d829 | |||
| 241014c3f1 | |||
| 264b78a7b0 | |||
| 7aecd9ac20 | |||
| d774536f52 | |||
| 1158cd750f | |||
| 81ab26904b | |||
| 26bb3b2148 | |||
| e2fe1a59b7 | |||
| afd6cf1041 | |||
| f45491a09c | |||
| a0fafa1dee | |||
| 6a09a46b10 | |||
| 4a42d8faf2 | |||
| 68b203fe4e | |||
| 59158c25cb | |||
| b8a08d1237 | |||
| 9beb8702e8 | |||
| 6684c44a4c | |||
| bee873abcc | |||
| 961c98618d | |||
| 738394c069 | |||
| 51b021eb64 | |||
| 00c43a4a3b | |||
| a297dbb897 | |||
| 8e11f8aec5 | |||
| f035e3ce68 | |||
| 532676f142 | |||
| 7c5113fc3b | |||
| 9827122af5 | |||
| 7712ac43e8 | |||
| 99a9edc64a | |||
| 36813e51a6 | |||
| cbce710443 | |||
| 5be04de862 | |||
| 296145ff14 | |||
| 3fa3114310 | |||
| e8c1a641b1 | |||
| 05a43c305f | |||
| 557437fd51 | |||
| 471a717ccb | |||
| b13cc88cd3 | |||
| 2f1fbb5a88 | |||
| fa95fecd1a | |||
| aefbdc97bd | |||
| 5817b2a18e | |||
| 4feacdeb25 | |||
| 201959c95d | |||
| 0a175660d2 | |||
| 03f275ea83 | |||
| f6aade2b1e | |||
| b8963868c9 | |||
| 3f73784941 | |||
| 77cb4f3bf5 | |||
| a3b2856ca5 | |||
| 11a6d52005 | |||
| e4172fa884 | |||
| 79e319ef93 | |||
| 38f940254a | |||
| 417f98ddc9 | |||
| 7151722191 | |||
| 1dc14f78f0 | |||
| 6f34c36a39 | |||
| 5a3d6b1a39 | |||
| 5d5a49d8da | |||
| f6f002a3bb | |||
| 81f89ae38c | |||
| 6d88f0f145 | |||
| 4cfde6344b | |||
| 4a92cb5619 | |||
| 52c5d76673 | |||
| dde37a1cb0 | |||
| 9cc5985bc4 | |||
| edb586616b | |||
| 1c68302a1a | |||
| 3f45cf5900 | |||
| 72ab0c824d | |||
| fd855ec1e9 | |||
| c0c290d4f6 | |||
| 7a00b6c815 | |||
| 31447e8b01 | |||
| 59967e2d2e | |||
| acf5e9d692 | |||
| ef39ae556c | |||
| d419d42238 | |||
| d6edcca767 | |||
| 8a9a68e2ae | |||
| b33a4fdffe | |||
| 35d09b26e2 | |||
| b9f41b4fd1 | |||
| e1436049d8 | |||
| 4e76b64969 | |||
| 78fffbf2c2 | |||
| 3314d12e03 | |||
| b2eb39ea15 | |||
| 1489c18b99 | |||
| 3aed0eb475 | |||
| ba1bce386c | |||
| 8f0e4e2a9c | |||
| 8a1c468c3c | |||
| 29b2fb1c52 | |||
| 8749d1c8e6 | |||
| fc73c50fec | |||
| 5fbe8d658f | |||
| 02d2493753 | |||
| edd972a2ed | |||
| 42b4259a4a | |||
| 8343a6bf5e | |||
| 4678255c4e | |||
| 0cb33b650c | |||
| 9817307d2f | |||
| 296c8cad4d | |||
| 40d50d1b0f | |||
| 2f1e7b8a74 | |||
| e0ba85df8b | |||
| 39ab1aef89 | |||
| 90defefb85 | |||
| 48249a7397 | |||
| ffa0ae9924 | |||
| 495cd6b419 | |||
| 7d59b89dc9 | |||
| aa09d0503d | |||
| 3a0022dad4 | |||
| 0d92f761ed | |||
| cc40f4ceb1 | |||
| aec336af26 | |||
| d74c576ee6 | |||
| 65f0fd40d6 | |||
| f9ae91deed | |||
| 8062d660f1 | |||
| b19e7036cd | |||
| 253df3a264 | |||
| 343811ce13 | |||
| 1b1b8325e1 | |||
| 027200ec51 | |||
| d819aea05f | |||
| e96ab66f34 | |||
| 2e4491d4b1 | |||
| 1b2327c509 | |||
| 66f6ad7b94 | |||
| b5f87f4394 | |||
| fbea85d6cd | |||
| b09945e64c | |||
| c3835e0208 | |||
| d736884f3d | |||
| 283f9e7ee6 | |||
| fa64665a49 | |||
| e127a2ea9f | |||
| 5be1b1f262 | |||
| 25d2380356 | |||
| 69d67f5412 | |||
| 6f7fe3ef3e | |||
| e3a4e11bcc | |||
| 67d225da53 | |||
| 5a5ced7da9 | |||
| 985be1bce6 | |||
| 99f24349ea | |||
| 890b69fb83 | |||
| f5d6f1e0c5 | |||
| 5ec0cfe070 | |||
| 3b3b1a538d | |||
| b0fa210aa3 | |||
| 801829c812 | |||
| 9b3c15e860 | |||
| 61d3bfb78b | |||
| 45d55a254b | |||
| 51e5db70b6 | |||
| f219bba933 | |||
| a0166e1873 | |||
| aff0449d8f | |||
| c55e9b815f | |||
| 03ba419b3c | |||
| c4098a3d9f | |||
| 21ce77989a | |||
| 91973abb4b | |||
| 722db051c6 | |||
| 87dd60cd8d | |||
| 7244fdc446 | |||
| 4f7e8fcded | |||
| 95063a5774 | |||
| ad7c2a87f5 | |||
| cc3ec7cb2b | |||
| 3942b4b147 | |||
| 9aa0012a08 | |||
| efd8e3b33d | |||
| 0b90b2209f | |||
| 9782039bde | |||
| 332aa832ce | |||
| bf4cad1e4c | |||
| b0c5edcd06 | |||
| 2250799f0c | |||
| ca071dfd75 | |||
| ac0c39980a | |||
| 04d4227255 | |||
| e6c3c72c1b |
+22
-9
@@ -63,7 +63,7 @@ LIBREADLINE = @TARGET_READLINE_LIBS@
|
||||
|
||||
# Should the database engine be compiled threadsafe
|
||||
#
|
||||
TCC += -DSQLITE_THREADSAFE=@SQLITE_THREADSAFE@
|
||||
#TCC += -DSQLITE_THREADSAFE=@SQLITE_THREADSAFE@
|
||||
|
||||
# Any target libraries which libsqlite must be linked against
|
||||
#
|
||||
@@ -117,7 +117,7 @@ TCLSH_CMD = @TCLSH_CMD@
|
||||
|
||||
# Where do we want to install the tcl plugin
|
||||
#
|
||||
TCLLIBDIR = @TCLLIBDIR@
|
||||
TCLLIBDIR = /System/Library/Tcl
|
||||
|
||||
# The suffix used on shared libraries. Ex: ".dll", ".so", ".dylib"
|
||||
#
|
||||
@@ -350,6 +350,9 @@ SRC += \
|
||||
SRC += \
|
||||
$(TOP)/ext/rtree/rtree.h \
|
||||
$(TOP)/ext/rtree/rtree.c
|
||||
SRC += \
|
||||
$(TOP)/ext/sqlrr/sqlrr.h \
|
||||
$(TOP)/ext/sqlrr/sqlrr.c
|
||||
SRC += \
|
||||
$(TOP)/ext/session/sqlite3session.c \
|
||||
$(TOP)/ext/session/sqlite3session.h
|
||||
@@ -554,6 +557,17 @@ EXTHDR += \
|
||||
$(TOP)/ext/icu/sqliteicu.h
|
||||
EXTHDR += \
|
||||
$(TOP)/ext/rtree/sqlite3rtree.h
|
||||
EXTHDR += \
|
||||
$(TOP)/ext/sqlrr/sqlrr.h
|
||||
|
||||
# If using the amalgamation, use sqlite3.c directly to build the test
|
||||
# fixture. Otherwise link against libsqlite3.la. (This distinction is
|
||||
# necessary because the test fixture requires non-API symbols which are
|
||||
# hidden when the library is built via the amalgamation).
|
||||
#
|
||||
TESTFIXTURE_SRC0 = $(TESTSRC2) libsqlite3.la
|
||||
TESTFIXTURE_SRC1 = sqlite3.c
|
||||
TESTFIXTURE_SRC = $(TESTSRC) $(TOP)/src/tclsqlite.c $(TESTFIXTURE_SRC$(USE_AMALGAMATION))
|
||||
|
||||
# executables needed for testing
|
||||
#
|
||||
@@ -616,9 +630,8 @@ libsqlite3.la: $(LIBOBJ)
|
||||
libtclsqlite3.la: tclsqlite.lo libsqlite3.la
|
||||
$(LTLINK) -no-undefined -o $@ tclsqlite.lo \
|
||||
libsqlite3.la @TCL_STUB_LIB_SPEC@ $(TLIBS) \
|
||||
-rpath "$(TCLLIBDIR)" \
|
||||
-version-info "8:6:8" \
|
||||
-avoid-version
|
||||
-rpath "$(TCLLIBDIR)/sqlite3" \
|
||||
-version-info "8:6:8"
|
||||
|
||||
sqlite3$(TEXE): shell.c sqlite3.c
|
||||
$(LTLINK) $(READLINE_FLAGS) $(SHELL_OPT) -o $@ \
|
||||
@@ -1347,10 +1360,10 @@ install: sqlite3$(TEXE) lib_install sqlite3.h sqlite3.pc ${HAVE_TCL:1=tcl_instal
|
||||
pkgIndex.tcl:
|
||||
echo 'package ifneeded sqlite3 $(RELEASE) [list load $(TCLLIBDIR)/libtclsqlite3$(SHLIB_SUFFIX) sqlite3]' > $@
|
||||
tcl_install: lib_install libtclsqlite3.la pkgIndex.tcl
|
||||
$(INSTALL) -d $(DESTDIR)$(TCLLIBDIR)
|
||||
$(LTINSTALL) libtclsqlite3.la $(DESTDIR)$(TCLLIBDIR)
|
||||
rm -f $(DESTDIR)$(TCLLIBDIR)/libtclsqlite3.la $(DESTDIR)$(TCLLIBDIR)/libtclsqlite3.a
|
||||
$(INSTALL) -m 0644 pkgIndex.tcl $(DESTDIR)$(TCLLIBDIR)
|
||||
$(INSTALL) -d $(DESTDIR)$(TCLLIBDIR)/sqlite3
|
||||
$(LTINSTALL) libtclsqlite3.la $(DESTDIR)$(TCLLIBDIR)/sqlite3
|
||||
rm -f $(DESTDIR)$(TCLLIBDIR)/sqlite3/libtclsqlite3.la $(DESTDIR)$(TCLLIBDIR)/sqlite3/libtclsqlite3.a
|
||||
$(INSTALL) -m 0644 pkgIndex.tcl $(DESTDIR)$(TCLLIBDIR)/sqlite3
|
||||
|
||||
clean:
|
||||
rm -f *.lo *.la *.o sqlite3$(TEXE) libsqlite3.la
|
||||
|
||||
@@ -1609,6 +1609,7 @@ FUZZDATA = \
|
||||
!IF $(DYNAMIC_SHELL)==0 && $(FOR_WIN10)==0
|
||||
SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_STMTVTAB
|
||||
SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_ENABLE_DBSTAT_VTAB
|
||||
SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
|
||||
SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_OFFSET_SQL_FUNC -DSQLITE_INTROSPECTION_PRAGMAS
|
||||
SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_RTREE
|
||||
!ENDIF
|
||||
|
||||
@@ -65,6 +65,7 @@
|
||||
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef SQLITE_AMALGAMATION
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
|
||||
sqlrr - 10/19/2009
|
||||
|
||||
SQL Replay Recording
|
||||
|
||||
SUMMARY
|
||||
-------------------------------------------------------
|
||||
This extension enables recording sqlite API calls that access the database so that they can be replayed or examined.
|
||||
|
||||
USAGE
|
||||
------------------------------------------------------
|
||||
Recording is enabled by compiling sqlite with symbolic constant SQLITE_ENABLE_SQLRR defined.
|
||||
By default logs are written to /tmp/<databasename>_<pid>_<connection_number>.sqlrr, to choose another directory, set the environment variable SQLITE_REPLAY_RECORD_DIR to that path.
|
||||
|
||||
FILE FORMAT
|
||||
-----------------------------------------------------
|
||||
file: <header>[<sql-command>]*
|
||||
|
||||
header: <signature><format-version>
|
||||
signature: SQLRR (5 bytes)
|
||||
format-version: n (1 byte)
|
||||
|
||||
sql-command: <timestamp><type><arg-data>
|
||||
timestamp: n (16 bytes)
|
||||
type: n (1 byte)
|
||||
open 0
|
||||
close 1
|
||||
exec 8
|
||||
bind-text 16
|
||||
bind-double 17
|
||||
bind-int 18
|
||||
bind-null 19
|
||||
bind-value 20
|
||||
bind-clear 21
|
||||
prep 32
|
||||
step 33
|
||||
reset 34
|
||||
finalize 35
|
||||
|
||||
open-arg-data: <connection><path><flags>
|
||||
close-arg-data: <connection>
|
||||
exec-arg-data: <connection><len><statement-text>
|
||||
bind-text-arg-data: <statement-ref><index><len><data>
|
||||
bind-double-arg-data: <statement-ref><index><data>
|
||||
bind-int-arg-data: <statement-ref><index><data>
|
||||
bind-null-arg-data: <statement-ref><index>
|
||||
bind-value-arg-data: <statement-ref><index><len><data> ???
|
||||
bind-clear-arg-data: <statement-ref>
|
||||
prep-arg-data: <connection><len><statement-text>
|
||||
step-arg-data: <statement-ref>
|
||||
reset-arg-data: <statement-ref>
|
||||
finalize-arg-data: <statement-ref>
|
||||
|
||||
NOTES
|
||||
@@ -0,0 +1,581 @@
|
||||
/*
|
||||
* sqlrr.c
|
||||
*/
|
||||
|
||||
#include "sqlrr.h"
|
||||
|
||||
#if defined(SQLITE_ENABLE_SQLRR)
|
||||
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/param.h>
|
||||
#include <errno.h>
|
||||
#include <pthread.h>
|
||||
#include <libkern/OSAtomic.h>
|
||||
|
||||
#include "sqliteInt.h"
|
||||
#include "vdbeInt.h"
|
||||
|
||||
#define LOGSUFFIXLEN 48
|
||||
|
||||
/*
|
||||
* Data types
|
||||
*/
|
||||
typedef struct SRRLogRef SRRLogRef;
|
||||
struct SRRLogRef {
|
||||
int fd;
|
||||
sqlite3 *db;
|
||||
const char *dbPath;
|
||||
char *logPath;
|
||||
int connection;
|
||||
int depth;
|
||||
SRRLogRef *nextRef;
|
||||
};
|
||||
|
||||
/*
|
||||
* Globals
|
||||
*/
|
||||
SRRLogRef *logRefHead = NULL;
|
||||
int dbLogCount = 0;
|
||||
static int srr_enabled = 1;
|
||||
pthread_mutex_t srr_log_mutex;
|
||||
static volatile int32_t srr_initialized = 0;
|
||||
|
||||
/*
|
||||
* Log management
|
||||
*/
|
||||
extern void SRRecInitialize() {
|
||||
int go = OSAtomicCompareAndSwap32Barrier(0, 1, &srr_initialized);
|
||||
if( go ){
|
||||
pthread_mutex_init(&srr_log_mutex, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static SRRLogRef *createLog(sqlite3 *db, const char *dbPath) {
|
||||
SRRLogRef *ref = NULL;
|
||||
char *baseDir = getenv("SQLITE_REPLAY_RECORD_DIR");
|
||||
char logPath[MAXPATHLEN] = "";
|
||||
char suffix[LOGSUFFIXLEN] = "";
|
||||
const char *dbName = dbPath;
|
||||
int len = 0;
|
||||
int index = 0;
|
||||
int fd = -1;
|
||||
size_t out;
|
||||
unsigned char version = SRR_FILE_VERSION;
|
||||
|
||||
SRRecInitialize();
|
||||
|
||||
/* construct the path for the log file
|
||||
* ${SQLITE_REPLAY_DIR}/<dbname>_<pid>_<connection_number>.sqlrr
|
||||
*/
|
||||
if (baseDir == NULL) {
|
||||
baseDir = "/tmp"; /* getenv(TMPDIR) */
|
||||
}
|
||||
len = strlen(baseDir);
|
||||
strlcat(logPath, baseDir, MAXPATHLEN);
|
||||
if ((len>0) && (baseDir[len-1] != '/')) {
|
||||
strlcat(logPath, "/", MAXPATHLEN);
|
||||
}
|
||||
len = strlen(dbPath);
|
||||
for (index = len-2; index >= 0; index --){
|
||||
if (dbPath[index] == '/') {
|
||||
dbName = &dbPath[index+1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
strlcat(logPath, dbName, MAXPATHLEN);
|
||||
int cNum = ++dbLogCount;
|
||||
snprintf(suffix, sizeof(suffix), "_%d_%d_XXXX.sqlrr", getpid(), cNum);
|
||||
len = strlcat(logPath, suffix, MAXPATHLEN);
|
||||
/* make it unique if we have the space */
|
||||
if ((len + 1) < MAXPATHLEN) {
|
||||
fd = mkstemps(logPath, 6);
|
||||
} else {
|
||||
fprintf(stderr, "Failed to create sqlite replay log path for %s [%s]\n", dbPath, logPath);
|
||||
return NULL;
|
||||
}
|
||||
if (fd == -1) {
|
||||
fprintf(stderr, "Failed to create sqlite replay log file for %s with path %s [%s]\n", dbPath, logPath, strerror(errno));
|
||||
return NULL;
|
||||
}
|
||||
fprintf(stdout, "Writing sqlite replay log file %s\n", logPath);
|
||||
out = write(fd, SRR_FILE_SIGNATURE, SRR_FILE_SIGNATURE_LEN);
|
||||
if (out!=-1) {
|
||||
out = write(fd, &version, 1);
|
||||
}
|
||||
if (out == -1){
|
||||
fprintf(stderr, "Write failure on log [%s]: %s\n", logPath, strerror(errno));
|
||||
close(fd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
len = strlen(logPath) + 1;
|
||||
ref = (SRRLogRef *)malloc(sizeof(SRRLogRef));
|
||||
|
||||
ref->db = db;
|
||||
ref->dbPath = dbPath;
|
||||
ref->logPath = (char *)malloc(len * sizeof(char));
|
||||
strlcpy(ref->logPath, logPath, len);
|
||||
ref->fd = fd;
|
||||
ref->connection = cNum;
|
||||
ref->depth = 0;
|
||||
|
||||
pthread_mutex_lock(&srr_log_mutex);
|
||||
ref->nextRef = logRefHead;
|
||||
logRefHead = ref;
|
||||
pthread_mutex_unlock(&srr_log_mutex);
|
||||
return ref;
|
||||
}
|
||||
|
||||
static void closeLog(sqlite3 *db) {
|
||||
SRRLogRef *ref = NULL;
|
||||
SRRLogRef *lastRef = NULL;
|
||||
|
||||
pthread_mutex_lock(&srr_log_mutex);
|
||||
for (ref = logRefHead; ref != NULL; ref = ref->nextRef) {
|
||||
if (ref->db == db) {
|
||||
if (lastRef == NULL) {
|
||||
logRefHead = ref->nextRef;
|
||||
} else {
|
||||
lastRef->nextRef = ref->nextRef;
|
||||
}
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&srr_log_mutex);
|
||||
|
||||
if (ref != NULL) {
|
||||
fprintf(stdout, "Closing sqlite replay log file %s\n", ref->logPath);
|
||||
close(ref->fd);
|
||||
free(ref->logPath);
|
||||
free(ref);
|
||||
}
|
||||
}
|
||||
|
||||
static SRRLogRef *getLog(sqlite3 *db) {
|
||||
pthread_mutex_lock(&srr_log_mutex);
|
||||
SRRLogRef *ref = logRefHead;
|
||||
for (ref = logRefHead; ref != NULL; ref = ref->nextRef) {
|
||||
if (ref->db == db) {
|
||||
pthread_mutex_unlock(&srr_log_mutex);
|
||||
return ref;
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&srr_log_mutex);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* SQLite recording API
|
||||
*/
|
||||
void SQLiteReplayRecorder(int flag) {
|
||||
srr_enabled = flag;
|
||||
}
|
||||
|
||||
// open-arg-data: <connection><len><path><flags>
|
||||
void _SRRecOpen(sqlite3 *db, const char *path, int flags) {
|
||||
if (!srr_enabled) return;
|
||||
if (db) {
|
||||
SRRLogRef *ref = createLog(db, path);
|
||||
if (ref) {
|
||||
SRRCommand code = SRROpen;
|
||||
int len = strlen(path);
|
||||
struct timeval tv;
|
||||
size_t out;
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
out = write(ref->fd, &tv, sizeof(tv));
|
||||
if (out!=-1) { out=write(ref->fd, &code, sizeof(SRRCommand)); }
|
||||
if (out!=-1) { out=write(ref->fd, &(ref->connection), sizeof(ref->connection)); }
|
||||
if (out!=-1) { out=write(ref->fd, &len, sizeof(len)); }
|
||||
if (out!=-1) { out=write(ref->fd, path, len); }
|
||||
if (out!=-1) { out=write(ref->fd, &flags, sizeof(flags)); }
|
||||
if (out==-1) {
|
||||
fprintf(stderr, "Error writing open to log file [%s]: %s\n", ref->logPath, strerror(errno));
|
||||
closeLog(db);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//close-arg-data: <connection>
|
||||
void SRRecClose(sqlite3 *db) {
|
||||
if (!srr_enabled) return;
|
||||
if (db) {
|
||||
SRRLogRef *ref = getLog(db);
|
||||
if (ref) {
|
||||
SRRCommand code = SRRClose;
|
||||
struct timeval tv;
|
||||
size_t out;
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
out = write(ref->fd, &tv, sizeof(tv));
|
||||
if (out!=-1) { out = write(ref->fd, &code, sizeof(SRRCommand)); }
|
||||
if (out!=-1) { out = write(ref->fd, &(ref->connection), sizeof(ref->connection)); }
|
||||
if (out==-1) {
|
||||
fprintf(stderr, "Error writing close to log file [%s]: %s\n", ref->logPath, strerror(errno));
|
||||
}
|
||||
closeLog(db);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// exec-arg-data: <connection><len><statement-text>
|
||||
void SRRecExec(sqlite3 *db, const char *sql) {
|
||||
if (!srr_enabled) return;
|
||||
if (db) {
|
||||
SRRLogRef *ref = getLog(db);
|
||||
if (ref) {
|
||||
if (ref->depth == 0) {
|
||||
SRRCommand code = SRRExec;
|
||||
int len = strlen(sql);
|
||||
struct timeval tv;
|
||||
size_t out;
|
||||
|
||||
ref->depth = 1;
|
||||
gettimeofday(&tv, NULL);
|
||||
out = write(ref->fd, &tv, sizeof(tv));
|
||||
if (out!=-1) { out = write(ref->fd, &code, sizeof(SRRCommand)); }
|
||||
if (out!=-1) { out = write(ref->fd, &(ref->connection), sizeof(ref->connection)); }
|
||||
if (out!=-1) { out = write(ref->fd, &len, sizeof(len)); }
|
||||
if (out!=-1) { out = write(ref->fd, sql, len); }
|
||||
if (out==-1) {
|
||||
fprintf(stderr, "Error writing exec to log file [%s]: %s\n", ref->logPath, strerror(errno));
|
||||
closeLog(db);
|
||||
}
|
||||
} else {
|
||||
ref->depth ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SRRecExecEnd(sqlite3 *db) {
|
||||
if (!srr_enabled) return;
|
||||
if (db) {
|
||||
SRRLogRef *ref = getLog(db);
|
||||
if (ref) {
|
||||
ref->depth --;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// prep-arg-data: <connection><len><statement-text><savesql><statement-ref>
|
||||
void _SRRecPrepare(sqlite3 *db, const char *sql, int nBytes, int saveSql, sqlite3_stmt *pStmt) {
|
||||
if (!srr_enabled) return;
|
||||
if ((db!=NULL)&&(pStmt!=NULL)) {
|
||||
SRRLogRef *ref = getLog(db);
|
||||
if (ref && (ref->depth == 0)) {
|
||||
SRRCommand code = SRRPrepare;
|
||||
struct timeval tv;
|
||||
size_t out;
|
||||
int sqlLen = nBytes;
|
||||
|
||||
if (sqlLen == -1) {
|
||||
sqlLen = strlen(sql);
|
||||
}
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
out = write(ref->fd, &tv, sizeof(tv));
|
||||
if (out!=-1) { out = write(ref->fd, &code, sizeof(SRRCommand)); }
|
||||
if (out!=-1) { out = write(ref->fd, &(ref->connection), sizeof(ref->connection)); }
|
||||
if (out!=-1) { out = write(ref->fd, &sqlLen, sizeof(sqlLen)); }
|
||||
if (out!=-1) { out = write(ref->fd, sql, sqlLen); }
|
||||
if (out!=-1) { out = write(ref->fd, &saveSql, sizeof(saveSql)); }
|
||||
if (out!=-1) {
|
||||
int64_t stmtInt = (int64_t)((intptr_t)(pStmt));
|
||||
out = write(ref->fd, &stmtInt, sizeof(int64_t));
|
||||
}
|
||||
if (out==-1) {
|
||||
fprintf(stderr, "Error writing prepare to log file [%s]: %s\n", ref->logPath, strerror(errno));
|
||||
closeLog(db);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//step-arg-data: <statement-ref>
|
||||
void SRRecStep(sqlite3_stmt *pStmt) {
|
||||
if (!srr_enabled) return;
|
||||
if(pStmt!=NULL) {
|
||||
Vdbe *v = (Vdbe *)pStmt;
|
||||
SRRLogRef *ref = getLog(v->db);
|
||||
if (ref) {
|
||||
if (ref->depth == 0) {
|
||||
SRRCommand code = SRRStep;
|
||||
struct timeval tv;
|
||||
size_t out;
|
||||
|
||||
ref->depth = 1;
|
||||
gettimeofday(&tv, NULL);
|
||||
out = write(ref->fd, &tv, sizeof(tv));
|
||||
if (out!=-1) { out = write(ref->fd, &code, sizeof(SRRCommand)); }
|
||||
if (out!=-1) {
|
||||
int64_t stmtInt = (int64_t)((intptr_t)(pStmt));
|
||||
out = write(ref->fd, &stmtInt, sizeof(int64_t));
|
||||
}
|
||||
if (out==-1) {
|
||||
fprintf(stderr, "Error writing step to log file [%s]: %s\n", ref->logPath, strerror(errno));
|
||||
closeLog(ref->db);
|
||||
}
|
||||
} else {
|
||||
ref->depth ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SRRecStepEnd(sqlite3_stmt *pStmt) {
|
||||
if (!srr_enabled) return;
|
||||
if(pStmt!=NULL) {
|
||||
Vdbe *v = (Vdbe *)pStmt;
|
||||
SRRLogRef *ref = getLog(v->db);
|
||||
if (ref) {
|
||||
ref->depth --;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// reset-arg-data: <statement-ref>
|
||||
void SRRecReset(sqlite3_stmt *pStmt) {
|
||||
if (!srr_enabled) return;
|
||||
if(pStmt!=NULL) {
|
||||
Vdbe *v = (Vdbe *)pStmt;
|
||||
SRRLogRef *ref = getLog(v->db);
|
||||
if (ref && (ref->depth == 0)) {
|
||||
SRRCommand code = SRRReset;
|
||||
struct timeval tv;
|
||||
size_t out;
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
out = write(ref->fd, &tv, sizeof(tv));
|
||||
if (out!=-1) { out = write(ref->fd, &code, sizeof(SRRCommand)); }
|
||||
if (out!=-1) {
|
||||
int64_t stmtInt = (int64_t)((intptr_t)(pStmt));
|
||||
out = write(ref->fd, &stmtInt, sizeof(int64_t));
|
||||
}
|
||||
if (out==-1) {
|
||||
fprintf(stderr, "Error writing reset to log file [%s]: %s\n", ref->logPath, strerror(errno));
|
||||
closeLog(ref->db);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// finalize-arg-data: <statement-ref>
|
||||
void SRRecFinalize(sqlite3_stmt *pStmt) {
|
||||
if (!srr_enabled) return;
|
||||
if(pStmt!=NULL) {
|
||||
Vdbe *v = (Vdbe *)pStmt;
|
||||
SRRLogRef *ref = getLog(v->db);
|
||||
if (ref && (ref->depth == 0)) {
|
||||
SRRCommand code = SRRFinalize;
|
||||
struct timeval tv;
|
||||
size_t out;
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
out = write(ref->fd, &tv, sizeof(tv));
|
||||
if (out!=-1) { out = write(ref->fd, &code, sizeof(SRRCommand)); }
|
||||
if (out!=-1) {
|
||||
int64_t stmtInt = (int64_t)((intptr_t)(pStmt));
|
||||
out = write(ref->fd, &stmtInt, sizeof(int64_t));
|
||||
}
|
||||
if (out==-1) {
|
||||
fprintf(stderr, "Error writing finalize to log file [%s]: %s\n", ref->logPath, strerror(errno));
|
||||
closeLog(ref->db);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// bind-text-arg-data: <statement-ref><index><len><data>
|
||||
void SRRecBindText(sqlite3_stmt *pStmt, int i, const char *zData, int64_t nData) {
|
||||
if (!srr_enabled) return;
|
||||
if(pStmt!=NULL) {
|
||||
Vdbe *v = (Vdbe *)pStmt;
|
||||
SRRLogRef *ref = getLog(v->db);
|
||||
if (ref && (ref->depth == 0)) {
|
||||
SRRCommand code = SRRBindText;
|
||||
struct timeval tv;
|
||||
size_t out;
|
||||
int64_t textLen = nData;
|
||||
if (textLen == -1) {
|
||||
textLen = strlen(zData);
|
||||
}
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
out = write(ref->fd, &tv, sizeof(tv));
|
||||
if (out!=-1) { out = write(ref->fd, &code, sizeof(SRRCommand)); }
|
||||
if (out!=-1) {
|
||||
int64_t stmtInt = (int64_t)((intptr_t)(pStmt));
|
||||
out = write(ref->fd, &stmtInt, sizeof(int64_t));
|
||||
}
|
||||
if (out!=-1) { out = write(ref->fd, &i, sizeof(i)); }
|
||||
if (out!=-1) { out = write(ref->fd, &textLen, sizeof(textLen)); }
|
||||
if (out!=-1) { out = write(ref->fd, zData, textLen); }
|
||||
if (out==-1) {
|
||||
fprintf(stderr, "Error writing bind text to log file [%s]: %s\n", ref->logPath, strerror(errno));
|
||||
closeLog(ref->db);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// bind-blob-arg-data: <statement-ref><index><len>[<data>]
|
||||
void SRRecBindBlob(sqlite3_stmt *pStmt, int i, const char *zData, int64_t nData) {
|
||||
if (!srr_enabled) return;
|
||||
if(pStmt!=NULL) {
|
||||
Vdbe *v = (Vdbe *)pStmt;
|
||||
SRRLogRef *ref = getLog(v->db);
|
||||
if (ref && (ref->depth == 0)) {
|
||||
SRRCommand code = SRRBindBlob;
|
||||
struct timeval tv;
|
||||
size_t out;
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
out = write(ref->fd, &tv, sizeof(tv));
|
||||
if (out!=-1) { out = write(ref->fd, &code, sizeof(SRRCommand)); }
|
||||
if (out!=-1) {
|
||||
int64_t stmtInt = (int64_t)((intptr_t)(pStmt));
|
||||
out = write(ref->fd, &stmtInt, sizeof(int64_t));
|
||||
}
|
||||
if (out!=-1) { out = write(ref->fd, &i, sizeof(i)); }
|
||||
if (zData == NULL) {
|
||||
int64_t negNData = -nData;
|
||||
if (out!=-1) { out = write(ref->fd, &negNData, sizeof(negNData)); }
|
||||
} else {
|
||||
if (out!=-1) { out = write(ref->fd, &nData, sizeof(nData)); }
|
||||
if (out!=-1) { out = write(ref->fd, zData, nData); }
|
||||
}
|
||||
if (out==-1) {
|
||||
fprintf(stderr, "Error writing bind blob to log file [%s]: %s\n", ref->logPath, strerror(errno));
|
||||
closeLog(ref->db);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// bind-double-arg-data: <statement-ref><index><data>
|
||||
void SRRecBindDouble(sqlite3_stmt *pStmt, int i, double value) {
|
||||
if (!srr_enabled) return;
|
||||
if(pStmt!=NULL) {
|
||||
Vdbe *v = (Vdbe *)pStmt;
|
||||
SRRLogRef *ref = getLog(v->db);
|
||||
if (ref && (ref->depth == 0)) {
|
||||
SRRCommand code = SRRBindDouble;
|
||||
struct timeval tv;
|
||||
size_t out;
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
out = write(ref->fd, &tv, sizeof(tv));
|
||||
if (out!=-1) { out = write(ref->fd, &code, sizeof(SRRCommand)); }
|
||||
if (out!=-1) {
|
||||
int64_t stmtInt = (int64_t)((intptr_t)(pStmt));
|
||||
out = write(ref->fd, &stmtInt, sizeof(int64_t));
|
||||
}
|
||||
if (out!=-1) { out = write(ref->fd, &i, sizeof(i)); }
|
||||
if (out!=-1) { out = write(ref->fd, &value, sizeof(value)); }
|
||||
if (out==-1) {
|
||||
fprintf(stderr, "Error writing bind double to log file [%s]: %s\n", ref->logPath, strerror(errno));
|
||||
closeLog(ref->db);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// bind-int-arg-data: <statement-ref><index><data>
|
||||
void SRRecBindInt64(sqlite3_stmt *pStmt, int i, int64_t value) {
|
||||
if (!srr_enabled) return;
|
||||
if(pStmt!=NULL) {
|
||||
Vdbe *v = (Vdbe *)pStmt;
|
||||
SRRLogRef *ref = getLog(v->db);
|
||||
if (ref && (ref->depth == 0)) {
|
||||
SRRCommand code = SRRBindInt;
|
||||
struct timeval tv;
|
||||
size_t out;
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
out = write(ref->fd, &tv, sizeof(tv));
|
||||
if (out!=-1) { out = write(ref->fd, &code, sizeof(SRRCommand)); }
|
||||
if (out!=-1) {
|
||||
int64_t stmtInt = (int64_t)((intptr_t)(pStmt));
|
||||
out = write(ref->fd, &stmtInt, sizeof(int64_t));
|
||||
}
|
||||
if (out!=-1) { out = write(ref->fd, &i, sizeof(i)); }
|
||||
if (out!=-1) { out = write(ref->fd, &value, sizeof(value)); }
|
||||
if (out==-1) {
|
||||
fprintf(stderr, "Error writing bind int to log file [%s]: %s\n", ref->logPath, strerror(errno));
|
||||
closeLog(ref->db);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// bind-null-arg-data: <statement-ref><index>
|
||||
void SRRecBindNull(sqlite3_stmt *pStmt, int i) {
|
||||
if (!srr_enabled) return;
|
||||
if(pStmt!=NULL) {
|
||||
Vdbe *v = (Vdbe *)pStmt;
|
||||
SRRLogRef *ref = getLog(v->db);
|
||||
if (ref && (ref->depth == 0)) {
|
||||
SRRCommand code = SRRBindNull;
|
||||
struct timeval tv;
|
||||
size_t out;
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
out = write(ref->fd, &tv, sizeof(tv));
|
||||
if (out!=-1) { out = write(ref->fd, &code, sizeof(SRRCommand)); }
|
||||
if (out!=-1) {
|
||||
int64_t stmtInt = (int64_t)((intptr_t)(pStmt));
|
||||
out = write(ref->fd, &stmtInt, sizeof(int64_t));
|
||||
}
|
||||
if (out!=-1) { out = write(ref->fd, &i, sizeof(i)); }
|
||||
if (out==-1) {
|
||||
fprintf(stderr, "Error writing bind null to log file [%s]: %s\n", ref->logPath, strerror(errno));
|
||||
closeLog(ref->db);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// bind-value-arg-data: <statement-ref><index><len><data> ???
|
||||
void SRRecBindValue(sqlite3_stmt *pStmt, int i, const sqlite3_value *value) {
|
||||
if (!srr_enabled) return;
|
||||
if(pStmt!=NULL) {
|
||||
Vdbe *v = (Vdbe *)pStmt;
|
||||
SRRLogRef *ref = getLog(v->db);
|
||||
if (ref && (ref->depth == 0)) {
|
||||
fprintf(stderr, "SRRecBindValue(sqlite3_bind_value) is not yet supported, closing [%s]: %s\n", ref->logPath, strerror(errno));
|
||||
closeLog(ref->db);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// bind-clear-arg-data: <statement-ref>
|
||||
void SRRecClearBindings(sqlite3_stmt *pStmt) {
|
||||
if (!srr_enabled) return;
|
||||
if(pStmt!=NULL) {
|
||||
Vdbe *v = (Vdbe *)pStmt;
|
||||
SRRLogRef *ref = getLog(v->db);
|
||||
if (ref && (ref->depth == 0)) {
|
||||
SRRCommand code = SRRBindClear;
|
||||
struct timeval tv;
|
||||
size_t out;
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
out = write(ref->fd, &tv, sizeof(tv));
|
||||
if (out!=-1) { out = write(ref->fd, &code, sizeof(SRRCommand)); }
|
||||
if (out!=-1) {
|
||||
int64_t stmtInt = (int64_t)((intptr_t)(pStmt));
|
||||
out = write(ref->fd, &stmtInt, sizeof(int64_t));
|
||||
}
|
||||
if (out==-1) {
|
||||
fprintf(stderr, "Error writing clear bindings to log file [%s]: %s\n", ref->logPath, strerror(errno));
|
||||
closeLog(ref->db);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* SQLITE_ENABLE_SQLRR */
|
||||
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* sqlrr.h
|
||||
*/
|
||||
|
||||
#ifndef _SQLRR_H_
|
||||
#define _SQLRR_H_
|
||||
|
||||
/*
|
||||
** Header constants
|
||||
*/
|
||||
#define SRR_FILE_SIGNATURE "SQLRR"
|
||||
#define SRR_FILE_SIGNATURE_LEN 5
|
||||
#define SRR_FILE_VERSION 0x1
|
||||
#define SRR_FILE_VERSION_LEN 1
|
||||
|
||||
#if defined(SQLITE_ENABLE_SQLRR)
|
||||
|
||||
#include "sqlite3.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#define SRRecOpen(A,B,C) if(!rc){_SRRecOpen(A,B,C);}
|
||||
#define SRRecPrepare(A,B,C,D,E) if(!rc){_SRRecPrepare(A,B,C,D,E);}
|
||||
|
||||
typedef enum {
|
||||
SRROpen = 0,
|
||||
SRRClose = 1,
|
||||
SRRExec = 8,
|
||||
SRRBindText = 16,
|
||||
SRRBindBlob = 17,
|
||||
SRRBindDouble = 18,
|
||||
SRRBindInt = 19,
|
||||
SRRBindNull = 20,
|
||||
SRRBindValue = 21,
|
||||
SRRBindClear = 22,
|
||||
SRRPrepare = 32,
|
||||
SRRStep = 33,
|
||||
SRRReset = 34,
|
||||
SRRFinalize = 35
|
||||
} SRRCommand;
|
||||
|
||||
extern void SQLiteReplayRecorder(int flag);
|
||||
extern void _SRRecOpen(sqlite3 *db, const char *path, int flags);
|
||||
extern void SRRecClose(sqlite3 *db);
|
||||
extern void SRRecExec(sqlite3 *db, const char *sql);
|
||||
extern void SRRecExecEnd(sqlite3 *db);
|
||||
extern void _SRRecPrepare(sqlite3 *db, const char *sql, int nBytes, int saveSql, sqlite3_stmt *stmt);
|
||||
extern void SRRecStep(sqlite3_stmt *pStmt);
|
||||
extern void SRRecStepEnd(sqlite3_stmt *pStmt);
|
||||
extern void SRRecReset(sqlite3_stmt *pStmt);
|
||||
extern void SRRecFinalize(sqlite3_stmt *pStmt);
|
||||
extern void SRRecBindText(sqlite3_stmt *pStmt, int i, const char *zData, int64_t nData);
|
||||
extern void SRRecBindBlob(sqlite3_stmt *pStmt, int i, const char *zData, int64_t nData);
|
||||
extern void SRRecBindDouble(sqlite3_stmt *pStmt, int i, double value);
|
||||
extern void SRRecBindInt64(sqlite3_stmt *pStmt, int i, int64_t value);
|
||||
extern void SRRecBindNull(sqlite3_stmt *pStmt, int i);
|
||||
extern void SRRecBindValue(sqlite3_stmt *pStmt, int i, const sqlite3_value *value);
|
||||
extern void SRRecClearBindings(sqlite3_stmt *pStmt);
|
||||
|
||||
#endif /* defined(SQLITE_ENABLE_SQLRR) */
|
||||
|
||||
#endif /* _SQLRR_H_ */
|
||||
@@ -229,6 +229,9 @@ SRC += \
|
||||
$(TOP)/ext/rtree/sqlite3rtree.h \
|
||||
$(TOP)/ext/rtree/rtree.h \
|
||||
$(TOP)/ext/rtree/rtree.c
|
||||
SRC += \
|
||||
$(TOP)/ext/sqlrr/sqlrr.h \
|
||||
$(TOP)/ext/sqlrr/sqlrr.c
|
||||
SRC += \
|
||||
$(TOP)/ext/session/sqlite3session.c \
|
||||
$(TOP)/ext/session/sqlite3session.h
|
||||
@@ -460,22 +463,7 @@ HDR = \
|
||||
# Header files used by extensions
|
||||
#
|
||||
EXTHDR += \
|
||||
$(TOP)/ext/fts1/fts1.h \
|
||||
$(TOP)/ext/fts1/fts1_hash.h \
|
||||
$(TOP)/ext/fts1/fts1_tokenizer.h
|
||||
EXTHDR += \
|
||||
$(TOP)/ext/fts2/fts2.h \
|
||||
$(TOP)/ext/fts2/fts2_hash.h \
|
||||
$(TOP)/ext/fts2/fts2_tokenizer.h
|
||||
EXTHDR += \
|
||||
$(TOP)/ext/fts3/fts3.h \
|
||||
$(TOP)/ext/fts3/fts3Int.h \
|
||||
$(TOP)/ext/fts3/fts3_hash.h \
|
||||
$(TOP)/ext/fts3/fts3_tokenizer.h
|
||||
EXTHDR += \
|
||||
$(TOP)/ext/rtree/rtree.h
|
||||
EXTHDR += \
|
||||
$(TOP)/ext/icu/sqliteicu.h
|
||||
$(TOP)/ext/sqlrr/sqlrr.h
|
||||
EXTHDR += \
|
||||
$(TOP)/ext/fts5/fts5Int.h \
|
||||
fts5parse.h \
|
||||
@@ -605,10 +593,10 @@ sqlite3.o: sqlite3.c
|
||||
# files are automatically generated. This target takes care of
|
||||
# all that automatic generation.
|
||||
#
|
||||
target_source: $(SRC) $(TOP)/tool/vdbe-compress.tcl fts5.c
|
||||
target_source: $(SRC) $(EXTHDR) $(TOP)/tool/vdbe-compress.tcl fts5.c
|
||||
rm -rf tsrc
|
||||
mkdir tsrc
|
||||
cp -f $(SRC) tsrc
|
||||
cp -f $(SRC) $(EXTHDR) tsrc
|
||||
rm tsrc/sqlite.h.in tsrc/parse.y
|
||||
tclsh $(TOP)/tool/vdbe-compress.tcl $(OPTS) <tsrc/vdbe.c >vdbe.new
|
||||
mv vdbe.new tsrc/vdbe.c
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
C Avoid\susing\sa\smisaligned\spointer.
|
||||
D 2018-06-02T19:14:58.082
|
||||
C Add\sthe\sexprNodeCopy()\sroutine\sthat\swill\ssafely\smemcpy()\san\sExpr\snode\sthat\nmight\sbe\sa\ssize-reduced\snode.
|
||||
D 2019-05-07T02:57:28.889
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F Makefile.in bfc40f350586923e0419d2ea4b559c37ec10ee4b6e210e08c14401f8e340f0da
|
||||
F Makefile.in ab754e8fb9a83a308dfef344fd3a86bb93956d8ac0b4b461b96f6201a76f75f0
|
||||
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
||||
F Makefile.msc 681fb88cccf1fd58c0b9648f6a09b75332206ef72ca76012ad11699c320cec5f
|
||||
F Makefile.msc 887c54fc449b1880711e86f16f8afb1158a55884292895faeb3259a060e7e212
|
||||
F README.md 7764d56778d567913ef11c82da9ab94aefa0826f7c243351e4e2d7adaef6f373
|
||||
F VERSION b7c9d1d11cb70ef8e90cfcf3c944aa58a9f801cc2ad487eebb0a110c16dfc2df
|
||||
F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
|
||||
@@ -356,7 +356,7 @@ F ext/repair/test/checkfreelist01.test 3e8aa6aeb4007680c94a8d07b41c339aa635cc782
|
||||
F ext/repair/test/checkindex01.test 6945d0ffc0c1dc993b2ce88036b26e0f5d6fcc65da70fc9df27c2647bb358b0f
|
||||
F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c
|
||||
F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761
|
||||
F ext/rtree/rtree.c cb6d4bd43c118354fe5b5213843da058259467ecdbac0c6f71ead0fd89acf4ec
|
||||
F ext/rtree/rtree.c a1444c00551402b805a8d3181f80effc9f563426fa31b168f48b90537fba9f63
|
||||
F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412
|
||||
F ext/rtree/rtree1.test 309afc04d4287542b2cd74f933296832cc681c7b014d9405cb329b62053a5349
|
||||
F ext/rtree/rtree2.test 5f25b01acd03470067a2d52783b2eb0a50bf836803d4342d20ca39e541220fe2
|
||||
@@ -411,13 +411,16 @@ F ext/session/sessionwor.test 2f3744236dc8b170a695b7d8ddc8c743c7e79fdc
|
||||
F ext/session/sqlite3session.c 2d29bbd888599b94b2c8b31ff433675e008273a4d225b336508b18e6187fec1d
|
||||
F ext/session/sqlite3session.h c01820d5b6e73e86d88008f4d1c1c7dfb83422963018292b864028a0400ceccf
|
||||
F ext/session/test_session.c dba36c6c0153b22501112d3e8882b5c946cf617c955153b6712bd2f8ba1428c0
|
||||
F ext/sqlrr/README.txt 4239030e73023e72a2e727808cd433577d5bf730
|
||||
F ext/sqlrr/sqlrr.c 8d1e6571cd6a6beabdb5bcdfe3a0e723b914db41
|
||||
F ext/sqlrr/sqlrr.h 09e4f8929ad9bc2638732c0cc0db5eef8c417824
|
||||
F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3
|
||||
F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04
|
||||
F ext/userauth/userauth.c 3410be31283abba70255d71fd24734e017a4497f
|
||||
F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
|
||||
F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
|
||||
F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60
|
||||
F main.mk 3f50dfe5cb4257c1aca96e417636ed51bc2561e71d31a21e9ccdf66feb912f43
|
||||
F main.mk ec0a9fd7686a9e4f11b47403a2ae5a9de6720e3b5e48b7292ad34cf625b9a249
|
||||
F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83
|
||||
F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271
|
||||
F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504
|
||||
@@ -436,7 +439,7 @@ F src/auth.c a38f3c63c974787ecf75e3213f8cac6568b9a7af7591fb0372ec0517dd16dca8
|
||||
F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b
|
||||
F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33
|
||||
F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
|
||||
F src/btree.c 44405d03a05496e13b40b3a208bcf941c42c815da90d6ff4b04267a6985e5eb7
|
||||
F src/btree.c 194a98d932f33a8fef0873f0cabd9c221c72c140caae8e5ddfee095fd0e47ffd
|
||||
F src/btree.h 448f15b98ea85dcf7e4eb76f731cadb89636c676ad25dfaac6de77cd66556598
|
||||
F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96
|
||||
F src/build.c 5fc41458505331bfb0c175f40b9a13cb335f826bed3ae311aaae000c132d7b16
|
||||
@@ -447,7 +450,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957
|
||||
F src/dbpage.c 8db4c97f630e7d83f884ea75caf1ffd0988c160e9d530194d93721c80821e0f6
|
||||
F src/dbstat.c edabb82611143727511a45ca0859b8cd037851ebe756ae3db289859dd18b6f91
|
||||
F src/delete.c 4c8c7604277a2041647f96b78f4b9a47858e9217e4fb333d35e7b5ab32c5b57f
|
||||
F src/expr.c 16f90ae2af2a100bc430a89184afde54878d82f18267e8d00bc4f33e695a7c57
|
||||
F src/expr.c 2d96dc299acee05a59da770e9a276cceb54558d2767104d915d16d8a466b1c67
|
||||
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
||||
F src/fkey.c b1da9ef8dc834603bb0d28972378a7ce65897847f9a1e89ab800bbdf24c788ee
|
||||
F src/func.c e2e3c02621a528a472933fd4733a5da635676f1461be73293f6e9f62f18d4eaa
|
||||
@@ -457,9 +460,9 @@ F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4
|
||||
F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da
|
||||
F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
|
||||
F src/insert.c 76b1dc902e4c3930d9a17a40cd8ee2e94b1fd8cce766672caef164a6d5d4df1d
|
||||
F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e
|
||||
F src/legacy.c 83f4499122392b1f1527a5180b1e89951bf640611ce98768bde1a9f28f0f7dde
|
||||
F src/loadext.c 6aae5739198d96c51ae6eb97c4a5b1744c22ed7a5a565a5399a717780d48a36b
|
||||
F src/main.c 0402e234155e0aad75fe6cd204864f492495be8605a50b4b3d4d72895cced3ce
|
||||
F src/main.c 0eba75a0a4a7a4ea0d68ecf01a21f145e351984fa4efe101c54caaa244d671ae
|
||||
F src/malloc.c 07295435093ce354c6d9063ac05a2eeae28bd251d2e63c48b3d67c12c76f7e18
|
||||
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
|
||||
F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de
|
||||
@@ -475,37 +478,38 @@ F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4
|
||||
F src/mutex_unix.c aaf9ebc3f89df28483c52208497a99a02cc3650011422fc9d4c57e4392f7fe58
|
||||
F src/mutex_w32.c 7670d770c94bbfe8289bec9d7f1394c5a00a57c37f892aab6b6612d085255235
|
||||
F src/notify.c 9711a7575036f0d3040ba61bc6e217f13a9888e7
|
||||
F src/os.c 1cb0d1d1b3a4267966dee6e292d2b2cdf88e47c0c59cebff27ecafac052dd165
|
||||
F src/os.c c46d15f4cbe775cd9eb703cc3a1d59a1c32f7dd4e79f01e0123dc7daa54b24b8
|
||||
F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432
|
||||
F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85
|
||||
F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586
|
||||
F src/os_unix.c c230a7a24766320d8414afd087edcd43e499fb45e86361f6f4f464f343d965a9
|
||||
F src/os_win.c ac29c25cde4cfb4adacc59cdec4aa45698ca0e29164ea127859585ccd9faa354
|
||||
F src/os_unix.c 90421208ca051e062158af9ac8f3917f9af17e12fddbe40901f3c46fdf6316f9
|
||||
F src/os_win.c 9f0d1f91afc260dd95d02218c8816b49dd083f25e651739a4b27a85f0cdf15e8
|
||||
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
|
||||
F src/pager.c 1bb6a57fa0465296a4d6109a1a64610a0e7adde1f3acf3ef539a9d972908ce8f
|
||||
F src/pager.h c571b064df842ec8f2e90855dead9acf4cbe0d1b2c05afe0ef0d0145f7fd0388
|
||||
F src/pager.c a6f2fcf933b872db6c6987a10da651f87c14253fccccc3fa35de2491da9474e3
|
||||
F src/pager.h 340c4396d108cf3858ba0f8da46143d8d6fa3af399a7056f4cc2b6ffa39da29b
|
||||
F src/parse.y 0b81472496809693a139067fea1fe3f14a7be8aa26c8f18bb327034d1252a06a
|
||||
F src/pcache.c 135ef0bc6fb2e3b7178d49ab5c9176254c8a691832c1bceb1156b2fbdd0869bd
|
||||
F src/pcache.h 072f94d29281cffd99e46c1539849f248c4b56ae7684c1f36626797fee375170
|
||||
F src/pcache1.c 716975564c15eb6679e97f734cec1bfd6c16ac3d4010f05f1f8e509fc7d19880
|
||||
F src/pragma.c c0d13c0e82a9197aef5533d63300c5b0c8a216ae1fd14ada64e1f12f398d7e82
|
||||
F src/pcache1.c 77a8848baa3d396b8f597b2e8ba85d82ba00584e45e1c1c27d413712a1b0d88a
|
||||
F src/pragma.c fc2af8cd6c0944e319a7e1efc89ea3c8fc38430651f30e1a8fed81428c34c822
|
||||
F src/pragma.h bb83728944b42f6d409c77f5838a8edbdb0fe83046c5496ffc9602b40340a324
|
||||
F src/prepare.c 95a9dba7a5d032039a77775188cb3b6fb17f2fa1a0b7cd915b30b4b823383ffa
|
||||
F src/prepare.c 04a30fc5382abf1b5ee8bded957770701364f9479e1bfa364152bc74aff6a362
|
||||
F src/printf.c 7f6f3cba8e0c49c19e30a1ff4e9aeda6e06814dcbad4b664a69e1b6cb6e7e365
|
||||
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
||||
F src/resolve.c 14602f46800ba182ea6a490e0f304127d29ac1f724bdadcc639e25d3223fcf6e
|
||||
F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
|
||||
F src/select.c 3291892add3a8f01dc3754e40ef9e30ad22c78e3404a388ae58f0390a1fb29eb
|
||||
F src/shell.c.in c29cb307d6275131e6f9874e0fa73f87acf40a22c4a82faba2059a93b4d294d1
|
||||
F src/sqlite.h.in 63b07f76731f2b1e55c48fdb9f0508dcc6fbe3971010b8612ffd847c3c56d9a1
|
||||
F src/sqlite.h.in a93959f471da0867d8fcf88d822f990679bdcd0fbb3378ef7d14e2fc20f68bfc
|
||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||
F src/sqlite3_private.h aee73ebaea1963e528b61408c01ba82f49fdf3dca9cbe940f3b0f3d9cec25942
|
||||
F src/sqlite3ext.h 9887b27e69c01e79c2cbe74ef73bf01af5b5703d6a7f0a4371e386d7249cb1c7
|
||||
F src/sqliteInt.h d2bd297dba08f2390a91c31ff775e0964e9663df5b2910a569fe6f830b8b2beb
|
||||
F src/sqliteInt.h 96b4eedd7c010ebe48b224c578e567976bf24eecbd45f9eb0e0093b9d681933e
|
||||
F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
|
||||
F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e
|
||||
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
|
||||
F src/tclsqlite.c 916a92de77ec5cbe27818ca194d8cf0c58aa7ad5b87527098f6aa5a6068800ce
|
||||
F src/test1.c 51aa5f3030217ca45eb62e90944838794d4faaae7a8f60e0330ae01f30bc997b
|
||||
F src/test1.c d49d47d44902032b22c484a9d6022630e3303776e1650682250854d1e5148f86
|
||||
F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5
|
||||
F src/test3.c b8434949dfb8aff8dfa082c8b592109e77844c2135ed3c492113839b6956255b
|
||||
F src/test4.c 18ec393bb4d0ad1de729f0b94da7267270f3d8e6
|
||||
@@ -520,7 +524,7 @@ F src/test_backup.c bf5da90c9926df0a4b941f2d92825a01bbe090a0
|
||||
F src/test_bestindex.c 78809f11026f18a93fcfd798d9479cba37e1201c830260bf1edc674b2fa9b857
|
||||
F src/test_blob.c ae4a0620b478548afb67963095a7417cd06a4ec0a56adb453542203bfdcb31ce
|
||||
F src/test_btree.c 8b2dc8b8848cf3a4db93f11578f075e82252a274
|
||||
F src/test_config.c 097c6189803886a1fb26ec37d8bc62b90512cb53ab79a1fb6d35196c1ec42ded
|
||||
F src/test_config.c 15d4d8f38d920d20b991a4156e43c95aad465734545a6ae91d46447f1fde17a1
|
||||
F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f
|
||||
F src/test_demovfs.c a0c3bdd45ed044115c2c9f7779e56eafff18741e
|
||||
F src/test_devsym.c 1960abbb234b97e9b920f07e99503fc04b443f62bbc3c6ff2c2cea2133e3b8a2
|
||||
@@ -546,7 +550,7 @@ F src/test_rtree.c 671f3fae50ff116ef2e32a3bf1fe21b5615b4b7b
|
||||
F src/test_schema.c f575932cb6274d12147a77e13ea4b49d52408513
|
||||
F src/test_server.c a2615049954cbb9cfb4a62e18e2f0616e4dc38fe
|
||||
F src/test_sqllog.c 11e6ce7575f489155c604ac4b439f2ac1d3d5aef
|
||||
F src/test_superlock.c 4839644b9201da822f181c5bc406c0b2385f672e
|
||||
F src/test_superlock.c 793bb9d43a924c21993bcd6c2e200d3db8abf34e
|
||||
F src/test_syscall.c 1073306ba2e9bfc886771871a13d3de281ed3939
|
||||
F src/test_tclsh.c 58052fe48efe8f579834f4648d239569f2efc6285f5019ebdf0040f58d16238d
|
||||
F src/test_tclvar.c 33ff42149494a39c5fbb0df3d25d6fafb2f668888e41c0688d07273dcb268dfc
|
||||
@@ -565,10 +569,10 @@ F src/upsert.c 47edd408cc73f8d3c00a140550d1ad180b407c146285947969dd09874802bf88
|
||||
F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
|
||||
F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157
|
||||
F src/vacuum.c 37730af7540033135909ecaee3667dddec043293428d8718546d0d64ba4a5025
|
||||
F src/vdbe.c 71e5a72d89eabf7f88ef0ad4a429d3c3ee5d10de76af3818c47b275a6b3a9097
|
||||
F src/vdbe.c e0164a0f4d4efcc9335e6e1ec74656301f79642f8524183f2d08178314967702
|
||||
F src/vdbe.h e3f43bcc27ff30b0f25a6104d0cb5657e1c4b5e1b5cd2dd2216d5bcc2156a746
|
||||
F src/vdbeInt.h 42d3e65ea0c664f6d9bc9a53de645c0baf8566ff0188409ff3b8d2abc327bc17
|
||||
F src/vdbeapi.c 765a0bbe01311626417de6cb743f7f25f9f98435c98a9df4bb0714d11014633d
|
||||
F src/vdbeapi.c 409748b4bdb694bd1330cc6345f4aa47fe02224bbfb30de9afd2d2dd96026a3c
|
||||
F src/vdbeaux.c b00d35805a2b326d1371ab7ce8f3a95c8af35b1431367ffe482fc2c735d69fb1
|
||||
F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191
|
||||
F src/vdbemem.c 803323406d8623a7619ea5d5f74016697eeaed19c02b98ce9c3013e77dbe1c38
|
||||
@@ -576,14 +580,14 @@ F src/vdbesort.c 731a09e5cb9e96b70c394c1b7cf3860fbe84acca7682e178615eb941a3a0ef2
|
||||
F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392
|
||||
F src/vtab.c 10ea07dec111de6fb0a4fc87a7ffa4c65fdc088a19dbfaf7d6f2b128f2e8eb7b
|
||||
F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
|
||||
F src/wal.c aa9cffc7a2bad6b826a86c8562dd4978398720ed41cb8ee7aa9d054eb8b456a0
|
||||
F src/wal.h 8de5d2d3de0956d6f6cb48c83a4012d5f227b8fe940f3a349a4b7e85ebcb492a
|
||||
F src/wal.c fe0187275982737e0576ba2572f75d48a4ac70f37911cb68905644e690d884da
|
||||
F src/wal.h bada9007800e82f2765ad9ecd9f96176b45c71db769502e24de49d68c0acef65
|
||||
F src/walker.c da987a20d40145c0a03c07d8fefcb2ed363becc7680d0500d9c79915591f5b1f
|
||||
F src/where.c 60ec752fcbe9f9e0271ac60548d159a540a1ee47a4f9fedc85e88a3d0e392dd1
|
||||
F src/whereInt.h cbae2bcd37cfebdb7812a8b188cdb19634ced2b9346470d1c270556b0c33ea53
|
||||
F src/wherecode.c 728c7f70731430ccdac807a79969873e1af6968bf1c4745dff3f9dd35f636cc8
|
||||
F src/whereexpr.c e90b2e76dcabc81edff56633bf281bc01d93b71e0c81482dc06925ce39f5844a
|
||||
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
|
||||
F test/8_3_names.test 05034aadccd2253ffe6cbefb06662b8aa4600f77
|
||||
F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
|
||||
F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d
|
||||
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
|
||||
@@ -618,10 +622,10 @@ F test/async4.test 1787e3952128aa10238bf39945126de7ca23685a
|
||||
F test/async5.test 383ab533fdb9f7ad228cc99ee66e1acb34cc0dc0
|
||||
F test/atof1.test ff0b0156fd705b67c506e1f2bfe9e26102bea9bd
|
||||
F test/atomic.test 065a453dde33c77ff586d91ccaa6ed419829d492dbb1a5694b8a09f3f9d7d061
|
||||
F test/attach.test f4b8918ba2f3e88e6883b8452340545f10a1388af808343c37fc5c577be8281c
|
||||
F test/attach.test 402747cea8096d238f8ee8ad3e2b27c05613eb0eb8f697eae1ed1753926763fc
|
||||
F test/attach2.test 256bd240da1835fb8408dd59fb7ef71f8358c7a756c46662434d11d07ba3a0ce
|
||||
F test/attach3.test c59d92791070c59272e00183b7353eeb94915976
|
||||
F test/attach4.test 53bf502f17647c6d6c5add46dda6bac8b6f4665c
|
||||
F test/attach4.test faaaf33fa51f986b414520cb03cecdc7999df108
|
||||
F test/attachmalloc.test 3a4bfca9545bfe906a8d2e622de10fbac5b711b0
|
||||
F test/auth.test 3d6cd8f3978ba55b1202574e6ecd79c6e00914ca44b9bfd6c1fe6fb873fcac88
|
||||
F test/auth2.test 9eb7fce9f34bf1f50d3f366fb3e606be5a2000a1
|
||||
@@ -657,7 +661,7 @@ F test/bigfile2.test 1b489a3a39ae90c7f027b79110d6b4e1dbc71bfc
|
||||
F test/bigmmap.test 31dad31573638bd32de866cdefd11843f75685be4ba6aec1a47918f098f1899b
|
||||
F test/bigrow.test f0aeb7573dcb8caaafea76454be3ade29b7fc747
|
||||
F test/bigsort.test 8299fa9298f4f1e02fc7d2712e8b77d6cd60e5a2
|
||||
F test/bind.test 1e136709b306f7ed3192d349c2930d89df6ab621654ad6f1a72381d3fe76f483
|
||||
F test/bind.test d9134cb9300ccef302e94dfd66008dc24f14af48595e30beabb49dccbc0ef3ca
|
||||
F test/bindxfer.test efecd12c580c14df5f4ad3b3e83c667744a4f7e0
|
||||
F test/bitvec.test 75894a880520164d73b1305c1c3f96882615e142
|
||||
F test/blob.test e7ac6c7d3a985cc4678c64f325292529a69ae252
|
||||
@@ -673,7 +677,7 @@ F test/btree01.test e08b3613540145b353f20c81cb18ead54ff12e0f
|
||||
F test/btree02.test fe69453d474d8154d19b904157ff1db4812fed99
|
||||
F test/btreefault.test c2bcb542685eea44621275cfedbd8a13f65201e3
|
||||
F test/busy.test 510dc6daaad18bcbbc085bcc6217d6dc418def5e73f72ce1475eea0cb7834727
|
||||
F test/cache.test 13bc046b26210471ca6f2889aceb1ea52dc717de
|
||||
F test/cache.test 0bc2195f4a7207108af2617ed356e77daf4412f7
|
||||
F test/cacheflush.test af25bb1509df04c1da10e38d8f322d66eceedf61
|
||||
F test/cachespill.test 895997f84a25b323b166aecb69baab2d6380ea98f9e0bcc688c4493c535cfab9
|
||||
F test/capi2.test 34a1a9a96d543a2ec2c209696b11b164444f57253b1f2cba1c2e53fadede6c7b
|
||||
@@ -749,7 +753,7 @@ F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b
|
||||
F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e
|
||||
F test/dbpage.test dbf50a4d361f9e45a979432c727506065113124478a7d2db12074fa655e65d6c
|
||||
F test/dbstatus.test c15fa97f743dac7ce996814c84b56317e138895ee15ce27f15b608aa6924c90a
|
||||
F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef
|
||||
F test/dbstatus2.test ce94261a9e45cfd2d08195a82553c03b45c01e5ebad8a17888aeef818d9da69c
|
||||
F test/default.test 0cb49b1c315a0d81c81d775e407f66906a2a604d
|
||||
F test/delete.test 31832b0c45ecb51a54348c68db173be462985901e6ed7f403d6d7a8f70ab4ef0
|
||||
F test/delete2.test 3a03f2cca1f9a67ec469915cb8babd6485db43fa
|
||||
@@ -784,9 +788,9 @@ F test/e_totalchanges.test b12ee5809d3e63aeb83238dd501a7bca7fd72c10
|
||||
F test/e_update.test f46c2554d915c9197548681e8d8c33a267e84528
|
||||
F test/e_uri.test 47eeb2960e74613f0f8722b2f13aef08fde69daa16e5380ac93df84dac8b1f72
|
||||
F test/e_vacuum.test 1b8b4772d05374aa1b8958669138bbb4213ee26a
|
||||
F test/e_wal.test ae9a593207a77d711443ee69ffe081fda9243625
|
||||
F test/e_wal.test 95c21e45eefe4cc31e820f998b14f92d1cb3a1bf
|
||||
F test/e_walauto.test 248af31e73c98df23476a22bdb815524c9dc3ba8
|
||||
F test/e_walckpt.test 28c371a6bb5e5fe7f31679c1df1763a19d19e8a0
|
||||
F test/e_walckpt.test 9f20ab843538484c57069074b126699266ee5521
|
||||
F test/e_walhook.test 01b494287ba9e60b70f6ebf3c6c62e0ffe01788e344a4846b08e5de0b344cb66
|
||||
F test/emptytable.test a38110becbdfa6325cd65cb588dca658cd885f62
|
||||
F test/enc.test e54531cd6bf941ee6760be041dff19a104c7acea
|
||||
@@ -796,14 +800,14 @@ F test/enc4.test c8f1ce3618508fd0909945beb8b8831feef2c020
|
||||
F test/eqp.test 4fd69d25f21d8679f5fce13e639975879d89abf6acce4bd9cede133b7482aba7
|
||||
F test/errmsg.test eae9f091eb39ce7e20305de45d8e5d115b68fa856fba4ea6757b6ca3705ff7f9
|
||||
F test/eval.test a64c9105d6ff163df7cf09d6ac29cdad5922078c
|
||||
F test/exclusive.test 1206b87e192497d78c7f35552e86a9d05421498da300fb1cce5ca5351ccde3c3
|
||||
F test/exclusive.test e6b1f19261732fb0c32401393917b640d3b4e7df397f72ceff201d6548907f47
|
||||
F test/exclusive2.test 984090e8e9d1b331d2e8111daf6e5d61dda0bef7
|
||||
F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7
|
||||
F test/exists.test 79a75323c78f02bbe9c251ea502a092f9ef63dac
|
||||
F test/expr.test 7cb55e80aeb41d65fec968c08212505123063fea60bdc355d764d747670e9eea
|
||||
F test/extension01.test 00d13cec817f331a687a243e0e5a2d87b0e358c9
|
||||
F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79
|
||||
F test/fallocate.test 07416bd593a116d5893cb244f45a94d5c6fe030561df3bd972e6135f8106e509
|
||||
F test/fallocate.test 0ba4d7f1ca7268519f0f5515f654a924627ba1aa1efddca120d608ddb590b513
|
||||
F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3
|
||||
F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4
|
||||
F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768
|
||||
@@ -969,13 +973,13 @@ F test/in4.test d2b38cba404bc4320f4fe1b595b3d163f212c068
|
||||
F test/in5.test 7ae37fcd4a5e198291c6ab5f31a5bb3d15397efe8b75a6736d7a95a7b8dd9e08
|
||||
F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822
|
||||
F test/incrblob2.test a494c9e848560039a23974b9119cfc2cf3ad3bd15cc2694ee6367ae537ef8f1f
|
||||
F test/incrblob3.test d8d036fde015d4a159cd3cbae9d29003b37227a4
|
||||
F test/incrblob3.test 5fa6f2665ae37da05928bb16851d4f86515af78a
|
||||
F test/incrblob4.test 21a52a6843a56cdcce968c6a86b72a7066d0e6ba
|
||||
F test/incrblob_err.test 69f9247fed50278d48ea710d1a8f9cdb09e4c0b8
|
||||
F test/incrblobfault.test 74dd8ac108304cea0b4a0df6df63a1567e558758
|
||||
F test/incrcorrupt.test 6c567fbf870aa9e91866fe52ce6f200cd548939a
|
||||
F test/incrvacuum.test b729aab1d4983037da57e66c20dfd7458561a85626dcf824f60175e35f4ce152
|
||||
F test/incrvacuum2.test 7d26cfda66c7e55898d196de54ac4ec7d86a4e3d
|
||||
F test/incrvacuum2.test 1e873b6caf87ce160d4cb6d8c7a46f0570da1ddc
|
||||
F test/incrvacuum3.test 75256fb1377e7c39ef2de62bfc42bbff67be295a
|
||||
F test/incrvacuum_ioerr.test 6ae2f783424e47a0033304808fe27789cf93e635
|
||||
F test/index.test fe3c7a1aad82af92623747e9c3f3aa94ccd51238
|
||||
@@ -1019,7 +1023,7 @@ F test/join5.test 5a2da0c3ea852a7063d3e72fc7d5a04a6de5ef6e6d85092582f69033f7459a
|
||||
F test/join6.test cfe6503791ceb0cbb509966740286ec423cbf10b
|
||||
F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497
|
||||
F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4
|
||||
F test/journal3.test c9c29883f5bf535ae82ae21c472df6263806a22e467b6db7cd0d6d545305b4f6
|
||||
F test/journal3.test eab2157ce43e68866782917aa0857de736ec2d42d825fc500d6836b707c236ba
|
||||
F test/jrnlmode.test a6693f2bed4541a21e703aaa37bb3e10de154130645952933b82b2dec0a8b539
|
||||
F test/jrnlmode2.test 8759a1d4657c064637f8b079592651530db738419e1d649c6df7048cd724363d
|
||||
F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa
|
||||
@@ -1042,12 +1046,13 @@ F test/lock.test be4fe08118fb988fed741f429b7dd5d65e1c90db
|
||||
F test/lock2.test 5242d8ac4e2d59c403aebff606af449b455aceff
|
||||
F test/lock3.test f271375930711ae044080f4fe6d6eda930870d00
|
||||
F test/lock4.test 27143363eda1622f03c133efc8db808fc331afd973486cb571ea71cd717d37b8
|
||||
F test/lock5.test c6c5e0ebcb21c61a572870cc86c0cb9f14cede38
|
||||
F test/lock6.test ad5b387a3a8096afd3c68a55b9535056431b0cf5
|
||||
F test/lock5.test 1f1e0fd1670deef8c0a76e8f895bd5e124133ca4
|
||||
F test/lock6.test 83434ae8ca1d1c5e2eaf74d4e44aa24ab62b291c
|
||||
F test/lock7.test 49f1eaff1cdc491cc5dee3669f3c671d9f172431
|
||||
F test/lock_common.tcl 7ffb45accf6ee91c736df9bafe0806a44358f035
|
||||
F test/lock_proxy.test 95be9c32d79be25cf643b4e41a0aa0e53aa21621
|
||||
F test/lookaside.test b17c99ae3aef96a8c9fa6f6be33cc75b93d657cb791d3827302b6835b71941f7
|
||||
F test/main.test 6bbb3999fd461eb8fb335cbab97409a3d7f91bbb8da60635e8be3e4a04a77772
|
||||
F test/main.test ad8fa65ab7f5d5c6cc4ac287f9d70f21d285361e3ab194fcba16ddf49b7c29d7
|
||||
F test/make-where7.tcl 05c16b5d4f5d6512881dfec560cb793915932ef9
|
||||
F test/malloc.test 18dd1c4188c81ca79cf123527c71b19ee0c31feb9947fdffb0dc6ceb1436816a
|
||||
F test/malloc3.test 6e88bae6312854a4adb4ecc2a6a5ea8c59b4db778b724ba718e1c43fc8c3c136
|
||||
@@ -1071,13 +1076,13 @@ F test/mallocJ.test b5d1839da331d96223e5f458856f8ffe1366f62e
|
||||
F test/mallocK.test 1f4b5efbf61715ab79b20b38739ff4b3d110ceb53f54e5db6da1f01c083707ab
|
||||
F test/mallocL.test fb311ff80afddf3b1a75e52289081f4754d901dc
|
||||
F test/mallocM.test 78bbe9d3da84a5c679123cdb40d7b2010b18fc46e13897e4f253c6ba6fbff134
|
||||
F test/malloc_common.tcl aac62499b76be719fac31e7a3e54a7fd53272e7f
|
||||
F test/manydb.test 28385ae2087967aa05c38624cec7d96ec74feb3e
|
||||
F test/malloc_common.tcl 8d368ee0b9d77c9643b174448f137c18b68e49f4
|
||||
F test/manydb.test 3cd8e52ab3112cb8365afeedd6e8231977920577
|
||||
F test/mem5.test c6460fba403c5703141348cd90de1c294188c68f
|
||||
F test/memdb.test c1f2a343ad14398d5d6debda6ea33e80d0dafcc7
|
||||
F test/memdb.test c46019291625650d71416e770f6a54a281a1a98f
|
||||
F test/memdb1.test 61aa1dbdeea6320791d2ff42a9a6149d5716be674bf06ee0ffa0aad1bf3eb5f8
|
||||
F test/memleak.test 10b9c6c57e19fc68c32941495e9ba1c50123f6e2
|
||||
F test/memsubsys1.test 9e7555a22173b8f1c96c281ce289b338fcba2abe8b157f8798ca195bbf1d347e
|
||||
F test/memsubsys1.test 21f6e0e93302665caa03f37bf832afa1e8dde768d3f5547a5c59a03655d3bfaa
|
||||
F test/memsubsys2.test 3e4a8d0c05fd3e5fa92017c64666730a520c7e08
|
||||
F test/minmax.test 6751e87b409fe11b02e70a306d846fa544e25a41
|
||||
F test/minmax2.test dae92964ac87c1d2ef978c582e81a95e11c00f1cbef68980bfb2abaf10315063
|
||||
@@ -1099,7 +1104,7 @@ F test/mmap3.test b3c297e78e6a8520aafcc1a8f140535594c9086e
|
||||
F test/mmap4.test 2e2b4e32555b58da15176e6fe750f17c9dcf7f93
|
||||
F test/mmapfault.test d4c9eff9cd8c2dc14bc43e71e042f175b0a26fe3
|
||||
F test/mmapwarm.test 2272005969cd17a910077bd5082f70bc1fefad9a875afec7fc9af483898ecaf3
|
||||
F test/multiplex.test dc0d67b66f84b484a83cb8bbdf3f0a7f49562ccd
|
||||
F test/multiplex.test 659fdd41065d4af3fc769b87052c275d0c4685fb
|
||||
F test/multiplex2.test 580ca5817c7edbe4cc68fa150609c9473393003a
|
||||
F test/multiplex3.test d228f59eac91839a977eac19f21d053f03e4d101
|
||||
F test/multiplex4.test e8ae4c4bd70606a5727743241f13b5701990abe4
|
||||
@@ -1134,24 +1139,24 @@ F test/oserror.test e7b3416be4b9d5dd2fe0b42dd394daaddbb6c83eeec1f0e47b120b53e0ad
|
||||
F test/ossfuzz.c c4c4547e2c92ac52f10038b073a03248251a23c1c559728f63a18aeca0e79f03
|
||||
F test/ossshell.c f125c5bd16e537a2549aa579b328dd1c59905e7ab1338dfc210e755bb7b69f17
|
||||
F test/ovfl.test 199c482696defceacee8c8e0e0ef36da62726b2f
|
||||
F test/pager1.test a32ce299ed01ffb06e84a3af467ae1f3389786b316f40c4359f442c79144736b
|
||||
F test/pager1.test cfd1c1dd00c5d5dece44476e817cfb57b578a4c1ef1425307001da6bdfa6a24f
|
||||
F test/pager2.test 67b8f40ae98112bcdba1f2b2d03ea83266418c71
|
||||
F test/pager3.test 4e9a83d6ca0838d7c602c9eb93d1357562d9059c1e02ffb138a8271020838370
|
||||
F test/pager4.test a122e9e6925d5b23b31e3dfef8c6a44bbf19590e
|
||||
F test/pagerfault.test 63c5da625562c66345ab4528790327ca63db2f6f9cbae2aba8cb7c51de3d1628
|
||||
F test/pagerfault.test 4934ada4438c6bb3f58bbffed5147cd22208ae2dda7837b6e012cf212a3eff51
|
||||
F test/pagerfault2.test caf4c7facb914fd3b03a17b31ae2b180c8d6ca1f
|
||||
F test/pagerfault3.test 1003fcda009bf48a8e22a516e193b6ef0dd1bbd8
|
||||
F test/pageropt.test 84e4cc5cbca285357f7906e99b21be4f2bf5abc0
|
||||
F test/pagesize.test 5769fc62d8c890a83a503f67d47508dfdc543305
|
||||
F test/parser1.test 391b9bf9a229547a129c61ac345ed1a6f5eb1854
|
||||
F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b
|
||||
F test/pcache.test 9a04fa260cb47dd4fdc5d13c5e97054e05931592
|
||||
F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442
|
||||
F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff
|
||||
F test/permutations.test 10793f1de89a226fa22dde9ba9398de22571fee1bfb53a935a11be4aa014704f
|
||||
F test/pragma.test 7c8cfc328a1717a95663cf8edb06c52ddfeaf97bb0aee69ae7457132e8d39e7d
|
||||
F test/pragma.test 3ce8294c0f86ef7586e44fdc7be887f0cfeaec01093ad3e24d5736b96fb55984
|
||||
F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f
|
||||
F test/pragma3.test 14c12bc5352b1e100e0b6b44f371053a81ccf8ed
|
||||
F test/pragma4.test 3046501bee2f652dc2a4f9c87781e2741361d6864439c8381aba6c3b774b335c
|
||||
F test/pragma4.test da107b2fd465e67aa9f419a4e313b26b76336fabf71059c51d0b3211a6ae3c51
|
||||
F test/pragma5.test 824ce6ced5d6b7ec71abe37fc6005ff836fe39d638273dc5192b39864b9ee983
|
||||
F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8
|
||||
F test/printf.test b3ff34e73d59124140eaf89f7672e21bc2ca5fcc
|
||||
@@ -1178,7 +1183,7 @@ F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb
|
||||
F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa
|
||||
F test/rollback2.test bc868d57899dc6972e2b4483faae0e03365a0556941474eec487ae21d8d38bb6
|
||||
F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a
|
||||
F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc
|
||||
F test/rowallock.test e8c576ebc92f6b9211662f495658fd39bbcacb5b
|
||||
F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81
|
||||
F test/rowid.test 5b7509f384f4f6fae1af3c8c104c8ca299fea18d
|
||||
F test/rowvalue.test ef851a80f7e6de93b51caca9e4b6b7d2dcd540bbcca7d51860e80435b8b4c0de
|
||||
@@ -1229,7 +1234,7 @@ F test/server1.test 46803bd3fe8b99b30dbc5ff38ffc756f5c13a118
|
||||
F test/session.test 78fa2365e93d3663a6e933f86e7afc395adf18be
|
||||
F test/sessionfuzz-data1.db 1f8d5def831f19b1c74571037f0d53a588ea49a6c4ca2a028fc0c27ef896dbcb
|
||||
F test/sessionfuzz.c b0fcdcf757451957e17396a3af5171f1fdf9b2babc81da9fa35675df46c4729a
|
||||
F test/shared.test 1da9dbad400cee0d93f252ccf76e1ae007a63746
|
||||
F test/shared.test 13376ba3be1c5685ab1ec184189adabd15fa70be
|
||||
F test/shared2.test 03eb4a8d372e290107d34b6ce1809919a698e879
|
||||
F test/shared3.test ab693f9b6e156b8bfb2a0ad94f29fe69602a5d38
|
||||
F test/shared4.test c75f476804e76e26bf6fa0e7b421fb0ca7d07558
|
||||
@@ -1251,7 +1256,7 @@ F test/shell7.test 115132f66d0463417f408562cc2cf534f6bbc6d83a6d50f0072a9eb171bae
|
||||
F test/shell8.test 96be02ea0c21f05b24c1883d7b711a1fa8525a68ab7b636aacf6057876941013
|
||||
F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3
|
||||
F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5
|
||||
F test/shrink.test 1b4330b1fd9e818c04726d45cb28db73087535ce
|
||||
F test/shrink.test 09bc6e2473321e7a4711ae7d753865daffc42f4a
|
||||
F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329
|
||||
F test/skipscan1.test 8ab5d2c7c5cd3fe7f172d366e6e74e887cb33cb4
|
||||
F test/skipscan2.test ef143c6e4a5ba4f19c1d1e3f517811f7942bdf2142736cc568feb34e0b5fb763
|
||||
@@ -1289,7 +1294,7 @@ F test/sqllimits1.test a74ee2a3740b9f9c2437c246d8fb77354862a142
|
||||
F test/sqllog.test 6af6cb0b09f4e44e1917e06ce85be7670302517a
|
||||
F test/stat.test f8f1279ffffabe6df825723af18cc6e0ae70a893
|
||||
F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1
|
||||
F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75
|
||||
F test/stmt.test 96bf5c903079f6966498428c953e13dd0192add53230de87a52c59bd505d060a
|
||||
F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5
|
||||
F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49
|
||||
F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f
|
||||
@@ -1297,7 +1302,7 @@ F test/subquery2.test 8250dfd6a773b04c7a5c37ac63276f62b329157ce171244d0cbe1acc36
|
||||
F test/subselect.test 0966aa8e720224dbd6a5e769a3ec2a723e332303
|
||||
F test/substr.test 18f57c4ca8a598805c4d64e304c418734d843c1a
|
||||
F test/subtype1.test 7fe09496352f97053af1437150751be2d0a0cae8
|
||||
F test/superlock.test ec94f0556b6488d97f71c79f9061ae08d9ab8f12
|
||||
F test/superlock.test c86eacd6cead5da9c5ecd25f3d46fca30a927ef2
|
||||
F test/swarmvtab.test 9a3fd5ab3e9b3c976ad1b3d7646aab725114f2ac26b59395d0778b33bab6cdaf
|
||||
F test/swarmvtab2.test c948cb2fdfc5b01d85e8f6d6504854202dc1a0782ab2a0ed61538f27cbd0aa5c
|
||||
F test/swarmvtab3.test 6cb664669630fcec4102a09333e52068734858fd2761eee3b0465c14cdbcee29
|
||||
@@ -1312,14 +1317,14 @@ F test/table.test b708f3e5fa2542fa51dfab21fc07b36ea445cb2f
|
||||
F test/tableapi.test 2674633fa95d80da917571ebdd759a14d9819126
|
||||
F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930
|
||||
F test/tclsqlite.test 5337e8890b96dad1ee541b15fbeec32e6bac2fe7fa096f91089057385aadba9b
|
||||
F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08
|
||||
F test/tempdb.test 8d0c2ee1cc2286629ca1d7e4e470a8ecf3951b65fb93c6bb7e27fee8ed9f8055
|
||||
F test/tempdb2.test 4749545409c6d7438b435c3f05cdd139cf4145a954a6908d19e3443ffd8724b3
|
||||
F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900
|
||||
F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30
|
||||
F test/temptable2.test d2940417496e2b9548e01d09990763fbe88c316504033256d51493e1f1a5ce6a
|
||||
F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637
|
||||
F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc
|
||||
F test/tester.tcl aa7558f20fcf7dd9151325f849d9103bd450235093bc078073bf0f080991e3c4
|
||||
F test/tester.tcl 06501adc7445d67c50bae9d0d6ede96cb44963369ab1ddeb4d770f79cfd4f974
|
||||
F test/thread001.test b61a29dd87cf669f5f6ac96124a7c97d71b0c80d9012746072055877055cf9ef
|
||||
F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58
|
||||
F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7
|
||||
@@ -1336,10 +1341,10 @@ F test/time-wordcount.sh 8e0b0f8109367827ad5d58f5cc849705731e4b90
|
||||
F test/tkt-02a8e81d44.test 6c80d9c7514e2a42d4918bf87bf6bc54f379110c
|
||||
F test/tkt-26ff0c2d1e.test c15bec890c4d226c0da2f35ff30f9e84c169cfef90e73a8cb5cec11d723dfa96
|
||||
F test/tkt-2a5629202f.test 0521bd25658428baa26665aa53ffed9367d33af2
|
||||
F test/tkt-2d1a5c67d.test be1326f3061caec85085f4c9ee4490561ca037c0
|
||||
F test/tkt-2d1a5c67d.test 58a56653795d1787f4ed661f9da7da153b0dc3f9
|
||||
F test/tkt-2ea2425d34.test 1cf13e6f75d149b3209a0cb32927a82d3d79fb28
|
||||
F test/tkt-31338dca7e.test 6fb8807851964da0d24e942f2e19c7c705b9fb58
|
||||
F test/tkt-313723c356.test 4b306ad45c736cedf2f5221f6155b92143244b6d
|
||||
F test/tkt-313723c356.test d78f772dd71d632f3d3f6d3d588c3105b2ab1bb3
|
||||
F test/tkt-385a5b56b9.test 5204a7cba0e28c99df0acbf95af5e1af4d32965a7a14de6eccebf949607618b1
|
||||
F test/tkt-38cb5df375.test f3cc8671f1eb604d4ae9cf886ed4366bec656678
|
||||
F test/tkt-3998683a16.test 6d1d04d551ed1704eb3396ca87bb9ccc8c5c1eb7
|
||||
@@ -1439,7 +1444,7 @@ F test/tkt3357.test 77c37c6482b526fe89941ce951c22d011f5922ed
|
||||
F test/tkt3419.test 1bbf36d7ea03b638c15804251287c2391f5c1f6b
|
||||
F test/tkt3424.test 61f831bd2b071bd128fa5d00fbda57e656ca5812
|
||||
F test/tkt3442.test a1fc47c669e651d16494de3ff349bcb53281456f2ca02c8bc14220b6044bbfe8
|
||||
F test/tkt3457.test 5651e2cbb94645b677ec663160b9e192b87b7d365aecdfb24e19f749575a6fc2
|
||||
F test/tkt3457.test 0316b1541debab33d784e82bd41efa05fd26931a77018c6e762d79e15087210a
|
||||
F test/tkt3461.test 228ea328a5a21e8663f80ee3d212a6ad92549a19
|
||||
F test/tkt3493.test 1686cbde85f8721fc1bdc0ee72f2ef2f63139218
|
||||
F test/tkt3508.test d75704db9501625c7f7deec119fcaf1696aefb7d
|
||||
@@ -1553,38 +1558,38 @@ F test/vtabJ.test d7b73675708cf63cfcb9d443bb451fc01a028347275b7311e51f9fdf3ca675
|
||||
F test/vtab_alter.test 736e66fb5ec7b4fee58229aa3ada2f27ec58bc58c00edae4836890c3784c6783
|
||||
F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8
|
||||
F test/vtab_shared.test 5253bff2355a9a3f014c15337da7e177ab0ef8ad
|
||||
F test/wal.test 613efec03e517e1775d86b993a54877d2e29a477
|
||||
F test/wal2.test 155b9efa999bdb38ce1cd729b9a4fcdbffd6b88be27f039bad1d2929d287d918
|
||||
F test/wal3.test 2a93004bc0fb2b5c29888964024695bade278ab2
|
||||
F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c
|
||||
F test/wal5.test 9c11da7aeccd83a46d79a556ad11a18d3cb15aa9
|
||||
F test/wal6.test b602704e4b066199bc89d91ca9000f335dcf4572
|
||||
F test/wal.test 83635d428b0a3fe883939cedbaedf29e13a5affd
|
||||
F test/wal2.test a8f30a878c6c44dbdd37c9e5bb001245e78b27a8e97f15baf9842bb76f4a155a
|
||||
F test/wal3.test 82f70ca79e5db6829f9246f4a30d4a4751921c3b
|
||||
F test/wal4.test 5755887f321baa4c55de0b91066fa7d0cafcac9d
|
||||
F test/wal5.test 9304fada875d7279deb2783385b0ae1c02d96b88
|
||||
F test/wal6.test 3d9b79194d15f5b4f6e4169f89f815c049edb2df
|
||||
F test/wal64k.test 163655ecd2cb8afef4737cac2a40fdd2eeaf20b8
|
||||
F test/wal7.test 2ae8f427d240099cc4b2dfef63cff44e2a68a1bd
|
||||
F test/wal8.test d9df3fba4caad5854ed69ed673c68482514203c8
|
||||
F test/wal7.test 18cf68ab8010ae0a2baaa48e5b59567a9503e63e
|
||||
F test/wal8.test 82bf6e493002b2d1580823b40e47bce3e15f468a
|
||||
F test/wal9.test 378e76a9ad09cd9bee06c172ad3547b0129a6750
|
||||
F test/wal_common.tcl a98f17fba96206122eff624db0ab13ec377be4fe
|
||||
F test/walbak.test 018d4e5a3d45c6298d11b99f09a8ef6876527946
|
||||
F test/walbig.test f437473a16cfb314867c6b5d1dbcd519e73e3434
|
||||
F test/wal_common.tcl 15f152fd55703975878741beca6cfa4209d5b3b3
|
||||
F test/walbak.test e322af729156c121183af4847c6e2b17bc629f47
|
||||
F test/walbig.test 3ca3d94751b80054eed5bda20a1339ae1f619483
|
||||
F test/walblock.test be48f3a75eff0b4456209f26b3ce186c2015497d
|
||||
F test/walcksum.test bb234a1bb42248b3515d992b719708015c384278
|
||||
F test/walcrash.test 21038858cc552077b0522f50b0fa87e38139306a
|
||||
F test/walcrash2.test a0edab4e5390f03b99a790de89aad15d6ec70b36
|
||||
F test/walcrash3.test e426aa58122d20f2b9fbe9a507f9eb8cab85b8af
|
||||
F test/walcksum.test add42a54d7c7d9bc72a913792022a195293bef2b
|
||||
F test/walcrash.test 065a041da88f980df3830f09b7fe308337bb594a
|
||||
F test/walcrash2.test 6eb6842d34cc5955726264c80566963c32a9cbea
|
||||
F test/walcrash3.test 279640ffafa23f7564529ccd69bfb97849ccae9d
|
||||
F test/walcrash4.test e7b6e7639a950a0cca8e210e248c8dad4d63bf20
|
||||
F test/walfault.test 09b8ad7e52d2f54bce50e31aa7ea51412bb9f70ac13c74e669ddcd8b48b0d98d
|
||||
F test/walhook.test ed00a40ba7255da22d6b66433ab61fab16a63483
|
||||
F test/walmode.test cd6e7cff618eaaa5910ce57c3657aa50110397f86213886a2400afb9bfec7b7b
|
||||
F test/walnoshm.test 84ca10c544632a756467336b7c3b864d493ee496
|
||||
F test/walfault.test 3771f7c8b159438cbf3c56fdaee07b317fa25857cd30dfd9e0d080993cfba952
|
||||
F test/walhook.test 5d2bdb04fd3e220e2f96e6b566d57e00020bdaec
|
||||
F test/walmode.test edef6af21a8ef04b2acc7c14c44609e53d2a3ac4674e233673de439f258dcba4
|
||||
F test/walnoshm.test 559b878f3aab838971d820329ca35f1caa7b038e
|
||||
F test/waloverwrite.test dad2f26567f1b45174e54fbf9a8dc1cb876a7f03
|
||||
F test/walpersist.test 8c6b7e3ec1ba91b5e4dc4e0921d6d3f87cd356a6
|
||||
F test/walpersist.test abd956d66e2f36d2d9d05d3a969f48be6d2ddbec
|
||||
F test/walprotocol.test a112aba0b79e3adeaa485fed09484b32c654e97df58e454aa8489ac2cd57bf84
|
||||
F test/walro.test cb438d05ba0d191f10b688e39c4f0cd5b71569a1d1f4440e5bdf3c6880e08c20
|
||||
F test/walro.test cac7fa52dffec99f15c6e266769628d711935e4064dbcd7466ce3479b5011eb5
|
||||
F test/walro2.test 0e79dd15cbdb4f482c01ea248373669c732414a726b357d04846a816afafb768
|
||||
F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cfd51af68
|
||||
F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417
|
||||
F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f
|
||||
F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747
|
||||
F test/walshared.test 04590b10c677f75318701818c50bc0dda5da64ab
|
||||
F test/walslow.test 07a51cbe9d4895d0a90c7af76d14a62d363ac162
|
||||
F test/walthread.test c2bc173d0ca244134ab6bcf8ccd108ee787fb2e7925dbbae973e60fcc6c74851
|
||||
F test/where.test f19ea3fa31c425b04af42c8b192a5b595ee84498df8d27dcd79ec043b25fbbfb
|
||||
F test/where2.test 478d2170637b9211f593120648858593bf2445a1
|
||||
F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c
|
||||
@@ -1668,7 +1673,7 @@ F tool/mkshellc.tcl 1f45770aea226ac093a9c72f718efbb88a2a2833409ec2e1c4cecae42026
|
||||
F tool/mksourceid.c d458f9004c837bee87a6382228ac20d3eae3c49ea3b0a5aace936f8b60748d3b
|
||||
F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97
|
||||
F tool/mksqlite3c-noext.tcl fef88397668ae83166735c41af99d79f56afaabb
|
||||
F tool/mksqlite3c.tcl d532ccbe81234f766bab6e5c0451c99529debcea138caccc1862a9645b2d54f2
|
||||
F tool/mksqlite3c.tcl ebc17b2cbf760b351b38de6e1714cbb7f7192cb0ca58b00f7ea139d821ebf80f
|
||||
F tool/mksqlite3h.tcl 080873e3856eceb9d289a08a00c4b30f875ea3feadcbece796bd509b1532792c
|
||||
F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b
|
||||
F tool/mkvsix.tcl b9e0777a213c23156b6542842c238479e496ebf5
|
||||
@@ -1730,8 +1735,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||
P ce2c3e7a875ede4366c48660ae8239d2b74e5f690ad5059844a45f1164f41e61 1b807b51cdf455b4f54216b73fd22bbc90f94e24222401e045f88cfd27f487e3
|
||||
R 2db4b8b40a57a71d528932145db72c5a
|
||||
T +closed 1b807b51cdf455b4f54216b73fd22bbc90f94e24222401e045f88cfd27f487e3
|
||||
P 95fbac39baaab1c3a84fdfc82ccb7f42398b2e92f18a2a57bce1d4a713cb0839
|
||||
Q +a874c649960ba2e2b2fd380d08c02a45884a1060d3922be8847729008ca6766e
|
||||
R a6fae0d92c2131f849bdcaa6d55fc00a
|
||||
T *branch * expr-node-copy-patch
|
||||
T *sym-expr-node-copy-patch *
|
||||
T -sym-apple-osx *
|
||||
U drh
|
||||
Z 5a6c767d04a951cad28a5422f8a9694a
|
||||
Z b6ed866304647254c009dac674727594
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
1ecb3aa13de5c8dc611b814ff34010de0bd90aae73d88aa37a59c4627be4cc2d
|
||||
ab2ba8e732d4a813a336e37e06bbc98842d22d4896120b1b97e8577684e9ea53
|
||||
@@ -87,8 +87,14 @@ static BtShared *SQLITE_WSD sqlite3SharedCacheList = 0;
|
||||
** sqlite3_open(), sqlite3_open16(), or sqlite3_open_v2().
|
||||
*/
|
||||
int sqlite3_enable_shared_cache(int enable){
|
||||
#if defined(__APPLE__) && !defined(SQLITE_TEST) && !defined(TH3_COMPATIBILITY)
|
||||
/* Enable global shared cache function for debugging and unit tests,
|
||||
** but not for release */
|
||||
return SQLITE_MISUSE;
|
||||
#else
|
||||
sqlite3GlobalConfig.sharedCacheEnabled = enable;
|
||||
return SQLITE_OK;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
+12
-3
@@ -1084,6 +1084,16 @@ static int exprStructSize(Expr *p){
|
||||
return EXPR_FULLSIZE;
|
||||
}
|
||||
|
||||
/*
|
||||
** Copy the complete content of an Expr node, taking care not to read
|
||||
** past the end of the structure for a reduced-size version of the source
|
||||
** Expr.
|
||||
*/
|
||||
static void exprNodeCopy(Expr *pDest, Expr *pSrc){
|
||||
memset(pDest, 0, sizeof(Expr));
|
||||
memcpy(pDest, pSrc, exprStructSize(pSrc));
|
||||
}
|
||||
|
||||
/*
|
||||
** The dupedExpr*Size() routines each return the number of bytes required
|
||||
** to store a copy of an expression or expression tree. They differ in
|
||||
@@ -4107,7 +4117,7 @@ expr_code_doover:
|
||||
nExpr = pEList->nExpr;
|
||||
endLabel = sqlite3VdbeMakeLabel(v);
|
||||
if( (pX = pExpr->pLeft)!=0 ){
|
||||
tempX = *pX;
|
||||
exprNodeCopy(&tempX, pX);
|
||||
testcase( pX->op==TK_COLUMN );
|
||||
exprToRegister(&tempX, exprCodeVector(pParse, &tempX, ®Free1));
|
||||
testcase( regFree1==0 );
|
||||
@@ -4432,13 +4442,12 @@ static void exprCodeBetween(
|
||||
Expr exprX; /* The x subexpression */
|
||||
int regFree1 = 0; /* Temporary use register */
|
||||
|
||||
|
||||
memset(&compLeft, 0, sizeof(Expr));
|
||||
memset(&compRight, 0, sizeof(Expr));
|
||||
memset(&exprAnd, 0, sizeof(Expr));
|
||||
|
||||
assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
|
||||
exprX = *pExpr->pLeft;
|
||||
exprNodeCopy(&exprX, pExpr->pLeft);
|
||||
exprAnd.op = TK_AND;
|
||||
exprAnd.pLeft = &compLeft;
|
||||
exprAnd.pRight = &compRight;
|
||||
|
||||
+9
-1
@@ -16,6 +16,9 @@
|
||||
*/
|
||||
|
||||
#include "sqliteInt.h"
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
# include "sqlrr.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Execute SQL code. Return one of the SQLITE_ success/failure
|
||||
@@ -42,7 +45,9 @@ int sqlite3_exec(
|
||||
|
||||
if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;
|
||||
if( zSql==0 ) zSql = "";
|
||||
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecExec(db, zSql);
|
||||
#endif
|
||||
sqlite3_mutex_enter(db->mutex);
|
||||
sqlite3Error(db, SQLITE_OK);
|
||||
while( rc==SQLITE_OK && zSql[0] ){
|
||||
@@ -124,6 +129,9 @@ int sqlite3_exec(
|
||||
exec_out:
|
||||
if( pStmt ) sqlite3VdbeFinalize((Vdbe *)pStmt);
|
||||
sqlite3DbFree(db, azCols);
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecExecEnd(db);
|
||||
#endif
|
||||
|
||||
rc = sqlite3ApiExit(db, rc);
|
||||
if( rc!=SQLITE_OK && pzErrMsg ){
|
||||
|
||||
+155
@@ -16,6 +16,9 @@
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
# include "sqlrr.h"
|
||||
#endif
|
||||
#ifdef SQLITE_ENABLE_FTS3
|
||||
# include "fts3.h"
|
||||
#endif
|
||||
@@ -1253,6 +1256,10 @@ void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){
|
||||
if( db->lookaside.bMalloced ){
|
||||
sqlite3_free(db->lookaside.pStart);
|
||||
}
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecClose(db);
|
||||
#endif
|
||||
|
||||
sqlite3_free(db);
|
||||
}
|
||||
|
||||
@@ -1364,6 +1371,7 @@ const char *sqlite3ErrName(int rc){
|
||||
case SQLITE_IOERR_MMAP: zName = "SQLITE_IOERR_MMAP"; break;
|
||||
case SQLITE_IOERR_GETTEMPPATH: zName = "SQLITE_IOERR_GETTEMPPATH"; break;
|
||||
case SQLITE_IOERR_CONVPATH: zName = "SQLITE_IOERR_CONVPATH"; break;
|
||||
case SQLITE_IOERR_VNODE: zName = "SQLITE_IOERR_VNODE"; break;
|
||||
case SQLITE_CORRUPT: zName = "SQLITE_CORRUPT"; break;
|
||||
case SQLITE_CORRUPT_VTAB: zName = "SQLITE_CORRUPT_VTAB"; break;
|
||||
case SQLITE_NOTFOUND: zName = "SQLITE_NOTFOUND"; break;
|
||||
@@ -2621,6 +2629,44 @@ int sqlite3_limit(sqlite3 *db, int limitId, int newLimit){
|
||||
}
|
||||
return oldLimit; /* IMP: R-53341-35419 */
|
||||
}
|
||||
#if defined(SQLITE_ENABLE_AUTO_PROFILE)
|
||||
/* stderr logging */
|
||||
void _sqlite_auto_profile(void *aux, const char *sql, u64 ns);
|
||||
void _sqlite_auto_trace(void *aux, const char *sql);
|
||||
void _sqlite_auto_profile(void *aux, const char *sql, u64 ns) {
|
||||
#pragma unused(aux)
|
||||
fprintf(stderr, "Query: %s\n Execution Time: %llu ms\n", sql, ns / 1000000);
|
||||
}
|
||||
void _sqlite_auto_trace(void *aux, const char *sql) {
|
||||
fprintf(stderr, "TraceSQL(%p): %s\n", aux, sql);
|
||||
}
|
||||
|
||||
/* syslog logging */
|
||||
#include <asl.h>
|
||||
static aslclient autolog_client = NULL;
|
||||
static void _close_asl_log() {
|
||||
if( NULL!=autolog_client ){
|
||||
asl_close(autolog_client);
|
||||
autolog_client = NULL;
|
||||
}
|
||||
}
|
||||
static void _open_asl_log() {
|
||||
if( NULL==autolog_client ){
|
||||
autolog_client = asl_open("SQLite", NULL, 0);
|
||||
atexit(_close_asl_log);
|
||||
}
|
||||
}
|
||||
|
||||
void _sqlite_auto_profile_syslog(void *aux, const char *sql, u64 ns);
|
||||
void _sqlite_auto_trace_syslog(void *aux, const char *sql);
|
||||
void _sqlite_auto_profile_syslog(void *aux, const char *sql, u64 ns) {
|
||||
#pragma unused(aux)
|
||||
asl_log(autolog_client, NULL, ASL_LEVEL_NOTICE, "Query: %s\n Execution Time: %llu ms\n", sql, ns / 1000000);
|
||||
}
|
||||
void _sqlite_auto_trace_syslog(void *aux, const char *sql) {
|
||||
asl_log(autolog_client, NULL, ASL_LEVEL_NOTICE, "TraceSQL(%p): %s\n", aux, sql);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
** This function is used to parse both URIs and non-URI filenames passed by the
|
||||
@@ -2876,6 +2922,57 @@ int sqlite3ParseUri(
|
||||
return rc;
|
||||
}
|
||||
|
||||
#if defined(SQLITE_ENABLE_AUTO_PROFILE)
|
||||
#define SQLITE_AUTOLOGGING_STDERR 1
|
||||
#define SQLITE_AUTOLOGGING_SYSLOG 2
|
||||
static void enableAutoLogging(
|
||||
sqlite3 *db
|
||||
){
|
||||
char *envprofile = getenv("SQLITE_AUTO_PROFILE");
|
||||
|
||||
if( envprofile!=NULL ){
|
||||
int where = 0;
|
||||
if( !strncasecmp("1", envprofile, 1) ){
|
||||
if( isatty(2) ){
|
||||
where = SQLITE_AUTOLOGGING_STDERR;
|
||||
}else{
|
||||
where = SQLITE_AUTOLOGGING_SYSLOG;
|
||||
}
|
||||
} else if( !strncasecmp("stderr", envprofile, 6) ){
|
||||
where = SQLITE_AUTOLOGGING_STDERR;
|
||||
} else if( !strncasecmp("syslog", envprofile, 6) ){
|
||||
where = SQLITE_AUTOLOGGING_SYSLOG;
|
||||
}
|
||||
if( where==SQLITE_AUTOLOGGING_STDERR ){
|
||||
sqlite3_profile(db, _sqlite_auto_profile, db);
|
||||
}else if( where==SQLITE_AUTOLOGGING_SYSLOG ){
|
||||
_open_asl_log();
|
||||
sqlite3_profile(db, _sqlite_auto_profile_syslog, db);
|
||||
}
|
||||
}
|
||||
char *envtrace = getenv("SQLITE_AUTO_TRACE");
|
||||
if( envtrace!=NULL ){
|
||||
int where = 0;
|
||||
if( !strncasecmp("1", envtrace, 1) ){
|
||||
if( isatty(2) ){
|
||||
where = SQLITE_AUTOLOGGING_STDERR;
|
||||
}else{
|
||||
where = SQLITE_AUTOLOGGING_SYSLOG;
|
||||
}
|
||||
} else if( !strncasecmp("stderr", envtrace, 6) ){
|
||||
where = SQLITE_AUTOLOGGING_STDERR;
|
||||
} else if( !strncasecmp("syslog", envtrace, 6) ){
|
||||
where = SQLITE_AUTOLOGGING_SYSLOG;
|
||||
}
|
||||
if( where==SQLITE_AUTOLOGGING_STDERR ){
|
||||
sqlite3_trace(db, _sqlite_auto_trace, db);
|
||||
}else if( where==SQLITE_AUTOLOGGING_SYSLOG ){
|
||||
_open_asl_log();
|
||||
sqlite3_trace(db, _sqlite_auto_trace_syslog, db);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
** This routine does the work of opening a database on behalf of
|
||||
@@ -3208,7 +3305,30 @@ opendb_out:
|
||||
}else if( rc!=SQLITE_OK ){
|
||||
db->magic = SQLITE_MAGIC_SICK;
|
||||
}
|
||||
#if defined(__APPLE__) && ENABLE_FORCE_WAL
|
||||
if( db && !rc ){
|
||||
if ((0 == access("/var/db/enableForceWAL", R_OK))) {
|
||||
#ifdef SQLITE_DEBUG
|
||||
fprintf(stderr, "SQLite WAL journal_mode ENABLED by default.\n");
|
||||
#endif
|
||||
|
||||
sqlite3_exec(db, "pragma journal_mode=wal", NULL, NULL, NULL);
|
||||
#ifdef SQLITE_DEBUG
|
||||
// } else {
|
||||
// fprintf(stderr, "SQLite WAL journal_mode NOT ENABLED by default.\n");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(SQLITE_ENABLE_AUTO_PROFILE)
|
||||
if( db && !rc ){
|
||||
enableAutoLogging(db);
|
||||
}
|
||||
#endif
|
||||
*ppDb = db;
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecOpen(db, zFilename, flags);
|
||||
#endif
|
||||
#ifdef SQLITE_ENABLE_SQLLOG
|
||||
if( sqlite3GlobalConfig.xSqllog ){
|
||||
/* Opening a db handle. Fourth parameter is passed 0. */
|
||||
@@ -3665,11 +3785,20 @@ int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, void *pArg){
|
||||
}else if( op==SQLITE_FCNTL_JOURNAL_POINTER ){
|
||||
*(sqlite3_file**)pArg = sqlite3PagerJrnlFile(pPager);
|
||||
rc = SQLITE_OK;
|
||||
#ifndef SQLITE_OMIT_WAL
|
||||
if( (rc==SQLITE_OK)&&(op==SQLITE_FCNTL_LAST_ERRNO)&&(*(int *)pArg==0) ){
|
||||
sqlite3_file *pWalFd = sqlite3PagerWalFile(pPager);
|
||||
if( pWalFd&&(pWalFd->pMethods) ){
|
||||
rc = sqlite3OsFileControl(pWalFd, op, pArg);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}else{
|
||||
rc = sqlite3OsFileControl(fd, op, pArg);
|
||||
}
|
||||
sqlite3BtreeLeave(pBtree);
|
||||
}
|
||||
sqlite3Error(db, rc);
|
||||
sqlite3_mutex_leave(db->mutex);
|
||||
return rc;
|
||||
}
|
||||
@@ -4089,6 +4218,32 @@ int sqlite3_db_readonly(sqlite3 *db, const char *zDbName){
|
||||
pBt = sqlite3DbNameToBtree(db, zDbName);
|
||||
return pBt ? sqlite3BtreeIsReadonly(pBt) : -1;
|
||||
}
|
||||
#if (SQLITE_ENABLE_APPLE_SPI>0) && defined(__APPLE__)
|
||||
|
||||
#include "sqlite3_private.h"
|
||||
|
||||
/*
|
||||
** Testing a file path for sqlite locks held by a process ID.
|
||||
** Returns SQLITE_LOCKSTATE_ON if locks are present on path
|
||||
** that would prevent writing to the database.
|
||||
*/
|
||||
int _sqlite3_lockstate(const char *path, pid_t pid){
|
||||
sqlite3 *db = NULL;
|
||||
|
||||
if( sqlite3_open_v2(path, &db, SQLITE_OPEN_READONLY, NULL) == SQLITE_OK ){
|
||||
LockstatePID lockstate = {pid, -1};
|
||||
sqlite3_file_control(db, NULL, SQLITE_FCNTL_LOCKSTATE_PID, &lockstate);
|
||||
sqlite3_close(db);
|
||||
int state = lockstate.state;
|
||||
return state;
|
||||
}
|
||||
if( NULL!=db ){
|
||||
sqlite3_close(db); /* need to close even if open returns an error */
|
||||
}
|
||||
return SQLITE_LOCKSTATE_ERROR;
|
||||
}
|
||||
|
||||
#endif /* SQLITE_ENABLE_APPLE_SPI */
|
||||
|
||||
#ifdef SQLITE_ENABLE_SNAPSHOT
|
||||
/*
|
||||
|
||||
@@ -210,12 +210,18 @@ int sqlite3OsOpen(
|
||||
int *pFlagsOut
|
||||
){
|
||||
int rc;
|
||||
int openFlags;
|
||||
DO_OS_MALLOC_TEST(0);
|
||||
/* 0x87f7f is a mask of SQLITE_OPEN_ flags that are valid to be passed
|
||||
** down into the VFS layer. Some SQLITE_OPEN_ flags (for example,
|
||||
** SQLITE_OPEN_FULLMUTEX or SQLITE_OPEN_SHAREDCACHE) are blocked before
|
||||
** reaching the VFS. */
|
||||
rc = pVfs->xOpen(pVfs, zPath, pFile, flags & 0x87f7f, pFlagsOut);
|
||||
#if SQLITE_ENABLE_DATA_PROTECTION
|
||||
openFlags = flags & (0x87f7f | SQLITE_OPEN_FILEPROTECTION_MASK);
|
||||
#else
|
||||
openFlags = flags & 0x87f7f;
|
||||
#endif
|
||||
rc = pVfs->xOpen(pVfs, zPath, pFile, openFlags, pFlagsOut);
|
||||
assert( rc==SQLITE_OK || pFile->pMethods==0 );
|
||||
return rc;
|
||||
}
|
||||
|
||||
+1275
-37
File diff suppressed because it is too large
Load Diff
@@ -3513,6 +3513,15 @@ static int winFileControl(sqlite3_file *id, int op, void *pArg){
|
||||
OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h));
|
||||
return SQLITE_OK;
|
||||
}
|
||||
case SQLITE_FCNTL_PERSIST_WAL: {
|
||||
int bPersist = *(int*)pArg;
|
||||
if( bPersist<0 ){
|
||||
*(int*)pArg = pFile->bPersistWal;
|
||||
}else{
|
||||
pFile->bPersistWal = bPersist!=0;
|
||||
}
|
||||
return SQLITE_OK;
|
||||
}
|
||||
case SQLITE_FCNTL_PERSIST_WAL: {
|
||||
winModeBit(pFile, WINFILE_PERSIST_WAL, (int*)pArg);
|
||||
OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h));
|
||||
|
||||
+55
-9
@@ -2565,7 +2565,11 @@ static int pager_delmaster(Pager *pPager, const char *zMaster){
|
||||
if( !pMaster ){
|
||||
rc = SQLITE_NOMEM_BKPT;
|
||||
}else{
|
||||
const int flags = (SQLITE_OPEN_READONLY|SQLITE_OPEN_MASTER_JOURNAL);
|
||||
const int flags =
|
||||
#if SQLITE_ENABLE_DATA_PROTECTION
|
||||
(pPager->vfsFlags&SQLITE_OPEN_FILEPROTECTION_MASK)|
|
||||
#endif
|
||||
(SQLITE_OPEN_READONLY|SQLITE_OPEN_MASTER_JOURNAL);
|
||||
rc = sqlite3OsOpen(pVfs, zMaster, pMaster, flags, 0);
|
||||
}
|
||||
if( rc!=SQLITE_OK ) goto delmaster_out;
|
||||
@@ -2601,7 +2605,11 @@ static int pager_delmaster(Pager *pPager, const char *zMaster){
|
||||
** so, return without deleting the master journal file.
|
||||
*/
|
||||
int c;
|
||||
int flags = (SQLITE_OPEN_READONLY|SQLITE_OPEN_MAIN_JOURNAL);
|
||||
int flags =
|
||||
#if SQLITE_ENABLE_DATA_PROTECTION
|
||||
(pPager->vfsFlags&SQLITE_OPEN_FILEPROTECTION_MASK)|
|
||||
#endif
|
||||
(SQLITE_OPEN_READONLY|SQLITE_OPEN_MAIN_JOURNAL);
|
||||
rc = sqlite3OsOpen(pVfs, zJournal, pJournal, flags, 0);
|
||||
if( rc!=SQLITE_OK ){
|
||||
goto delmaster_out;
|
||||
@@ -3674,7 +3682,11 @@ static int pagerOpentemp(
|
||||
sqlite3_opentemp_count++; /* Used for testing and analysis only */
|
||||
#endif
|
||||
|
||||
vfsFlags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE |
|
||||
vfsFlags |=
|
||||
#if SQLITE_ENABLE_DATA_PROTECTION
|
||||
(pPager->vfsFlags&SQLITE_OPEN_FILEPROTECTION_MASK)|
|
||||
#endif
|
||||
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE |
|
||||
SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE;
|
||||
rc = sqlite3OsOpen(pPager->pVfs, 0, pFile, vfsFlags, 0);
|
||||
assert( rc!=SQLITE_OK || isOpen(pFile) );
|
||||
@@ -5093,7 +5105,11 @@ static int hasHotJournal(Pager *pPager, int *pExists){
|
||||
** it can be ignored.
|
||||
*/
|
||||
if( !jrnlOpen ){
|
||||
int f = SQLITE_OPEN_READONLY|SQLITE_OPEN_MAIN_JOURNAL;
|
||||
int f =
|
||||
#if SQLITE_ENABLE_DATA_PROTECTION
|
||||
(pPager->vfsFlags&SQLITE_OPEN_FILEPROTECTION_MASK)|
|
||||
#endif
|
||||
SQLITE_OPEN_READONLY|SQLITE_OPEN_MAIN_JOURNAL;
|
||||
rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &f);
|
||||
}
|
||||
if( rc==SQLITE_OK ){
|
||||
@@ -5233,7 +5249,11 @@ int sqlite3PagerSharedLock(Pager *pPager){
|
||||
pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &bExists);
|
||||
if( rc==SQLITE_OK && bExists ){
|
||||
int fout = 0;
|
||||
int f = SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_JOURNAL;
|
||||
int f =
|
||||
#if SQLITE_ENABLE_DATA_PROTECTION
|
||||
(pPager->vfsFlags&SQLITE_OPEN_FILEPROTECTION_MASK)|
|
||||
#endif
|
||||
SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_JOURNAL;
|
||||
assert( !pPager->tempFile );
|
||||
rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &fout);
|
||||
assert( rc!=SQLITE_OK || isOpen(pPager->jfd) );
|
||||
@@ -5743,6 +5763,9 @@ static int pager_open_journal(Pager *pPager){
|
||||
int flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
|
||||
int nSpill;
|
||||
|
||||
#if SQLITE_ENABLE_DATA_PROTECTION
|
||||
flags |= (pPager->vfsFlags&SQLITE_OPEN_FILEPROTECTION_MASK);
|
||||
#endif
|
||||
if( pPager->tempFile ){
|
||||
flags |= (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL);
|
||||
nSpill = sqlite3Config.nStmtSpill;
|
||||
@@ -6964,6 +6987,18 @@ sqlite3_file *sqlite3PagerFile(Pager *pPager){
|
||||
return pPager->fd;
|
||||
}
|
||||
|
||||
#if !defined(SQLITE_OMIT_WAL)
|
||||
/*
|
||||
** Return the file handle for the WAL journal file associated
|
||||
** with the pager. This might return NULL if the file has
|
||||
** not yet been opened.
|
||||
*/
|
||||
sqlite3_file *sqlite3PagerWalFile(Pager *pPager){
|
||||
return ((pPager->pWal) ? sqlite3WalFile(pPager->pWal) : (NULL));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
|
||||
/*
|
||||
** Reset the lock timeout for pager.
|
||||
@@ -7496,10 +7531,14 @@ static int pagerOpenWal(Pager *pPager){
|
||||
** (e.g. due to malloc() failure), return an error code.
|
||||
*/
|
||||
if( rc==SQLITE_OK ){
|
||||
rc = sqlite3WalOpen(pPager->pVfs,
|
||||
pPager->fd, pPager->zWal, pPager->exclusiveMode,
|
||||
pPager->journalSizeLimit, &pPager->pWal
|
||||
);
|
||||
#if SQLITE_ENABLE_DATA_PROTECTION
|
||||
rc = sqlite3WalOpen(pPager->pVfs, pPager->fd, pPager->zWal, pPager->exclusiveMode,
|
||||
pPager->journalSizeLimit, (pPager->vfsFlags & (SQLITE_OPEN_FILEPROTECTION_MASK | SQLITE_OPEN_READONLY)),
|
||||
&pPager->pWal);
|
||||
#else
|
||||
rc = sqlite3WalOpen(pPager->pVfs, pPager->fd, pPager->zWal, pPager->exclusiveMode,
|
||||
pPager->journalSizeLimit, (pPager->vfsFlags & SQLITE_OPEN_READONLY), &pPager->pWal);
|
||||
#endif
|
||||
}
|
||||
pagerFixMaplimit(pPager);
|
||||
|
||||
@@ -7593,6 +7632,13 @@ int sqlite3PagerCloseWal(Pager *pPager, sqlite3 *db){
|
||||
pPager->pageSize, (u8*)pPager->pTmpSpace);
|
||||
pPager->pWal = 0;
|
||||
pagerFixMaplimit(pPager);
|
||||
|
||||
/* Ensure that the WAL file is deleted even if the PERSIST_WAL
|
||||
** hint is enabled. */
|
||||
if( rc==SQLITE_OK ){
|
||||
rc = sqlite3OsDelete(pPager->pVfs, pPager->zWal, 0);
|
||||
if( rc==SQLITE_IOERR_DELETE_NOENT ) rc = SQLITE_OK;
|
||||
}
|
||||
if( rc && !pPager->exclusiveMode ) pagerUnlockDb(pPager, SHARED_LOCK);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -205,6 +205,7 @@ int sqlite3PagerMemUsed(Pager*);
|
||||
const char *sqlite3PagerFilename(Pager*, int);
|
||||
sqlite3_vfs *sqlite3PagerVfs(Pager*);
|
||||
sqlite3_file *sqlite3PagerFile(Pager*);
|
||||
sqlite3_file *sqlite3PagerWalFile(Pager *pPager);
|
||||
sqlite3_file *sqlite3PagerJrnlFile(Pager*);
|
||||
const char *sqlite3PagerJournalname(Pager*);
|
||||
void *sqlite3PagerTempSpace(Pager*);
|
||||
|
||||
+1
-2
@@ -372,8 +372,7 @@ static void pcache1Free(void *p){
|
||||
sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
|
||||
#ifndef SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS
|
||||
{
|
||||
int nFreed = 0;
|
||||
nFreed = sqlite3MallocSize(p);
|
||||
int nFreed = sqlite3MallocSize(p);
|
||||
sqlite3_mutex_enter(pcache1.mutex);
|
||||
sqlite3StatusDown(SQLITE_STATUS_PAGECACHE_OVERFLOW, nFreed);
|
||||
sqlite3_mutex_leave(pcache1.mutex);
|
||||
|
||||
+2
-2
@@ -217,11 +217,11 @@ static void setAllPagerFlags(sqlite3 *db){
|
||||
assert( SQLITE_CacheSpill==PAGER_CACHESPILL );
|
||||
assert( (PAGER_FULLFSYNC | PAGER_CKPT_FULLFSYNC | PAGER_CACHESPILL)
|
||||
== PAGER_FLAGS_MASK );
|
||||
assert( (pDb->safety_level & PAGER_SYNCHRONOUS_MASK)==pDb->safety_level );
|
||||
while( (n--) > 0 ){
|
||||
if( pDb->pBt ){
|
||||
sqlite3BtreeSetPagerFlags(pDb->pBt,
|
||||
pDb->safety_level | (db->flags & PAGER_FLAGS_MASK) );
|
||||
(pDb->safety_level & PAGER_SYNCHRONOUS_MASK)
|
||||
| (db->flags & PAGER_FLAGS_MASK) );
|
||||
}
|
||||
pDb++;
|
||||
}
|
||||
|
||||
+12
-1
@@ -14,6 +14,9 @@
|
||||
** from disk.
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
# include "sqlrr.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Fill the InitData structure with an error message that indicates
|
||||
@@ -756,6 +759,9 @@ int sqlite3_prepare(
|
||||
){
|
||||
int rc;
|
||||
rc = sqlite3LockAndPrepare(db,zSql,nBytes,0,0,ppStmt,pzTail);
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecPrepare(db, zSql, nBytes, 0, *ppStmt);
|
||||
#endif
|
||||
assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */
|
||||
return rc;
|
||||
}
|
||||
@@ -796,6 +802,9 @@ int sqlite3_prepare_v3(
|
||||
rc = sqlite3LockAndPrepare(db,zSql,nBytes,
|
||||
SQLITE_PREPARE_SAVESQL|(prepFlags&SQLITE_PREPARE_MASK),
|
||||
0,ppStmt,pzTail);
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecPrepare(db, zSql, nBytes, 1, *ppStmt);
|
||||
#endif
|
||||
assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 );
|
||||
return rc;
|
||||
}
|
||||
@@ -839,7 +848,9 @@ static int sqlite3Prepare16(
|
||||
if( zSql8 ){
|
||||
rc = sqlite3LockAndPrepare(db, zSql8, -1, prepFlags, 0, ppStmt, &zTail8);
|
||||
}
|
||||
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecPrepare(db, zSql8, -1, 1, *ppStmt);
|
||||
#endif
|
||||
if( zTail8 && pzTail ){
|
||||
/* If sqlite3_prepare returns a tail pointer, we calculate the
|
||||
** equivalent pointer into the UTF-16 string by counting the unicode
|
||||
|
||||
@@ -563,6 +563,7 @@ int sqlite3_exec(
|
||||
#define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */
|
||||
#define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */
|
||||
#define SQLITE_OPEN_WAL 0x00080000 /* VFS only */
|
||||
#define SQLITE_OPEN_FILEPROTECTION_MASK 0x00700000
|
||||
|
||||
/* Reserved: 0x00F00000 */
|
||||
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* sqlite3_private.h
|
||||
*/
|
||||
|
||||
#ifndef _SQLITE3_PRIVATE_H
|
||||
#define _SQLITE3_PRIVATE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define SQLITE_LOCKSTATE_OFF 0
|
||||
#define SQLITE_LOCKSTATE_ON 1
|
||||
#define SQLITE_LOCKSTATE_NOTADB 2
|
||||
#define SQLITE_LOCKSTATE_ERROR -1
|
||||
|
||||
#define SQLITE_LOCKSTATE_ANYPID -1
|
||||
|
||||
/*
|
||||
** Test a file path for sqlite locks held by a process ID (-1 = any PID).
|
||||
** Returns one of the following integer codes:
|
||||
**
|
||||
** SQLITE_LOCKSTATE_OFF no active sqlite file locks match the specified pid
|
||||
** SQLITE_LOCKSTATE_ON active sqlite file locks match the specified pid
|
||||
** SQLITE_LOCKSTATE_NOTADB path points to a file that is not an sqlite db file
|
||||
** SQLITE_LOCKSTATE_ERROR path was not vaild or was unreadable
|
||||
**
|
||||
** There is no support for identifying db files encrypted via SEE encryption
|
||||
** currently. Zero byte files are tested for sqlite locks, but if no sqlite
|
||||
** locks are present then SQLITE_LOCKSTATE_NOTADB is returned.
|
||||
*/
|
||||
extern int _sqlite3_lockstate(const char *path, pid_t pid);
|
||||
|
||||
/*
|
||||
** Test an open database connection for sqlite locks held by a process ID,
|
||||
** if a process has an open database connection this will avoid trashing file
|
||||
** locks by re-using open file descriptors for the database file and support
|
||||
** files (-shm)
|
||||
*/
|
||||
#define SQLITE_FCNTL_LOCKSTATE_PID 103
|
||||
|
||||
/*
|
||||
** Pass the SQLITE_TRUNCATE_DATABASE operation code to sqlite3_file_control()
|
||||
** to truncate a database and its associated journal file to zero length. The
|
||||
** SQLITE_TRUNCATE_* flags represent optional flags to safely initialize an
|
||||
** empty database in the place of the truncated database, the flags are passed
|
||||
** into sqlite3_file_control via the fourth argument using a pointer to an integer
|
||||
** configured with the ORed flags. If the fourth argument is NULL, the default
|
||||
** behavior is applied and the database file is truncated to zero bytes, a rollback
|
||||
** journal (if present) is unlinked, a WAL journal (if present) is truncated to zero
|
||||
** bytes and the first few bytes of the -shm file is scrambled to trigger existing
|
||||
** connections to rebuild the index from the database file contents.
|
||||
*/
|
||||
#define SQLITE_FCNTL_TRUNCATE_DATABASE 101
|
||||
#define SQLITE_TRUNCATE_DATABASE SQLITE_FCNTL_TRUNCATE_DATABASE
|
||||
#define SQLITE_TRUNCATE_INITIALIZE_HEADER_MASK (0x7F<<0)
|
||||
#define SQLITE_TRUNCATE_JOURNALMODE_WAL (0x1<<0)
|
||||
#define SQLITE_TRUNCATE_AUTOVACUUM_MASK (0x3<<2)
|
||||
#define SQLITE_TRUNCATE_AUTOVACUUM_OFF (0x1<<2)
|
||||
#define SQLITE_TRUNCATE_AUTOVACUUM_FULL (0x2<<2)
|
||||
#define SQLITE_TRUNCATE_AUTOVACUUM_INCREMENTAL (0x3<<2)
|
||||
#define SQLITE_TRUNCATE_PAGESIZE_MASK (0x7<<4)
|
||||
#define SQLITE_TRUNCATE_PAGESIZE_1024 (0x1<<4)
|
||||
#define SQLITE_TRUNCATE_PAGESIZE_2048 (0x2<<4)
|
||||
#define SQLITE_TRUNCATE_PAGESIZE_4096 (0x3<<4)
|
||||
#define SQLITE_TRUNCATE_PAGESIZE_8192 (0x4<<4)
|
||||
#define SQLITE_TRUNCATE_FORCE (0x1<<7)
|
||||
|
||||
/*
|
||||
** Pass the SQLITE_REPLACE_DATABASE operation code to sqlite3_file_control()
|
||||
** and a sqlite3 pointer to another open database file to safely copy the
|
||||
** contents of that database file into the receiving database.
|
||||
*/
|
||||
#define SQLITE_FCNTL_REPLACE_DATABASE 102
|
||||
#define SQLITE_REPLACE_DATABASE SQLITE_FCNTL_REPLACE_DATABASE
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of the 'extern "C"' block */
|
||||
#endif
|
||||
#endif
|
||||
@@ -4463,6 +4463,30 @@ SQLITE_API SQLITE_EXTERN void (SQLITE_CDECL *sqlite3IoTrace)(const char*,...);
|
||||
#define MEMTYPE_LOOKASIDE 0x02 /* Heap that might have been lookaside */
|
||||
#define MEMTYPE_PCACHE 0x04 /* Page cache allocations */
|
||||
|
||||
#if (SQLITE_ENABLE_APPLE_SPI>0) && defined(__APPLE__)
|
||||
|
||||
/*
|
||||
** An instance of the following structure is used to hold the process ID
|
||||
** and return-by-reference lockstate value. The SQLITE_FCNTL_LOCKSTATE_PID
|
||||
** requires the 4th argument to sqlite3_file_control to be a pointer to an
|
||||
** instance of LockstatePID initialized with a LockstatePID.pid value equal
|
||||
** to a process ID to be tested, or the special value SQLITE_LOCKSTATE_ANYPID
|
||||
** The Lockstate.state value is always set to one of the following values
|
||||
** when sqlite3_file_control returns:
|
||||
**
|
||||
** SQLITE_LOCKSTATE_OFF no active sqlite file locks match the specified pid
|
||||
** SQLITE_LOCKSTATE_ON active sqlite file locks match the specified pid
|
||||
** SQLITE_LOCKSTATE_NOTADB path points to a file that is not an sqlite db file
|
||||
** SQLITE_LOCKSTATE_ERROR path was not vaild or was unreadable
|
||||
*/
|
||||
typedef struct LockstatePID LockstatePID;
|
||||
struct LockstatePID {
|
||||
pid_t pid; /* Process ID to test */
|
||||
int state; /* The state of the lock (return value) */
|
||||
};
|
||||
|
||||
#endif /* (SQLITE_ENABLE_APPLE_SPI>0) && defined(__APPLE__) */
|
||||
|
||||
/*
|
||||
** Threading interface
|
||||
*/
|
||||
|
||||
+199
-1
@@ -4001,6 +4001,24 @@ static int SQLITE_TCLAPI test_clear_bindings(
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
** Usage: sqlite3_clear_bindings STMT
|
||||
**
|
||||
*/
|
||||
static int test_clear_bindings_null(
|
||||
void * clientData,
|
||||
Tcl_Interp *interp,
|
||||
int objc,
|
||||
Tcl_Obj *CONST objv[]
|
||||
){
|
||||
if( objc!=1 ){
|
||||
return TCL_ERROR;
|
||||
}
|
||||
/* test for handling NULL <rdar://problem/6646331> */
|
||||
Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_clear_bindings(0)));
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
** Usage: sqlite3_sleep MILLISECONDS
|
||||
*/
|
||||
@@ -5684,6 +5702,96 @@ static int SQLITE_TCLAPI file_control_lasterrno_test(
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
#ifdef __APPLE__
|
||||
/* From sqlite3_private.h */
|
||||
# ifndef SQLITE_TRUNCATE_DATABASE
|
||||
# define SQLITE_TRUNCATE_DATABASE 101
|
||||
# define SQLITE_TRUNCATE_JOURNALMODE_WAL (0x1<<0)
|
||||
# define SQLITE_TRUNCATE_AUTOVACUUM_MASK (0x3<<2)
|
||||
# define SQLITE_TRUNCATE_AUTOVACUUM_OFF (0x1<<2)
|
||||
# define SQLITE_TRUNCATE_AUTOVACUUM_FULL (0x2<<2)
|
||||
# define SQLITE_TRUNCATE_AUTOVACUUM_INCREMENTAL (0x3<<2)
|
||||
# define SQLITE_TRUNCATE_PAGESIZE_MASK (0x7<<4)
|
||||
# define SQLITE_TRUNCATE_PAGESIZE_1024 (0x1<<4)
|
||||
# define SQLITE_TRUNCATE_PAGESIZE_2048 (0x2<<4)
|
||||
# define SQLITE_TRUNCATE_PAGESIZE_4096 (0x3<<4)
|
||||
# define SQLITE_TRUNCATE_PAGESIZE_8192 (0x4<<4)
|
||||
# endif
|
||||
# ifndef SQLITE_REPLACE_DATABASE
|
||||
# define SQLITE_REPLACE_DATABASE 102
|
||||
# endif
|
||||
|
||||
/*
|
||||
** tclcmd: file_control_truncate_test DB
|
||||
**
|
||||
** This TCL command runs the sqlite3_file_control interface and
|
||||
** verifies correct operation of the SQLITE_TRUNCATE_DATABASE verb.
|
||||
*/
|
||||
static int file_control_truncate_test(
|
||||
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
|
||||
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
|
||||
int objc, /* Number of arguments */
|
||||
Tcl_Obj *CONST objv[] /* Command arguments */
|
||||
){
|
||||
sqlite3 *db;
|
||||
int flags;
|
||||
int rc;
|
||||
|
||||
if( objc!=3 ){
|
||||
Tcl_AppendResult(interp, "wrong # args: should be \"",
|
||||
Tcl_GetStringFromObj(objv[0], 0), " DB FLAGS", 0);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ){
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if( Tcl_GetIntFromObj(interp, objv[2], &flags) ){
|
||||
return TCL_ERROR;
|
||||
}
|
||||
rc = sqlite3_file_control(db, NULL, SQLITE_TRUNCATE_DATABASE, &flags);
|
||||
if( rc ){
|
||||
Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
|
||||
return TCL_ERROR;
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
** tclcmd: file_control_replace_test DB
|
||||
**
|
||||
** This TCL command runs the sqlite3_file_control interface and
|
||||
** verifies correct operation of the SQLITE_REPLACE_DATABASE verb.
|
||||
*/
|
||||
static int file_control_replace_test(
|
||||
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
|
||||
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
|
||||
int objc, /* Number of arguments */
|
||||
Tcl_Obj *CONST objv[] /* Command arguments */
|
||||
){
|
||||
sqlite3 *src_db;
|
||||
sqlite3 *dst_db;
|
||||
int rc;
|
||||
|
||||
if( objc!=3 ){
|
||||
Tcl_AppendResult(interp, "wrong # args: should be \"",
|
||||
Tcl_GetStringFromObj(objv[0], 0), " DST_DB SRC_DB", 0);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if( getDbPointer(interp, Tcl_GetString(objv[1]), &dst_db) ){
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if( getDbPointer(interp, Tcl_GetString(objv[2]), &src_db) ){
|
||||
return TCL_ERROR;
|
||||
}
|
||||
rc = sqlite3_file_control(dst_db, NULL, SQLITE_REPLACE_DATABASE, src_db);
|
||||
if( rc ){
|
||||
Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
|
||||
return TCL_ERROR;
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
/*
|
||||
** tclcmd: file_control_chunksize_test DB DBNAME SIZE
|
||||
**
|
||||
@@ -5829,6 +5937,90 @@ static int SQLITE_TCLAPI file_control_lockproxy_test(
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <sys/param.h>
|
||||
#include <sys/mount.h>
|
||||
#include <sys/errno.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
** tclcmd: path_is_local PWD
|
||||
*/
|
||||
static int path_is_local(
|
||||
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
|
||||
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
|
||||
int objc, /* Number of arguments */
|
||||
Tcl_Obj *CONST objv[] /* Command arguments */
|
||||
){
|
||||
#ifdef __APPLE__
|
||||
const char *zPath;
|
||||
int nPath;
|
||||
struct statfs fsInfo;
|
||||
|
||||
if( objc!=2 ){
|
||||
Tcl_AppendResult(interp, "wrong # args: should be \"",
|
||||
Tcl_GetStringFromObj(objv[0], 0), " PATH", 0);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
zPath = Tcl_GetStringFromObj(objv[1], &nPath);
|
||||
if( statfs(zPath, &fsInfo) == -1 ){
|
||||
int err = errno;
|
||||
Tcl_AppendResult(interp, "Error calling statfs on path",
|
||||
Tcl_NewIntObj(err), 0);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if( fsInfo.f_flags&MNT_LOCAL ){
|
||||
Tcl_SetObjResult(interp, Tcl_NewIntObj(1));
|
||||
} else {
|
||||
Tcl_SetObjResult(interp, Tcl_NewIntObj(0));
|
||||
}
|
||||
#else
|
||||
Tcl_SetObjResult(interp, Tcl_NewIntObj(1));
|
||||
#endif
|
||||
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
** tclcmd: path_is_dos PWD
|
||||
*/
|
||||
static int path_is_dos(
|
||||
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
|
||||
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
|
||||
int objc, /* Number of arguments */
|
||||
Tcl_Obj *CONST objv[] /* Command arguments */
|
||||
){
|
||||
#ifdef __APPLE__
|
||||
const char *zPath;
|
||||
int nPath;
|
||||
struct statfs fsInfo;
|
||||
|
||||
if( objc!=2 ){
|
||||
Tcl_AppendResult(interp, "wrong # args: should be \"",
|
||||
Tcl_GetStringFromObj(objv[0], 0), " PATH", 0);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
zPath = Tcl_GetStringFromObj(objv[1], &nPath);
|
||||
if( statfs(zPath, &fsInfo) == -1 ){
|
||||
int err = errno;
|
||||
Tcl_AppendResult(interp, "Error calling statfs on path",
|
||||
Tcl_NewIntObj(err), 0);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (0 == strncmp("msdos", fsInfo.f_fstypename, 5)) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewIntObj(1));
|
||||
} else if (0 == strncmp("exfat", fsInfo.f_fstypename, 5)) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewIntObj(1));
|
||||
} else {
|
||||
Tcl_SetObjResult(interp, Tcl_NewIntObj(0));
|
||||
}
|
||||
#else
|
||||
Tcl_SetObjResult(interp, Tcl_NewIntObj(0));
|
||||
#endif
|
||||
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
#if SQLITE_OS_WIN
|
||||
/*
|
||||
** tclcmd: file_control_win32_av_retry DB NRETRY DELAY
|
||||
@@ -5962,7 +6154,6 @@ static int SQLITE_TCLAPI file_control_persist_wal(
|
||||
Tcl_AppendResult(interp, z, (char*)0);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
** tclcmd: file_control_powersafe_overwrite DB PSOW-FLAG
|
||||
**
|
||||
@@ -7590,6 +7781,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
|
||||
{ "sqlite3_bind_parameter_name", test_bind_parameter_name, 0},
|
||||
{ "sqlite3_bind_parameter_index", test_bind_parameter_index, 0},
|
||||
{ "sqlite3_clear_bindings", test_clear_bindings, 0},
|
||||
{ "sqlite3_clear_bindings_null", test_clear_bindings_null, 0},
|
||||
{ "sqlite3_sleep", test_sleep, 0},
|
||||
{ "sqlite3_errcode", test_errcode ,0 },
|
||||
{ "sqlite3_extended_errcode", test_ex_errcode ,0 },
|
||||
@@ -7697,6 +7889,10 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
|
||||
{ "file_control_test", file_control_test, 0 },
|
||||
{ "file_control_lasterrno_test", file_control_lasterrno_test, 0 },
|
||||
{ "file_control_lockproxy_test", file_control_lockproxy_test, 0 },
|
||||
#ifdef __APPLE__
|
||||
{ "file_control_truncate_test", file_control_truncate_test, 0 },
|
||||
{ "file_control_replace_test", file_control_replace_test, 0 },
|
||||
#endif
|
||||
{ "file_control_chunksize_test", file_control_chunksize_test, 0 },
|
||||
{ "file_control_sizehint_test", file_control_sizehint_test, 0 },
|
||||
#if SQLITE_OS_WIN
|
||||
@@ -7710,6 +7906,8 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
|
||||
{ "file_control_tempfilename", file_control_tempfilename, 0 },
|
||||
{ "sqlite3_vfs_list", vfs_list, 0 },
|
||||
{ "sqlite3_create_function_v2", test_create_function_v2, 0 },
|
||||
{ "path_is_local", path_is_local, 0 },
|
||||
{ "path_is_dos", path_is_dos, 0 },
|
||||
|
||||
/* Functions from os.h */
|
||||
#ifndef SQLITE_OMIT_UTF16
|
||||
|
||||
+31
-1
@@ -620,7 +620,21 @@ Tcl_SetVar2(interp, "sqlite_options", "mergesort", "1", TCL_GLOBAL_ONLY);
|
||||
#else
|
||||
Tcl_SetVar2(interp,"sqlite_options","prefer_proxy_locking","0",TCL_GLOBAL_ONLY);
|
||||
#endif
|
||||
|
||||
#if defined(SQLITE_ENABLE_PURGEABLE_PCACHE) && defined(__APPLE__)
|
||||
Tcl_SetVar2(interp,"sqlite_options","enable_purgeable_pcache","1",TCL_GLOBAL_ONLY);
|
||||
#else
|
||||
Tcl_SetVar2(interp,"sqlite_options","enable_purgeable_pcache","0",TCL_GLOBAL_ONLY);
|
||||
#endif
|
||||
#if SQLITE_DEFAULT_CKPTFULLFSYNC
|
||||
Tcl_SetVar2(interp,"sqlite_options","default_ckptfullfsync","1",TCL_GLOBAL_ONLY);
|
||||
#else
|
||||
Tcl_SetVar2(interp,"sqlite_options","default_ckptfullfsync","0",TCL_GLOBAL_ONLY);
|
||||
#endif
|
||||
#if SQLITE_ENABLE_PERSIST_WAL
|
||||
Tcl_SetVar2(interp,"sqlite_options","enable_persist_wal","1",TCL_GLOBAL_ONLY);
|
||||
#else
|
||||
Tcl_SetVar2(interp,"sqlite_options","enable_persist_wal","0",TCL_GLOBAL_ONLY);
|
||||
#endif
|
||||
|
||||
#ifdef SQLITE_OMIT_SHARED_CACHE
|
||||
Tcl_SetVar2(interp, "sqlite_options", "shared_cache", "0", TCL_GLOBAL_ONLY);
|
||||
@@ -756,6 +770,22 @@ Tcl_SetVar2(interp, "sqlite_options", "mergesort", "1", TCL_GLOBAL_ONLY);
|
||||
Tcl_SetVar2(interp, "sqlite_options", "sqllog", "0", TCL_GLOBAL_ONLY);
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
# if defined(__ppc__)
|
||||
Tcl_SetVar2(interp, "os_options", "arch", "ppc", TCL_GLOBAL_ONLY);
|
||||
# elif defined(__i386__)
|
||||
Tcl_SetVar2(interp, "os_options", "arch", "i386", TCL_GLOBAL_ONLY);
|
||||
# elif defined(__x86_64__)
|
||||
Tcl_SetVar2(interp, "os_options", "arch", "x86_64", TCL_GLOBAL_ONLY);
|
||||
# elif defined(__arm__)
|
||||
Tcl_SetVar2(interp, "os_options", "arch", "arm", TCL_GLOBAL_ONLY);
|
||||
# else
|
||||
# error Unrecognized architecture for exec_options
|
||||
# endif
|
||||
#else
|
||||
Tcl_SetVar2(interp, "os_options", "arch", "unknown", TCL_GLOBAL_ONLY);
|
||||
#endif
|
||||
|
||||
#ifdef SQLITE_ENABLE_URI_00_ERROR
|
||||
Tcl_SetVar2(interp, "sqlite_options", "uri_00_error", "1", TCL_GLOBAL_ONLY);
|
||||
#else
|
||||
|
||||
@@ -148,7 +148,7 @@ static int superlockWalLock(
|
||||
** this function must have been obtained from a successful call to
|
||||
** sqlite3demo_superlock().
|
||||
*/
|
||||
void sqlite3demo_superunlock(void *pLock){
|
||||
static void sqlite3demo_superunlock(void *pLock){
|
||||
Superlock *p = (Superlock *)pLock;
|
||||
if( p->bWal ){
|
||||
int rc; /* Return code */
|
||||
@@ -179,9 +179,10 @@ void sqlite3demo_superunlock(void *pLock){
|
||||
** until either the lock can be obtained or the busy-handler function returns
|
||||
** 0 (indicating "give up").
|
||||
*/
|
||||
int sqlite3demo_superlock(
|
||||
static int sqlite3demo_superlock(
|
||||
const char *zPath, /* Path to database file to lock */
|
||||
const char *zVfs, /* VFS to use to access database file */
|
||||
int flags, /* Additional flags to pass to sqlite3_open_v2 */
|
||||
int (*xBusy)(void*,int), /* Busy handler callback */
|
||||
void *pBusyArg, /* Context arg for busy handler */
|
||||
void **ppLock /* OUT: Context to pass to superunlock() */
|
||||
@@ -196,7 +197,7 @@ int sqlite3demo_superlock(
|
||||
|
||||
/* Open a database handle on the file to superlock. */
|
||||
rc = sqlite3_open_v2(
|
||||
zPath, &pLock->db, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs
|
||||
zPath, &pLock->db, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|flags, zVfs
|
||||
);
|
||||
|
||||
/* Install a busy-handler and execute a BEGIN EXCLUSIVE. If this is not
|
||||
@@ -338,7 +339,7 @@ static int SQLITE_TCLAPI superlock_cmd(
|
||||
xBusy = superlock_busy;
|
||||
}
|
||||
|
||||
rc = sqlite3demo_superlock(zPath, zVfs, xBusy, &busy, &pLock);
|
||||
rc = sqlite3demo_superlock(zPath, zVfs, 0, xBusy, &busy, &pLock);
|
||||
assert( rc==SQLITE_OK || pLock==0 );
|
||||
assert( rc!=SQLITE_OK || pLock!=0 );
|
||||
|
||||
|
||||
+2
-1
@@ -597,7 +597,8 @@ int sqlite3VdbeExec(
|
||||
** sqlite3_column_text16() failed. */
|
||||
goto no_mem;
|
||||
}
|
||||
assert( p->rc==SQLITE_OK || (p->rc&0xff)==SQLITE_BUSY );
|
||||
assert( p->rc==SQLITE_OK || (p->rc&0xff)==SQLITE_BUSY
|
||||
|| (p->rc&0xFF)==SQLITE_LOCKED );
|
||||
assert( p->bIsReader || p->readOnly!=0 );
|
||||
p->iCurrentTime = 0;
|
||||
assert( p->explain==0 );
|
||||
|
||||
+44
-1
@@ -15,6 +15,9 @@
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
#include "vdbeInt.h"
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
# include "sqlrr.h"
|
||||
#endif
|
||||
|
||||
#ifndef SQLITE_OMIT_DEPRECATED
|
||||
/*
|
||||
@@ -102,6 +105,9 @@ int sqlite3_finalize(sqlite3_stmt *pStmt){
|
||||
rc = SQLITE_OK;
|
||||
}else{
|
||||
Vdbe *v = (Vdbe*)pStmt;
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecFinalize(pStmt);
|
||||
#endif
|
||||
sqlite3 *db = v->db;
|
||||
if( vdbeSafety(v) ) return SQLITE_MISUSE_BKPT;
|
||||
sqlite3_mutex_enter(db->mutex);
|
||||
@@ -128,6 +134,9 @@ int sqlite3_reset(sqlite3_stmt *pStmt){
|
||||
}else{
|
||||
Vdbe *v = (Vdbe*)pStmt;
|
||||
sqlite3 *db = v->db;
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecReset(pStmt);
|
||||
#endif
|
||||
sqlite3_mutex_enter(db->mutex);
|
||||
checkProfileCallback(db, v);
|
||||
rc = sqlite3VdbeReset(v);
|
||||
@@ -147,7 +156,14 @@ int sqlite3_clear_bindings(sqlite3_stmt *pStmt){
|
||||
int rc = SQLITE_OK;
|
||||
Vdbe *p = (Vdbe*)pStmt;
|
||||
#if SQLITE_THREADSAFE
|
||||
sqlite3_mutex *mutex = ((Vdbe*)pStmt)->db->mutex;
|
||||
sqlite3_mutex *mutex=NULL;
|
||||
#endif
|
||||
if( NULL==pStmt ){ return SQLITE_OK; } /* <rdar://problem/6646331> */
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecClearBindings(pStmt);
|
||||
#endif
|
||||
#if SQLITE_THREADSAFE
|
||||
mutex = ((Vdbe*)pStmt)->db->mutex;
|
||||
#endif
|
||||
sqlite3_mutex_enter(mutex);
|
||||
for(i=0; i<p->nVar; i++){
|
||||
@@ -1346,6 +1362,9 @@ int sqlite3_bind_blob(
|
||||
int nData,
|
||||
void (*xDel)(void*)
|
||||
){
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecBindBlob(pStmt, i, zData, nData);
|
||||
#endif
|
||||
#ifdef SQLITE_ENABLE_API_ARMOR
|
||||
if( nData<0 ) return SQLITE_MISUSE_BKPT;
|
||||
#endif
|
||||
@@ -1368,6 +1387,9 @@ int sqlite3_bind_blob64(
|
||||
int sqlite3_bind_double(sqlite3_stmt *pStmt, int i, double rValue){
|
||||
int rc;
|
||||
Vdbe *p = (Vdbe *)pStmt;
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecBindDouble(pStmt, i, rValue);
|
||||
#endif
|
||||
rc = vdbeUnbind(p, i);
|
||||
if( rc==SQLITE_OK ){
|
||||
sqlite3VdbeMemSetDouble(&p->aVar[i-1], rValue);
|
||||
@@ -1376,11 +1398,17 @@ int sqlite3_bind_double(sqlite3_stmt *pStmt, int i, double rValue){
|
||||
return rc;
|
||||
}
|
||||
int sqlite3_bind_int(sqlite3_stmt *p, int i, int iValue){
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecBindInt64(p, i, (i64)iValue);
|
||||
#endif
|
||||
return sqlite3_bind_int64(p, i, (i64)iValue);
|
||||
}
|
||||
int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValue){
|
||||
int rc;
|
||||
Vdbe *p = (Vdbe *)pStmt;
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecBindInt64(pStmt, i, iValue);
|
||||
#endif
|
||||
rc = vdbeUnbind(p, i);
|
||||
if( rc==SQLITE_OK ){
|
||||
sqlite3VdbeMemSetInt64(&p->aVar[i-1], iValue);
|
||||
@@ -1391,6 +1419,9 @@ int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValue){
|
||||
int sqlite3_bind_null(sqlite3_stmt *pStmt, int i){
|
||||
int rc;
|
||||
Vdbe *p = (Vdbe*)pStmt;
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecBindNull(pStmt, i);
|
||||
#endif
|
||||
rc = vdbeUnbind(p, i);
|
||||
if( rc==SQLITE_OK ){
|
||||
sqlite3_mutex_leave(p->db->mutex);
|
||||
@@ -1422,6 +1453,9 @@ int sqlite3_bind_text(
|
||||
int nData,
|
||||
void (*xDel)(void*)
|
||||
){
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecBindText(pStmt, i, zData, nData);
|
||||
#endif
|
||||
return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF8);
|
||||
}
|
||||
int sqlite3_bind_text64(
|
||||
@@ -1448,6 +1482,9 @@ int sqlite3_bind_text16(
|
||||
int nData,
|
||||
void (*xDel)(void*)
|
||||
){
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecBindText(pStmt, i, zData, nData);
|
||||
#endif
|
||||
return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF16NATIVE);
|
||||
}
|
||||
#endif /* SQLITE_OMIT_UTF16 */
|
||||
@@ -1471,6 +1508,9 @@ int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_value *pValue){
|
||||
break;
|
||||
}
|
||||
case SQLITE_TEXT: {
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecBindText(pStmt, i, pValue->z, pValue->n);
|
||||
#endif
|
||||
rc = bindText(pStmt,i, pValue->z, pValue->n, SQLITE_TRANSIENT,
|
||||
pValue->enc);
|
||||
break;
|
||||
@@ -1485,6 +1525,9 @@ int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_value *pValue){
|
||||
int sqlite3_bind_zeroblob(sqlite3_stmt *pStmt, int i, int n){
|
||||
int rc;
|
||||
Vdbe *p = (Vdbe *)pStmt;
|
||||
#ifdef SQLITE_ENABLE_SQLRR
|
||||
SRRecBindBlob(pStmt, i, NULL, n);
|
||||
#endif
|
||||
rc = vdbeUnbind(p, i);
|
||||
if( rc==SQLITE_OK ){
|
||||
sqlite3VdbeMemSetZeroBlob(&p->aVar[i-1], n);
|
||||
|
||||
@@ -1324,11 +1324,12 @@ int sqlite3WalOpen(
|
||||
const char *zWalName, /* Name of the WAL file */
|
||||
int bNoShm, /* True to run in heap-memory mode */
|
||||
i64 mxWalSize, /* Truncate WAL to this size on reset */
|
||||
int flags, /* VFS file protection flags */
|
||||
Wal **ppWal /* OUT: Allocated Wal handle */
|
||||
){
|
||||
int rc; /* Return Code */
|
||||
Wal *pRet; /* Object to allocate and return */
|
||||
int flags; /* Flags passed to OsOpen() */
|
||||
int vfsFlags; /* Flags passed to OsOpen() */
|
||||
|
||||
assert( zWalName && zWalName[0] );
|
||||
assert( pDbFd );
|
||||
@@ -1367,9 +1368,13 @@ int sqlite3WalOpen(
|
||||
pRet->exclusiveMode = (bNoShm ? WAL_HEAPMEMORY_MODE: WAL_NORMAL_MODE);
|
||||
|
||||
/* Open file handle on the write-ahead log file. */
|
||||
flags = (SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_WAL);
|
||||
rc = sqlite3OsOpen(pVfs, zWalName, pRet->pWalFd, flags, &flags);
|
||||
if( rc==SQLITE_OK && flags&SQLITE_OPEN_READONLY ){
|
||||
if( flags&SQLITE_OPEN_READONLY ){
|
||||
vfsFlags = flags | SQLITE_OPEN_WAL;
|
||||
} else {
|
||||
vfsFlags = flags | (SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_WAL);
|
||||
}
|
||||
rc = sqlite3OsOpen(pVfs, zWalName, pRet->pWalFd, vfsFlags, &vfsFlags);
|
||||
if( rc==SQLITE_OK && vfsFlags&SQLITE_OPEN_READONLY ){
|
||||
pRet->readOnly = WAL_RDONLY;
|
||||
}
|
||||
|
||||
@@ -2065,6 +2070,9 @@ static int walIndexTryHdr(Wal *pWal, int *pChanged){
|
||||
** reordering the reads and writes.
|
||||
*/
|
||||
aHdr = walIndexHdr(pWal);
|
||||
if( aHdr==NULL ){
|
||||
return 1; /* Shouldn't be getting NULL from walIndexHdr, but we are */
|
||||
}
|
||||
memcpy(&h1, (void *)&aHdr[0], sizeof(h1));
|
||||
walShmBarrier(pWal);
|
||||
memcpy(&h2, (void *)&aHdr[1], sizeof(h2));
|
||||
@@ -2962,7 +2970,6 @@ Pgno sqlite3WalDbsize(Wal *pWal){
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** This function starts a write transaction on the WAL.
|
||||
**
|
||||
@@ -3180,6 +3187,10 @@ typedef struct WalWriter {
|
||||
sqlite3_int64 iSyncPoint; /* Fsync at this offset */
|
||||
int syncFlags; /* Flags for the fsync */
|
||||
int szPage; /* Size of one page */
|
||||
#if defined(SQLITE_WRITE_WALFRAME_PREBUFFERED)
|
||||
void *aFrameBuf; /* Frame buffer */
|
||||
size_t szFrameBuf; /* Size of frame buffer */
|
||||
#endif
|
||||
} WalWriter;
|
||||
|
||||
/*
|
||||
@@ -3223,17 +3234,29 @@ static int walWriteOneFrame(
|
||||
){
|
||||
int rc; /* Result code from subfunctions */
|
||||
void *pData; /* Data actually written */
|
||||
#if defined(SQLITE_WRITE_WALFRAME_PREBUFFERED)
|
||||
u8 *aFrame = p->aFrameBuf;
|
||||
#else
|
||||
u8 aFrame[WAL_FRAME_HDRSIZE]; /* Buffer to assemble frame-header in */
|
||||
#endif
|
||||
|
||||
#if defined(SQLITE_HAS_CODEC)
|
||||
if( (pData = sqlite3PagerCodec(pPage))==0 ) return SQLITE_NOMEM_BKPT;
|
||||
#else
|
||||
pData = pPage->pData;
|
||||
#endif
|
||||
|
||||
walEncodeFrame(p->pWal, pPage->pgno, nTruncate, pData, aFrame);
|
||||
|
||||
#if defined(SQLITE_WRITE_WALFRAME_PREBUFFERED)
|
||||
memcpy(&aFrame[WAL_FRAME_HDRSIZE], pData, p->szPage);
|
||||
rc = walWriteToLog(p, aFrame, (p->szPage + WAL_FRAME_HDRSIZE), iOffset);
|
||||
#else
|
||||
rc = walWriteToLog(p, aFrame, sizeof(aFrame), iOffset);
|
||||
if( rc ) return rc;
|
||||
/* Write the page data */
|
||||
rc = walWriteToLog(p, pData, p->szPage, iOffset+sizeof(aFrame));
|
||||
#endif
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -3392,6 +3415,13 @@ int sqlite3WalFrames(
|
||||
w.szPage = szPage;
|
||||
iOffset = walFrameOffset(iFrame+1, szPage);
|
||||
szFrame = szPage + WAL_FRAME_HDRSIZE;
|
||||
#if defined(SQLITE_WRITE_WALFRAME_PREBUFFERED)
|
||||
w.aFrameBuf = (void *)malloc(szFrame);
|
||||
if( NULL==w.aFrameBuf ){
|
||||
return SQLITE_NOMEM;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* Write all frames into the log file exactly once */
|
||||
for(p=pList; p; p=p->pDirty){
|
||||
@@ -3427,7 +3457,12 @@ int sqlite3WalFrames(
|
||||
assert( iOffset==walFrameOffset(iFrame, szPage) );
|
||||
nDbSize = (isCommit && p->pDirty==0) ? nTruncate : 0;
|
||||
rc = walWriteOneFrame(&w, p, nDbSize, iOffset);
|
||||
if( rc ) return rc;
|
||||
if( rc ) {
|
||||
#if defined(SQLITE_WRITE_WALFRAME_PREBUFFERED)
|
||||
free(w.aFrameBuf);
|
||||
#endif
|
||||
return rc;
|
||||
}
|
||||
pLast = p;
|
||||
iOffset += szFrame;
|
||||
p->flags |= PGHDR_WAL_APPEND;
|
||||
@@ -3462,7 +3497,12 @@ int sqlite3WalFrames(
|
||||
testcase( bSync );
|
||||
while( iOffset<w.iSyncPoint ){
|
||||
rc = walWriteOneFrame(&w, pLast, nTruncate, iOffset);
|
||||
if( rc ) return rc;
|
||||
if( rc ) {
|
||||
#if defined(SQLITE_WRITE_WALFRAME_PREBUFFERED)
|
||||
free(w.aFrameBuf);
|
||||
#endif
|
||||
return rc;
|
||||
}
|
||||
iOffset += szFrame;
|
||||
nExtra++;
|
||||
}
|
||||
@@ -3473,6 +3513,9 @@ int sqlite3WalFrames(
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(SQLITE_WRITE_WALFRAME_PREBUFFERED)
|
||||
free(w.aFrameBuf);
|
||||
#endif
|
||||
/* If this frame set completes the first transaction in the WAL and
|
||||
** if PRAGMA journal_size_limit is set, then truncate the WAL to the
|
||||
** journal size limit, if possible.
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
typedef struct Wal Wal;
|
||||
|
||||
/* Open and close a connection to a write-ahead log. */
|
||||
int sqlite3WalOpen(sqlite3_vfs*, sqlite3_file*, const char *, int, i64, Wal**);
|
||||
int sqlite3WalOpen(sqlite3_vfs*, sqlite3_file*, const char *, int, i64, int, Wal**);
|
||||
int sqlite3WalClose(Wal *pWal, sqlite3*, int sync_flags, int, u8 *);
|
||||
|
||||
/* Set the limiting size of a WAL file. */
|
||||
@@ -78,6 +78,9 @@ int sqlite3WalReadFrame(Wal *, u32, int, u8 *);
|
||||
/* If the WAL is not empty, return the size of the database. */
|
||||
Pgno sqlite3WalDbsize(Wal *pWal);
|
||||
|
||||
/* If a WAL journal file has been created, return it */
|
||||
sqlite3_file *sqlite3WalFile(Wal *pWal);
|
||||
|
||||
/* Obtain or release the WRITER lock. */
|
||||
int sqlite3WalBeginWriteTransaction(Wal *pWal);
|
||||
int sqlite3WalEndWriteTransaction(Wal *pWal);
|
||||
|
||||
@@ -146,6 +146,8 @@ ifcapable !wal {
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
if ![wal_is_ok] { finish_test; return }
|
||||
|
||||
db close
|
||||
forcedelete test.db
|
||||
do_test 8_3_names-5.0 {
|
||||
|
||||
+18
-17
@@ -737,23 +737,24 @@ do_test attach-6.1 {
|
||||
}
|
||||
} {0 {}}
|
||||
if {$tcl_platform(platform)=="unix"} {
|
||||
do_test attach-6.2 {
|
||||
sqlite3 dbx cannot-read
|
||||
dbx eval {CREATE TABLE t1(a,b,c)}
|
||||
dbx close
|
||||
file attributes cannot-read -permission 0000
|
||||
if {[file writable cannot-read]} {
|
||||
puts "\n**** Tests do not work when run as root ****"
|
||||
forcedelete cannot-read
|
||||
exit 1
|
||||
}
|
||||
catchsql {
|
||||
ATTACH DATABASE 'cannot-read' AS noread;
|
||||
}
|
||||
} {1 {unable to open database: cannot-read}}
|
||||
do_test attach-6.2.2 {
|
||||
db errorcode
|
||||
} {14}
|
||||
sqlite3 dbx cannot-read
|
||||
dbx eval {CREATE TABLE t1(a,b,c)}
|
||||
dbx close
|
||||
file attributes cannot-read -permission 0000
|
||||
if {[file writable cannot-read]} {
|
||||
#puts "\n**** Tests do not work when run as root ****"
|
||||
forcedelete cannot-read
|
||||
#exit 1
|
||||
} else {
|
||||
do_test attach-6.2 {
|
||||
catchsql {
|
||||
ATTACH DATABASE 'cannot-read' AS noread;
|
||||
}
|
||||
} {1 {unable to open database: cannot-read}}
|
||||
do_test attach-6.2.2 {
|
||||
db errorcode
|
||||
} {14}
|
||||
}
|
||||
forcedelete cannot-read
|
||||
}
|
||||
|
||||
|
||||
@@ -80,6 +80,7 @@ foreach {name f} $files {
|
||||
set mode wal
|
||||
}
|
||||
ifcapable !wal { set mode delete }
|
||||
if ![wal_is_ok] { set mode delete }
|
||||
lappend L $mode
|
||||
append S "
|
||||
PRAGMA $name.journal_mode = WAL;
|
||||
|
||||
@@ -656,6 +656,9 @@ do_test bind-13.4 {
|
||||
[sqlite3_column_type $VM 2]
|
||||
} {NULL NULL NULL}
|
||||
sqlite3_finalize $VM
|
||||
do_test bind-13.5 {
|
||||
sqlite3_clear_bindings_null
|
||||
} {0}
|
||||
|
||||
#--------------------------------------------------------------------
|
||||
# These tests attempt to reproduce bug #3463.
|
||||
|
||||
+16
-5
@@ -107,12 +107,17 @@ do_execsql_test cache-2.3.3 {
|
||||
} {main exclusive temp closed}
|
||||
do_test cache-2.3.4 { pager_cache_size db } 2
|
||||
do_execsql_test cache-2.3.5 COMMIT
|
||||
do_test cache-2.3.6 { pager_cache_size db } 1
|
||||
|
||||
if !$::sqlite_options(enable_purgeable_pcache) {
|
||||
# purgeable pcache doesn't share cache between connections
|
||||
do_test cache-2.3.6 { pager_cache_size db } 1
|
||||
}
|
||||
do_execsql_test cache-2.3.7 {
|
||||
SELECT * FROM t1 UNION SELECT * FROM t2;
|
||||
} {1 2 i j x y}
|
||||
do_test cache-2.3.8 { pager_cache_size db } 1
|
||||
if !$::sqlite_options(enable_purgeable_pcache) {
|
||||
# purgeable pcache doesn't share cache between connections
|
||||
do_test cache-2.3.8 { pager_cache_size db } 1
|
||||
}
|
||||
|
||||
# Tests for cache_size = 0.
|
||||
#
|
||||
@@ -130,11 +135,17 @@ do_execsql_test cache-2.4.3 {
|
||||
do_test cache-2.4.4 { pager_cache_size db } 2
|
||||
do_execsql_test cache-2.4.5 COMMIT
|
||||
|
||||
do_test cache-2.4.6 { pager_cache_size db } 0
|
||||
if !$::sqlite_options(enable_purgeable_pcache) {
|
||||
# purgeable pcache doesn't share cache between connections
|
||||
do_test cache-2.4.6 { pager_cache_size db } 0
|
||||
}
|
||||
do_execsql_test cache-2.4.7 {
|
||||
SELECT * FROM t1 UNION SELECT * FROM t2;
|
||||
} {1 2 i j x y}
|
||||
do_test cache-2.4.8 { pager_cache_size db } 0
|
||||
if !$::sqlite_options(enable_purgeable_pcache) {
|
||||
# purgeable pcache doesn't share cache between connections
|
||||
do_test cache-2.4.8 { pager_cache_size db } 0
|
||||
}
|
||||
|
||||
sqlite3_soft_heap_limit $cmdlinearg(soft-heap-limit)
|
||||
finish_test
|
||||
|
||||
@@ -42,6 +42,9 @@ proc db_spill {db {reset 0}} {
|
||||
}
|
||||
|
||||
do_test 1.1 {
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
db close
|
||||
sqlite3 db test.db
|
||||
execsql { PRAGMA mmap_size = 0 }
|
||||
|
||||
+2
-1
@@ -33,7 +33,8 @@ testvfs oldvfs -iversion 1
|
||||
#
|
||||
# All three done with VFS "oldvfs", which has iVersion==1 and so does
|
||||
# not support shared memory.
|
||||
#
|
||||
#
|
||||
forcedelete test.db-shm
|
||||
sqlite3 db test.db -vfs oldvfs
|
||||
do_execsql_test 1.1.1 {
|
||||
PRAGMA journal_mode = WAL;
|
||||
|
||||
@@ -440,6 +440,7 @@ foreach {tn script} {
|
||||
# It's not. Test case "$tp.6".
|
||||
#
|
||||
do_test $tp.4 {
|
||||
forcedelete abc.db-shm abc.db-wal
|
||||
forcecopy test.db abc.db
|
||||
sqlite3 db4 abc.db
|
||||
db4 eval { SELECT * FROM t1 UNION ALL SELECT * FROM t2 }
|
||||
|
||||
+1
-5
@@ -404,12 +404,8 @@ sqlite3 db test.db
|
||||
# if we're using proxy locks, we use 3 filedescriptors for a db
|
||||
# that is open but NOT writing changes, normally
|
||||
# sqlite uses 1 (proxy locking adds the conch and the local lock)
|
||||
set using_proxy 0
|
||||
foreach {name value} [array get env SQLITE_FORCE_PROXY_LOCKING] {
|
||||
set using_proxy $value
|
||||
}
|
||||
set extrafds 0
|
||||
if {$using_proxy!=0} {
|
||||
if {[forced_proxy_locking]} {
|
||||
set extrafds 2
|
||||
}
|
||||
|
||||
|
||||
+12
-1
@@ -79,13 +79,24 @@ set skipwaltests [expr {
|
||||
[permutation]=="journaltest" || [permutation]=="inmemory_journal"
|
||||
}]
|
||||
ifcapable !wal { set skipwaltests 1 }
|
||||
if {![wal_is_ok]} { set skipwaltests 1 }
|
||||
|
||||
if {!$skipwaltests} {
|
||||
db close
|
||||
forcedelete test.db
|
||||
ifcapable enable_persist_wal {
|
||||
forcedelete test.db-journal
|
||||
forcedelete test.db-wal
|
||||
forcedelete test.db-shm
|
||||
}
|
||||
if {[forced_proxy_locking]} {
|
||||
forcedelete .test.db-conch
|
||||
}
|
||||
sqlite3 db test.db
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
file_control_chunksize_test db main [expr 32*1024]
|
||||
|
||||
do_test fallocate-2.1 {
|
||||
execsql {
|
||||
PRAGMA page_size = 1024;
|
||||
|
||||
+11
-6
@@ -260,12 +260,17 @@ proc access_method {args} {
|
||||
return ""
|
||||
}
|
||||
|
||||
do_test incrblob3-7.2 {
|
||||
sqlite3 db test.db
|
||||
sqlite3_db_config_lookaside db 0 0 0
|
||||
list [catch {db incrblob blobs v 1} msg] $msg
|
||||
} {1 {database schema has changed}}
|
||||
db close
|
||||
#set sqlite_os_trace 1
|
||||
# AFP asserts because the "db incrblob blobs v 1" clears the file locks and the unlock fails (HFS doesn't care about a failed unlock)
|
||||
if {[path_is_local "."]} {
|
||||
|
||||
do_test incrblob3-7.2 {
|
||||
sqlite3 db test.db
|
||||
sqlite3_db_config_lookaside db 0 0 0
|
||||
list [catch {db incrblob blobs v 1} msg] $msg
|
||||
} {1 {database schema has changed}}
|
||||
db close
|
||||
}
|
||||
tvfs delete
|
||||
|
||||
finish_test
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
source $testdir/wal_common.tcl
|
||||
|
||||
# If this build of the library does not support auto-vacuum, omit this
|
||||
# whole file.
|
||||
@@ -134,6 +135,8 @@ do_test incrvacuum2-3.2 {
|
||||
|
||||
integrity_check incrvacuum2-3.3
|
||||
|
||||
if ![wal_is_ok] { finish_test; return }
|
||||
|
||||
if {[wal_is_capable]} {
|
||||
# At one point, when a specific page was being extracted from the b-tree
|
||||
# free-list (e.g. during an incremental-vacuum), all trunk pages that
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ source $testdir/malloc_common.tcl
|
||||
# If a connection is required to create a journal file, it creates it with
|
||||
# the same file-system permissions as the database file itself. Test this.
|
||||
#
|
||||
if {$::tcl_platform(platform) == "unix"
|
||||
if {$::tcl_platform(platform) == "unix" && ![path_is_dos "."]
|
||||
&& [atomic_batch_write test.db]==0
|
||||
} {
|
||||
|
||||
|
||||
+74
-68
@@ -106,88 +106,94 @@ if {[catch {sqlite3 db test.db -vfs unix-flock} msg]} {
|
||||
return
|
||||
}
|
||||
|
||||
do_test lock5-flock.1 {
|
||||
sqlite3 db test.db -vfs unix-flock
|
||||
execsql {
|
||||
CREATE TABLE t1(a, b);
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES(1, 2);
|
||||
}
|
||||
} {}
|
||||
# Only run the flock tests on a local file system
|
||||
if { [path_is_local "."] } {
|
||||
|
||||
# Make sure we are not accidentally using the dotfile locking scheme.
|
||||
do_test lock5-flock.2 {
|
||||
file exists test.db.lock
|
||||
} {0}
|
||||
do_test lock5-flock.1 {
|
||||
sqlite3 db test.db -vfs unix-flock
|
||||
execsql {
|
||||
CREATE TABLE t1(a, b);
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES(1, 2);
|
||||
}
|
||||
} {}
|
||||
|
||||
do_test lock5-flock.3 {
|
||||
catch { sqlite3 db2 test.db -vfs unix-flock }
|
||||
catchsql { SELECT * FROM t1 } db2
|
||||
} {1 {database is locked}}
|
||||
# Make sure we are not accidentally using the dotfile locking scheme.
|
||||
do_test lock5-flock.2 {
|
||||
file exists test.db.lock
|
||||
} {0}
|
||||
|
||||
do_test lock5-flock.4 {
|
||||
execsql COMMIT
|
||||
catchsql { SELECT * FROM t1 } db2
|
||||
} {0 {1 2}}
|
||||
do_test lock5-flock.3 {
|
||||
catch { sqlite3 db2 test.db -vfs unix-flock }
|
||||
catchsql { SELECT * FROM t1 } db2
|
||||
} {1 {database is locked}}
|
||||
|
||||
do_test lock5-flock.5 {
|
||||
execsql BEGIN
|
||||
catchsql { SELECT * FROM t1 } db2
|
||||
} {0 {1 2}}
|
||||
do_test lock5-flock.4 {
|
||||
execsql COMMIT
|
||||
catchsql { SELECT * FROM t1 } db2
|
||||
} {0 {1 2}}
|
||||
|
||||
do_test lock5-flock.6 {
|
||||
execsql {SELECT * FROM t1}
|
||||
catchsql { SELECT * FROM t1 } db2
|
||||
} {1 {database is locked}}
|
||||
do_test lock5-flock.5 {
|
||||
execsql BEGIN
|
||||
catchsql { SELECT * FROM t1 } db2
|
||||
} {0 {1 2}}
|
||||
|
||||
do_test lock5-flock.7 {
|
||||
db close
|
||||
catchsql { SELECT * FROM t1 } db2
|
||||
} {0 {1 2}}
|
||||
do_test lock5-flock.6 {
|
||||
execsql {SELECT * FROM t1}
|
||||
catchsql { SELECT * FROM t1 } db2
|
||||
} {1 {database is locked}}
|
||||
|
||||
do_test lock5-flock.8 {
|
||||
db2 close
|
||||
} {}
|
||||
do_test lock5-flock.7 {
|
||||
db close
|
||||
catchsql { SELECT * FROM t1 } db2
|
||||
} {0 {1 2}}
|
||||
|
||||
#####################################################################
|
||||
do_test lock5-flock.8 {
|
||||
db2 close
|
||||
} {}
|
||||
|
||||
do_test lock5-none.1 {
|
||||
sqlite3 db test.db -vfs unix-none
|
||||
sqlite3 db2 test.db -vfs unix-none
|
||||
execsql { PRAGMA mmap_size = 0 } db2
|
||||
execsql {
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES(3, 4);
|
||||
}
|
||||
} {}
|
||||
do_test lock5-none.2 {
|
||||
execsql { SELECT * FROM t1 }
|
||||
} {1 2 3 4}
|
||||
do_test lock5-none.3 {
|
||||
execsql { SELECT * FROM t1; } db2
|
||||
} {1 2}
|
||||
do_test lock5-none.4 {
|
||||
execsql {
|
||||
BEGIN;
|
||||
SELECT * FROM t1;
|
||||
} db2
|
||||
} {1 2}
|
||||
do_test lock5-none.5 {
|
||||
execsql COMMIT
|
||||
execsql {SELECT * FROM t1} db2
|
||||
} {1 2}
|
||||
#####################################################################
|
||||
|
||||
ifcapable memorymanage {
|
||||
do_test lock5-none.1 {
|
||||
sqlite3 db test.db -vfs unix-none
|
||||
sqlite3 db2 test.db -vfs unix-none
|
||||
execsql {
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES(3, 4);
|
||||
}
|
||||
} {}
|
||||
do_test lock5-none.2 {
|
||||
execsql { SELECT * FROM t1 }
|
||||
} {1 2 3 4}
|
||||
do_test lock5-flock.3 {
|
||||
execsql { SELECT * FROM t1 } db2
|
||||
} {1 2}
|
||||
do_test lock5-none.4 {
|
||||
execsql {
|
||||
BEGIN;
|
||||
SELECT * FROM t1;
|
||||
} db2
|
||||
} {1 2}
|
||||
do_test lock5-none.5 {
|
||||
execsql COMMIT
|
||||
} {}
|
||||
do_test lock5-none.6 {
|
||||
sqlite3_release_memory 1000000
|
||||
execsql {SELECT * FROM t1} db2
|
||||
} {1 2 3 4}
|
||||
}
|
||||
} {1 2}
|
||||
|
||||
do_test lock5-none.X {
|
||||
db close
|
||||
db2 close
|
||||
} {}
|
||||
ifcapable memorymanage {
|
||||
do_test lock5-none.6 {
|
||||
sqlite3_release_memory 1000000
|
||||
execsql {SELECT * FROM t1} db2
|
||||
} {1 2 3 4}
|
||||
}
|
||||
|
||||
do_test lock5-flock.X {
|
||||
db close
|
||||
db2 close
|
||||
} {}
|
||||
}
|
||||
|
||||
ifcapable lock_proxy_pragmas {
|
||||
set env(SQLITE_FORCE_PROXY_LOCKING) $::using_proxy
|
||||
|
||||
+5
-3
@@ -126,9 +126,10 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
set lockpath
|
||||
} {{:auto: (not held)}}
|
||||
|
||||
set lpp [exec mktemp -t fail]
|
||||
do_test lock6-1.4.1 {
|
||||
execsql "PRAGMA lock_proxy_file='$lpp'"
|
||||
catchsql {
|
||||
PRAGMA lock_proxy_file="notmine";
|
||||
select * from sqlite_master;
|
||||
} db
|
||||
} {1 {database is locked}}
|
||||
@@ -137,7 +138,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
execsql {
|
||||
PRAGMA lock_proxy_file;
|
||||
} db
|
||||
} {notmine}
|
||||
} $lpp
|
||||
|
||||
do_test lock6-1.5 {
|
||||
testfixture $::tf1 {
|
||||
@@ -150,9 +151,10 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
|
||||
catch {testfixture $::tf1 {db close}}
|
||||
|
||||
set lpp [exec mktemp -t ok]
|
||||
do_test lock6-1.6 {
|
||||
execsql "PRAGMA lock_proxy_file='$lpp'"
|
||||
execsql {
|
||||
PRAGMA lock_proxy_file="mine";
|
||||
select * from sqlite_master;
|
||||
} db
|
||||
} {}
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
# 2008 June 28
|
||||
#
|
||||
# The author disclaims copyright to this source code. In place of
|
||||
# a legal notice, here is a blessing:
|
||||
#
|
||||
# May you do good and not evil.
|
||||
# May you find forgiveness for yourself and forgive others.
|
||||
# May you share freely, never taking more than you give.
|
||||
#
|
||||
#***********************************************************************
|
||||
# This file implements regression tests for SQLite library. The
|
||||
# focus of this script is database proxy locks.
|
||||
#
|
||||
# $Id$
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
|
||||
# This file is only run if using the unix backend compiled with the
|
||||
# SQLITE_ENABLE_LOCKING_STYLE macro.
|
||||
db close
|
||||
if {[catch {sqlite3 db test.db -vfs unix-none} msg]} {
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
db close
|
||||
file delete -force test.db.lock
|
||||
|
||||
#####################################################################
|
||||
ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
set ::using_proxy 0
|
||||
foreach {name value} [array get env SQLITE_FORCE_PROXY_LOCKING] {
|
||||
set ::using_proxy $value
|
||||
}
|
||||
|
||||
# enable the proxy locking for these tests
|
||||
set env(SQLITE_FORCE_PROXY_LOCKING) "1"
|
||||
|
||||
# test conch file creation
|
||||
#
|
||||
|
||||
catch { file delete lock_proxy_test.db }
|
||||
catch { file delete .lock_proxy_test.db-conch }
|
||||
# test that proxy locking mode creates conch files
|
||||
do_test lock_proxy1.0 {
|
||||
sqlite3 db2 lock_proxy_test.db
|
||||
catchsql {
|
||||
create table x(y);
|
||||
} db2
|
||||
file exists .lock_proxy_test.db-conch
|
||||
} {1}
|
||||
catch { db2 close }
|
||||
|
||||
|
||||
# test proxy locking readonly file system handling
|
||||
#
|
||||
|
||||
if {[file exists /usr/bin/hdiutil]} {
|
||||
|
||||
puts "Creating readonly file system for proxy locking tests..."
|
||||
if {[file exists /Volumes/readonly]} {
|
||||
exec hdiutil detach /Volumes/readonly
|
||||
}
|
||||
if {[file exists readonly.dmg]} {
|
||||
file delete readonly.dmg
|
||||
}
|
||||
exec hdiutil create -megabytes 1 -fs HFS+ readonly.dmg -volname readonly
|
||||
exec hdiutil attach readonly.dmg
|
||||
|
||||
# create test1.db and a .test1.db-conch for host4
|
||||
set sqlite_hostid_num 4
|
||||
sqlite3 db2 /Volumes/readonly/test1.db
|
||||
execsql {
|
||||
create table x(y);
|
||||
} db2
|
||||
db2 close
|
||||
|
||||
# create test2.db and a .test2.db-conch for host5
|
||||
set sqlite_hostid_num 5
|
||||
sqlite3 db2 /Volumes/readonly/test2.db
|
||||
execsql {
|
||||
create table x(y);
|
||||
} db2
|
||||
db2 close
|
||||
|
||||
# create test3.db without a conch file
|
||||
set env(SQLITE_FORCE_PROXY_LOCKING) "0"
|
||||
sqlite3 db2 /Volumes/readonly/test3.db
|
||||
execsql {
|
||||
create table x(y);
|
||||
} db2
|
||||
db2 close
|
||||
exec hdiutil detach /Volumes/readonly
|
||||
exec hdiutil attach -readonly readonly.dmg
|
||||
|
||||
# test that an unwritable, host-mismatched conch file prevents
|
||||
# read only proxy-locking mode database access
|
||||
set env(SQLITE_FORCE_PROXY_LOCKING) "1"
|
||||
do_test lock_proxy2.0 {
|
||||
sqlite3 db2 /Volumes/readonly/test1.db
|
||||
catchsql {
|
||||
select * from sqlite_master;
|
||||
} db2
|
||||
} {1 {database is locked}}
|
||||
catch { db2 close }
|
||||
|
||||
# test that an unwritable, host-matching conch file allows
|
||||
# read only proxy-locking mode database access
|
||||
do_test lock_proxy2.1 {
|
||||
sqlite3 db2 /Volumes/readonly/test2.db
|
||||
catchsql {
|
||||
select * from sqlite_master;
|
||||
} db2
|
||||
} {0 {table x x 2 {CREATE TABLE x(y)}}}
|
||||
catch { db2 close }
|
||||
|
||||
# test that an unwritable, nonexistant conch file allows
|
||||
# read only proxy-locking mode database access
|
||||
do_test lock_proxy2.2 {
|
||||
sqlite3 db2 /Volumes/readonly/test3.db
|
||||
catchsql {
|
||||
select * from sqlite_master;
|
||||
} db2
|
||||
} {0 {table x x 2 {CREATE TABLE x(y)}}}
|
||||
catch { db2 close }
|
||||
|
||||
exec hdiutil detach /Volumes/readonly
|
||||
file delete readonly.dmg
|
||||
}
|
||||
set env(SQLITE_FORCE_PROXY_LOCKING) "0"
|
||||
set sqlite_hostid_num 0
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
|
||||
file delete -force test.db
|
||||
|
||||
ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
set env(SQLITE_FORCE_PROXY_LOCKING) $::using_proxy
|
||||
}
|
||||
|
||||
finish_test
|
||||
+3
-3
@@ -314,7 +314,7 @@ if {[permutation] == ""} {
|
||||
#
|
||||
do_test main-3.1 {
|
||||
catch {db close}
|
||||
foreach f [glob -nocomplain testdb/*] {forcedelete $f}
|
||||
catch {foreach f [glob -nocomplain testdb/*] {forcedelete $f}}
|
||||
forcedelete testdb
|
||||
sqlite3 db testdb
|
||||
set v [catch {execsql {SELECT * from T1 where x!!5}} msg]
|
||||
@@ -322,7 +322,7 @@ do_test main-3.1 {
|
||||
} {1 {unrecognized token: "!"}}
|
||||
do_test main-3.2 {
|
||||
catch {db close}
|
||||
foreach f [glob -nocomplain testdb/*] {forcedelete $f}
|
||||
catch {foreach f [glob -nocomplain testdb/*] {forcedelete $f}}
|
||||
forcedelete testdb
|
||||
sqlite3 db testdb
|
||||
set v [catch {execsql {SELECT * from T1 where ^x}} msg]
|
||||
@@ -442,7 +442,7 @@ do_test main-3.2.30 {
|
||||
|
||||
do_test main-3.3 {
|
||||
catch {db close}
|
||||
foreach f [glob -nocomplain testdb/*] {forcedelete $f}
|
||||
catch {foreach f [glob -nocomplain testdb/*] {forcedelete $f}}
|
||||
forcedelete testdb
|
||||
sqlite3 db testdb
|
||||
execsql {
|
||||
|
||||
@@ -445,7 +445,7 @@ proc do_malloc_test {tn args} {
|
||||
set zRepeat "transient"
|
||||
if {$::iRepeat} {set zRepeat "persistent"}
|
||||
restore_prng_state
|
||||
foreach file [glob -nocomplain test.db-mj*] {forcedelete $file}
|
||||
catch {foreach file [glob -nocomplain test.db-mj*] {forcedelete $file}}
|
||||
|
||||
do_test ${tn}.${zRepeat}.${::n} {
|
||||
|
||||
|
||||
+1
-5
@@ -22,12 +22,8 @@ set N 300
|
||||
# if we're using proxy locks, we use 5 filedescriptors for a db
|
||||
# that is open and in the middle of writing changes, normally
|
||||
# sqlite uses 3 (proxy locking adds the conch and the local lock)
|
||||
set using_proxy 0
|
||||
foreach {name value} [array get env SQLITE_FORCE_PROXY_LOCKING] {
|
||||
set using_proxy value
|
||||
}
|
||||
set num_fd_per_openwrite_db 3
|
||||
if {$using_proxy>0} {
|
||||
if {[forced_proxy_locking]} {
|
||||
set num_fd_per_openwrite_db 5
|
||||
}
|
||||
|
||||
|
||||
+20
-18
@@ -11,7 +11,6 @@
|
||||
# This file implements regression tests for SQLite library. The
|
||||
# focus of this script is in-memory database backend.
|
||||
#
|
||||
# $Id: memdb.test,v 1.19 2009/05/18 16:04:38 danielk1977 Exp $
|
||||
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
@@ -407,23 +406,26 @@ do_test memdb-8.2 {
|
||||
|
||||
# Test that auto-vacuum works with in-memory databases.
|
||||
#
|
||||
ifcapable autovacuum {
|
||||
do_test memdb-9.1 {
|
||||
db close
|
||||
sqlite3 db test.db
|
||||
db cache size 0
|
||||
execsql {
|
||||
PRAGMA auto_vacuum = full;
|
||||
CREATE TABLE t1(a);
|
||||
INSERT INTO t1 VALUES(randstr(1000,1000));
|
||||
INSERT INTO t1 VALUES(randstr(1000,1000));
|
||||
INSERT INTO t1 VALUES(randstr(1000,1000));
|
||||
}
|
||||
set before [db one {PRAGMA page_count}]
|
||||
execsql { DELETE FROM t1 }
|
||||
set after [db one {PRAGMA page_count}]
|
||||
expr {$before>$after}
|
||||
} {1}
|
||||
set msize [sqlite3_status SQLITE_STATUS_MALLOC_SIZE 0]
|
||||
if {[lindex $msize 2]!=0} {
|
||||
ifcapable autovacuum {
|
||||
do_test memdb-9.1 {
|
||||
db close
|
||||
sqlite3 db test.db
|
||||
db cache size 0
|
||||
execsql {
|
||||
PRAGMA auto_vacuum = full;
|
||||
CREATE TABLE t1(a);
|
||||
INSERT INTO t1 VALUES(randstr(1000,1000));
|
||||
INSERT INTO t1 VALUES(randstr(1000,1000));
|
||||
INSERT INTO t1 VALUES(randstr(1000,1000));
|
||||
}
|
||||
set before [db one {PRAGMA page_count}]
|
||||
execsql { DELETE FROM t1 }
|
||||
set after [db one {PRAGMA page_count}]
|
||||
expr {$before>$after}
|
||||
} {1}
|
||||
}
|
||||
}
|
||||
|
||||
} ;# ifcapable memorydb
|
||||
|
||||
+19
-15
@@ -124,18 +124,20 @@ sqlite3_config singlethread
|
||||
sqlite3_initialize
|
||||
reset_highwater_marks
|
||||
build_test_db memsubsys1-3.1 {PRAGMA page_size=1024}
|
||||
do_test memsubsys1-3.1.3 {
|
||||
set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
|
||||
} 0
|
||||
do_test memsubsys1-3.1.4 {
|
||||
set overflow [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2]
|
||||
# Note: The measured PAGECACHE_OVERFLOW is amount malloc() returns, not what
|
||||
# was requested. System malloc() implementations might (arbitrarily) return
|
||||
# slightly different oversize buffers, which can result in slightly different
|
||||
# PAGECACHE_OVERFLOW sizes between consecutive runs. So we cannot do an
|
||||
# exact comparison. Simply verify that the amount is within 5%.
|
||||
expr {$overflow>=$max_pagecache*0.95 && $overflow<=$max_pagecache*1.05}
|
||||
} 1
|
||||
if !$::sqlite_options(enable_purgeable_pcache) {
|
||||
do_test memsubsys1-3.1.3 {
|
||||
set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
|
||||
} 0
|
||||
do_test memsubsys1-3.1.4 {
|
||||
set overflow [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2]
|
||||
# Note: The measured PAGECACHE_OVERFLOW is amount malloc() returns, not what
|
||||
# was requested. System malloc() implementations might (arbitrarily) return
|
||||
# slightly different oversize buffers, which can result in different
|
||||
# PAGECACHE_OVERFLOW sizes between consecutive runs. So we cannot do an
|
||||
# exact comparison. Simply verify that the amount is within 5%.
|
||||
expr {$overflow>=$max_pagecache*0.95 && $overflow<=$max_pagecache*1.05}
|
||||
} 1
|
||||
}
|
||||
do_test memsubsys1-3.1.5 {
|
||||
set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
|
||||
} 0
|
||||
@@ -169,9 +171,11 @@ do_test memsubsys1-4.3 {
|
||||
set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
|
||||
expr {$pg_used>=45 && $pg_used<=50}
|
||||
} 1
|
||||
do_test memsubsys1-4.4 {
|
||||
set pg_ovfl [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2]
|
||||
} 0
|
||||
if !$::sqlite_options(enable_purgeable_pcache) {
|
||||
do_test memsubsys1-4.4 {
|
||||
set pg_ovfl [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2]
|
||||
} 0
|
||||
}
|
||||
do_test memsubsys1-4.5 {
|
||||
set maxreq [lindex [sqlite3_status SQLITE_STATUS_MALLOC_SIZE 0] 2]
|
||||
expr {$maxreq<7000}
|
||||
|
||||
@@ -14,6 +14,12 @@ set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
source $testdir/malloc_common.tcl
|
||||
|
||||
# AFP doesn't like multiplex db tests
|
||||
if { ![path_is_local "."] } {
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
|
||||
# The tests in this file assume that SQLite is compiled without
|
||||
# ENABLE_8_3_NAMES.
|
||||
#
|
||||
|
||||
+40
-31
@@ -553,6 +553,8 @@ proc copy_on_mj_delete {method filename args} {
|
||||
return SQLITE_OK
|
||||
}
|
||||
|
||||
if {![forced_proxy_locking]} {
|
||||
# proxy locking uses can't deal with auto proxy file paths longer than MAXPATHLEN
|
||||
foreach {tn1 tcl} {
|
||||
1 { set prefix "test.db" }
|
||||
2 {
|
||||
@@ -739,6 +741,7 @@ foreach {tn1 tcl} {
|
||||
db close
|
||||
tv delete
|
||||
forcedelete $dirname
|
||||
}
|
||||
|
||||
# Set up a VFS to make a copy of the file-system just before deleting a
|
||||
# journal file to commit a transaction. The transaction modifies exactly
|
||||
@@ -1220,7 +1223,7 @@ do_execsql_test pager1-6.12 { PRAGMA max_page_count } {11}
|
||||
# $ws: The expected size of the WAL file, in bytes, after executing
|
||||
# the SQL script. Or -1 if the WAL is not expected to exist.
|
||||
#
|
||||
ifcapable wal {
|
||||
if {$::sqlite_options(wal) && [wal_is_ok]} {
|
||||
faultsim_delete_and_reopen
|
||||
foreach {tn sql res js ws} [subst {
|
||||
|
||||
@@ -1256,6 +1259,9 @@ ifcapable wal {
|
||||
10 { SELECT * FROM t1 } {1 2 3 4 5 6 7 8} 0 -1
|
||||
|
||||
}] {
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
do_execsql_test pager1-7.1.$tn.1 $sql $res
|
||||
catch { set J -1 ; set J [file size test.db-journal] }
|
||||
catch { set W -1 ; set W [file size test.db-wal] }
|
||||
@@ -2046,7 +2052,7 @@ do_test pager1-20.2.2 {
|
||||
}
|
||||
} {}
|
||||
|
||||
ifcapable wal {
|
||||
if {$::sqlite_options(wal) && [wal_is_ok]} {
|
||||
do_test pager1-20.3.1 {
|
||||
faultsim_delete_and_reopen
|
||||
db func a_string a_string
|
||||
@@ -2081,7 +2087,7 @@ ifcapable wal {
|
||||
# pager1-21.1.*: The VFS has an iVersion less than 2, or
|
||||
# pager1-21.2.*: The VFS does not provide xShmXXX() methods.
|
||||
#
|
||||
ifcapable wal {
|
||||
if {$::sqlite_options(wal) && [wal_is_ok]} {
|
||||
do_test pager1-21.0 {
|
||||
faultsim_delete_and_reopen
|
||||
execsql {
|
||||
@@ -2112,33 +2118,36 @@ ifcapable wal {
|
||||
# pager1-22.1.*: is a no-op on a non-WAL db, and
|
||||
# pager1-22.2.*: does not cause xSync calls with a synchronous=off db.
|
||||
#
|
||||
ifcapable wal {
|
||||
do_test pager1-22.1.1 {
|
||||
faultsim_delete_and_reopen
|
||||
execsql {
|
||||
CREATE TABLE ko(c DEFAULT 'abc', b DEFAULT 'def');
|
||||
INSERT INTO ko DEFAULT VALUES;
|
||||
}
|
||||
execsql { PRAGMA wal_checkpoint }
|
||||
} {0 -1 -1}
|
||||
do_test pager1-22.2.1 {
|
||||
testvfs tv -default 1
|
||||
tv filter xSync
|
||||
tv script xSyncCb
|
||||
proc xSyncCb {args} {incr ::synccount}
|
||||
set ::synccount 0
|
||||
sqlite3 db test.db
|
||||
execsql {
|
||||
PRAGMA synchronous = off;
|
||||
PRAGMA journal_mode = WAL;
|
||||
INSERT INTO ko DEFAULT VALUES;
|
||||
}
|
||||
execsql { PRAGMA wal_checkpoint }
|
||||
set synccount
|
||||
} {0}
|
||||
db close
|
||||
tv delete
|
||||
}
|
||||
do_test pager1-22.1.1 {
|
||||
faultsim_delete_and_reopen
|
||||
execsql {
|
||||
CREATE TABLE ko(c DEFAULT 'abc', b DEFAULT 'def');
|
||||
INSERT INTO ko DEFAULT VALUES;
|
||||
}
|
||||
execsql { PRAGMA wal_checkpoint }
|
||||
} {0 -1 -1}
|
||||
do_test pager1-22.2.1 {
|
||||
testvfs tv -default 1
|
||||
tv filter xSync
|
||||
tv script xSyncCb
|
||||
proc xSyncCb {args} {incr ::synccount}
|
||||
sqlite3 db test.db
|
||||
|
||||
# Switch the db to WAL mode. And then execute a SELECT to make sure
|
||||
# that the WAL file is open. Note that this may change the synchronous
|
||||
# setting if DEFAULT_WAL_SAFETYLEVEL is defined.
|
||||
execsql { PRAGMA journal_mode = WAL ; SELECT * FROM ko }
|
||||
|
||||
# Set synchronous=OFF. Insert some data and run a checkpoint. Since
|
||||
# sync=off, this should not cause any calls to the xSync() method.
|
||||
set ::synccount 0
|
||||
execsql {
|
||||
PRAGMA synchronous = off;
|
||||
INSERT INTO ko DEFAULT VALUES;
|
||||
PRAGMA wal_checkpoint;
|
||||
}
|
||||
set synccount
|
||||
} {0}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# Tests for changing journal mode.
|
||||
@@ -2386,7 +2395,7 @@ do_test pager1.27.1 {
|
||||
# the same database.
|
||||
#
|
||||
catch { db close }
|
||||
ifcapable wal {
|
||||
if {$::sqlite_options(wal) && [wal_is_ok]} {
|
||||
do_multiclient_test tn {
|
||||
do_test pager1-28.$tn.1 {
|
||||
sql1 {
|
||||
|
||||
@@ -1062,6 +1062,39 @@ ifcapable crashtest {
|
||||
}
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# When a 3.7.0 client opens a write-transaction on a database file that
|
||||
# has been appended to or truncated by a pre-370 client, it updates
|
||||
# the db-size in the file header immediately. This test case provokes
|
||||
# errors during that operation.
|
||||
#
|
||||
do_test pagerfault-22-pre1 {
|
||||
faultsim_delete_and_reopen
|
||||
db func a_string a_string
|
||||
execsql {
|
||||
PRAGMA page_size = 1024;
|
||||
PRAGMA auto_vacuum = 0;
|
||||
CREATE TABLE t1(a);
|
||||
CREATE INDEX i1 ON t1(a);
|
||||
INSERT INTO t1 VALUES(a_string(3000));
|
||||
CREATE TABLE t2(a);
|
||||
INSERT INTO t2 VALUES(1);
|
||||
}
|
||||
db close
|
||||
sql36231 { INSERT INTO t1 VALUES(a_string(3000)) }
|
||||
faultsim_save_and_close
|
||||
} {}
|
||||
do_faultsim_test pagerfault-22 -prep {
|
||||
faultsim_restore_and_reopen
|
||||
} -body {
|
||||
execsql { INSERT INTO t2 VALUES(2) }
|
||||
execsql { SELECT * FROM t2 }
|
||||
} -test {
|
||||
faultsim_test_result {0 {1 2}}
|
||||
faultsim_integrity_check
|
||||
}
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# When a 3.7.0 client opens a write-transaction on a database file that
|
||||
# has been appended to or truncated by a pre-370 client, it updates
|
||||
|
||||
+6
-1
@@ -117,7 +117,9 @@ do_test pcache-1.7 {
|
||||
# page. Because the number of allocated pages is greater than the
|
||||
# configured maximum, this page should be freed immediately instead of
|
||||
# recycled.
|
||||
#
|
||||
# Note- purgable_pcache doesn't share caches between connections and these tests
|
||||
# are only useful for testing that feature.
|
||||
if !$::sqlite_options(enable_purgeable_pcache) {
|
||||
do_test pcache-1.8 {
|
||||
execsql {ROLLBACK} db2
|
||||
pcache_stats
|
||||
@@ -178,5 +180,8 @@ do_test pcache-1.15 {
|
||||
}
|
||||
pcache_stats
|
||||
} {current 14 max 15 min 10 recyclable 14}
|
||||
} else {
|
||||
db2 close
|
||||
}
|
||||
|
||||
finish_test
|
||||
|
||||
+137
-32
@@ -1504,7 +1504,12 @@ sqlite3 dbX :memory:
|
||||
dbX eval {PRAGMA temp_store_directory = ""}
|
||||
dbX close
|
||||
|
||||
ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
set skip_lock_proxy_tests [path_is_dos "."]
|
||||
ifcapable !(lock_proxy_pragmas&&prefer_proxy_locking) {
|
||||
set skip_lock_proxy_tests 1
|
||||
}
|
||||
|
||||
if !$skip_lock_proxy_tests {
|
||||
set sqlite_hostid_num 1
|
||||
|
||||
set using_proxy 0
|
||||
@@ -1518,67 +1523,67 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
set env(SQLITE_FORCE_PROXY_LOCKING) "0"
|
||||
|
||||
sqlite3 db test.db
|
||||
# set lock proxy name and then query it via pragma interface
|
||||
set lpp [exec mktemp -t "proxy1"]
|
||||
do_test pragma-16.1 {
|
||||
execsql {
|
||||
PRAGMA lock_proxy_file="mylittleproxy";
|
||||
select * from sqlite_master;
|
||||
}
|
||||
execsql {
|
||||
PRAGMA lock_proxy_file;
|
||||
}
|
||||
} {mylittleproxy}
|
||||
execsql "PRAGMA lock_proxy_file='$lpp'"
|
||||
execsql "select * from sqlite_master"
|
||||
execsql "PRAGMA lock_proxy_file"
|
||||
} $lpp
|
||||
|
||||
# 2 database connections can share a lock proxy file
|
||||
do_test pragma-16.2 {
|
||||
sqlite3 db2 test.db
|
||||
execsql {
|
||||
PRAGMA lock_proxy_file="mylittleproxy";
|
||||
} db2
|
||||
execsql "PRAGMA lock_proxy_file='$lpp'" db2
|
||||
} {}
|
||||
|
||||
db2 close
|
||||
# 2nd database connection should auto-name an existing lock proxy file
|
||||
do_test pragma-16.2.1 {
|
||||
sqlite3 db2 test.db
|
||||
execsql {
|
||||
PRAGMA lock_proxy_file=":auto:";
|
||||
select * from sqlite_master;
|
||||
} db2
|
||||
execsql {
|
||||
PRAGMA lock_proxy_file;
|
||||
} db2
|
||||
} {mylittleproxy}
|
||||
execsql "PRAGMA lock_proxy_file" db2
|
||||
} $lpp
|
||||
|
||||
db2 close
|
||||
set lpp2 [exec mktemp -t "proxy2"]
|
||||
|
||||
# 2nd database connection cannot override the lock proxy file
|
||||
do_test pragma-16.3 {
|
||||
sqlite3 db2 test.db
|
||||
execsql {
|
||||
PRAGMA lock_proxy_file="myotherproxy";
|
||||
} db2
|
||||
execsql "PRAGMA lock_proxy_file='$lpp2'" db2
|
||||
catchsql {
|
||||
select * from sqlite_master;
|
||||
} db2
|
||||
} {1 {database is locked}}
|
||||
|
||||
set lpp3 [exec mktemp -t "proxy3"]
|
||||
|
||||
# lock proxy file can be renamed if no other connections are active
|
||||
do_test pragma-16.4 {
|
||||
db2 close
|
||||
db close
|
||||
sqlite3 db2 test.db
|
||||
execsql {
|
||||
PRAGMA lock_proxy_file="myoriginalproxy";
|
||||
PRAGMA lock_proxy_file="myotherproxy";
|
||||
PRAGMA lock_proxy_file;
|
||||
} db2
|
||||
} {myotherproxy}
|
||||
execsql "PRAGMA lock_proxy_file='$lpp3'" db2
|
||||
execsql "PRAGMA lock_proxy_file='$lpp2'" db2
|
||||
execsql "PRAGMA lock_proxy_file" db2
|
||||
} $lpp2
|
||||
|
||||
db2 close
|
||||
set env(SQLITE_FORCE_PROXY_LOCKING) "1"
|
||||
# auto-naming should reuse the last proxy name when available
|
||||
do_test pragma-16.5 {
|
||||
sqlite3 db2 test.db
|
||||
execsql {
|
||||
PRAGMA lock_proxy_file=":auto:";
|
||||
PRAGMA lock_proxy_file;
|
||||
} db2
|
||||
} {myotherproxy}
|
||||
} $lpp2
|
||||
|
||||
# auto-naming a new proxy should use a predictable & unique name
|
||||
do_test pragma-16.6 {
|
||||
db2 close
|
||||
sqlite3 db2 test2.db
|
||||
@@ -1590,6 +1595,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
} {1}
|
||||
|
||||
set sqlite_hostid_num 2
|
||||
# db access should be limited to one host at a time (simulate 2nd host id)
|
||||
do_test pragma-16.7 {
|
||||
list [catch {
|
||||
sqlite3 db test2.db
|
||||
@@ -1601,6 +1607,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
} {1 {database is locked}}
|
||||
db close
|
||||
|
||||
# default to using proxy locking (simulate network file system detection)
|
||||
do_test pragma-16.8 {
|
||||
list [catch {
|
||||
sqlite3 db test2.db
|
||||
@@ -1609,19 +1616,25 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
} {1 {database is locked}}
|
||||
|
||||
db2 close
|
||||
set lpp4 [exec mktemp -t "proxy4"]
|
||||
|
||||
# check that db is unlocked after first host connection closes
|
||||
do_test pragma-16.8.1 {
|
||||
execsql {
|
||||
PRAGMA lock_proxy_file="yetanotherproxy";
|
||||
PRAGMA lock_proxy_file;
|
||||
}
|
||||
} {yetanotherproxy}
|
||||
execsql "PRAGMA lock_proxy_file='$lpp4'"
|
||||
execsql "select * from sqlite_master"
|
||||
execsql "PRAGMA lock_proxy_file"
|
||||
} $lpp4
|
||||
|
||||
do_test pragma-16.8.2 {
|
||||
execsql {
|
||||
create table mine(x);
|
||||
create table if not exists mine(x);
|
||||
insert into mine values (1);
|
||||
}
|
||||
} {}
|
||||
|
||||
db close
|
||||
file delete -force proxytest.db
|
||||
file delete -force .proxytest.db-conch
|
||||
do_test pragma-16.9 {
|
||||
sqlite3 db proxytest.db
|
||||
set lockpath2 [execsql {
|
||||
@@ -1631,6 +1644,98 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
string match "*proxytest.db:auto:" $lockpath2
|
||||
} {1}
|
||||
|
||||
# ensure creating directories for a lock proxy file works
|
||||
set lpp5d [exec mktemp -d -t "proxy5"]
|
||||
set lpp5 $lpp5d/sub/dir/lock
|
||||
db close
|
||||
do_test pragma-16.10.1 {
|
||||
sqlite3 db proxytest.db
|
||||
execsql "PRAGMA lock_proxy_file='$lpp5'"
|
||||
set lockpath2 [execsql {
|
||||
PRAGMA lock_proxy_file;
|
||||
} db]
|
||||
string match "*sub/dir/lock" $lockpath2
|
||||
} {1}
|
||||
|
||||
# ensure that after deleting the path, setting ":auto:" works correctly
|
||||
db close
|
||||
file delete -force $lpp5d
|
||||
do_test pragma-16.10.2 {
|
||||
sqlite3 db proxytest.db
|
||||
set lockpath3 [execsql {
|
||||
PRAGMA lock_proxy_file=":auto:";
|
||||
create table if not exists pt(y);
|
||||
PRAGMA lock_proxy_file;
|
||||
} db]
|
||||
string match "*sub/dir/lock" $lockpath3
|
||||
} {1}
|
||||
|
||||
# ensure that if the path can not be created (file instead of dir)
|
||||
# setting :auto: deals with it by creating a new autonamed lock file
|
||||
db close
|
||||
file delete -force $lpp5d
|
||||
close [open "$lpp5d" a]
|
||||
do_test pragma-16.10.3 {
|
||||
sqlite3 db proxytest.db
|
||||
set lockpath2 [execsql {
|
||||
PRAGMA lock_proxy_file=":auto:";
|
||||
create table if not exists zz(y);
|
||||
PRAGMA lock_proxy_file;
|
||||
} db]
|
||||
string match "*proxytest.db:auto:" $lockpath2
|
||||
} {1}
|
||||
|
||||
# make sure we can deal with ugly file paths correctly
|
||||
db close
|
||||
file delete -force $lpp5d
|
||||
set lpp6 [exec mktemp -d -t "proxy6"]/./././////./proxytest/../proxytest/sub/dir/lock
|
||||
do_test pragma-16.10.4 {
|
||||
sqlite3 db proxytest.db
|
||||
execsql "PRAGMA lock_proxy_file='$lpp6'"
|
||||
set lockpath4 [execsql {
|
||||
create table if not exists aa(bb);
|
||||
PRAGMA lock_proxy_file;
|
||||
} db]
|
||||
string match "*proxytest/sub/dir/lock" $lockpath4
|
||||
} {1}
|
||||
|
||||
# ensure that if the path can not be created (perm), setting :auto: deals
|
||||
db close
|
||||
file delete -force $lpp5d
|
||||
do_test pragma-16.10.5 {
|
||||
sqlite3 db proxytest.db
|
||||
execsql "PRAGMA lock_proxy_file='$lpp5'"
|
||||
execsql {
|
||||
create table if not exists bb(bb);
|
||||
}
|
||||
db close
|
||||
file delete -force $lpp5d
|
||||
file mkdir $lpp5d
|
||||
file attributes $lpp5d -permission 0000
|
||||
sqlite3 db proxytest.db
|
||||
set lockpath5 [execsql {
|
||||
PRAGMA lock_proxy_file=":auto:";
|
||||
create table if not exists cc(bb);
|
||||
PRAGMA lock_proxy_file;
|
||||
} db]
|
||||
string match "*proxytest.db:auto:" $lockpath5
|
||||
} {1}
|
||||
|
||||
# ensure that if the path can not be created, locking fails
|
||||
db close
|
||||
do_test pragma-16.10.6 {
|
||||
sqlite3 db proxytest.db
|
||||
execsql "PRAGMA lock_proxy_file='$lpp5'"
|
||||
catchsql {
|
||||
create table if not exists faily(y);
|
||||
PRAGMA lock_proxy_file;
|
||||
} db
|
||||
} {1 {database is locked}}
|
||||
db close
|
||||
|
||||
file attributes $lpp5d -permission 0777
|
||||
file delete -force $lpp5d
|
||||
|
||||
set env(SQLITE_FORCE_PROXY_LOCKING) $using_proxy
|
||||
set sqlite_hostid_num 0
|
||||
}
|
||||
|
||||
+5
-3
@@ -23,7 +23,7 @@ proc do_pragma_ncol_test {tn sql nCol} {
|
||||
}
|
||||
|
||||
# If there is no RHS argument, the following PRAGMA statements operate as
|
||||
# queries, returning a single row containing a single column.
|
||||
# queries, returning a single row containing a single column.
|
||||
#
|
||||
# Or, if there is RHS argument, they return zero rows of zero columns.
|
||||
#
|
||||
@@ -54,6 +54,8 @@ foreach {tn sql} {
|
||||
24 "PRAGMA schema_version = 211"
|
||||
25 "PRAGMA short_column_names = 1"
|
||||
26 "PRAGMA synchronous = full"
|
||||
27 "PRAGMA temp_store_directory = '/tmp'"
|
||||
28 "PRAGMA temp_store_directory = ''"
|
||||
29 "PRAGMA temp_store = memory"
|
||||
30 "PRAGMA user_version = 405"
|
||||
31 "PRAGMA writable_schema = 1"
|
||||
@@ -62,7 +64,7 @@ foreach {tn sql} {
|
||||
|
||||
# Without RHS:
|
||||
do_pragma_ncol_test 1.$tn.1 [lindex [split $sql =] 0] 1
|
||||
|
||||
|
||||
# With RHS:
|
||||
do_pragma_ncol_test 1.$tn.2 $sql 0
|
||||
}
|
||||
@@ -77,7 +79,7 @@ foreach {tn sql} {
|
||||
5 "PRAGMA case_sensitive_like"
|
||||
} {
|
||||
|
||||
do_pragma_ncol_test 1.$tn.1 $sql 0
|
||||
do_pragma_ncol_test 2.$tn.1 $sql 0
|
||||
}
|
||||
|
||||
# EXPLAIN on a PRAGMA integrity_check.
|
||||
|
||||
@@ -11,12 +11,18 @@
|
||||
#***********************************************************************
|
||||
# This file implements regression tests for SQLite library. The
|
||||
# focus of this file is testing locks on read-only WAL-mode databases.
|
||||
#
|
||||
# Note that the apple-osx branch does not allow read-only WAL-mode
|
||||
# databases (per check-in from Adam Swift on 2011-06-24 20:47:06) and
|
||||
# so this test module is disabled in the apple-osx branch.
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
source $testdir/lock_common.tcl
|
||||
set testprefix rowallock
|
||||
|
||||
finish_test; return ;# This test module disabled in the apple-osx branch
|
||||
|
||||
set mmap_res 1000000
|
||||
ifcapable !mmap {
|
||||
set mmap_res 0
|
||||
|
||||
+1
-5
@@ -45,13 +45,9 @@ ifcapable autovacuum {
|
||||
# if we're using proxy locks, we use 2 filedescriptors for a db
|
||||
# that is open but NOT yet locked, after a lock is taken we'll have 3,
|
||||
# normally sqlite uses 1 (proxy locking adds the conch and the local lock)
|
||||
set using_proxy 0
|
||||
foreach {name value} [array get env SQLITE_FORCE_PROXY_LOCKING] {
|
||||
set using_proxy $value
|
||||
}
|
||||
set extrafds_prelock 0
|
||||
set extrafds_postlock 0
|
||||
if {$using_proxy>0} {
|
||||
if {[forced_proxy_locking]} {
|
||||
set extrafds_prelock 1
|
||||
set extrafds_postlock 2
|
||||
}
|
||||
|
||||
@@ -17,6 +17,11 @@ set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
test_set_config_pagecache 0 0
|
||||
|
||||
# purgeable pcache tracks memory differently
|
||||
ifcapable {enable_purgeable_pcache} {
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
unset -nocomplain baseline
|
||||
do_test shrink-1.1 {
|
||||
db eval {
|
||||
|
||||
+24
-7
@@ -35,8 +35,19 @@ if {$::TEMP_STORE==3} {
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
|
||||
# if we're using proxy locks, we use 3 filedescriptors for a db
|
||||
# that is open but NOT writing changes, normally
|
||||
# sqlite uses 1 (proxy locking adds the conch and the local lock)
|
||||
set extrafds 0
|
||||
if {[forced_proxy_locking]} {
|
||||
set extrafds 2
|
||||
}
|
||||
|
||||
|
||||
do_test stmt-1.2 {
|
||||
set sqlite_open_file_count
|
||||
expr $sqlite_open_file_count-$extrafds
|
||||
} {1}
|
||||
do_test stmt-1.3 {
|
||||
execsql {
|
||||
@@ -45,17 +56,20 @@ do_test stmt-1.3 {
|
||||
INSERT INTO t1 VALUES(1, 1);
|
||||
}
|
||||
set sqlite_open_file_count
|
||||
expr $sqlite_open_file_count-$extrafds
|
||||
} {2}
|
||||
do_test stmt-1.4 {
|
||||
execsql {
|
||||
INSERT INTO t1 SELECT a+1, b+1 FROM t1;
|
||||
}
|
||||
set sqlite_open_file_count
|
||||
expr $sqlite_open_file_count-$extrafds
|
||||
# 2016-03-04: statement-journal open deferred
|
||||
} {2}
|
||||
do_test stmt-1.5 {
|
||||
execsql COMMIT
|
||||
set sqlite_open_file_count
|
||||
expr $sqlite_open_file_count-$extrafds
|
||||
} {1}
|
||||
do_test stmt-1.6.1 {
|
||||
execsql {
|
||||
@@ -63,35 +77,38 @@ do_test stmt-1.6.1 {
|
||||
INSERT INTO t1 SELECT a+2, b+2 FROM t1;
|
||||
}
|
||||
set sqlite_open_file_count
|
||||
expr $sqlite_open_file_count-$extrafds
|
||||
} {2}
|
||||
do_test stmt-1.6.2 {
|
||||
execsql { INSERT INTO t1 SELECT a+4, b+4 FROM t1 }
|
||||
set sqlite_open_file_count
|
||||
expr $sqlite_open_file_count-$extrafds
|
||||
# 2016-03-04: statement-journal open deferred
|
||||
} {2}
|
||||
do_test stmt-1.7 {
|
||||
execsql COMMIT
|
||||
set sqlite_open_file_count
|
||||
expr $sqlite_open_file_count-$extrafds
|
||||
} {1}
|
||||
|
||||
|
||||
proc filecount {testname sql expected} {
|
||||
proc filecount {testname sql expected extrafds} {
|
||||
uplevel [list do_test $testname [subst -nocommand {
|
||||
execsql BEGIN
|
||||
execsql { $sql }
|
||||
set ret [set sqlite_open_file_count]
|
||||
execsql ROLLBACK
|
||||
set ret
|
||||
}] $expected]
|
||||
}] [ expr $expected+$extrafds ] ]
|
||||
}
|
||||
|
||||
filecount stmt-2.1 { INSERT INTO t1 VALUES(9, 9) } 2
|
||||
filecount stmt-2.2 { REPLACE INTO t1 VALUES(9, 9) } 2
|
||||
filecount stmt-2.3 { INSERT INTO t1 SELECT 9, 9 } 2
|
||||
filecount stmt-2.1 { INSERT INTO t1 VALUES(9, 9) } 2 $extrafds
|
||||
filecount stmt-2.2 { REPLACE INTO t1 VALUES(9, 9) } 2 $extrafds
|
||||
filecount stmt-2.3 { INSERT INTO t1 SELECT 9, 9 } 2 $extrafds
|
||||
filecount stmt-2.4 {
|
||||
INSERT INTO t1 SELECT 9, 9;
|
||||
INSERT INTO t1 SELECT 10, 10;
|
||||
} 2
|
||||
} 2 $extrafds
|
||||
|
||||
do_test stmt-2.5 {
|
||||
execsql { CREATE INDEX i1 ON t1(b) }
|
||||
@@ -99,6 +116,6 @@ do_test stmt-2.5 {
|
||||
filecount stmt-2.6 {
|
||||
REPLACE INTO t1 VALUES(5, 5);
|
||||
REPLACE INTO t1 VALUES(5, 5);
|
||||
} 2
|
||||
} 2 $extrafds
|
||||
|
||||
finish_test
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
source $testdir/lock_common.tcl
|
||||
source $testdir/wal_common.tcl
|
||||
|
||||
set testprefix superlock
|
||||
do_not_use_codec
|
||||
@@ -43,6 +44,11 @@ do_not_use_codec
|
||||
#
|
||||
#
|
||||
|
||||
if {[forced_proxy_locking]} {
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
|
||||
do_execsql_test 1.1 {
|
||||
CREATE TABLE t1(a, b);
|
||||
INSERT INTO t1 VALUES(1, 2);
|
||||
@@ -58,6 +64,12 @@ do_test 1.2 { sqlite3demo_superlock unlock test.db } {unlock}
|
||||
do_catchsql_test 1.3 { SELECT * FROM t1 } {1 {database is locked}}
|
||||
do_test 1.4 { unlock } {}
|
||||
|
||||
ifcapable !wal {finish_test ; return }
|
||||
if { ![wal_is_ok] } {
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
|
||||
do_execsql_test 2.1 {
|
||||
INSERT INTO t1 VALUES(3, 4);
|
||||
PRAGMA journal_mode = WAL;
|
||||
|
||||
+7
-2
@@ -57,6 +57,11 @@ do_test tempdb-1.2 {
|
||||
}
|
||||
} {}
|
||||
|
||||
set extrafds 0
|
||||
if {[forced_proxy_locking]} {
|
||||
set extrafds 2
|
||||
}
|
||||
|
||||
do_test tempdb-2.1 {
|
||||
# Set $::jrnl_in_memory if the journal file is expected to be in-memory.
|
||||
# Similarly, set $::subj_in_memory if the sub-journal file is expected
|
||||
@@ -81,7 +86,7 @@ do_test tempdb-2.2 {
|
||||
}
|
||||
catchsql { INSERT INTO t1 SELECT * FROM t2 }
|
||||
set sqlite_open_file_count
|
||||
} [expr 1 + (0==$jrnl_in_memory)]
|
||||
} [expr 1 + $extrafds + (0==$jrnl_in_memory)]
|
||||
do_test tempdb-2.3 {
|
||||
execsql {
|
||||
PRAGMA temp_store = 'memory';
|
||||
@@ -93,6 +98,6 @@ do_test tempdb-2.3 {
|
||||
}
|
||||
catchsql { INSERT INTO t1 SELECT * FROM t2 }
|
||||
set sqlite_open_file_count
|
||||
} [expr 1 + (0==$jrnl_in_memory)]
|
||||
} [expr 1 + $extrafds + (0==$jrnl_in_memory)]
|
||||
|
||||
finish_test
|
||||
|
||||
+46
-4
@@ -579,6 +579,23 @@ if {[info exists cmdlinearg]==0} {
|
||||
#
|
||||
sqlite3_soft_heap_limit $cmdlinearg(soft-heap-limit)
|
||||
|
||||
proc forced_proxy_locking {} {
|
||||
if $::sqlite_options(lock_proxy_pragmas)&&$::sqlite_options(prefer_proxy_locking) {
|
||||
set force_proxy_value 0
|
||||
set force_key "SQLITE_FORCE_PROXY_LOCKING="
|
||||
foreach {env_pair} [exec env] {
|
||||
if { [string first $force_key $env_pair] == 0} {
|
||||
set force_proxy_value [string range $env_pair [string length $force_key] end]
|
||||
}
|
||||
}
|
||||
if { "$force_proxy_value " == "1 " } {
|
||||
return 1
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
# Create a test database
|
||||
#
|
||||
proc reset_db {} {
|
||||
@@ -586,6 +603,14 @@ proc reset_db {} {
|
||||
forcedelete test.db
|
||||
forcedelete test.db-journal
|
||||
forcedelete test.db-wal
|
||||
if {[forced_proxy_locking]} {
|
||||
sqlite3 db ./test.db
|
||||
set lock_proxy_path [db eval "PRAGMA lock_proxy_file;"]
|
||||
catch {db close}
|
||||
# puts "deleting $lock_proxy_path"
|
||||
file delete -force $lock_proxy_path
|
||||
file delete -force test.db
|
||||
}
|
||||
sqlite3 db ./test.db
|
||||
set ::DB [sqlite3_connection_pointer db]
|
||||
if {[info exists ::SETUP_SQL]} {
|
||||
@@ -1284,11 +1309,15 @@ proc finalize_testing {} {
|
||||
memdebug_log_sql leaks.sql
|
||||
}
|
||||
}
|
||||
foreach f [glob -nocomplain test.db-*-journal] {
|
||||
forcedelete $f
|
||||
catch {
|
||||
foreach f [glob -nocomplain test.db-*-journal] {
|
||||
forcedelete $f
|
||||
}
|
||||
}
|
||||
foreach f [glob -nocomplain test.db-mj*] {
|
||||
forcedelete $f
|
||||
catch {
|
||||
foreach f [glob -nocomplain test.db-mj*] {
|
||||
forcedelete $f
|
||||
}
|
||||
}
|
||||
exit [expr {$nErr>0}]
|
||||
}
|
||||
@@ -2155,6 +2184,19 @@ proc presql {} {
|
||||
set presql
|
||||
}
|
||||
|
||||
proc wal_is_ok {} {
|
||||
if { [forced_proxy_locking] } {
|
||||
return 1
|
||||
}
|
||||
if { ![path_is_local "."] } {
|
||||
return 0
|
||||
}
|
||||
if { [path_is_dos "."] } {
|
||||
return 0
|
||||
}
|
||||
return 1
|
||||
}
|
||||
|
||||
proc isquick {} {
|
||||
set ret 0
|
||||
catch {set ret $::G(isquick)}
|
||||
|
||||
@@ -21,6 +21,7 @@ set testprefix tkt-2d1a5c67d
|
||||
|
||||
ifcapable {!vtab} {finish_test; return}
|
||||
if {[wal_is_capable]==0} {finish_test; return}
|
||||
if {![wal_is_ok]} {finish_test; return}
|
||||
|
||||
for {set ii 1} {$ii<=10} {incr ii} {
|
||||
do_test tkt-2d1a5c67d.1.$ii {
|
||||
|
||||
@@ -19,6 +19,7 @@ source $testdir/tester.tcl
|
||||
source $testdir/malloc_common.tcl
|
||||
|
||||
if {![wal_is_capable]} { finish_test ; return }
|
||||
if ![wal_is_ok] { finish_test; return }
|
||||
|
||||
do_execsql_test tkt-313723c356.1 {
|
||||
PRAGMA page_size = 1024;
|
||||
|
||||
+22
-21
@@ -74,27 +74,28 @@ catch {
|
||||
test_syscall fault 1 1
|
||||
}
|
||||
|
||||
do_test tkt3457-1.2 {
|
||||
forcecopy bak.db-journal test.db-journal
|
||||
file attributes test.db-journal -permissions ---------
|
||||
catchsql { SELECT * FROM t1 }
|
||||
} {1 {unable to open database file}}
|
||||
do_test tkt3457-1.3 {
|
||||
forcecopy bak.db-journal test.db-journal
|
||||
file attributes test.db-journal -permissions -w--w--w-
|
||||
catchsql { SELECT * FROM t1 }
|
||||
} {1 {unable to open database file}}
|
||||
do_test tkt3457-1.4 {
|
||||
forcecopy bak.db-journal test.db-journal
|
||||
file attributes test.db-journal -permissions r--r--r--
|
||||
catchsql { SELECT * FROM t1 }
|
||||
} {1 {unable to open database file}}
|
||||
|
||||
do_test tkt3457-1.5 {
|
||||
forcecopy bak.db-journal test.db-journal
|
||||
file attributes test.db-journal -permissions rw-rw-rw-
|
||||
catchsql { SELECT * FROM t1 }
|
||||
} {0 {1 2 3 4 5 6}}
|
||||
if { ![path_is_dos "."] } {
|
||||
do_test tkt3457-1.2 {
|
||||
forcecopy bak.db-journal test.db-journal
|
||||
file attributes test.db-journal -permissions ---------
|
||||
catchsql { SELECT * FROM t1 }
|
||||
} {1 {unable to open database file}}
|
||||
do_test tkt3457-1.3 {
|
||||
forcecopy bak.db-journal test.db-journal
|
||||
file attributes test.db-journal -permissions -w--w--w-
|
||||
catchsql { SELECT * FROM t1 }
|
||||
} {1 {unable to open database file}}
|
||||
do_test tkt3457-1.4 {
|
||||
forcecopy bak.db-journal test.db-journal
|
||||
file attributes test.db-journal -permissions r--r--r--
|
||||
catchsql { SELECT * FROM t1 }
|
||||
} {1 {unable to open database file}}
|
||||
do_test tkt3457-1.5 {
|
||||
forcecopy bak.db-journal test.db-journal
|
||||
file attributes test.db-journal -permissions rw-rw-rw-
|
||||
catchsql { SELECT * FROM t1 }
|
||||
} {0 {1 2 3 4 5 6}}
|
||||
}
|
||||
|
||||
# Reenable fchmod
|
||||
catch {
|
||||
|
||||
+41
-1
@@ -22,6 +22,10 @@ source $testdir/wal_common.tcl
|
||||
set testprefix wal
|
||||
|
||||
ifcapable !wal {finish_test ; return }
|
||||
if { ![wal_is_ok] } {
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
test_set_config_pagecache 0 0
|
||||
|
||||
proc reopen_db {} {
|
||||
@@ -173,6 +177,9 @@ do_test wal-4.3 {
|
||||
} {a b}
|
||||
|
||||
do_test wal-4.4.1 {
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
db close
|
||||
sqlite3 db test.db
|
||||
db func blob blob
|
||||
@@ -224,6 +231,9 @@ db2 close
|
||||
|
||||
do_test wal-4.5.1 {
|
||||
reopen_db
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
db func blob blob
|
||||
execsql {
|
||||
PRAGMA journal_mode = WAL;
|
||||
@@ -338,6 +348,9 @@ foreach sector {512 4096} {
|
||||
forcedelete test.db test.db-wal
|
||||
do_test wal-6.$sector.$pgsz.1 {
|
||||
sqlite3 db test.db -vfs devsym
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
execsql "
|
||||
PRAGMA page_size = $pgsz;
|
||||
PRAGMA auto_vacuum = 0;
|
||||
@@ -724,6 +737,9 @@ do_test wal-11.8 {
|
||||
list [expr [file size test.db]/1024] [file size test.db-wal]
|
||||
} [list 37 [wal_file_size 40 1024]]
|
||||
do_test wal-11.9 {
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
db close
|
||||
list [expr [file size test.db]/1024] [log_deleted test.db-wal]
|
||||
} {37 1}
|
||||
@@ -738,6 +754,9 @@ sqlite3_wal db test.db
|
||||
#ifcapable !mmap {set nWal 37}
|
||||
set nWal 34
|
||||
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
do_test wal-11.10 {
|
||||
execsql {
|
||||
PRAGMA cache_size = 10;
|
||||
@@ -785,6 +804,9 @@ do_test wal-12.1 {
|
||||
list [expr [file size test.db]/1024] [file size test.db-wal]
|
||||
} [list 1 [wal_file_size 5 1024]]
|
||||
do_test wal-12.2 {
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
db close
|
||||
sqlite3 db test.db
|
||||
execsql {
|
||||
@@ -822,6 +844,9 @@ do_test wal-12.6 {
|
||||
execsql { SELECT * FROM t2 } db2
|
||||
} {B 2}
|
||||
db2 close
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
db close
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
@@ -979,10 +1004,12 @@ foreach {tn ckpt_cmd ckpt_res ckpt_main ckpt_aux} {
|
||||
PRAGMA aux.auto_vacuum = 0;
|
||||
PRAGMA main.journal_mode = WAL;
|
||||
PRAGMA aux.journal_mode = WAL;
|
||||
SELECT count(*) FROM main.sqlite_master, aux.sqlite_master;
|
||||
PRAGMA main.synchronous = NORMAL;
|
||||
PRAGMA aux.synchronous = NORMAL;
|
||||
PRAGMA aux.synchronous = FULL;
|
||||
}
|
||||
} {wal wal}
|
||||
} {wal wal 0}
|
||||
|
||||
do_test wal-16.$tn.2 {
|
||||
execsql {
|
||||
@@ -1053,6 +1080,7 @@ foreach {tn sectorsize logsize} "
|
||||
PRAGMA page_size = 512;
|
||||
PRAGMA cache_size = -2000;
|
||||
PRAGMA journal_mode = WAL;
|
||||
SELECT * FROM sqlite_master;
|
||||
PRAGMA synchronous = FULL;
|
||||
}
|
||||
execsql {
|
||||
@@ -1268,6 +1296,9 @@ do_test wal-19.2 {
|
||||
}
|
||||
} {1 2 3 4 5 6}
|
||||
do_test wal-19.3 {
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db2 0
|
||||
}
|
||||
db close
|
||||
db2 close
|
||||
file exists test.db-wal
|
||||
@@ -1420,6 +1451,9 @@ do_test wal-23.1 {
|
||||
INSERT INTO t1 VALUES(1, 2);
|
||||
INSERT INTO t1 VALUES(3, 4);
|
||||
}
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
faultsim_save_and_close
|
||||
|
||||
sqlite3_shutdown
|
||||
@@ -1466,6 +1500,9 @@ ifcapable autovacuum {
|
||||
INSERT INTO t1 SELECT * FROM t1;
|
||||
} {wal}
|
||||
do_test 24.2 {
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
execsql {
|
||||
DELETE FROM t1;
|
||||
PRAGMA wal_checkpoint;
|
||||
@@ -1494,6 +1531,9 @@ ifcapable autovacuum {
|
||||
} [wal_file_size 1 1024]
|
||||
}
|
||||
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
db close
|
||||
sqlite3_shutdown
|
||||
test_sqlite3_log
|
||||
|
||||
+56
-13
@@ -22,6 +22,7 @@ source $testdir/wal_common.tcl
|
||||
set testprefix wal2
|
||||
|
||||
ifcapable !wal {finish_test ; return }
|
||||
if ![wal_is_ok] {finish_test ; return }
|
||||
|
||||
set sqlite_sync_count 0
|
||||
proc cond_incr_sync_count {adj} {
|
||||
@@ -71,6 +72,13 @@ proc incr_tvfs_hdr {file idx incrval} {
|
||||
set_tvfs_hdr $file $ints
|
||||
}
|
||||
|
||||
set shmpath test.db-shm
|
||||
if {[forced_proxy_locking]} {
|
||||
sqlite3 db test.db
|
||||
set shmpath [execsql { pragma lock_proxy_file }]-shm
|
||||
db close
|
||||
}
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# Test case wal2-1.*:
|
||||
@@ -573,9 +581,15 @@ do_test wal2-6.3.1 {
|
||||
list [file exists test.db-wal] [file exists test.db-journal]
|
||||
} {1 0}
|
||||
do_test wal2-6.3.2 {
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
execsql { PRAGMA journal_mode = DELETE }
|
||||
file exists test.db-wal
|
||||
} {0}
|
||||
do_test wal2-6.3.2.1 {
|
||||
execsql { PRAGMA journal_mode; }
|
||||
} {delete}
|
||||
do_test wal2-6.3.3 {
|
||||
execsql { PRAGMA lock_status }
|
||||
} {main exclusive temp closed}
|
||||
@@ -730,7 +744,9 @@ foreach {tn sql res expected_locks} {
|
||||
do_test wal2-6.4.$tn.1 { execsql $S } $res
|
||||
do_test wal2-6.4.$tn.2 { set ::locks } $L
|
||||
}
|
||||
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
db close
|
||||
tvfs delete
|
||||
|
||||
@@ -961,6 +977,9 @@ do_test wal2-10.1.1 {
|
||||
INSERT INTO t1 VALUES(1, 2);
|
||||
INSERT INTO t1 VALUES(3, 4);
|
||||
}
|
||||
if {[forced_proxy_locking]} {
|
||||
forcecopy $shmpath sv_test.db-shm
|
||||
}
|
||||
faultsim_save_and_close
|
||||
} {}
|
||||
do_test wal2-10.1.2 {
|
||||
@@ -1060,6 +1079,11 @@ tvfs delete
|
||||
# file itself. Test this.
|
||||
#
|
||||
if {$::tcl_platform(platform) == "unix"} {
|
||||
if {[forced_proxy_locking]} {
|
||||
# faultsim_delete_and_reopen doesn't know about the shm file redirect...
|
||||
forcedelete $shmpath
|
||||
}
|
||||
|
||||
faultsim_delete_and_reopen
|
||||
# Changed on 2012-02-13: umask is deliberately ignored for -wal files.
|
||||
#set umask [exec /bin/sh -c umask]
|
||||
@@ -1073,7 +1097,7 @@ if {$::tcl_platform(platform) == "unix"} {
|
||||
PRAGMA journal_mode = WAL;
|
||||
}
|
||||
db close
|
||||
list [file exists test.db-wal] [file exists test.db-shm]
|
||||
list [file exists test.db-wal] [file exists $shmpath]
|
||||
} {0 0}
|
||||
|
||||
foreach {tn permissions} {
|
||||
@@ -1088,19 +1112,22 @@ if {$::tcl_platform(platform) == "unix"} {
|
||||
file attributes test.db -permissions
|
||||
} $permissions
|
||||
do_test wal2-12.2.$tn.2 {
|
||||
list [file exists test.db-wal] [file exists test.db-shm]
|
||||
list [file exists test.db-wal] [file exists $shmpath]
|
||||
} {0 0}
|
||||
do_test wal2-12.2.$tn.3 {
|
||||
sqlite3 db test.db
|
||||
execsql { INSERT INTO tx DEFAULT VALUES }
|
||||
list [file exists test.db-wal] [file exists test.db-shm]
|
||||
list [file exists test.db-wal] [file exists $shmpath]
|
||||
} {1 1}
|
||||
do_test wal2-12.2.$tn.4 {
|
||||
list [file attr test.db-wal -perm] [file attr test.db-shm -perm]
|
||||
list [file attr test.db-wal -perm] [file attr $shmpath -perm]
|
||||
} [list $effective $effective]
|
||||
do_test wal2-12.2.$tn.5 {
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
db close
|
||||
list [file exists test.db-wal] [file exists test.db-shm]
|
||||
list [file exists test.db-wal] [file exists $shmpath]
|
||||
} {0 0}
|
||||
}
|
||||
}
|
||||
@@ -1113,7 +1140,7 @@ if {$::tcl_platform(platform) == "unix"} {
|
||||
if {$::tcl_platform(platform) == "unix"} {
|
||||
proc perm {} {
|
||||
set L [list]
|
||||
foreach f {test.db test.db-wal test.db-shm} {
|
||||
foreach f {test.db test.db-wal $shmpath} {
|
||||
if {[file exists $f]} {
|
||||
lappend L [file attr $f -perm]
|
||||
} else {
|
||||
@@ -1123,6 +1150,10 @@ if {$::tcl_platform(platform) == "unix"} {
|
||||
set L
|
||||
}
|
||||
|
||||
if {[forced_proxy_locking]} {
|
||||
# faultsim_delete_and_reopen doesn't know about the shm file redirect...
|
||||
forcedelete $shmpath
|
||||
}
|
||||
faultsim_delete_and_reopen
|
||||
execsql {
|
||||
PRAGMA journal_mode = WAL;
|
||||
@@ -1131,8 +1162,11 @@ if {$::tcl_platform(platform) == "unix"} {
|
||||
INSERT INTO t1 VALUES('3.14', '2.72');
|
||||
}
|
||||
do_test wal2-13.1.1 {
|
||||
list [file exists test.db-shm] [file exists test.db-wal]
|
||||
list [file exists $shmpath] [file exists test.db-wal]
|
||||
} {1 1}
|
||||
if {[forced_proxy_locking]} {
|
||||
forcecopy $shmpath proxysv_test.db-shm
|
||||
}
|
||||
faultsim_save_and_close
|
||||
|
||||
foreach {tn db_perm wal_perm shm_perm can_open can_read can_write} {
|
||||
@@ -1146,14 +1180,17 @@ if {$::tcl_platform(platform) == "unix"} {
|
||||
9 00000 00644 00644 0 0 0
|
||||
} {
|
||||
faultsim_restore
|
||||
if {[forced_proxy_locking]} {
|
||||
forcecopy proxysv_test.db-shm $shmpath
|
||||
}
|
||||
do_test wal2-13.$tn.1 {
|
||||
file attr test.db -perm $db_perm
|
||||
file attr test.db-wal -perm $wal_perm
|
||||
file attr test.db-shm -perm $shm_perm
|
||||
file attr $shmpath -perm $shm_perm
|
||||
|
||||
set L [file attr test.db -perm]
|
||||
lappend L [file attr test.db-wal -perm]
|
||||
lappend L [file attr test.db-shm -perm]
|
||||
lappend L [file attr $shmpath -perm]
|
||||
} [list $db_perm $wal_perm $shm_perm]
|
||||
|
||||
# If $can_open is true, then it should be possible to open a database
|
||||
@@ -1167,6 +1204,10 @@ if {$::tcl_platform(platform) == "unix"} {
|
||||
} $r($can_open)
|
||||
|
||||
if {$can_open} {
|
||||
# Different behavior, because Darwin does an access() call prior
|
||||
# to attempting to open the SHM in read/write mode and demotes to
|
||||
# read-only if the SHM is read-only.
|
||||
if {$tn==4 && $::tcl_platform(os)=="Darwin"} {set can_read 1}
|
||||
|
||||
# If $can_read is true, then the client should be able to read from
|
||||
# the database file. If $can_read is false, attempting to read should
|
||||
@@ -1217,6 +1258,8 @@ foreach {tn sql reslist} {
|
||||
set sqlite_sync_count 0
|
||||
set sqlite_fullsync_count 0
|
||||
|
||||
set useres $reslist
|
||||
|
||||
do_execsql_test wal2-14.$tn.2 {
|
||||
PRAGMA wal_autocheckpoint = 10;
|
||||
CREATE TABLE t1(a, b); -- 2 wal syncs
|
||||
@@ -1232,7 +1275,7 @@ foreach {tn sql reslist} {
|
||||
do_test wal2-14.$tn.3 {
|
||||
cond_incr_sync_count 1
|
||||
list $sqlite_sync_count $sqlite_fullsync_count
|
||||
} [lrange $reslist 0 1]
|
||||
} [lrange $useres 0 1]
|
||||
|
||||
set sqlite_sync_count 0
|
||||
set sqlite_fullsync_count 0
|
||||
@@ -1240,7 +1283,7 @@ foreach {tn sql reslist} {
|
||||
do_test wal2-14.$tn.4 {
|
||||
execsql { INSERT INTO t1 VALUES(7, zeroblob(12*4096)) }
|
||||
list $sqlite_sync_count $sqlite_fullsync_count
|
||||
} [lrange $reslist 2 3]
|
||||
} [lrange $useres 2 3]
|
||||
|
||||
set sqlite_sync_count 0
|
||||
set sqlite_fullsync_count 0
|
||||
@@ -1252,7 +1295,7 @@ foreach {tn sql reslist} {
|
||||
execsql { INSERT INTO t1 VALUES(13, 14) }
|
||||
db close
|
||||
list $sqlite_sync_count $sqlite_fullsync_count
|
||||
} [lrange $reslist 4 5]
|
||||
} [lrange $useres 4 5]
|
||||
}
|
||||
|
||||
catch { db close }
|
||||
|
||||
+4
-1
@@ -19,6 +19,7 @@ source $testdir/lock_common.tcl
|
||||
source $testdir/wal_common.tcl
|
||||
source $testdir/malloc_common.tcl
|
||||
ifcapable !wal {finish_test ; return }
|
||||
if ![wal_is_ok] {finish_test ; return }
|
||||
|
||||
set a_string_counter 1
|
||||
proc a_string {n} {
|
||||
@@ -211,6 +212,8 @@ foreach {tn syncmode synccount} {
|
||||
foreach {method filename id flags} $args break
|
||||
lappend ::syncs [file tail $filename] $flags
|
||||
}
|
||||
set usecount $synccount
|
||||
|
||||
do_test wal3-3.$tn {
|
||||
forcedelete test.db test.db-wal test.db-journal
|
||||
|
||||
@@ -233,7 +236,7 @@ foreach {tn syncmode synccount} {
|
||||
}
|
||||
T filter {}
|
||||
set ::syncs
|
||||
} $synccount
|
||||
} $usecount
|
||||
|
||||
db close
|
||||
T delete
|
||||
|
||||
@@ -16,6 +16,10 @@ set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
source $testdir/malloc_common.tcl
|
||||
ifcapable !wal {finish_test ; return }
|
||||
if { ![wal_is_ok] || [path_is_dos "."]} {
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
|
||||
do_test wal4-1.1 {
|
||||
execsql {
|
||||
|
||||
@@ -18,6 +18,7 @@ source $testdir/tester.tcl
|
||||
source $testdir/lock_common.tcl
|
||||
source $testdir/wal_common.tcl
|
||||
ifcapable !wal {finish_test ; return }
|
||||
if ![wal_is_ok] { finish_test; return }
|
||||
do_not_use_codec
|
||||
|
||||
set testprefix wal5
|
||||
@@ -80,6 +81,11 @@ foreach {testprefix do_wal_checkpoint} {
|
||||
}
|
||||
|
||||
proc reopen_all {} {
|
||||
ifcapable enable_persist_wal {
|
||||
code1 { file_control_persist_wal db 0 }
|
||||
code2 { file_control_persist_wal db2 0 }
|
||||
code3 { file_control_persist_wal db3 0 }
|
||||
}
|
||||
code1 {db close}
|
||||
code2 {db2 close}
|
||||
code3 {db3 close}
|
||||
@@ -343,6 +349,11 @@ foreach {testprefix do_wal_checkpoint} {
|
||||
|
||||
do_test 3.$tn.4 { code3 { do_wal_checkpoint db3 } } {0 2 2}
|
||||
|
||||
ifcapable enable_persist_wal {
|
||||
code1 { file_control_persist_wal db 0 }
|
||||
code2 { file_control_persist_wal db2 0 }
|
||||
code3 { file_control_persist_wal db3 0 }
|
||||
}
|
||||
code1 {db close}
|
||||
code2 {db2 close}
|
||||
code3 {db3 close}
|
||||
|
||||
@@ -21,6 +21,8 @@ source $testdir/wal_common.tcl
|
||||
source $testdir/malloc_common.tcl
|
||||
ifcapable !wal {finish_test ; return }
|
||||
|
||||
if { ![wal_is_ok] } {finish_test ; return }
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# Changing to WAL mode in one connection forces the change in others.
|
||||
#
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
ifcapable !wal {finish_test ; return }
|
||||
if ![wal_is_ok] { finish_test; return }
|
||||
|
||||
# Case 1: No size limit. Journal can get large.
|
||||
#
|
||||
|
||||
@@ -26,7 +26,9 @@
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
set ::testprefix wal8
|
||||
|
||||
ifcapable !wal {finish_test ; return }
|
||||
if ![wal_is_ok] { finish_test; return }
|
||||
do_not_use_codec
|
||||
|
||||
db close
|
||||
|
||||
@@ -33,6 +33,20 @@ proc wal_cksum_intlist {ckv1 ckv2 intlist} {
|
||||
}
|
||||
}
|
||||
|
||||
# If the synchronous mode for the main database of db handle $db
|
||||
# is either OFF or NORMAL, return $nRight. Otherwise, if it is
|
||||
# FULL, return $nWrite+$nTrans.
|
||||
#
|
||||
proc wal_frames {db nWrite nTrans} {
|
||||
set nRet $nWrite
|
||||
switch -- [$db one {PRAGMA main.synchronous}] {
|
||||
0 { }
|
||||
1 { }
|
||||
default { incr nRet $nTrans }
|
||||
}
|
||||
set nRet
|
||||
}
|
||||
|
||||
|
||||
# This proc calculates checksums in the same way as those used by SQLite
|
||||
# in WAL files. If the $endian argument is "big", then checksums are
|
||||
|
||||
@@ -21,6 +21,7 @@ source $testdir/malloc_common.tcl
|
||||
do_not_use_codec
|
||||
|
||||
ifcapable !wal {finish_test ; return }
|
||||
if { ![wal_is_ok] } { finish_test ; return }
|
||||
|
||||
|
||||
# Test organization:
|
||||
@@ -324,6 +325,9 @@ foreach {tn src dest dest_final} {
|
||||
do_test walbak-4.$tn.1 {
|
||||
sqlite3 db test.db
|
||||
db eval "PRAGMA journal_mode = $src"
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
db eval {
|
||||
CREATE TABLE t1(a, b);
|
||||
INSERT INTO t1 VALUES('I', 'II');
|
||||
@@ -332,6 +336,9 @@ foreach {tn src dest dest_final} {
|
||||
|
||||
sqlite3 db2 test.db2
|
||||
db2 eval "PRAGMA journal_mode = $dest"
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db2 0
|
||||
}
|
||||
db2 eval {
|
||||
CREATE TABLE t2(x, y);
|
||||
INSERT INTO t2 VALUES('1', '2');
|
||||
|
||||
@@ -21,6 +21,7 @@ ifcapable !wal {
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
if ![wal_is_ok] { finish_test; return }
|
||||
|
||||
# Do not use a codec for this file, as the database is manipulated using
|
||||
# external methods (the [fake_big_file] and [hexio_write] commands).
|
||||
@@ -32,6 +33,10 @@ ifcapable !lfs {
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
if { ![wal_is_ok] } {
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
|
||||
set a_string_counter 1
|
||||
proc a_string {n} {
|
||||
|
||||
@@ -16,6 +16,7 @@ source $testdir/lock_common.tcl
|
||||
source $testdir/wal_common.tcl
|
||||
|
||||
ifcapable !wal {finish_test ; return }
|
||||
if ![wal_is_ok] { finish_test; return }
|
||||
|
||||
# Read and return the contents of file $filename. Treat the content as
|
||||
# binary data.
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
ifcapable !wal {finish_test ; return }
|
||||
if ![wal_is_ok] { finish_test; return }
|
||||
|
||||
db close
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ source $testdir/tester.tcl
|
||||
source $testdir/lock_common.tcl
|
||||
source $testdir/wal_common.tcl
|
||||
ifcapable !wal {finish_test ; return }
|
||||
if { ![wal_is_ok] } { finish_test ; return }
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
@@ -18,6 +18,8 @@ set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
|
||||
ifcapable !wal {finish_test ; return }
|
||||
if ![wal_is_ok] { finish_test; return }
|
||||
|
||||
set testprefix walcrash3
|
||||
|
||||
db close
|
||||
|
||||
@@ -19,6 +19,7 @@ source $testdir/malloc_common.tcl
|
||||
source $testdir/lock_common.tcl
|
||||
|
||||
ifcapable !wal {finish_test ; return }
|
||||
if ![wal_is_ok] { finish_test; return }
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# This test case, walfault-1-*, simulates faults while executing a
|
||||
|
||||
@@ -22,6 +22,7 @@ source $testdir/tester.tcl
|
||||
source $testdir/wal_common.tcl
|
||||
|
||||
ifcapable !wal {finish_test ; return }
|
||||
if ![wal_is_ok] { finish_test; return }
|
||||
|
||||
set ::wal_hook [list]
|
||||
proc wal_hook {zDb nEntry} {
|
||||
@@ -71,8 +72,14 @@ do_test walhook-1.5 {
|
||||
} [expr 6*1024]
|
||||
|
||||
db2 close
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
db close
|
||||
sqlite3 db test.db
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
do_test walhook-2.1 {
|
||||
execsql { PRAGMA synchronous = NORMAL }
|
||||
execsql { PRAGMA wal_autocheckpoint }
|
||||
|
||||
+44
-6
@@ -35,6 +35,20 @@ ifcapable !wal {
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
if { ![wal_is_ok] && ![path_is_dos "."]} {
|
||||
do_test walmode-0.1 {
|
||||
execsql { PRAGMA journal_mode = wal }
|
||||
} {delete}
|
||||
do_test walmode-0.2 {
|
||||
execsql { PRAGMA main.journal_mode = wal }
|
||||
} {delete}
|
||||
do_test walmode-0.3 {
|
||||
execsql { PRAGMA main.journal_mode }
|
||||
} {delete}
|
||||
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
|
||||
do_test walmode-1.1 {
|
||||
set sqlite_sync_count 0
|
||||
@@ -45,12 +59,18 @@ do_test walmode-1.2 {
|
||||
file size test.db
|
||||
} {1024}
|
||||
|
||||
if {[atomic_batch_write test.db]==0} {
|
||||
set expected_sync_count 3
|
||||
if {$::tcl_platform(platform)!="windows"} {
|
||||
ifcapable dirsync {
|
||||
incr expected_sync_count
|
||||
}
|
||||
# Determine how many sync() calls to expect from the "journal_mode=WAL"
|
||||
# command above. Note that if DEFAULT_WAL_SAFETYLEVEL is defined, the
|
||||
# safety-level may have been modified while compiling the "journal_mode=WAL"
|
||||
# statement.
|
||||
switch -- [db eval {PRAGMA main.synchronous}] {
|
||||
0 { set expected_sync_count 0 }
|
||||
1 { set expected_sync_count 2 }
|
||||
default { set expected_sync_count 3 }
|
||||
}
|
||||
if {$::tcl_platform(platform)!="windows"} {
|
||||
ifcapable dirsync {
|
||||
incr expected_sync_count
|
||||
}
|
||||
do_test walmode-1.3 {
|
||||
set sqlite_sync_count
|
||||
@@ -68,6 +88,9 @@ do_test walmode-1.6 {
|
||||
file exists test.db-wal
|
||||
} {1}
|
||||
do_test walmode-1.7 {
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
db close
|
||||
file exists test.db-wal
|
||||
} {0}
|
||||
@@ -84,6 +107,9 @@ do_test walmode-2.2 {
|
||||
file exists test.db-wal
|
||||
} {1}
|
||||
do_test walmode-2.3 {
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
db close
|
||||
file exists test.db-wal
|
||||
} {0}
|
||||
@@ -106,6 +132,9 @@ do_test walmode-3.2 {
|
||||
#
|
||||
do_test walmode-4.1 {
|
||||
execsql { INSERT INTO t1 VALUES(1, 2) }
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
execsql { PRAGMA journal_mode = persist }
|
||||
} {persist}
|
||||
if {[atomic_batch_write test.db]==0} {
|
||||
@@ -133,6 +162,9 @@ if {[atomic_batch_write test.db]==0} {
|
||||
#
|
||||
do_test walmode-4.6 {
|
||||
sqlite3 db2 test.db
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db2 0
|
||||
}
|
||||
execsql { PRAGMA main.journal_mode } db2
|
||||
} {delete}
|
||||
do_test walmode-4.7 {
|
||||
@@ -150,6 +182,9 @@ do_test walmode-4.10 {
|
||||
|
||||
do_test walmode-4.11 {
|
||||
db2 close
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
execsql { PRAGMA journal_mode = delete } db
|
||||
} {delete}
|
||||
do_test walmode-4.12 {
|
||||
@@ -303,6 +338,9 @@ db close
|
||||
do_test walmode-7.0 {
|
||||
forcedelete test.db
|
||||
sqlite3 db test.db
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
execsql {
|
||||
PRAGMA journal_mode = WAL;
|
||||
CREATE TABLE t1(a, b);
|
||||
|
||||
@@ -17,6 +17,7 @@ set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
set testprefix walnoshm
|
||||
ifcapable !wal {finish_test ; return }
|
||||
if ![wal_is_ok] { finish_test; return }
|
||||
|
||||
db close
|
||||
testvfs tvfsshm
|
||||
@@ -53,6 +54,9 @@ do_execsql_test 1.6 { INSERT INTO t1 VALUES(3, 4) }
|
||||
do_execsql_test 1.7 {
|
||||
PRAGMA locking_mode = normal;
|
||||
} {exclusive}
|
||||
ifcapable enable_persist_wal {
|
||||
file_control_persist_wal db 0
|
||||
}
|
||||
do_execsql_test 1.8 {
|
||||
PRAGMA journal_mode = delete;
|
||||
PRAGMA main.locking_mode;
|
||||
|
||||
+31
-12
@@ -21,6 +21,12 @@ ifcapable !wal {
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
if ![wal_is_ok] { finish_test; return }
|
||||
|
||||
set shmpath test.db-shm
|
||||
if {[forced_proxy_locking]} {
|
||||
set shmpath [execsql { pragma lock_proxy_file }]-shm
|
||||
}
|
||||
|
||||
do_test walpersist-1.0 {
|
||||
db eval {
|
||||
@@ -31,22 +37,35 @@ do_test walpersist-1.0 {
|
||||
file exists test.db-wal
|
||||
} {1}
|
||||
do_test walpersist-1.1 {
|
||||
file exists test.db-shm
|
||||
file exists $shmpath
|
||||
} {1}
|
||||
do_test walpersist-1.2 {
|
||||
db close
|
||||
list [file exists test.db] [file exists test.db-wal] [file exists test.db-shm]
|
||||
} {1 0 0}
|
||||
ifcapable enable_persist_wal {
|
||||
do_test walpersist-1.2-on {
|
||||
db close
|
||||
list [file exists test.db] [file exists test.db-wal] [file exists $shmpath]
|
||||
} {1 1 1}
|
||||
} {
|
||||
do_test walpersist-1.2-off {
|
||||
db close
|
||||
list [file exists test.db] [file exists test.db-wal] [file exists $shmpath]
|
||||
} {1 0 0}
|
||||
}
|
||||
do_test walpersist-1.3 {
|
||||
sqlite3 db test.db
|
||||
db eval {SELECT length(a) FROM t1}
|
||||
} {5000}
|
||||
do_test walpersist-1.4 {
|
||||
list [file exists test.db] [file exists test.db-wal] [file exists test.db-shm]
|
||||
list [file exists test.db] [file exists test.db-wal] [file exists $shmpath]
|
||||
} {1 1 1}
|
||||
do_test walpersist-1.5 {
|
||||
file_control_persist_wal db -1
|
||||
} {0 0}
|
||||
ifcapable enable_persist_wal {
|
||||
do_test walpersist-1.5-on {
|
||||
file_control_persist_wal db -1
|
||||
} {0 1}
|
||||
} {
|
||||
do_test walpersist-1.5-off {
|
||||
file_control_persist_wal db -1
|
||||
} {0 0}
|
||||
}
|
||||
do_test walpersist-1.6 {
|
||||
file_control_persist_wal db 1
|
||||
} {0 1}
|
||||
@@ -64,7 +83,7 @@ do_test walpersist-1.10 {
|
||||
} {0 1}
|
||||
do_test walpersist-1.11 {
|
||||
db close
|
||||
list [file exists test.db] [file exists test.db-wal] [file exists test.db-shm]
|
||||
list [file exists test.db] [file exists test.db-wal] [file exists $shmpath]
|
||||
} {1 1 1}
|
||||
|
||||
# Make sure the journal_size_limit works to limit the size of the
|
||||
@@ -72,7 +91,7 @@ do_test walpersist-1.11 {
|
||||
# journal_size_limit causes the WAL file to be truncated to zero bytes
|
||||
# when closing.
|
||||
#
|
||||
forcedelete test.db test.db-shm test.db-wal
|
||||
forcedelete test.db $shmpath test.db-wal
|
||||
do_test walpersist-2.1 {
|
||||
sqlite3 db test.db
|
||||
db eval {
|
||||
@@ -97,7 +116,7 @@ do_test walpersist-2.3 {
|
||||
|
||||
do_test 3.1 {
|
||||
catch {db close}
|
||||
forcedelete test.db test.db-shm test.db-wal
|
||||
forcedelete test.db $shmpath test.db-wal
|
||||
sqlite3 db test.db
|
||||
execsql {
|
||||
PRAGMA page_size = 1024;
|
||||
|
||||
+88
-11
@@ -30,6 +30,14 @@ ifcapable !wal {
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
if ![wal_is_ok] { finish_test; return }
|
||||
|
||||
set shmpath test.db-shm
|
||||
if {[forced_proxy_locking]} {
|
||||
sqlite3 db test.db
|
||||
set shmpath [execsql { pragma lock_proxy_file }]-shm
|
||||
db close
|
||||
}
|
||||
|
||||
do_multiclient_test tn {
|
||||
|
||||
@@ -62,11 +70,11 @@ do_multiclient_test tn {
|
||||
CREATE TABLE t1(x, y);
|
||||
INSERT INTO t1 VALUES('a', 'b');
|
||||
}
|
||||
file exists test.db-shm
|
||||
file exists $shmpath
|
||||
} {1}
|
||||
|
||||
do_test 1.1.2 {
|
||||
file attributes test.db-shm -permissions r--r--r--
|
||||
file attributes $shmpath -permissions r--r--r--
|
||||
code1 { sqlite3 db file:test.db?readonly_shm=1 }
|
||||
} {}
|
||||
|
||||
@@ -99,7 +107,7 @@ do_multiclient_test tn {
|
||||
do_test 1.2.1 {
|
||||
code2 { db2 close }
|
||||
code1 { db close }
|
||||
list [file exists test.db-wal] [file exists test.db-shm]
|
||||
list [file exists test.db-wal] [file exists $shmpath]
|
||||
} {1 1}
|
||||
|
||||
do_test 1.2.2 {
|
||||
@@ -109,9 +117,9 @@ do_multiclient_test tn {
|
||||
|
||||
do_test 1.2.3 {
|
||||
code1 { db close }
|
||||
file attributes test.db-shm -permissions rw-r--r--
|
||||
hexio_write test.db-shm 0 01020304
|
||||
file attributes test.db-shm -permissions r--r--r--
|
||||
file attributes $shmpath -permissions rw-r--r--
|
||||
hexio_write $shmpath 0 01020304
|
||||
file attributes $shmpath -permissions r--r--r--
|
||||
code1 { sqlite3 db file:test.db?readonly_shm=1 }
|
||||
csql1 { SELECT * FROM t1 }
|
||||
} {0 {a b c d e f g h i j}}
|
||||
@@ -120,11 +128,11 @@ do_multiclient_test tn {
|
||||
} {SQLITE_OK}
|
||||
|
||||
do_test 1.2.5 {
|
||||
file attributes test.db-shm -permissions rw-r--r--
|
||||
file attributes $shmpath -permissions rw-r--r--
|
||||
code2 { sqlite3 db2 test.db }
|
||||
sql2 "SELECT * FROM t1"
|
||||
} {a b c d e f g h i j}
|
||||
file attributes test.db-shm -permissions r--r--r--
|
||||
file attributes $shmpath -permissions r--r--r--
|
||||
do_test 1.2.6 { sql1 "SELECT * FROM t1" } {a b c d e f g h i j}
|
||||
|
||||
do_test 1.2.7 {
|
||||
@@ -152,9 +160,13 @@ do_multiclient_test tn {
|
||||
# Also test that if the -shm file can be opened for read/write access,
|
||||
# it is not if readonly_shm=1 is present in the URI.
|
||||
do_test 1.3.2.1 {
|
||||
ifcapable enable_persist_wal {
|
||||
code1 { file_control_persist_wal db 0 }
|
||||
code2 { file_control_persist_wal db2 0 }
|
||||
}
|
||||
code1 { db close }
|
||||
code2 { db2 close }
|
||||
file exists test.db-shm
|
||||
file exists $shmpath
|
||||
} {0}
|
||||
do_test 1.3.2.2 {
|
||||
code1 { sqlite3 db file:test.db?readonly_shm=1 }
|
||||
@@ -162,8 +174,8 @@ do_multiclient_test tn {
|
||||
} {1 {unable to open database file}}
|
||||
do_test 1.3.2.3 {
|
||||
code1 { db close }
|
||||
close [open test.db-shm w]
|
||||
file attributes test.db-shm -permissions r--r--r--
|
||||
close [open $shmpath w]
|
||||
file attributes $shmpath -permissions r--r--r--
|
||||
code1 { sqlite3 db file:test.db?readonly_shm=1 }
|
||||
csql1 { SELECT * FROM t1 }
|
||||
} {0 {a b c d e f g h i j k l}}
|
||||
@@ -297,4 +309,69 @@ do_multiclient_test tn {
|
||||
} {}
|
||||
}
|
||||
|
||||
forcedelete $shmpath
|
||||
|
||||
if {$tcl_platform(os)=="Darwin"} {
|
||||
ifcapable enable_persist_wal {
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
|
||||
catch {db2 close}
|
||||
reset_db
|
||||
do_execsql_test 3.1 {
|
||||
CREATE TABLE t1(a, b);
|
||||
PRAGMA journal_mode = wal;
|
||||
INSERT INTO t1 VALUES(1, 2);
|
||||
} {wal}
|
||||
db_save
|
||||
db close
|
||||
db_restore
|
||||
|
||||
sqlite3 db test.db -readonly 1
|
||||
|
||||
do_execsql_test 3.2 { SELECT * FROM t1 } {1 2}
|
||||
do_catchsql_test 3.3 {
|
||||
INSERT INTO t1 VALUES(3, 4)
|
||||
} {1 {attempt to write a readonly database}}
|
||||
|
||||
sqlite3 db2 test.db
|
||||
do_test 3.4 {
|
||||
db2 eval { INSERT INTO t1 VALUES(3, 4) }
|
||||
} {}
|
||||
do_execsql_test 3.5 { SELECT * FROM t1 } {1 2 3 4}
|
||||
|
||||
db close
|
||||
db2 close
|
||||
db_restore
|
||||
file attributes $shmpath -permissions r--r--r--
|
||||
sqlite3 db test.db -readonly 1
|
||||
do_execsql_test 3.6 { SELECT * FROM t1 } {1 2}
|
||||
|
||||
db close
|
||||
db_restore
|
||||
file attributes $shmpath -permissions r--r--r--
|
||||
sqlite3 db test.db
|
||||
do_test 3.7 {
|
||||
catchsql { SELECT * FROM t1 }
|
||||
} {1 {unable to open database file}}
|
||||
|
||||
db close
|
||||
db_restore
|
||||
file attributes $shmpath -permissions r--r--r--
|
||||
sqlite3 db test.db -readonly 1
|
||||
do_execsql_test 3.8 { SELECT * FROM t1 } {1 2}
|
||||
|
||||
sqlite3 db2 test.db
|
||||
do_test 3.9 { db2 eval { SELECT * FROM t1 } } {1 2}
|
||||
do_test 3.10 {
|
||||
catchsql { INSERT INTO t1 VALUES(3, 4) } db2
|
||||
} {1 {attempt to write a readonly database}}
|
||||
|
||||
catch { db close }
|
||||
catch { db2 close }
|
||||
|
||||
forcedelete $shmpath
|
||||
} ;# endif capable enable_persist_wal
|
||||
} ;# endif os Darwin
|
||||
|
||||
finish_test
|
||||
|
||||
@@ -17,6 +17,7 @@ set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
|
||||
ifcapable !wal {finish_test ; return }
|
||||
if ![wal_is_ok] { finish_test; return }
|
||||
|
||||
db close
|
||||
set ::enable_shared_cache [sqlite3_enable_shared_cache 1]
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ source $testdir/wal_common.tcl
|
||||
source $testdir/lock_common.tcl
|
||||
|
||||
ifcapable !wal {finish_test ; return }
|
||||
|
||||
if ![wal_is_ok] { finish_test; return }
|
||||
set testprefix walslow
|
||||
|
||||
proc reopen_db {} {
|
||||
|
||||
@@ -19,6 +19,7 @@ source $testdir/tester.tcl
|
||||
source $testdir/lock_common.tcl
|
||||
if {[run_thread_tests]==0} { finish_test ; return }
|
||||
ifcapable !wal { finish_test ; return }
|
||||
if ![wal_is_ok] { finish_test; return }
|
||||
|
||||
set sqlite_walsummary_mmap_incr 64
|
||||
|
||||
|
||||
@@ -121,6 +121,7 @@ foreach hdr {
|
||||
sqliteicu.h
|
||||
sqliteInt.h
|
||||
sqliteLimit.h
|
||||
sqlrr.h
|
||||
vdbe.h
|
||||
vdbeInt.h
|
||||
vxworks.h
|
||||
@@ -394,6 +395,7 @@ foreach file {
|
||||
rtree.c
|
||||
icu.c
|
||||
fts3_icu.c
|
||||
sqlrr.c
|
||||
sqlite3rbu.c
|
||||
dbstat.c
|
||||
dbpage.c
|
||||
|
||||
Reference in New Issue
Block a user